10
Creating Shaped Wordclouds Using R Tidewater Big Data Enthusiasts Chuck Cartledge Developer April 23, 2020 at 12:57 Noon Contents List of Figures i 1 Introduction 1 2 Discussion 1 3 Conclusion 7 A Misc. files 9 List of Figures 1 A sample word cloud based on Romeo and Juliet. ............... 2 2 A more interesting word cloud based on Romeo and Juliette.......... 3 3 An empty word cloud figure............................ 4 4 A filled word cloud figure. ............................ 5 5 A filled USA word cloud figure. ......................... 6 6 A collection of sample word clouds. ....................... 8 i

Creating Shaped Wordclouds Using R - clc-ent.comThe wordcloud2 function behaves slightly di erently than most of the other R plot func-tions that I’ve used. The result from both

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Creating Shaped Wordclouds Using R - clc-ent.comThe wordcloud2 function behaves slightly di erently than most of the other R plot func-tions that I’ve used. The result from both

Creating Shaped Wordclouds Using R

Tidewater Big Data EnthusiastsChuck Cartledge

Developer

April 23 2020 at 1257 Noon

Contents

List of Figures i

1 Introduction 1

2 Discussion 1

3 Conclusion 7

A Misc files 9

List of Figures

1 A sample word cloud based on Romeo and Juliet 22 A more interesting word cloud based on Romeo and Juliette 33 An empty word cloud figure 44 A filled word cloud figure 55 A filled USA word cloud figure 66 A collection of sample word clouds 8

i

1 Introduction

The R library wordcloud provides an easy way to create an image showing how often a word(or tag) appears in a corpus (see Figure 1 on the following page) In a word cloud the sizeof a word indicates how often that word appears Word cloud words can be colored as well

While word clouds are easy to create often the clouds could be shaped differently tocreate a more lasting and profound impression (see Figure 2 on page 3)

2 Discussion

The R library wordcloud21 provides the capability of creating a word cloud that takes theshape of an image or the shape of letters The collection of predefined shapes include

bull rsquocardiodrsquo ndash a heart shape

bull rsquocirclersquo ndash the default

bull rsquodiamondrsquo ndash an alias for a square

bull rsquopentagonrsquo ndash the five sided object

bull rsquostarrsquo ndash a five pointed star

bull rsquotrianglersquo ndash a triangle with the wide base at the bottom

bull rsquotriangle-forwardrsquo ndash a triangle with the wide base at the left

This collection of shapes (when combined with a user specified background color) maybe enough to satisfy a wide variety of needs But it is the figPath option that offers themost potential

The figPath option can point to a figure that contains the image the cloud path shouldfill

Here are the steps to create an ldquointerestingrdquo shape to fill with a word cloud

1 Downloadcreate an image with only two items (see Figure 3 on page 4)

bull A white background and

bull A black outline of the shape

2 Fill the interior of the shape with the same color as the outline (see Figure 4 on page 5)

3 Pass the location of the filled image as the figPath parameter (see Figure 5 on page 6)

Figure 1 A sample word cloud based on Romeo and Juliet The image was created usingwordcloud function in the wordcloud library and the text from ldquoRomeo and Julietrdquo

2

Figure 2 A more interesting word cloud based on Romeo and Juliette The image wascreated using wordcloud2 function in the wordcloud2 library and the text from ldquoRomeo andJulietrdquo

3

Figure 3 An empty word cloud figure

4

Figure 4 A filled word cloud figure

5

Figure 5 A filled USA word cloud figure

The wordcloud2 function behaves slightly differently than most of the other R plot func-tions that Irsquove used The result from both wordcloud2 and letterCloud is not displayablewithin R These functions actually create an HTML page in a temporary directory with em-bedded JavaScript that performs the placement of the words within the shape and providesa level of interaction after the page is displayed R ldquounderstandsrdquo that the product fromthese functions is an HTML widget and starts up the default browser to show the page Thepage and its sub-directories are removed when R ends

The fact that the page uses JavaScript introduces some interesting aspects Buried in theJavaScript used by the page to place the words in the cloud are a plethora of Mathrandom()calls The JavaScript specification says that the Mathrandom() function has to return avalue greater than or equal to 0 and less than 1 which is reasonable for a random functionThe specification also says that the implementation of the random function is up to theJavaScript application and does not specify how the numbers are to be generated Meaningthat the same HTML page being viewed by two different browsers may generate two differentsequences of random numbers Most random number generators have the capability of settinga seed value so that a repeatable sequence can be generated JavaScript does not supportthe idea of a random number seed The HTML page and collection of directories can bemoved to a server where they are available for use and support

All of this means that each loading and viewing of the page will generate a different

1Available fromhttpsgithubcomLchiffonwordcloud2

6

image and there is no practical way to ldquoget backrdquo to an image that was goodIn the Files section (see Section A on page 9) is an R script and support files to work

with The R script was used to create various images (see Figure 6 on the following page)

3 Conclusion

The wordcloud2 library enables you to create word clouds of arbitrary shape inside an HTMLusing JavaScript to position and orient each word Each HTML page and its associatedlibrary files are placed in individual directories that are removed when the creating R processterminates Pages and files can be moved or copied for safe keeping if desired Because thepages use the Mathrandom() JavaScript function each time the page is loaded words willbe positioned differently in the cloud If the desired shape has an internal hole then it ispossible that some words may not be placed in the cloud

wordcloud2 allows you to create word clouds to support your data visualization needs

7

(a) A heart

(b) The letters ldquoUSArdquo

(c) A star

(d) The USA

Figure 6 A collection of sample word clouds These images were created with the attachedR script

8

A Misc files

The files used to create all these figures are attached to this report They are

1 romeoAndJulietbase64 ndash default text used to demonstrate the software

2 heartpng ndash a heart shape with a hole

3 usapng ndash an outline of the continental United States

4 wordCloudR ndash an R script to demonstrate making word clouds

9

ClJvbWVvIGFuZCBKdWxpZXQKU2hha2VzcGVhcmUgaG9tZXBhZ2UgfCBSb21lbyBhbmQgSnVsaWV0IHwgRW50aXJlIHBsYXkKQUNUIEkKUFJPTE9HVUUKCiAgICBUd28gaG91c2Vob2xkcywgYm90aCBhbGlrZSBpbiBkaWduaXR5LAogICAgSW4gZmFpciBWZXJvbmEsIHdoZXJlIHdlIGxheSBvdXIgc2NlbmUsCiAgICBGcm9tIGFuY2llbnQgZ3J1ZGdlIGJyZWFrIHRvIG5ldyBtdXRpbnksCiAgICBXaGVyZSBjaXZpbCBibG9vZCBtYWtlcyBjaXZpbCBoYW5kcyB1bmNsZWFuLgogICAgRnJvbSBmb3J0aCB0aGUgZmF0YWwgbG9pbnMgb2YgdGhlc2UgdHdvIGZvZXMKICAgIEEgcGFpciBvZiBzdGFyLWNyb3NzJ2QgbG92ZXJzIHRha2UgdGhlaXIgbGlmZTsKICAgIFdob3NlIG1pc2FkdmVudHVyZWQgcGl0ZW91cyBvdmVydGhyb3dzCiAgICBEbyB3aXRoIHRoZWlyIGRlYXRoIGJ1cnkgdGhlaXIgcGFyZW50cycgc3RyaWZlLgogICAgVGhlIGZlYXJmdWwgcGFzc2FnZSBvZiB0aGVpciBkZWF0aC1tYXJrJ2QgbG92ZSwKICAgIEFuZCB0aGUgY29udGludWFuY2Ugb2YgdGhlaXIgcGFyZW50cycgcmFnZSwKICAgIFdoaWNoLCBidXQgdGhlaXIgY2hpbGRyZW4ncyBlbmQsIG5vdWdodCBjb3VsZCByZW1vdmUsCiAgICBJcyBub3cgdGhlIHR3byBob3VycycgdHJhZmZpYyBvZiBvdXIgc3RhZ2U7CiAgICBUaGUgd2hpY2ggaWYgeW91IHdpdGggcGF0aWVudCBlYXJzIGF0dGVuZCwKICAgIFdoYXQgaGVyZSBzaGFsbCBtaXNzLCBvdXIgdG9pbCBzaGFsbCBzdHJpdmUgdG8gbWVuZC4KClNDRU5FIEkuIFZlcm9uYS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgU0FNUFNPTiBhbmQgR1JFR09SWSwgb2YgdGhlIGhvdXNlIG9mIENhcHVsZXQsIGFybWVkIHdpdGggc3dvcmRzIGFuZCBidWNrbGVycyAKClNBTVBTT04KCiAgICBHcmVnb3J5LCBvJyBteSB3b3JkLCB3ZSdsbCBub3QgY2FycnkgY29hbHMuCgpHUkVHT1JZCgogICAgTm8sIGZvciB0aGVuIHdlIHNob3VsZCBiZSBjb2xsaWVycy4KClNBTVBTT04KCiAgICBJIG1lYW4sIGFuIHdlIGJlIGluIGNob2xlciwgd2UnbGwgZHJhdy4KCkdSRUdPUlkKCiAgICBBeSwgd2hpbGUgeW91IGxpdmUsIGRyYXcgeW91ciBuZWNrIG91dCBvJyB0aGUgY29sbGFyLgoKU0FNUFNPTgoKICAgIEkgc3RyaWtlIHF1aWNrbHksIGJlaW5nIG1vdmVkLgoKR1JFR09SWQoKICAgIEJ1dCB0aG91IGFydCBub3QgcXVpY2tseSBtb3ZlZCB0byBzdHJpa2UuCgpTQU1QU09OCgogICAgQSBkb2cgb2YgdGhlIGhvdXNlIG9mIE1vbnRhZ3VlIG1vdmVzIG1lLgoKR1JFR09SWQoKICAgIFRvIG1vdmUgaXMgdG8gc3RpcjsgYW5kIHRvIGJlIHZhbGlhbnQgaXMgdG8gc3RhbmQ6CiAgICB0aGVyZWZvcmUsIGlmIHRob3UgYXJ0IG1vdmVkLCB0aG91IHJ1bm4nc3QgYXdheS4KClNBTVBTT04KCiAgICBBIGRvZyBvZiB0aGF0IGhvdXNlIHNoYWxsIG1vdmUgbWUgdG8gc3RhbmQ6IEkgd2lsbAogICAgdGFrZSB0aGUgd2FsbCBvZiBhbnkgbWFuIG9yIG1haWQgb2YgTW9udGFndWUncy4KCkdSRUdPUlkKCiAgICBUaGF0IHNob3dzIHRoZWUgYSB3ZWFrIHNsYXZlOyBmb3IgdGhlIHdlYWtlc3QgZ29lcwogICAgdG8gdGhlIHdhbGwuCgpTQU1QU09OCgogICAgVHJ1ZTsgYW5kIHRoZXJlZm9yZSB3b21lbiwgYmVpbmcgdGhlIHdlYWtlciB2ZXNzZWxzLAogICAgYXJlIGV2ZXIgdGhydXN0IHRvIHRoZSB3YWxsOiB0aGVyZWZvcmUgSSB3aWxsIHB1c2gKICAgIE1vbnRhZ3VlJ3MgbWVuIGZyb20gdGhlIHdhbGwsIGFuZCB0aHJ1c3QgaGlzIG1haWRzCiAgICB0byB0aGUgd2FsbC4KCkdSRUdPUlkKCiAgICBUaGUgcXVhcnJlbCBpcyBiZXR3ZWVuIG91ciBtYXN0ZXJzIGFuZCB1cyB0aGVpciBtZW4uCgpTQU1QU09OCgogICAgJ1RpcyBhbGwgb25lLCBJIHdpbGwgc2hvdyBteXNlbGYgYSB0eXJhbnQ6IHdoZW4gSQogICAgaGF2ZSBmb3VnaHQgd2l0aCB0aGUgbWVuLCBJIHdpbGwgYmUgY3J1ZWwgd2l0aCB0aGUKICAgIG1haWRzLCBhbmQgY3V0IG9mZiB0aGVpciBoZWFkcy4KCkdSRUdPUlkKCiAgICBUaGUgaGVhZHMgb2YgdGhlIG1haWRzPwoKU0FNUFNPTgoKICAgIEF5LCB0aGUgaGVhZHMgb2YgdGhlIG1haWRzLCBvciB0aGVpciBtYWlkZW5oZWFkczsKICAgIHRha2UgaXQgaW4gd2hhdCBzZW5zZSB0aG91IHdpbHQuCgpHUkVHT1JZCgogICAgVGhleSBtdXN0IHRha2UgaXQgaW4gc2Vuc2UgdGhhdCBmZWVsIGl0LgoKU0FNUFNPTgoKICAgIE1lIHRoZXkgc2hhbGwgZmVlbCB3aGlsZSBJIGFtIGFibGUgdG8gc3RhbmQ6IGFuZAogICAgJ3RpcyBrbm93biBJIGFtIGEgcHJldHR5IHBpZWNlIG9mIGZsZXNoLgoKR1JFR09SWQoKICAgICdUaXMgd2VsbCB0aG91IGFydCBub3QgZmlzaDsgaWYgdGhvdSBoYWRzdCwgdGhvdQogICAgaGFkc3QgYmVlbiBwb29yIEpvaG4uIERyYXcgdGh5IHRvb2whIGhlcmUgY29tZXMKICAgIHR3byBvZiB0aGUgaG91c2Ugb2YgdGhlIE1vbnRhZ3Vlcy4KClNBTVBTT04KCiAgICBNeSBuYWtlZCB3ZWFwb24gaXMgb3V0OiBxdWFycmVsLCBJIHdpbGwgYmFjayB0aGVlLgoKR1JFR09SWQoKICAgIEhvdyEgdHVybiB0aHkgYmFjayBhbmQgcnVuPwoKU0FNUFNPTgoKICAgIEZlYXIgbWUgbm90LgoKR1JFR09SWQoKICAgIE5vLCBtYXJyeTsgSSBmZWFyIHRoZWUhCgpTQU1QU09OCgogICAgTGV0IHVzIHRha2UgdGhlIGxhdyBvZiBvdXIgc2lkZXM7IGxldCB0aGVtIGJlZ2luLgoKR1JFR09SWQoKICAgIEkgd2lsbCBmcm93biBhcyBJIHBhc3MgYnksIGFuZCBsZXQgdGhlbSB0YWtlIGl0IGFzCiAgICB0aGV5IGxpc3QuCgpTQU1QU09OCgogICAgTmF5LCBhcyB0aGV5IGRhcmUuIEkgd2lsbCBiaXRlIG15IHRodW1iIGF0IHRoZW07CiAgICB3aGljaCBpcyBhIGRpc2dyYWNlIHRvIHRoZW0sIGlmIHRoZXkgYmVhciBpdC4KCiAgICBFbnRlciBBQlJBSEFNIGFuZCBCQUxUSEFTQVIKCkFCUkFIQU0KCiAgICBEbyB5b3UgYml0ZSB5b3VyIHRodW1iIGF0IHVzLCBzaXICgpTQU1QU09OCgogICAgSSBkbyBiaXRlIG15IHRodW1iLCBzaXIuCgpBQlJBSEFNCgogICAgRG8geW91IGJpdGUgeW91ciB0aHVtYiBhdCB1cywgc2lyPwoKU0FNUFNPTgoKICAgIFtBc2lkZSB0byBHUkVHT1JZXSBJcyB0aGUgbGF3IG9mIG91ciBzaWRlLCBpZiBJIHNheQogICAgYXkCgpHUkVHT1JZCgogICAgTm8uCgpTQU1QU09OCgogICAgTm8sIHNpciwgSSBkbyBub3QgYml0ZSBteSB0aHVtYiBhdCB5b3UsIHNpciwgYnV0IEkKICAgIGJpdGUgbXkgdGh1bWIsIHNpci4KCkdSRUdPUlkKCiAgICBEbyB5b3UgcXVhcnJlbCwgc2lyPwoKQUJSQUhBTQoKICAgIFF1YXJyZWwgc2lyISBubywgc2lyLgoKU0FNUFNPTgoKICAgIElmIHlvdSBkbywgc2lyLCBJIGFtIGZvciB5b3U6IEkgc2VydmUgYXMgZ29vZCBhIG1hbiBhcyB5b3UuCgpBQlJBSEFNCgogICAgTm8gYmV0dGVyLgoKU0FNUFNPTgoKICAgIFdlbGwsIHNpci4KCkdSRUdPUlkKCiAgICBTYXkgJ2JldHRlcjonIGhlcmUgY29tZXMgb25lIG9mIG15IG1hc3RlcidzIGtpbnNtZW4uCgpTQU1QU09OCgogICAgWWVzLCBiZXR0ZXIsIHNpci4KCkFCUkFIQU0KCiAgICBZb3UgbGllLgoKU0FNUFNPTgoKICAgIERyYXcsIGlmIHlvdSBiZSBtZW4uIEdyZWdvcnksIHJlbWVtYmVyIHRoeSBzd2FzaGluZyBibG93LgoKICAgIFRoZXkgZmlnaHQKCiAgICBFbnRlciBCRU5WT0xJTwoKQkVOVk9MSU8KCiAgICBQYXJ0LCBmb29scyEKICAgIFB1dCB1cCB5b3VyIHN3b3JkczsgeW91IGtub3cgbm90IHdoYXQgeW91IGRvLgoKICAgIEJlYXRzIGRvd24gdGhlaXIgc3dvcmRzCgogICAgRW50ZXIgVFlCQUxUCgpUWUJBTFQKCiAgICBXaGF0LCBhcnQgdGhvdSBkcmF3biBhbW9uZyB0aGVzZSBoZWFydGxlc3MgaGluZHMCiAgICBUdXJuIHRoZWUsIEJlbnZvbGlvLCBsb29rIHVwb24gdGh5IGRlYXRoLgoKQkVOVk9MSU8KCiAgICBJIGRvIGJ1dCBrZWVwIHRoZSBwZWFjZTogcHV0IHVwIHRoeSBzd29yZCwKICAgIE9yIG1hbmFnZSBpdCB0byBwYXJ0IHRoZXNlIG1lbiB3aXRoIG1lLgoKVFlCQUxUCgogICAgV2hhdCwgZHJhd24sIGFuZCB0YWxrIG9mIHBlYWNlISBJIGhhdGUgdGhlIHdvcmQsCiAgICBBcyBJIGhhdGUgaGVsbCwgYWxsIE1vbnRhZ3VlcywgYW5kIHRoZWU6CiAgICBIYXZlIGF0IHRoZWUsIGNvd2FyZCEKCiAgICBUaGV5IGZpZ2h0CgogICAgRW50ZXIsIHNldmVyYWwgb2YgYm90aCBob3VzZXMsIHdobyBqb2luIHRoZSBmcmF5OyB0aGVuIGVudGVyIENpdGl6ZW5zLCB3aXRoIGNsdWJzCgpGaXJzdCBDaXRpemVuCgogICAgQ2x1YnMsIGJpbGxzLCBhbmQgcGFydGlzYW5zISBzdHJpa2UhIGJlYXQgdGhlbSBkb3duIQogICAgRG93biB3aXRoIHRoZSBDYXB1bGV0cyEgZG93biB3aXRoIHRoZSBNb250YWd1ZXMhCgogICAgRW50ZXIgQ0FQVUxFVCBpbiBoaXMgZ293biwgYW5kIExBRFkgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgdGhpcz8gR2l2ZSBtZSBteSBsb25nIHN3b3JkLCBobyEKCkxBRFkgQ0FQVUxFVAoKICAgIEEgY3J1dGNoLCBhIGNydXRjaCEgd2h5IGNhbGwgeW91IGZvciBhIHN3b3JkPwoKQ0FQVUxFVAoKICAgIE15IHN3b3JkLCBJIHNheSEgT2xkIE1vbnRhZ3VlIGlzIGNvbWUsCiAgICBBbmQgZmxvdXJpc2hlcyBoaXMgYmxhZGUgaW4gc3BpdGUgb2YgbWUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIExBRFkgTU9OVEFHVUUKCk1PTlRBR1VFCgogICAgVGhvdSB2aWxsYWluIENhcHVsZXQsLS1Ib2xkIG1lIG5vdCwgbGV0IG1lIGdvLgoKTEFEWSBNT05UQUdVRQoKICAgIFRob3Ugc2hhbHQgbm90IHN0aXIgYSBmb290IHRvIHNlZWsgYSBmb2UuCgogICAgRW50ZXIgUFJJTkNFLCB3aXRoIEF0dGVuZGFudHMKClBSSU5DRQoKICAgIFJlYmVsbGlvdXMgc3ViamVjdHMsIGVuZW1pZXMgdG8gcGVhY2UsCiAgICBQcm9mYW5lcnMgb2YgdGhpcyBuZWlnaGJvdXItc3RhaW5lZCBzdGVlbCwtLQogICAgV2lsbCB0aGV5IG5vdCBoZWFyPyBXaGF0LCBobyEgeW91IG1lbiwgeW91IGJlYXN0cywKICAgIFRoYXQgcXVlbmNoIHRoZSBmaXJlIG9mIHlvdXIgcGVybmljaW91cyByYWdlCiAgICBXaXRoIHB1cnBsZSBmb3VudGFpbnMgaXNzdWluZyBmcm9tIHlvdXIgdmVpbnMsCiAgICBPbiBwYWluIG9mIHRvcnR1cmUsIGZyb20gdGhvc2UgYmxvb2R5IGhhbmRzCiAgICBUaHJvdyB5b3VyIG1pc3RlbXBlcidkIHdlYXBvbnMgdG8gdGhlIGdyb3VuZCwKICAgIEFuZCBoZWFyIHRoZSBzZW50ZW5jZSBvZiB5b3VyIG1vdmVkIHByaW5jZS4KICAgIFRocmVlIGNpdmlsIGJyYXdscywgYnJlZCBvZiBhbiBhaXJ5IHdvcmQsCiAgICBCeSB0aGVlLCBvbGQgQ2FwdWxldCwgYW5kIE1vbnRhZ3VlLAogICAgSGF2ZSB0aHJpY2UgZGlzdHVyYidkIHRoZSBxdWlldCBvZiBvdXIgc3RyZWV0cywKICAgIEFuZCBtYWRlIFZlcm9uYSdzIGFuY2llbnQgY2l0aXplbnMKICAgIENhc3QgYnkgdGhlaXIgZ3JhdmUgYmVzZWVtaW5nIG9ybmFtZW50cywKICAgIFRvIHdpZWxkIG9sZCBwYXJ0aXNhbnMsIGluIGhhbmRzIGFzIG9sZCwKICAgIENhbmtlcidkIHdpdGggcGVhY2UsIHRvIHBhcnQgeW91ciBjYW5rZXInZCBoYXRlOgogICAgSWYgZXZlciB5b3UgZGlzdHVyYiBvdXIgc3RyZWV0cyBhZ2FpbiwKICAgIFlvdXIgbGl2ZXMgc2hhbGwgcGF5IHRoZSBmb3JmZWl0IG9mIHRoZSBwZWFjZS4KICAgIEZvciB0aGlzIHRpbWUsIGFsbCB0aGUgcmVzdCBkZXBhcnQgYXdheToKICAgIFlvdSBDYXB1bGV0OyBzaGFsbCBnbyBhbG9uZyB3aXRoIG1lOgogICAgQW5kLCBNb250YWd1ZSwgY29tZSB5b3UgdGhpcyBhZnRlcm5vb24sCiAgICBUbyBrbm93IG91ciBmdXJ0aGVyIHBsZWFzdXJlIGluIHRoaXMgY2FzZSwKICAgIFRvIG9sZCBGcmVlLXRvd24sIG91ciBjb21tb24ganVkZ21lbnQtcGxhY2UuCiAgICBPbmNlIG1vcmUsIG9uIHBhaW4gb2YgZGVhdGgsIGFsbCBtZW4gZGVwYXJ0LgoKICAgIEV4ZXVudCBhbGwgYnV0IE1PTlRBR1VFLCBMQURZIE1PTlRBR1VFLCBhbmQgQkVOVk9MSU8KCk1PTlRBR1VFCgogICAgV2hvIHNldCB0aGlzIGFuY2llbnQgcXVhcnJlbCBuZXcgYWJyb2FjaD8KICAgIFNwZWFrLCBuZXBoZXcsIHdlcmUgeW91IGJ5IHdoZW4gaXQgYmVnYW4CgpCRU5WT0xJTwoKICAgIEhlcmUgd2VyZSB0aGUgc2VydmFudHMgb2YgeW91ciBhZHZlcnNhcnksCiAgICBBbmQgeW91cnMsIGNsb3NlIGZpZ2h0aW5nIGVyZSBJIGRpZCBhcHByb2FjaDoKICAgIEkgZHJldyB0byBwYXJ0IHRoZW06IGluIHRoZSBpbnN0YW50IGNhbWUKICAgIFRoZSBmaWVyeSBUeWJhbHQsIHdpdGggaGlzIHN3b3JkIHByZXBhcmVkLAogICAgV2hpY2gsIGFzIGhlIGJyZWF0aGVkIGRlZmlhbmNlIHRvIG15IGVhcnMsCiAgICBIZSBzd3VuZyBhYm91dCBoaXMgaGVhZCBhbmQgY3V0IHRoZSB3aW5kcywKICAgIFdobyBub3RoaW5nIGh1cnQgd2l0aGFsIGhpc3MnZCBoaW0gaW4gc2Nvcm46CiAgICBXaGlsZSB3ZSB3ZXJlIGludGVyY2hhbmdpbmcgdGhydXN0cyBhbmQgYmxvd3MsCiAgICBDYW1lIG1vcmUgYW5kIG1vcmUgYW5kIGZvdWdodCBvbiBwYXJ0IGFuZCBwYXJ0LAogICAgVGlsbCB0aGUgcHJpbmNlIGNhbWUsIHdobyBwYXJ0ZWQgZWl0aGVyIHBhcnQuCgpMQURZIE1PTlRBR1VFCgogICAgTywgd2hlcmUgaXMgUm9tZW8IHNhdyB5b3UgaGltIHRvLWRheT8KICAgIFJpZ2h0IGdsYWQgSSBhbSBoZSB3YXMgbm90IGF0IHRoaXMgZnJheS4KCkJFTlZPTElPCgogICAgTWFkYW0sIGFuIGhvdXIgYmVmb3JlIHRoZSB3b3JzaGlwcCdkIHN1bgogICAgUGVlcidkIGZvcnRoIHRoZSBnb2xkZW4gd2luZG93IG9mIHRoZSBlYXN0LAogICAgQSB0cm91YmxlZCBtaW5kIGRyYXZlIG1lIHRvIHdhbGsgYWJyb2FkOwogICAgV2hlcmUsIHVuZGVybmVhdGggdGhlIGdyb3ZlIG9mIHN5Y2Ftb3JlCiAgICBUaGF0IHdlc3R3YXJkIHJvb3RldGggZnJvbSB0aGUgY2l0eSdzIHNpZGUsCiAgICBTbyBlYXJseSB3YWxraW5nIGRpZCBJIHNlZSB5b3VyIHNvbjoKICAgIFRvd2FyZHMgaGltIEkgbWFkZSwgYnV0IGhlIHdhcyB3YXJlIG9mIG1lCiAgICBBbmQgc3RvbGUgaW50byB0aGUgY292ZXJ0IG9mIHRoZSB3b29kOgogICAgSSwgbWVhc3VyaW5nIGhpcyBhZmZlY3Rpb25zIGJ5IG15IG93biwKICAgIFRoYXQgbW9zdCBhcmUgYnVzaWVkIHdoZW4gdGhleSdyZSBtb3N0IGFsb25lLAogICAgUHVyc3VlZCBteSBodW1vdXIgbm90IHB1cnN1aW5nIGhpcywKICAgIEFuZCBnbGFkbHkgc2h1bm4nZCB3aG8gZ2xhZGx5IGZsZWQgZnJvbSBtZS4KCk1PTlRBR1VFCgogICAgTWFueSBhIG1vcm5pbmcgaGF0aCBoZSB0aGVyZSBiZWVuIHNlZW4sCiAgICBXaXRoIHRlYXJzIGF1Z21lbnRpbmcgdGhlIGZyZXNoIG1vcm5pbmcgZGV3LgogICAgQWRkaW5nIHRvIGNsb3VkcyBtb3JlIGNsb3VkcyB3aXRoIGhpcyBkZWVwIHNpZ2hzOwogICAgQnV0IGFsbCBzbyBzb29uIGFzIHRoZSBhbGwtY2hlZXJpbmcgc3VuCiAgICBTaG91bGQgaW4gdGhlIGZ1cnRoZXN0IGVhc3QgYmVnaW4gdG8gZHJhdwogICAgVGhlIHNoYWR5IGN1cnRhaW5zIGZyb20gQXVyb3JhJ3MgYmVkLAogICAgQXdheSBmcm9tIHRoZSBsaWdodCBzdGVhbHMgaG9tZSBteSBoZWF2eSBzb24sCiAgICBBbmQgcHJpdmF0ZSBpbiBoaXMgY2hhbWJlciBwZW5zIGhpbXNlbGYsCiAgICBTaHV0cyB1cCBoaXMgd2luZG93cywgbG9ja3MgZmFyIGRheWxpZ2h0IG91dAogICAgQW5kIG1ha2VzIGhpbXNlbGYgYW4gYXJ0aWZpY2lhbCBuaWdodDoKICAgIEJsYWNrIGFuZCBwb3J0ZW50b3VzIG11c3QgdGhpcyBodW1vdXIgcHJvdmUsCiAgICBVbmxlc3MgZ29vZCBjb3Vuc2VsIG1heSB0aGUgY2F1c2UgcmVtb3ZlLgoKQkVOVk9MSU8KCiAgICBNeSBub2JsZSB1bmNsZSwgZG8geW91IGtub3cgdGhlIGNhdXNlPwoKTU9OVEFHVUUKCiAgICBJIG5laXRoZXIga25vdyBpdCBub3IgY2FuIGxlYXJuIG9mIGhpbS4KCkJFTlZPTElPCgogICAgSGF2ZSB5b3UgaW1wb3J0dW5lZCBoaW0gYnkgYW55IG1lYW5zPwoKTU9OVEFHVUUKCiAgICBCb3RoIGJ5IG15c2VsZiBhbmQgbWFueSBvdGhlciBmcmllbmRzOgogICAgQnV0IGhlLCBoaXMgb3duIGFmZmVjdGlvbnMnIGNvdW5zZWxsb3IsCiAgICBJcyB0byBoaW1zZWxmLS1JIHdpb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UVPCgogICAgR29vZCBoZWFydCwgYXQgd2hhdD8KCkJFTlZPTElPCgogICAgQXQgdGh5IGdvb2QgaGVhcnQncyBvcHByZXNzaW9uLgoKUk9NRU8KCiAgICBXaHksIHN1Y2ggaXMgbG92ZSdzIHRyYW5zZ3Jlc3Npb24uCiAgICBHcmllZnMgb2YgbWluZSBvd24gbGllIGhlYXZ5IGluIG15IGJyZWFzdCwKICAgIFdoaWNoIHRob3Ugd2lsdCBwcm9wYWdhdGUsIHRvIGhhdmUgaXQgcHJlc3QKICAgIFdpdGggbW9yZSBvZiB0aGluZTogdGhpcyBsb3ZlIHRoYXQgdGhvdSBoYXN0IHNob3duCiAgICBEb3RoIGFkZCBtb3JlIGdyaWVmIHRvIHRvbyBtdWNoIG9mIG1pbmUgb3duLgogICAgTG92ZSBpcyBhIHNtb2tlIHJhaXNlZCB3aXRoIHRoZSBmdW1lIG9mIHNpZ2hzOwogICAgQmVpbmcgcHVyZ2VkLCBhIGZpcmUgc3BhcmtsaW5nIGluIGxvdmVycycgZXllczsKICAgIEJlaW5nIHZleCdkIGEgc2VhIG5vdXJpc2gnZCB3aXRoIGxvdmVycycgdGVhcnM6CiAgICBXaGF0IGlzIGl0IGVsc2UIGEgbWFkbmVzcyBtb3N0IGRpc2NyZWV0LAogICAgQSBjaG9raW5nIGdhbGwgYW5kIGEgcHJlc2VydmluZyBzd2VldC4KICAgIEZhcmV3ZWxsLCBteSBjb3ouCgpCRU5WT0xJTwoKICAgIFNvZnQhIEkgd2lsbCBnbyBhbG9uZzsKICAgIEFuIGlmIHlvdSBsZWF2ZSBtZSBzbywgeW91IGRvIG1lIHdyb25nLgoKUk9NRU8KCiAgICBUdXQsIEkgaGF2ZSBsb3N0IG15c2VsZjsgSSBhbSBub3QgaGVyZTsKICAgIFRoaXMgaXMgbm90IFJvbWVvLCBoZSdzIHNvbWUgb3RoZXIgd2hlcmUuCgpCRU5WT0xJTwoKICAgIFRlbGwgbWUgaW4gc2FkbmVzcywgd2hvIGlzIHRoYXQgeW91IGxvdmUuCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIEkgZ3JvYW4gYW5kIHRlbGwgdGhlZT8KCkJFTlZPTElPCgogICAgR3JvYW4hIHdoeSwgbm8uCiAgICBCdXQgc2FkbHkgdGVsbCBtZSB3aG8uCgpST01FTwoKICAgIEJpZCBhIHNpY2sgbWFuIGluIHNhZG5lc3MgbWFrZSBoaXMgd2lsbDoKICAgIEFoLCB3b3JkIGlsbCB1cmdlZCB0byBvbmUgdGhhdCBpcyBzbyBpbGwhCiAgICBJbiBzYWRuZXNzLCBjb3VzaW4sIEkgZG8gbG92ZSBhIHdvbWFuLgoKQkVOVk9MSU8KCiAgICBJIGFpbSdkIHNvIG5lYXIsIHdoZW4gSSBzdXBwb3NlZCB5b3UgbG92ZWQuCgpST01FTwoKICAgIEEgcmlnaHQgZ29vZCBtYXJrLW1hbiEgQW5kIHNoZSdzIGZhaXIgSSBsb3ZlLgoKQkVOVk9MSU8KCiAgICBBIHJpZ2h0IGZhaXIgbWFyaywgZmFpciBjb3osIGlzIHNvb25lc3QgaGl0LgoKUk9NRU8KCiAgICBXZWxsLCBpbiB0aGF0IGhpdCB5b3UgbWlzczogc2hlJ2xsIG5vdCBiZSBoaXQKICAgIFdpdGggQ3VwaWQncyBhcnJvdzsgc2hlIGhhdGggRGlhbidzIHdpdDsKICAgIEFuZCwgaW4gc3Ryb25nIHByb29mIG9mIGNoYXN0aXR5IHdlbGwgYXJtJ2QsCiAgICBGcm9tIGxvdmUncyB3ZWFrIGNoaWxkaXNoIGJvdyBzaGUgbGl2ZXMgdW5oYXJtJ2QuCiAgICBTaGUgd2lsbCBub3Qgc3RheSB0aGUgc2llZ2Ugb2YgbG92aW5nIHRlcm1zLAogICAgTm9yIGJpZGUgdGhlIGVuY291bnRlciBvZiBhc3NhaWxpbmcgZXllcywKICAgIE5vciBvcGUgaGVyIGxhcCB0byBzYWludC1zZWR1Y2luZyBnb2xkOgogICAgTywgc2hlIGlzIHJpY2ggaW4gYmVhdXR5LCBvbmx5IHBvb3IsCiAgICBUaGF0IHdoZW4gc2hlIGRpZXMgd2l0aCBiZWF1dHkgZGllcyBoZXIgc3RvcmUuCgpCRU5WT0xJTwoKICAgIFRoZW4gc2hlIGhhdGggc3dvcm4gdGhhdCBzaGUgd2lsbCBzdGlsbCBsaXZlIGNoYXN0ZT8KClJPTUVPCgogICAgU2hlIGhhdGgsIGFuZCBpbiB0aGF0IHNwYXJpbmcgbWFrZXMgaHVnZSB3YXN0ZSwKICAgIEZvciBiZWF1dHkgc3RhcnZlZCB3aXRoIGhlciBzZXZlcml0eQogICAgQ3V0cyBiZWF1dHkgb2ZmIGZyb20gYWxsIHBvc3Rlcml0eS4KICAgIFNoZSBpcyB0b28gZmFpciwgdG9vIHdpc2UsIHdpc2VseSB0b28gZmFpciwKICAgIFRvIG1lcml0IGJsaXNzIGJ5IG1ha2luZyBtZSBkZXNwYWlyOgogICAgU2hlIGhhdGggZm9yc3dvcm4gdG8gbG92ZSwgYW5kIGluIHRoYXQgdm93CiAgICBEbyBJIGxpdmUgZGVhZCB0aGF0IGxpdmUgdG8gdGVsbCBpdCBub3cuCgpCRU5WT0xJTwoKICAgIEJlIHJ1bGVkIGJ5IG1lLCBmb3JnZXQgdG8gdGhpbmsgb2YgaGVyLgoKUk9NRU8KCiAgICBPLCB0ZWFjaCBtZSBob3cgSSBzaG91bGQgZm9yZ2V0IHRvIHRoaW5rLgoKQkVOVk9MSU8KCiAgICBCeSBnaXZpbmcgbGliZXJ0eSB1bnRvIHRoaW5lIGV5ZXM7CiAgICBFeGFtaW5lIG90aGVyIGJlYXV0aWVzLgoKUk9NRU8KCiAgICAnVGlzIHRoZSB3YXkKICAgIFRvIGNhbGwgaGVycyBleHF1aXNpdGUsIGluIHF1ZXN0aW9uIG1vcmU6CiAgICBUaGVzZSBoYXBweSBtYXNrcyB0aGF0IGtpc3MgZmFpciBsYWRpZXMnIGJyb3dzCiAgICBCZWluZyBibGFjayBwdXQgdXMgaW4gbWluZCB0aGV5IGhpZGUgdGhlIGZhaXI7CiAgICBIZSB0aGF0IGlzIHN0cnVja2VuIGJsaW5kIGNhbm5vdCBmb3JnZXQKICAgIFRoZSBwcmVjaW91cyB0cmVhc3VyZSBvZiBoaXMgZXllc2lnaHQgbG9zdDoKICAgIFNob3cgbWUgYSBtaXN0cmVzcyB0aGF0IGlzIHBhc3NpbmcgZmFpciwKICAgIFdoYXQgZG90aCBoZXIgYmVhdXR5IHNlcnZlLCBidXQgYXMgYSBub3RlCiAgICBXaGVyZSBJIG1heSByZWFkIHdobyBwYXNzJ2QgdGhhdCBwYXNzaW5nIGZhaXICiAgICBGYXJld2VsbDogdGhvdSBjYW5zdCBub3QgdGVhY2ggbWUgdG8gZm9yZ2V0LgoKQkVOVk9MSU8KCiAgICBJJ2xsIHBheSB0aGF0IGRvY3RyaW5lLCBvciBlbHNlIGRpZSBpbiBkZWJ0LgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEEgc3RyZWV0LgoKICAgIEVudGVyIENBUFVMRVQsIFBBUklTLCBhbmQgU2VydmFudCAKCkNBUFVMRVQKCiAgICBCdXQgTW9udGFndWUgaXMgYm91bmQgYXMgd2VsbCBhcyBJLAogICAgSW4gcGVuYWx0eSBhbGlrZTsgYW5kICd0aXMgbm90IGhhcmQsIEkgdGhpbmssCiAgICBGb3IgbWVuIHNvIG9sZCBhcyB3ZSB0byBrZWVwIHRoZSBwZWFjZS4KClBBUklTCgogICAgT2YgaG9ub3VyYWJsZSByZWNrb25pbmcgYXJlIHlvdSBib3RoOwogICAgQW5kIHBpdHkgJ3RpcyB5b3UgbGl2ZWQgYXQgb2RkcyBzbyBsb25nLgogICAgQnV0IG5vdywgbXkgbG9yZCwgd2hhdCBzYXkgeW91IHRvIG15IHN1aXQCgpDQVBVTEVUCgogICAgQnV0IHNheWluZyBvJ2VyIHdoYXQgSSBoYXZlIHNhaWQgYmVmb3JlOgogICAgTXkgY2hpbGQgaXMgeWV0IGEgc3RyYW5nZXIgaW4gdGhlIHdvcmxkOwogICAgU2hlIGhhdGggbm90IHNlZW4gdGhlIGNoYW5nZSBvZiBmb3VydGVlbiB5ZWFycywKICAgIExldCB0d28gbW9yZSBzdW1tZXJzIHdpdGhlciBpbiB0aGVpciBwcmlkZSwKICAgIEVyZSB3ZSBtYXkgdGhpbmsgaGVyIHJpcGUgdG8gYmUgYSBicmlkZS4KClBBUklTCgogICAgWW91bmdlciB0aGFuIHNoZSBhcmUgaGFwcHkgbW90aGVycyBtYWRlLgoKQ0FQVUxFVAoKICAgIEFuZCB0b28gc29vbiBtYXJyJ2QgYXJlIHRob3NlIHNvIGVhcmx5IG1hZGUuCiAgICBUaGUgZWFydGggaGF0aCBzd2FsbG93J2QgYWxsIG15IGhvcGVzIGJ1dCBzaGUsCiAgICBTaGUgaXMgdGhlIGhvcGVmdWwgbGFkeSBvZiBteSBlYXJ0aDoKICAgIEJ1dCB3b28gaGVyLCBnZW50bGUgUGFyaXMsIGdldCBoZXIgaGVhcnQsCiAgICBNeSB3aWxsIHRvIGhlciBjb25zZW50IGlzIGJ1dCBhIHBhcnQ7CiAgICBBbiBzaGUgYWdyZWUsIHdpdGhpbiBoZXIgc2NvcGUgb2YgY2hvaWNlCiAgICBMaWVzIG15IGNvbnNlbnQgYW5kIGZhaXIgYWNjb3JkaW5nIHZvaWNlLgogICAgVGhpcyBuaWdodCBJIGhvbGQgYW4gb2xkIGFjY3VzdG9tJ2QgZmVhc3QsCiAgICBXaGVyZXRvIEkgaGF2ZSBpbnZpdGVkIG1hbnkgYSBndWVzdCwKICAgIFN1Y2ggYXMgSSBsb3ZlOyBhbmQgeW91LCBhbW9uZyB0aGUgc3RvcmUsCiAgICBPbmUgbW9yZSwgbW9zdCB3ZWxjb21lLCBtYWtlcyBteSBudW1iZXIgbW9yZS4KICAgIEF0IG15IHBvb3IgaG91c2UgbG9vayB0byBiZWhvbGQgdGhpcyBuaWdodAogICAgRWFydGgtdHJlYWRpbmcgc3RhcnMgdGhhdCBtYWtlIGRhcmsgaGVhdmVuIGxpZ2h0OgogICAgU3VjaCBjb21mb3J0IGFzIGRvIGx1c3R5IHlvdW5nIG1lbiBmZWVsCiAgICBXaGVuIHdlbGwtYXBwYXJlbGwnZCBBcHJpbCBvbiB0aGUgaGVlbAogICAgT2YgbGltcGluZyB3aW50ZXIgdHJlYWRzLCBldmVuIHN1Y2ggZGVsaWdodAogICAgQW1vbmcgZnJlc2ggZmVtYWxlIGJ1ZHMgc2hhbGwgeW91IHRoaXMgbmlnaHQKICAgIEluaGVyaXQgYXQgbXkgaG91c2U7IGhlYXIgYWxsLCBhbGwgc2VlLAogICAgQW5kIGxpa2UgaGVyIG1vc3Qgd2hvc2UgbWVyaXQgbW9zdCBzaGFsbCBiZToKICAgIFdoaWNoIG9uIG1vcmUgdmlldywgb2YgbWFueSBtaW5lIGJlaW5nIG9uZQogICAgTWF5IHN0YW5kIGluIG51bWJlciwgdGhvdWdoIGluIHJlY2tvbmluZyBub25lLAogICAgQ29tZSwgZ28gd2l0aCBtZS4KCiAgICBUbyBTZXJ2YW50LCBnaXZpbmcgYSBwYXBlcgogICAgR28sIHNpcnJhaCwgdHJ1ZGdlIGFib3V0CiAgICBUaHJvdWdoIGZhaXIgVmVyb25hOyBmaW5kIHRob3NlIHBlcnNvbnMgb3V0CiAgICBXaG9zZSBuYW1lcyBhcmUgd3JpdHRlbiB0aGVyZSwgYW5kIHRvIHRoZW0gc2F5LAogICAgTXkgaG91c2UgYW5kIHdlbGNvbWUgb24gdGhlaXIgcGxlYXN1cmUgc3RheS4KCiAgICBFeGV1bnQgQ0FQVUxFVCBhbmQgUEFSSVMKClNlcnZhbnQKCiAgICBGaW5kIHRoZW0gb3V0IHdob3NlIG5hbWVzIGFyZSB3cml0dGVuIGhlcmUhIEl0IGlzCiAgICB3cml0dGVuLCB0aGF0IHRoZSBzaG9lbWFrZXIgc2hvdWxkIG1lZGRsZSB3aXRoIGhpcwogICAgeWFyZCwgYW5kIHRoZSB0YWlsb3Igd2l0aCBoaXMgbGFzdCwgdGhlIGZpc2hlciB3aXRoCiAgICBoaXMgcGVuY2lsLCBhbmQgdGhlIHBhaW50ZXIgd2l0aCBoaXMgbmV0czsgYnV0IEkgYW0KICAgIHNlbnQgdG8gZmluZCB0aG9zZSBwZXJzb25zIHdob3NlIG5hbWVzIGFyZSBoZXJlCiAgICB3cml0LCBhbmQgY2FuIG5ldmVyIGZpbmQgd2hhdCBuYW1lcyB0aGUgd3JpdGluZwogICAgcGVyc29uIGhhdGggaGVyZSB3cml0LiBJIG11c3QgdG8gdGhlIGxlYXJuZWQuLS1JbiBnb29kIHRpbWUuCgogICAgRW50ZXIgQkVOVk9MSU8gYW5kIFJPTUVPCgpCRU5WT0xJTwoKICAgIFR1dCwgbWFuLCBvbmUgZmlyZSBidXJucyBvdXQgYW5vdGhlcidzIGJ1cm5pbmcsCiAgICBPbmUgcGFpbiBpcyBsZXNzZW4nZCBieSBhbm90aGVyJ3MgYW5ndWlzaDsKICAgIFR1cm4gZ2lkZHksIGFuZCBiZSBob2xwIGJ5IGJhY2t3YXJkIHR1cm5pbmc7CiAgICBPbmUgZGVzcGVyYXRlIGdyaWVmIGN1cmVzIHdpdGggYW5vdGhlcidzIGxhbmd1aXNoOgogICAgVGFrZSB0aG91IHNvbWUgbmV3IGluZmVjdGlvbiB0byB0aHkgZXllLAogICAgQW5kIHRoZSByYW5rIHBvaXNvbiBvZiB0aGUgb2xkIHdpbGwgZGllLgoKUk9NRU8KCiAgICBZb3VyIHBsYWludGFpbi1sZWFmIGlzIGV4Y2VsbGVudCBmb3IgdGhhdC4KCkJFTlZPTElPCgogICAgRm9yIHdoYXQsIEkgcHJheSB0aGVlPwoKUk9NRU8KCiAgICBGb3IgeW91ciBicm9rZW4gc2hpbi4KCkJFTlZPTElPCgogICAgV2h5LCBSb21lbywgYXJ0IHRob3UgbWFkPwoKUk9NRU8KCiAgICBOb3QgbWFkLCBidXQgYm91bmQgbW9yZSB0aGFuIGEgbWFkLW1hbiBpczsKICAgIFNodXQgdXAgaW4gcHJpc29uLCBrZXB0IHdpdGhvdXQgbXkgZm9vZCwKICAgIFdoaXBwJ2QgYW5kIHRvcm1lbnRlZCBhbmQtLUdvZC1kZW4sIGdvb2QgZmVsbG93LgoKU2VydmFudAoKICAgIEdvZCBnaScgZ29kLWRlbi4gSSBwcmF5LCBzaXIsIGNhbiB5b3UgcmVhZD8KClJPTUVPCgogICAgQXksIG1pbmUgb3duIGZvcnR1bmUgaW4gbXkgbWlzZXJ5LgoKU2VydmFudAoKICAgIFBlcmhhcHMgeW91IGhhdmUgbGVhcm5lZCBpdCB3aXRob3V0IGJvb2s6IGJ1dCwgSQogICAgcHJheSwgY2FuIHlvdSByZWFkIGFueSB0aGluZyB5b3Ugc2VlPwoKUk9NRU8KCiAgICBBeSwgaWYgSSBrbm93IHRoZSBsZXR0ZXJzIGFuZCB0aGUgbGFuZ3VhZ2UuCgpTZXJ2YW50CgogICAgWWUgc2F5IGhvbmVzdGx5OiByZXN0IHlvdSBtZXJyeSEKClJPTUVPCgogICAgU3RheSwgZmVsbG93OyBJIGNhbiByZWFkLgoKICAgIFJlYWRzCiAgICAnU2lnbmlvciBNYXJ0aW5vIGFuZCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOwogICAgQ291bnR5IEFuc2VsbWUgYW5kIGhpcyBiZWF1dGVvdXMgc2lzdGVyczsgdGhlIGxhZHkKICAgIHdpZG93IG9mIFZpdHJhdmlvOyBTaWduaW9yIFBsYWNlbnRpbyBhbmQgaGlzIGxvdmVseQogICAgbmllY2VzOyBNZXJjdXRpbyBhbmQgaGlzIGJyb3RoZXIgVmFsZW50aW5lOyBtaW5lCiAgICB1bmNsZSBDYXB1bGV0LCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOyBteSBmYWlyIG5pZWNlCiAgICBSb3NhbGluZTsgTGl2aWE7IFNpZ25pb3IgVmFsZW50aW8gYW5kIGhpcyBjb3VzaW4KICAgIFR5YmFsdCwgTHVjaW8gYW5kIHRoZSBsaXZlbHkgSGVsZW5hLicgQSBmYWlyCiAgICBhc3NlbWJseTogd2hpdGhlciBzaG91bGQgdGhleSBjb21lPwoKU2VydmFudAoKICAgIFVwLgoKUk9NRU8KCiAgICBXaGl0aGVyPwoKU2VydmFudAoKICAgIFRvIHN1cHBlcjsgdG8gb3VyIGhvdXNlLgoKUk9NRU8KCiAgICBXaG9zZSBob3VzZT8KClNlcnZhbnQKCiAgICBNeSBtYXN0ZXIncy4KClJPTUVPCgogICAgSW5kZWVkLCBJIHNob3VsZCBoYXZlIGFzaydkIHlvdSB0aGF0IGJlZm9yZS4KClNlcnZhbnQKCiAgICBOb3cgSSdsbCB0ZWxsIHlvdSB3aXRob3V0IGFza2luZzogbXkgbWFzdGVyIGlzIHRoZQogICAgZ3JlYXQgcmljaCBDYXB1bGV0OyBhbmQgaWYgeW91IGJlIG5vdCBvZiB0aGUgaG91c2UKICAgIG9mIE1vbnRhZ3VlcywgSSBwcmF5LCBjb21lIGFuZCBjcnVzaCBhIGN1cCBvZiB3aW5lLgogICAgUmVzdCB5b3UgbWVycnkhCgogICAgRXhpdAoKQkVOVk9MSU8KCiAgICBBdCB0aGlzIHNhbWUgYW5jaWVudCBmZWFzdCBvZiBDYXB1bGV0J3MKICAgIFN1cHMgdGhlIGZhaXIgUm9zYWxpbmUgd2hvbSB0aG91IHNvIGxvdmVzdCwKICAgIFdpdGggYWxsIHRoZSBhZG1pcmVkIGJlYXV0aWVzIG9mIFZlcm9uYToKICAgIEdvIHRoaXRoZXI7IGFuZCwgd2l0aCB1bmF0dGFpbnRlZCBleWUsCiAgICBDb21wYXJlIGhlciBmYWNlIHdpdGggc29tZSB0aGF0IEkgc2hhbGwgc2hvdywKICAgIEFuZCBJIHdpbGwgbWFrZSB0aGVlIHRoaW5rIHRoeSBzd2FuIGEgY3Jvdy4KClJPTUVPCgogICAgV2hlbiB0aGUgZGV2b3V0IHJlbGlnaW9uIG9mIG1pbmUgZXllCiAgICBNYWludGFpbnMgc3VjaCBmYWxzZWhvb2QsIHRoZW4gdHVybiB0ZWFycyB0byBmaXJlczsKICAgIEFuZCB0aGVzZSwgd2hvIG9mdGVuIGRyb3duJ2QgY291bGQgbmV2ZXIgZGllLAogICAgVHJhbnNwYXJlbnQgaGVyZXRpY3MsIGJlIGJ1cm50IGZvciBsaWFycyEKICAgIE9uZSBmYWlyZXIgdGhhbiBteSBsb3ZlISB0aGUgYWxsLXNlZWluZyBzdW4KICAgIE5lJ2VyIHNhdyBoZXIgbWF0Y2ggc2luY2UgZmlyc3QgdGhlIHdvcmxkIGJlZ3VuLgoKQkVOVk9MSU8KCiAgICBUdXQsIHlvdSBzYXcgaGVyIGZhaXIsIG5vbmUgZWxzZSBiZWluZyBieSwKICAgIEhlcnNlbGYgcG9pc2VkIHdpdGggaGVyc2VsZiBpbiBlaXRoZXIgZXllOgogICAgQnV0IGluIHRoYXQgY3J5c3RhbCBzY2FsZXMgbGV0IHRoZXJlIGJlIHdlaWdoJ2QKICAgIFlvdXIgbGFkeSdzIGxvdmUgYWdhaW5zdCBzb21lIG90aGVyIG1haWQKICAgIFRoYXQgSSB3aWxsIHNob3cgeW91IHNoaW5pbmcgYXQgdGhpcyBmZWFzdCwKICAgIEFuZCBzaGUgc2hhbGwgc2NhbnQgc2hvdyB3ZWxsIHRoYXQgbm93IHNob3dzIGJlc3QuCgpST01FTwoKICAgIEknbGwgZ28gYWxvbmcsIG5vIHN1Y2ggc2lnaHQgdG8gYmUgc2hvd24sCiAgICBCdXQgdG8gcmVqb2ljZSBpbiBzcGxlbmRvciBvZiBtaW5lIG93bi4KCiAgICBFeGV1bnQKClNDRU5FIElJSS4gQSByb29tIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgTnVyc2UsIHdoZXJlJ3MgbXkgZGF1Z2h0ZXIIGNhbGwgaGVyIGZvcnRoIHRvIG1lLgoKTnVyc2UKCiAgICBOb3csIGJ5IG15IG1haWRlbmhlYWQsIGF0IHR3ZWx2ZSB5ZWFyIG9sZCwKICAgIEkgYmFkZSBoZXIgY29tZS4gV2hhdCwgbGFtYiEgd2hhdCwgbGFkeWJpcmQhCiAgICBHb2QgZm9yYmlkISBXaGVyZSdzIHRoaXMgZ2lybD8gV2hhdCwgSnVsaWV0IQoKICAgIEVudGVyIEpVTElFVAoKSlVMSUVUCgogICAgSG93IG5vdyEgd2hvIGNhbGxzPwoKTnVyc2UKCiAgICBZb3VyIG1vdGhlci4KCkpVTElFVAoKICAgIE1hZGFtLCBJIGFtIGhlcmUuCiAgICBXaGF0IGlzIHlvdXIgd2lsbD8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoaXMgaXMgdGhlIG1hdHRlcjotLU51cnNlLCBnaXZlIGxlYXZlIGF3aGlsZSwKICAgIFdlIG11c3QgdGFsayBpbiBzZWNyZXQ6LS1udXJzZSwgY29tZSBiYWNrIGFnYWluOwogICAgSSBoYXZlIHJlbWVtYmVyJ2QgbWUsIHRob3UncyBoZWFyIG91ciBjb3Vuc2VsLgogICAgVGhvdSBrbm93J3N0IG15IGRhdWdodGVyJ3Mgb2YgYSBwcmV0dHkgYWdlLgoKTnVyc2UKCiAgICBGYWl0aCwgSSBjYW4gdGVsbCBoZXIgYWdlIHVudG8gYW4gaG91ci4KCkxBRFkgQ0FQVUxFVAoKICAgIFNoZSdzIG5vdCBmb3VydGVlbi4KCk51cnNlCgogICAgSSdsbCBsYXkgZm91cnRlZW4gb2YgbXkgdGVldGgsLS0KICAgIEFuZCB5ZXQsIHRvIG15IHRlZXRoIGJlIGl0IHNwb2tlbiwgSSBoYXZlIGJ1dCBmb3VyLS0KICAgIFNoZSBpcyBub3QgZm91cnRlZW4uIEhvdyBsb25nIGlzIGl0IG5vdwogICAgVG8gTGFtbWFzLXRpZGUCgpMQURZIENBUFVMRVQKCiAgICBBIGZvcnRuaWdodCBhbmQgb2RkIGRheXMuCgpOdXJzZQoKICAgIEV2ZW4gb3Igb2RkLCBvZiBhbGwgZGF5cyBpbiB0aGUgeWVhciwKICAgIENvbWUgTGFtbWFzLWV2ZSBhdCBuaWdodCBzaGFsbCBzaGUgYmUgZm91cnRlZW4uCiAgICBTdXNhbiBhbmQgc2hlLS1Hb2QgcmVzdCBhbGwgQ2hyaXN0aWFuIHNvdWxzIS0tCiAgICBXZXJlIG9mIGFuIGFnZTogd2VsbCwgU3VzYW4gaXMgd2l0aCBHb2Q7CiAgICBTaGUgd2FzIHRvbyBnb29kIGZvciBtZTogYnV0LCBhcyBJIHNhaWQsCiAgICBPbiBMYW1tYXMtZXZlIGF0IG5pZ2h0IHNoYWxsIHNoZSBiZSBmb3VydGVlbjsKICAgIFRoYXQgc2hhbGwgc2hlLCBtYXJyeTsgSSByZW1lbWJlciBpdCB3ZWxsLgogICAgJ1RpcyBzaW5jZSB0aGUgZWFydGhxdWFrZSBub3cgZWxldmVuIHllYXJzOwogICAgQW5kIHNoZSB3YXMgd2VhbidkLC0tSSBuZXZlciBzaGFsbCBmb3JnZXQgaXQsLS0KICAgIE9mIGFsbCB0aGUgZGF5cyBvZiB0aGUgeWVhciwgdXBvbiB0aGF0IGRheToKICAgIEZvciBJIGhhZCB0aGVuIGxhaWQgd29ybXdvb2QgdG8gbXkgZHVnLAogICAgU2l0dGluZyBpbiB0aGUgc3VuIHVuZGVyIHRoZSBkb3ZlLWhvdXNlIHdhbGw7CiAgICBNeSBsb3JkIGFuZCB5b3Ugd2VyZSB0aGVuIGF0IE1hbnR1YTotLQogICAgTmF5LCBJIGRvIGJlYXIgYSBicmFpbjotLWJ1dCwgYXMgSSBzYWlkLAogICAgV2hlbiBpdCBkaWQgdGFzdGUgdGhlIHdvcm13b29kIG9uIHRoZSBuaXBwbGUKICAgIE9mIG15IGR1ZyBhbmQgZmVsdCBpdCBiaXR0ZXIsIHByZXR0eSBmb29sLAogICAgVG8gc2VlIGl0IHRldGNoeSBhbmQgZmFsbCBvdXQgd2l0aCB0aGUgZHVnIQogICAgU2hha2UgcXVvdGggdGhlIGRvdmUtaG91c2U6ICd0d2FzIG5vIG5lZWQsIEkgdHJvdywKICAgIFRvIGJpZCBtZSB0cnVkZ2U6CiAgICBBbmQgc2luY2UgdGhhdCB0aW1lIGl0IGlzIGVsZXZlbiB5ZWFyczsKICAgIEZvciB0aGVuIHNoZSBjb3VsZCBzdGFuZCBhbG9uZTsgbmF5LCBieSB0aGUgcm9vZCwKICAgIFNoZSBjb3VsZCBoYXZlIHJ1biBhbmQgd2FkZGxlZCBhbGwgYWJvdXQ7CiAgICBGb3IgZXZlbiB0aGUgZGF5IGJlZm9yZSwgc2hlIGJyb2tlIGhlciBicm93OgogICAgQW5kIHRoZW4gbXkgaHVzYmFuZC0tR29kIGJlIHdpdGggaGlzIHNvdWwhCiAgICBBJyB3YXMgYSBtZXJyeSBtYW4tLXRvb2sgdXAgdGhlIGNoaWxkOgogICAgJ1llYSwnIHF1b3RoIGhlLCAnZG9zdCB0aG91IGZhbGwgdXBvbiB0aHkgZmFjZT8KICAgIFRob3Ugd2lsdCBmYWxsIGJhY2t3YXJkIHdoZW4gdGhvdSBoYXN0IG1vcmUgd2l0OwogICAgV2lsdCB0aG91IG5vdCwgSnVsZT8nIGFuZCwgYnkgbXkgaG9saWRhbWUsCiAgICBUaGUgcHJldHR5IHdyZXRjaCBsZWZ0IGNyeWluZyBhbmQgc2FpZCAnQXkuJwogICAgVG8gc2VlLCBub3csIGhvdyBhIGplc3Qgc2hhbGwgY29tZSBhYm91dCEKICAgIEkgd2FycmFudCwgYW4gSSBzaG91bGQgbGl2ZSBhIHRob3VzYW5kIHllYXJzLAogICAgSSBuZXZlciBzaG91bGQgZm9yZ2V0IGl0OiAnV2lsdCB0aG91IG5vdCwgSnVsZT8nIHF1b3RoIGhlOwogICAgQW5kLCBwcmV0dHkgZm9vbCwgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKTEFEWSBDQVBVTEVUCgogICAgRW5vdWdoIG9mIHRoaXM7IEkgcHJheSB0aGVlLCBob2xkIHRoeSBwZWFjZS4KCk51cnNlCgogICAgWWVzLCBtYWRhbTogeWV0IEkgY2Fubm90IGNob29zZSBidXQgbGF1Z2gsCiAgICBUbyB0aGluayBpdCBzaG91bGQgbGVhdmUgY3J5aW5nIGFuZCBzYXkgJ0F5LicKICAgIEFuZCB5ZXQsIEkgd2FycmFudCwgaXQgaGFkIHVwb24gaXRzIGJyb3cKICAgIEEgYnVtcCBhcyBiaWcgYXMgYSB5b3VuZyBjb2NrZXJlbCdzIHN0b25lOwogICAgQSBwYXJsb3VzIGtub2NrOyBhbmQgaXQgY3JpZWQgYml0dGVybHk6CiAgICAnWWVhLCcgcXVvdGggbXkgaHVzYmFuZCwnZmFsbCdzdCB1cG9uIHRoeSBmYWNlPwogICAgVGhvdSB3aWx0IGZhbGwgYmFja3dhcmQgd2hlbiB0aG91IGNvbWVzdCB0byBhZ2U7CiAgICBXaWx0IHRob3Ugbm90LCBKdWxlPycgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKSlVMSUVUCgogICAgQW5kIHN0aW50IHRob3UgdG9vLCBJIHByYXkgdGhlZSwgbnVyc2UsIHNheSBJLgoKTnVyc2UKCiAgICBQZWFjZSwgSSBoYXZlIGRvbmUuIEdvZCBtYXJrIHRoZWUgdG8gaGlzIGdyYWNlIQogICAgVGhvdSB3YXN0IHRoZSBwcmV0dGllc3QgYmFiZSB0aGF0IGUnZXIgSSBudXJzZWQ6CiAgICBBbiBJIG1pZ2h0IGxpdmUgdG8gc2VlIHRoZWUgbWFycmllZCBvbmNlLAogICAgSSBoYXZlIG15IHdpc2guCgpMQURZIENBUFVMRVQKCiAgICBNYXJyeSwgdGhhdCAnbWFycnknIGlzIHRoZSB2ZXJ5IHRoZW1lCiAgICBJIGNhbWUgdG8gdGFsayBvZi4gVGVsbCBtZSwgZGF1Z2h0ZXIgSnVsaWV0LAogICAgSG93IHN0YW5kcyB5b3VyIGRpc3Bvc2l0aW9uIHRvIGJlIG1hcnJpZWQCgpKVUxJRVQKCiAgICBJdCBpcyBhbiBob25vdXIgdGhhdCBJIGRyZWFtIG5vdCBvZi4KCk51cnNlCgogICAgQW4gaG9ub3VyISB3ZXJlIG5vdCBJIHRoaW5lIG9ubHkgbnVyc2UsCiAgICBJIHdvdWxkIHNheSB0aG91IGhhZHN0IHN1Y2snZCB3aXNkb20gZnJvbSB0aHkgdGVhdC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHRoaW5rIG9mIG1hcnJpYWdlIG5vdzsgeW91bmdlciB0aGFuIHlvdSwKICAgIEhlcmUgaW4gVmVyb25hLCBsYWRpZXMgb2YgZXN0ZWVtLAogICAgQXJlIG1hZGUgYWxyZWFkeSBtb3RoZXJzOiBieSBteSBjb3VudCwKICAgIEkgd2FzIHlvdXIgbW90aGVyIG11Y2ggdXBvbiB0aGVzZSB5ZWFycwogICAgVGhhdCB5b3UgYXJlIG5vdyBhIG1haWQuIFRodXMgdGhlbiBpbiBicmllZjoKICAgIFRoZSB2YWxpYW50IFBhcmlzIHNlZWtzIHlvdSBmb3IgaGlzIGxvdmUuCgpOdXJzZQoKICAgIEEgbWFuLCB5b3VuZyBsYWR5ISBsYWR5LCBzdWNoIGEgbWFuCiAgICBBcyBhbGwgdGhlIHdvcmxkLS13aHksIGhlJ3MgYSBtYW4gb2Ygd2F4LgoKTEFEWSBDQVBVTEVUCgogICAgVmVyb25hJ3Mgc3VtbWVyIGhhdGggbm90IHN1Y2ggYSBmbG93ZXIuCgpOdXJzZQoKICAgIE5heSwgaGUncyBhIGZsb3dlcjsgaW4gZmFpdGgsIGEgdmVyeSBmbG93ZXIuCgpMQURZIENBUFVMRVQKCiAgICBXaGF0IHNheSB5b3UIGNhbiB5b3UgbG92ZSB0aGUgZ2VudGxlbWFuPwogICAgVGhpcyBuaWdodCB5b3Ugc2hhbGwgYmVob2xkIGhpbSBhdCBvdXIgZmVhc3Q7CiAgICBSZWFkIG8nZXIgdGhlIHZvbHVtZSBvZiB5b3VuZyBQYXJpcycgZmFjZSwKICAgIEFuZCBmaW5kIGRlbGlnaHQgd3JpdCB0aGVyZSB3aXRoIGJlYXV0eSdzIHBlbjsKICAgIEV4YW1pbmUgZXZlcnkgbWFycmllZCBsaW5lYW1lbnQsCiAgICBBbmQgc2VlIGhvdyBvbmUgYW5vdGhlciBsZW5kcyBjb250ZW50CiAgICBBbmQgd2hhdCBvYnNjdXJlZCBpbiB0aGlzIGZhaXIgdm9sdW1lIGxpZXMKICAgIEZpbmQgd3JpdHRlbiBpbiB0aGUgbWFyZ2VudCBvZiBoaXMgZXllcy4KICAgIFRoaXMgcHJlY2lvdXMgYm9vayBvZiBsb3ZlLCB0aGlzIHVuYm91bmQgbG92ZXIsCiAgICBUbyBiZWF1dGlmeSBoaW0sIG9ubHkgbGFja3MgYSBjb3ZlcjoKICAgIFRoZSBmaXNoIGxpdmVzIGluIHRoZSBzZWEsIGFuZCAndGlzIG11Y2ggcHJpZGUKICAgIEZvciBmYWlyIHdpdGhvdXQgdGhlIGZhaXIgd2l0aGluIHRvIGhpZGU6CiAgICBUaGF0IGJvb2sgaW4gbWFueSdzIGV5ZXMgZG90aCBzaGFyZSB0aGUgZ2xvcnksCiAgICBUaGF0IGluIGdvbGQgY2xhc3BzIGxvY2tzIGluIHRoZSBnb2xkZW4gc3Rvcnk7CiAgICBTbyBzaGFsbCB5b3Ugc2hhcmUgYWxsIHRoYXQgaGUgZG90aCBwb3NzZXNzLAogICAgQnkgaGF2aW5nIGhpbSwgbWFraW5nIHlvdXJzZWxmIG5vIGxlc3MuCgpOdXJzZQoKICAgIE5vIGxlc3MhIG5heSwgYmlnZ2VyOyB3b21lbiBncm93IGJ5IG1lbi4KCkxBRFkgQ0FQVUxFVAoKICAgIFNwZWFrIGJyaWVmbHksIGNhbiB5b3UgbGlrZSBvZiBQYXJpcycgbG92ZT8KCkpVTElFVAoKICAgIEknbGwgbG9vayB0byBsaWtlLCBpZiBsb29raW5nIGxpa2luZyBtb3ZlOgogICAgQnV0IG5vIG1vcmUgZGVlcCB3aWxsIEkgZW5kYXJ0IG1pbmUgZXllCiAgICBUaGFuIHlvdXIgY29uc2VudCBnaXZlcyBzdHJlbmd0aCB0byBtYWtlIGl0IGZseS4KCiAgICBFbnRlciBhIFNlcnZhbnQKClNlcnZhbnQKCiAgICBNYWRhbSwgdGhlIGd1ZXN0cyBhcmUgY29tZSwgc3VwcGVyIHNlcnZlZCB1cCwgeW91CiAgICBjYWxsZWQsIG15IHlvdW5nIGxhZHkgYXNrZWQgZm9yLCB0aGUgbnVyc2UgY3Vyc2VkIGluCiAgICB0aGUgcGFudHJ5LCBhbmQgZXZlcnkgdGhpbmcgaW4gZXh0cmVtaXR5LiBJIG11c3QKICAgIGhlbmNlIHRvIHdhaXQ7IEkgYmVzZWVjaCB5b3UsIGZvbGxvdyBzdHJhaWdodC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlIGZvbGxvdyB0aGVlLgoKICAgIEV4aXQgU2VydmFudAogICAgSnVsaWV0LCB0aGUgY291bnR5IHN0YXlzLgoKTnVyc2UKCiAgICBHbywgZ2lybCwgc2VlayBoYXBweSBuaWdodHMgdG8gaGFwcHkgZGF5cy4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBST01FTywgTUVSQ1VUSU8sIEJFTlZPTElPLCB3aXRoIGZpdmUgb3Igc2l4IE1hc2tlcnMsIFRvcmNoLWJlYXJlcnMsIGFuZCBvdGhlcnMgCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIHRoaXMgc3BlZWNoIGJlIHNwb2tlIGZvciBvdXIgZXhjdXNlPwogICAgT3Igc2hhbGwgd2Ugb24gd2l0aG91dCBhIGFwb2xvZ3kCgpCRU5WT0xJTwoKICAgIFRoZSBkYXRlIGlzIG91dCBvZiBzdWNoIHByb2xpeGl0eToKICAgIFdlJ2xsIGhhdmUgbm8gQ3VwaWQgaG9vZHdpbmsnZCB3aXRoIGEgc2NhcmYsCiAgICBCZWFyaW5nIGEgVGFydGFyJ3MgcGFpbnRlZCBib3cgb2YgbGF0aCwKICAgIFNjYXJpbmcgdGhlIGxhZGllcyBsaWtlIGEgY3Jvdy1rZWVwZXI7CiAgICBOb3Igbm8gd2l0aG91dC1ib29rIHByb2xvZ3VlLCBmYWludGx5IHNwb2tlCiAgICBBZnRlciB0aGUgcHJvbXB0ZXIsIGZvciBvdXIgZW50cmFuY2U6CiAgICBCdXQgbGV0IHRoZW0gbWVhc3VyZSB1cyBieSB3aGF0IHRoZXkgd2lsbDsKICAgIFdlJ2xsIG1lYXN1cmUgdGhlbSBhIG1lYXN1cmUsIGFuZCBiZSBnb25lLgoKUk9NRU8KCiAgICBHaXZlIG1lIGEgdG9yY2g6IEkgYW0gbm90IGZvciB0aGlzIGFtYmxpbmc7CiAgICBCZWluZyBidXQgaGVhdnksIEkgd2lsbCBiZWFyIHRoZSBsaWdodC4KCk1FUkNVVElPCgogICAgTmF5LCBnZW50bGUgUm9tZW8sIHdlIG11c3QgaGF2ZSB5b3UgZGFuY2UuCgpST01FTwoKICAgIE5vdCBJLCBiZWxpZXZlIG1lOiB5b3UgaGF2ZSBkYW5jaW5nIHNob2VzCiAgICBXaXRoIG5pbWJsZSBzb2xlczogSSBoYXZlIGEgc291bCBvZiBsZWFkCiAgICBTbyBzdGFrZXMgbWUgdG8gdGhlIGdyb3VuZCBJIGNhbm5vdCBtb3ZlLgoKTUVSQ1VUSU8KCiAgICBZb3UgYXJlIGEgbG92ZXI7IGJvcnJvdyBDdXBpZCdzIHdpbmdzLAogICAgQW5kIHNvYXIgd2l0aCB0aGVtIGFib3ZlIGEgY29tbW9uIGJvdW5kLgoKUk9NRU8KCiAgICBJIGFtIHRvbyBzb3JlIGVucGllcmNlZCB3aXRoIGhpcyBzaGFmdAogICAgVG8gc29hciB3aXRoIGhpcyBsaWdodCBmZWF0aGVycywgYW5kIHNvIGJvdW5kLAogICAgSSBjYW5ub3QgYm91bmQgYSBwaXRjaCBhYm92ZSBkdWxsIHdvZToKICAgIFVuZGVyIGxvdmUncyBoZWF2eSBidXJkZW4gZG8gSSBzaW5rLgoKTUVSQ1VUSU8KCiAgICBBbmQsIHRvIHNpbmsgaW4gaXQsIHNob3VsZCB5b3UgYnVyZGVuIGxvdmU7CiAgICBUb28gZ3JlYXQgb3BwcmVzc2lvbiBmb3IgYSB0ZW5kZXIgdGhpbmcuCgpST01FTwoKICAgIElzIGxvdmUgYSB0ZW5kZXIgdGhpbmcIGl0IGlzIHRvbyByb3VnaCwKICAgIFRvbyBydWRlLCB0b28gYm9pc3Rlcm91cywgYW5kIGl0IHByaWNrcyBsaWtlIHRob3JuLgoKTUVSQ1VUSU8KCiAgICBJZiBsb3ZlIGJlIHJvdWdoIHdpdGggeW91LCBiZSByb3VnaCB3aXRoIGxvdmU7CiAgICBQcmljayBsb3ZlIGZvciBwcmlja2luZywgYW5kIHlvdSBiZWF0IGxvdmUgZG93bi4KICAgIEdpdmUgbWUgYSBjYXNlIHRvIHB1dCBteSB2aXNhZ2UgaW46CiAgICBBIHZpc29yIGZvciBhIHZpc29yISB3aGF0IGNhcmUgSQogICAgV2hhdCBjdXJpb3VzIGV5ZSBkb3RoIHF1b3RlIGRlZm9ybWl0aWVzPwogICAgSGVyZSBhcmUgdGhlIGJlZXRsZSBicm93cyBzaGFsbCBibHVzaCBmb3IgbWUuCgpCRU5WT0xJTwoKICAgIENvbWUsIGtub2NrIGFuZCBlbnRlcjsgYW5kIG5vIHNvb25lciBpbiwKICAgIEJ1dCBldmVyeSBtYW4gYmV0YWtlIGhpbSB0byBoaXMgbGVncy4KClJPTUVPCgogICAgQSB0b3JjaCBmb3IgbWU6IGxldCB3YW50b25zIGxpZ2h0IG9mIGhlYXJ0CiAgICBUaWNrbGUgdGhlIHNlbnNlbGVzcyBydXNoZXMgd2l0aCB0aGVpciBoZWVscywKICAgIEZvciBJIGFtIHByb3ZlcmInZCB3aXRoIGEgZ3JhbmRzaXJlIHBocmFzZTsKICAgIEknbGwgYmUgYSBjYW5kbGUtaG9sZGVyLCBhbmQgbG9vayBvbi4KICAgIFRoZSBnYW1lIHdhcyBuZSdlciBzbyBmYWlyLCBhbmQgSSBhbSBkb25lLgoKTUVSQ1VUSU8KCiAgICBUdXQsIGR1bidzIHRoZSBtb3VzZSwgdGhlIGNvbnN0YWJsZSdzIG93biB3b3JkOgogICAgSWYgdGhvdSBhcnQgZHVuLCB3ZSdsbCBkcmF3IHRoZWUgZnJvbSB0aGUgbWlyZQogICAgT2YgdGhpcyBzaXItcmV2ZXJlbmNlIGxvdmUsIHdoZXJlaW4gdGhvdSBzdGljaydzdAogICAgVXAgdG8gdGhlIGVhcnMuIENvbWUsIHdlIGJ1cm4gZGF5bGlnaHQsIGhvIQoKUk9NRU8KCiAgICBOYXksIHRoYXQncyBub3Qgc28uCgpNRVJDVVRJTwoKICAgIEkgbWVhbiwgc2lyLCBpbiBkZWxheQogICAgV2Ugd2FzdGUgb3VyIGxpZ2h0cyBpbiB2YWluLCBsaWtlIGxhbXBzIGJ5IGRheS4KICAgIFRha2Ugb3VyIGdvb2QgbWVhbmluZywgZm9yIG91ciBqdWRnbWVudCBzaXRzCiAgICBGaXZlIHRpbWVzIGluIHRoYXQgZXJlIG9uY2UgaW4gb3VyIGZpdmUgd2l0cy4KClJPTUVPCgogICAgQW5kIHdlIG1lYW4gd2VsbCBpbiBnb2luZyB0byB0aGlzIG1hc2s7CiAgICBCdXQgJ3RpcyBubyB3aXQgdG8gZ28uCgpNRVJDVVRJTwoKICAgIFdoeSwgbWF5IG9uZSBhc2sCgpST01FTwoKICAgIEkgZHJlYW0nZCBhIGRyZWFtIHRvLW5pZ2h0LgoKTUVSQ1VUSU8KCiAgICBBbmQgc28gZGlkIEkuCgpST01FTwoKICAgIFdlbGwsIHdoYXQgd2FzIHlvdXJzPwoKTUVSQ1VUSU8KCiAgICBUaGF0IGRyZWFtZXJzIG9mdGVuIGxpZS4KClJPTUVPCgogICAgSW4gYmVkIGFzbGVlcCwgd2hpbGUgdGhleSBkbyBkcmVhbSB0aGluZ3MgdHJ1ZS4KCk1FUkNVVElPCgogICAgTywgdGhlbiwgSSBzZWUgUXVlZW4gTWFiIGhhdGggYmVlbiB3aXRoIHlvdS4KICAgIFNoZSBpcyB0aGUgZmFpcmllcycgbWlkd2lmZSwgYW5kIHNoZSBjb21lcwogICAgSW4gc2hhcGUgbm8gYmlnZ2VyIHRoYW4gYW4gYWdhdGUtc3RvbmUKICAgIE9uIHRoZSBmb3JlLWZpbmdlciBvZiBhbiBhbGRlcm1hbiwKICAgIERyYXduIHdpdGggYSB0ZWFtIG9mIGxpdHRsZSBhdG9taWVzCiAgICBBdGh3YXJ0IG1lbidzIG5vc2VzIGFzIHRoZXkgbGllIGFzbGVlcDsKICAgIEhlciB3YWdvbi1zcG9rZXMgbWFkZSBvZiBsb25nIHNwaWRlcnMnIGxlZ3MsCiAgICBUaGUgY292ZXIgb2YgdGhlIHdpbmdzIG9mIGdyYXNzaG9wcGVycywKICAgIFRoZSB0cmFjZXMgb2YgdGhlIHNtYWxsZXN0IHNwaWRlcidzIHdlYiwKICAgIFRoZSBjb2xsYXJzIG9mIHRoZSBtb29uc2hpbmUncyB3YXRlcnkgYmVhbXMsCiAgICBIZXIgd2hpcCBvZiBjcmlja2V0J3MgYm9uZSwgdGhlIGxhc2ggb2YgZmlsbSwKICAgIEhlciB3YWdvbmVyIGEgc21hbGwgZ3JleS1jb2F0ZWQgZ25hdCwKICAgIE5vdCBzbyBiaWcgYXMgYSByb3VuZCBsaXR0bGUgd29ybQogICAgUHJpY2snZCBmcm9tIHRoZSBsYXp5IGZpbmdlciBvZiBhIG1haWQ7CiAgICBIZXIgY2hhcmlvdCBpcyBhbiBlbXB0eSBoYXplbC1udXQKICAgIE1hZGUgYnkgdGhlIGpvaW5lciBzcXVpcnJlbCBvciBvbGQgZ3J1YiwKICAgIFRpbWUgb3V0IG8nIG1pbmQgdGhlIGZhaXJpZXMnIGNvYWNobWFrZXJzLgogICAgQW5kIGluIHRoaXMgc3RhdGUgc2hlIGdhbGxvcHMgbmlnaHQgYnkgbmlnaHQKICAgIFRocm91Z2ggbG92ZXJzJyBicmFpbnMsIGFuZCB0aGVuIHRoZXkgZHJlYW0gb2YgbG92ZTsKICAgIE8nZXIgY291cnRpZXJzJyBrbmVlcywgdGhhdCBkcmVhbSBvbiBjb3VydCdzaWVzIHN0cmFpZ2h0LAogICAgTydlciBsYXd5ZXJzJyBmaW5nZXJzLCB3aG8gc3RyYWlnaHQgZHJlYW0gb24gZmVlcywKICAgIE8nZXIgbGFkaWVzICcgbGlwcywgd2hvIHN0cmFpZ2h0IG9uIGtpc3NlcyBkcmVhbSwKICAgIFdoaWNoIG9mdCB0aGUgYW5ncnkgTWFiIHdpdGggYmxpc3RlcnMgcGxhZ3VlcywKICAgIEJlY2F1c2UgdGhlaXIgYnJlYXRocyB3aXRoIHN3ZWV0bWVhdHMgdGFpbnRlZCBhcmU6CiAgICBTb21ldGltZSBzaGUgZ2FsbG9wcyBvJ2VyIGEgY291cnRpZXIncyBub3NlLAogICAgQW5kIHRoZW4gZHJlYW1zIGhlIG9mIHNtZWxsaW5nIG91dCBhIHN1aXQ7CiAgICBBbmQgc29tZXRpbWUgY29tZXMgc2hlIHdpdGggYSB0aXRoZS1waWcncyB0YWlsCiAgICBUaWNrbGluZyBhIHBhcnNvbidzIG5vc2UgYXMgYScgbGllcyBhc2xlZXAsCiAgICBUaGVuIGRyZWFtcywgaGUgb2YgYW5vdGhlciBiZW5lZmljZToKICAgIFNvbWV0aW1lIHNoZSBkcml2ZXRoIG8nZXIgYSBzb2xkaWVyJ3MgbmVjaywKICAgIEFuZCB0aGVuIGRyZWFtcyBoZSBvZiBjdXR0aW5nIGZvcmVpZ24gdGhyb2F0cywKICAgIE9mIGJyZWFjaGVzLCBhbWJ1c2NhZG9lcywgU3BhbmlzaCBibGFkZXMsCiAgICBPZiBoZWFsdGhzIGZpdmUtZmF0aG9tIGRlZXA7IGFuZCB0aGVuIGFub24KICAgIERydW1zIGluIGhpcyBlYXIsIGF0IHdoaWNoIGhlIHN0YXJ0cyBhbmQgd2FrZXMsCiAgICBBbmQgYmVpbmcgdGh1cyBmcmlnaHRlZCBzd2VhcnMgYSBwcmF5ZXIgb3IgdHdvCiAgICBBbmQgc2xlZXBzIGFnYWluLiBUaGlzIGlzIHRoYXQgdmVyeSBNYWIKICAgIFRoYXQgcGxhdHMgdGhlIG1hbmVzIG9mIGhvcnNlcyBpbiB0aGUgbmlnaHQsCiAgICBBbmQgYmFrZXMgdGhlIGVsZmxvY2tzIGluIGZvdWwgc2x1dHRpc2ggaGFpcnMsCiAgICBXaGljaCBvbmNlIHVudGFuZ2xlZCwgbXVjaCBtaXNmb3J0dW5lIGJvZGVzOgogICAgVGhpcyBpcyB0aGUgaGFnLCB3aGVuIG1haWRzIGxpZSBvbiB0aGVpciBiYWNrcywKICAgIFRoYXQgcHJlc3NlcyB0aGVtIGFuZCBsZWFybnMgdGhlbSBmaXJzdCB0byBiZWFyLAogICAgTWFraW5nIHRoZW0gd29tZW4gb2YgZ29vZCBjYXJyaWFnZToKICAgIFRoaXMgaXMgc2hlLS0KClJPTUVPCgogICAgUGVhY2UsIHBlYWNlLCBNZXJjdXRpbywgcGVhY2UhCiAgICBUaG91IHRhbGsnc3Qgb2Ygbm90aGluZy4KCk1FUkNVVElPCgogICAgVHJ1ZSwgSSB0YWxrIG9mIGRyZWFtcywKICAgIFdoaWNoIGFyZSB0aGUgY2hpbGRyZW4gb2YgYW4gaWRsZSBicmFpbiwKICAgIEJlZ290IG9mIG5vdGhpbmcgYnV0IHZhaW4gZmFudGFzeSwKICAgIFdoaWNoIGlzIGFzIHRoaW4gb2Ygc3Vic3RhbmNlIGFzIHRoZSBhaXIKICAgIEFuZCBtb3JlIGluY29uc3RhbnQgdGhhbiB0aGUgd2luZCwgd2hvIHdvb2VzCiAgICBFdmVuIG5vdyB0aGUgZnJvemVuIGJvc29tIG9mIHRoZSBub3J0aCwKICAgIEFuZCwgYmVpbmcgYW5nZXInZCwgcHVmZnMgYXdheSBmcm9tIHRoZW5jZSwKICAgIFR1cm5pbmcgaGlzIGZhY2UgdG8gdGhlIGRldy1kcm9wcGluZyBzb3V0aC4KCkJFTlZPTElPCgogICAgVGhpcyB3aW5kLCB5b3UgdGFsayBvZiwgYmxvd3MgdXMgZnJvbSBvdXJzZWx2ZXM7CiAgICBTdXBwZXIgaXMgZG9uZSwgYW5kIHdlIHNoYWxsIGNvbWUgdG9vIGxhdGUuCgpST01FTwoKICAgIEkgZmVhciwgdG9vIGVhcmx5OiBmb3IgbXkgbWluZCBtaXNnaXZlcwogICAgU29tZSBjb25zZXF1ZW5jZSB5ZXQgaGFuZ2luZyBpbiB0aGUgc3RhcnMKICAgIFNoYWxsIGJpdHRlcmx5IGJlZ2luIGhpcyBmZWFyZnVsIGRhdGUKICAgIFdpdGggdGhpcyBuaWdodCdzIHJldmVscyBhbmQgZXhwaXJlIHRoZSB0ZXJtCiAgICBPZiBhIGRlc3Bpc2VkIGxpZmUgY2xvc2VkIGluIG15IGJyZWFzdAogICAgQnkgc29tZSB2aWxlIGZvcmZlaXQgb2YgdW50aW1lbHkgZGVhdGguCiAgICBCdXQgSGUsIHRoYXQgaGF0aCB0aGUgc3RlZXJhZ2Ugb2YgbXkgY291cnNlLAogICAgRGlyZWN0IG15IHNhaWwhIE9uLCBsdXN0eSBnZW50bGVtZW4uCgpCRU5WT0xJTwoKICAgIFN0cmlrZSwgZHJ1bS4KCiAgICBFeGV1bnQKClNDRU5FIFYuIEEgaGFsbCBpbiBDYXB1bGV0J3MgaG91c2UuCgogICAgTXVzaWNpYW5zIHdhaXRpbmcuIEVudGVyIFNlcnZpbmdtZW4gd2l0aCBuYXBraW5zIAoKRmlyc3QgU2VydmFudAoKICAgIFdoZXJlJ3MgUG90cGFuLCB0aGF0IGhlIGhlbHBzIG5vdCB0byB0YWtlIGF3YXkIEhlCiAgICBzaGlmdCBhIHRyZW5jaGVyPyBoZSBzY3JhcGUgYSB0cmVuY2hlciEKClNlY29uZCBTZXJ2YW50CgogICAgV2hlbiBnb29kIG1hbm5lcnMgc2hhbGwgbGllIGFsbCBpbiBvbmUgb3IgdHdvIG1lbidzCiAgICBoYW5kcyBhbmQgdGhleSB1bndhc2hlZCB0b28sICd0aXMgYSBmb3VsIHRoaW5nLgoKRmlyc3QgU2VydmFudAoKICAgIEF3YXkgd2l0aCB0aGUgam9pbnQtc3Rvb2xzLCByZW1vdmUgdGhlCiAgICBjb3VydC1jdXBib2FyZCwgbG9vayB0byB0aGUgcGxhdGUuIEdvb2QgdGhvdSwgc2F2ZQogICAgbWUgYSBwaWVjZSBvZiBtYXJjaHBhbmU7IGFuZCwgYXMgdGhvdSBsb3Zlc3QgbWUsIGxldAogICAgdGhlIHBvcnRlciBsZXQgaW4gU3VzYW4gR3JpbmRzdG9uZSBhbmQgTmVsbC4KICAgIEFudG9ueSwgYW5kIFBvdHBhbiEKClNlY29uZCBTZXJ2YW50CgogICAgQXksIGJveSwgcmVhZHkuCgpGaXJzdCBTZXJ2YW50CgogICAgWW91IGFyZSBsb29rZWQgZm9yIGFuZCBjYWxsZWQgZm9yLCBhc2tlZCBmb3IgYW5kCiAgICBzb3VnaHQgZm9yLCBpbiB0aGUgZ3JlYXQgY2hhbWJlci4KClNlY29uZCBTZXJ2YW50CgogICAgV2UgY2Fubm90IGJlIGhlcmUgYW5kIHRoZXJlIHRvby4gQ2hlZXJseSwgYm95czsgYmUKICAgIGJyaXNrIGF3aGlsZSwgYW5kIHRoZSBsb25nZXIgbGl2ZXIgdGFrZSBhbGwuCgogICAgRW50ZXIgQ0FQVUxFVCwgd2l0aCBKVUxJRVQgYW5kIG90aGVycyBvZiBoaXMgaG91c2UsIG1lZXRpbmcgdGhlIEd1ZXN0cyBhbmQgTWFza2VycwoKQ0FQVUxFVAoKICAgIFdlbGNvbWUsIGdlbnRsZW1lbiEgbGFkaWVzIHRoYXQgaGF2ZSB0aGVpciB0b2VzCiAgICBVbnBsYWd1ZWQgd2l0aCBjb3JucyB3aWxsIGhhdmUgYSBib3V0IHdpdGggeW91LgogICAgQWggaGEsIG15IG1pc3RyZXNzZXMhIHdoaWNoIG9mIHlvdSBhbGwKICAgIFdpbGwgbm93IGRlbnkgdG8gZGFuY2UIHNoZSB0aGF0IG1ha2VzIGRhaW50eSwKICAgIFNoZSwgSSdsbCBzd2VhciwgaGF0aCBjb3JuczsgYW0gSSBjb21lIG5lYXIgeWUgbm93PwogICAgV2VsY29tZSwgZ2VudGxlbWVuISBJIGhhdmUgc2VlbiB0aGUgZGF5CiAgICBUaGF0IEkgaGF2ZSB3b3JuIGEgdmlzb3IgYW5kIGNvdWxkIHRlbGwKICAgIEEgd2hpc3BlcmluZyB0YWxlIGluIGEgZmFpciBsYWR5J3MgZWFyLAogICAgU3VjaCBhcyB3b3VsZCBwbGVhc2U6ICd0aXMgZ29uZSwgJ3RpcyBnb25lLCAndGlzIGdvbmU6CiAgICBZb3UgYXJlIHdlbGNvbWUsIGdlbnRsZW1lbiEgY29tZSwgbXVzaWNpYW5zLCBwbGF5LgogICAgQSBoYWxsLCBhIGhhbGwhIGdpdmUgcm9vbSEgYW5kIGZvb3QgaXQsIGdpcmxzLgoKICAgIE11c2ljIHBsYXlzLCBhbmQgdGhleSBkYW5jZQogICAgTW9yZSBsaWdodCwgeW91IGtuYXZlczsgYW5kIHR1cm4gdGhlIHRhYmxlcyB1cCwKICAgIEFuZCBxdWVuY2ggdGhlIGZpcmUsIHRoZSByb29tIGlzIGdyb3duIHRvbyBob3QuCiAgICBBaCwgc2lycmFoLCB0aGlzIHVubG9vaydkLWZvciBzcG9ydCBjb21lcyB3ZWxsLgogICAgTmF5LCBzaXQsIG5heSwgc2l0LCBnb29kIGNvdXNpbiBDYXB1bGV0OwogICAgRm9yIHlvdSBhbmQgSSBhcmUgcGFzdCBvdXIgZGFuY2luZyBkYXlzOgogICAgSG93IGxvbmcgaXMndCBub3cgc2luY2UgbGFzdCB5b3Vyc2VsZiBhbmQgSQogICAgV2VyZSBpbiBhIG1hc2sCgpTZWNvbmQgQ2FwdWxldAoKICAgIEJ5J3IgbGFkeSwgdGhpcnR5IHllYXJzLgoKQ0FQVUxFVAoKICAgIFdoYXQsIG1hbiEgJ3RpcyBub3Qgc28gbXVjaCwgJ3RpcyBub3Qgc28gbXVjaDoKICAgICdUaXMgc2luY2UgdGhlIG51cHRpYWxzIG9mIEx1Y2VudGlvLAogICAgQ29tZSBwZW50ZWNvc3QgYXMgcXVpY2tseSBhcyBpdCB3aWxsLAogICAgU29tZSBmaXZlIGFuZCB0d2VudHkgeWVhcnM7IGFuZCB0aGVuIHdlIG1hc2snZC4KClNlY29uZCBDYXB1bGV0CgogICAgJ1RpcyBtb3JlLCAndGlzIG1vcmUsIGhpcyBzb24gaXMgZWxkZXIsIHNpcjsKICAgIEhpcyBzb24gaXMgdGhpcnR5LgoKQ0FQVUxFVAoKICAgIFdpbGwgeW91IHRlbGwgbWUgdGhhdD8KICAgIEhpcyBzb24gd2FzIGJ1dCBhIHdhcmQgdHdvIHllYXJzIGFnby4KClJPTUVPCgogICAgW1RvIGEgU2VydmluZ21hbl0gV2hhdCBsYWR5IGlzIHRoYXQsIHdoaWNoIGRvdGgKICAgIGVucmljaCB0aGUgaGFuZAogICAgT2YgeW9uZGVyIGtuaWdodD8KClNlcnZhbnQKCiAgICBJIGtub3cgbm90LCBzaXIuCgpST01FTwoKICAgIE8sIHNoZSBkb3RoIHRlYWNoIHRoZSB0b3JjaGVzIHRvIGJ1cm4gYnJpZ2h0IQogICAgSXQgc2VlbXMgc2hlIGhhbmdzIHVwb24gdGhlIGNoZWVrIG9mIG5pZ2h0CiAgICBMaWtlIGEgcmljaCBqZXdlbCBpbiBhbiBFdGhpb3BlJ3MgZWFyOwogICAgQmVhdXR5IHRvbyByaWNoIGZvciB1c2UsIGZvciBlYXJ0aCB0b28gZGVhciEKICAgIFNvIHNob3dzIGEgc25vd3kgZG92ZSB0cm9vcGluZyB3aXRoIGNyb3dzLAogICAgQXMgeW9uZGVyIGxhZHkgbydlciBoZXIgZmVsbG93cyBzaG93cy4KICAgIFRoZSBtZWFzdXJlIGRvbmUsIEknbGwgd2F0Y2ggaGVyIHBsYWNlIG9mIHN0YW5kLAogICAgQW5kLCB0b3VjaGluZyBoZXJzLCBtYWtlIGJsZXNzZWQgbXkgcnVkZSBoYW5kLgogICAgRGlkIG15IGhlYXJ0IGxvdmUgdGlsbCBub3cIGZvcnN3ZWFyIGl0LCBzaWdodCEKICAgIEZvciBJIG5lJ2VyIHNhdyB0cnVlIGJlYXV0eSB0aWxsIHRoaXMgbmlnaHQuCgpUWUJBTFQKCiAgICBUaGlzLCBieSBoaXMgdm9pY2UsIHNob3VsZCBiZSBhIE1vbnRhZ3VlLgogICAgRmV0Y2ggbWUgbXkgcmFwaWVyLCBib3kuIFdoYXQgZGFyZXMgdGhlIHNsYXZlCiAgICBDb21lIGhpdGhlciwgY292ZXInZCB3aXRoIGFuIGFudGljIGZhY2UsCiAgICBUbyBmbGVlciBhbmQgc2Nvcm4gYXQgb3VyIHNvbGVtbml0eT8KICAgIE5vdywgYnkgdGhlIHN0b2NrIGFuZCBob25vdXIgb2YgbXkga2luLAogICAgVG8gc3RyaWtlIGhpbSBkZWFkLCBJIGhvbGQgaXQgbm90IGEgc2luLgoKQ0FQVUxFVAoKICAgIFdoeSwgaG93IG5vdywga2luc21hbiEgd2hlcmVmb3JlIHN0b3JtIHlvdSBzbz8KClRZQkFMVAoKICAgIFVuY2xlLCB0aGlzIGlzIGEgTW9udGFndWUsIG91ciBmb2UsCiAgICBBIHZpbGxhaW4gdGhhdCBpcyBoaXRoZXIgY29tZSBpbiBzcGl0ZSwKICAgIFRvIHNjb3JuIGF0IG91ciBzb2xlbW5pdHkgdGhpcyBuaWdodC4KCkNBUFVMRVQKCiAgICBZb3VuZyBSb21lbyBpcyBpdD8KClRZQkFMVAoKICAgICdUaXMgaGUsIHRoYXQgdmlsbGFpbiBSb21lby4KCkNBUFVMRVQKCiAgICBDb250ZW50IHRoZWUsIGdlbnRsZSBjb3osIGxldCBoaW0gYWxvbmU7CiAgICBIZSBiZWFycyBoaW0gbGlrZSBhIHBvcnRseSBnZW50bGVtYW47CiAgICBBbmQsIHRvIHNheSB0cnV0aCwgVmVyb25hIGJyYWdzIG9mIGhpbQogICAgVG8gYmUgYSB2aXJ0dW91cyBhbmQgd2VsbC1nb3Zlcm4nZCB5b3V0aDoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd2VhbHRoIG9mIGFsbCB0aGUgdG93bgogICAgSGVyZSBpbiBteSBob3VzZSBkbyBoaW0gZGlzcGFyYWdlbWVudDoKICAgIFRoZXJlZm9yZSBiZSBwYXRpZW50LCB0YWtlIG5vIG5vdGUgb2YgaGltOgogICAgSXQgaXMgbXkgd2lsbCwgdGhlIHdoaWNoIGlmIHRob3UgcmVzcGVjdCwKICAgIFNob3cgYSBmYWlyIHByZXNlbmNlIGFuZCBwdXQgb2ZmIHRoZXNlIGZyb3ducywKICAgIEFuZCBpbGwtYmVzZWVtaW5nIHNlbWJsYW5jZSBmb3IgYSBmZWFzdC4KClRZQkFMVAoKICAgIEl0IGZpdHMsIHdoZW4gc3VjaCBhIHZpbGxhaW4gaXMgYSBndWVzdDoKICAgIEknbGwgbm90IGVuZHVyZSBoaW0uCgpDQVBVTEVUCgogICAgSGUgc2hhbGwgYmUgZW5kdXJlZDoKICAgIFdoYXQsIGdvb2RtYW4gYm95ISBJIHNheSwgaGUgc2hhbGw6IGdvIHRvOwogICAgQW0gSSB0aGUgbWFzdGVyIGhlcmUsIG9yIHlvdT8gZ28gdG8uCiAgICBZb3UnbGwgbm90IGVuZHVyZSBoaW0hIEdvZCBzaGFsbCBtZW5kIG15IHNvdWwhCiAgICBZb3UnbGwgbWFrZSBhIG11dGlueSBhbW9uZyBteSBndWVzdHMhCiAgICBZb3Ugd2lsbCBzZXQgY29jay1hLWhvb3AhIHlvdSdsbCBiZSB0aGUgbWFuIQoKVFlCQUxUCgogICAgV2h5LCB1bmNsZSwgJ3RpcyBhIHNoYW1lLgoKQ0FQVUxFVAoKICAgIEdvIHRvLCBnbyB0bzsKICAgIFlvdSBhcmUgYSBzYXVjeSBib3k6IGlzJ3Qgc28sIGluZGVlZD8KICAgIFRoaXMgdHJpY2sgbWF5IGNoYW5jZSB0byBzY2F0aGUgeW91LCBJIGtub3cgd2hhdDoKICAgIFlvdSBtdXN0IGNvbnRyYXJ5IG1lISBtYXJyeSwgJ3RpcyB0aW1lLgogICAgV2VsbCBzYWlkLCBteSBoZWFydHMhIFlvdSBhcmUgYSBwcmluY294OyBnbzoKICAgIEJlIHF1aWV0LCBvci0tTW9yZSBsaWdodCwgbW9yZSBsaWdodCEgRm9yIHNoYW1lIQogICAgSSdsbCBtYWtlIHlvdSBxdWlldC4gV2hhdCwgY2hlZXJseSwgbXkgaGVhcnRzIQoKVFlCQUxUCgogICAgUGF0aWVuY2UgcGVyZm9yY2Ugd2l0aCB3aWxmdWwgY2hvbGVyIG1lZXRpbmcKICAgIE1ha2VzIG15IGZsZXNoIHRyZW1ibGUgaW4gdGhlaXIgZGlmZmVyZW50IGdyZWV0aW5nLgogICAgSSB3aWxsIHdpdGhkcmF3OiBidXQgdGhpcyBpbnRydXNpb24gc2hhbGwKICAgIE5vdyBzZWVtaW5nIHN3ZWV0IGNvbnZlcnQgdG8gYml0dGVyIGdhbGwuCgogICAgRXhpdAoKUk9NRU8KCiAgICBbVG8gSlVMSUVUXSBJZiBJIHByb2ZhbmUgd2l0aCBteSB1bndvcnRoaWVzdCBoYW5kCiAgICBUaGlzIGhvbHkgc2hyaW5lLCB0aGUgZ2VudGxlIGZpbmUgaXMgdGhpczoKICAgIE15IGxpcHMsIHR3byBibHVzaGluZyBwaWxncmltcywgcmVhZHkgc3RhbmQKICAgIFRvIHNtb290aCB0aGF0IHJvdWdoIHRvdWNoIHdpdGggYSB0ZW5kZXIga2lzcy4KCkpVTElFVAoKICAgIEdvb2QgcGlsZ3JpbSwgeW91IGRvIHdyb25nIHlvdXIgaGFuZCB0b28gbXVjaCwKICAgIFdoaWNoIG1hbm5lcmx5IGRldm90aW9uIHNob3dzIGluIHRoaXM7CiAgICBGb3Igc2FpbnRzIGhhdmUgaGFuZHMgdGhhdCBwaWxncmltcycgaGFuZHMgZG8gdG91Y2gsCiAgICBBbmQgcGFsbSB0byBwYWxtIGlzIGhvbHkgcGFsbWVycycga2lzcy4KClJPTUVPCgogICAgSGF2ZSBub3Qgc2FpbnRzIGxpcHMsIGFuZCBob2x5IHBhbG1lcnMgdG9vPwoKSlVMSUVUCgogICAgQXksIHBpbGdyaW0sIGxpcHMgdGhhdCB0aGV5IG11c3QgdXNlIGluIHByYXllci4KClJPTUVPCgogICAgTywgdGhlbiwgZGVhciBzYWludCwgbGV0IGxpcHMgZG8gd2hhdCBoYW5kcyBkbzsKICAgIFRoZXkgcHJheSwgZ3JhbnQgdGhvdSwgbGVzdCBmYWl0aCB0dXJuIHRvIGRlc3BhaXIuCgpKVUxJRVQKCiAgICBTYWludHMgZG8gbm90IG1vdmUsIHRob3VnaCBncmFudCBmb3IgcHJheWVycycgc2FrZS4KClJPTUVPCgogICAgVGhlbiBtb3ZlIG5vdCwgd2hpbGUgbXkgcHJheWVyJ3MgZWZmZWN0IEkgdGFrZS4KICAgIFRodXMgZnJvbSBteSBsaXBzLCBieSB5b3VycywgbXkgc2luIGlzIHB1cmdlZC4KCkpVTElFVAoKICAgIFRoZW4gaGF2ZSBteSBsaXBzIHRoZSBzaW4gdGhhdCB0aGV5IGhhdmUgdG9vay4KClJPTUVPCgogICAgU2luIGZyb20gdGh5IGxpcHMIE8gdHJlc3Bhc3Mgc3dlZXRseSB1cmdlZCEKICAgIEdpdmUgbWUgbXkgc2luIGFnYWluLgoKSlVMSUVUCgogICAgWW91IGtpc3MgYnkgdGhlIGJvb2suCgpOdXJzZQoKICAgIE1hZGFtLCB5b3VyIG1vdGhlciBjcmF2ZXMgYSB3b3JkIHdpdGggeW91LgoKUk9NRU8KCiAgICBXaGF0IGlzIGhlciBtb3RoZXICgpOdXJzZQoKICAgIE1hcnJ5LCBiYWNoZWxvciwKICAgIEhlciBtb3RoZXIgaXMgdGhlIGxhZHkgb2YgdGhlIGhvdXNlLAogICAgQW5kIGEgZ29vZCBsYWR5LCBhbmQgYSB3aXNlIGFuZCB2aXJ0dW91cwogICAgSSBudXJzZWQgaGVyIGRhdWdodGVyLCB0aGF0IHlvdSB0YWxrJ2Qgd2l0aGFsOwogICAgSSB0ZWxsIHlvdSwgaGUgdGhhdCBjYW4gbGF5IGhvbGQgb2YgaGVyCiAgICBTaGFsbCBoYXZlIHRoZSBjaGlua3MuCgpST01FTwoKICAgIElzIHNoZSBhIENhcHVsZXQCiAgICBPIGRlYXIgYWNjb3VudCEgbXkgbGlmZSBpcyBteSBmb2UncyBkZWJ0LgoKQkVOVk9MSU8KCiAgICBBd2F5LCBiZWdvbmU7IHRoZSBzcG9ydCBpcyBhdCB0aGUgYmVzdC4KClJPTUVPCgogICAgQXksIHNvIEkgZmVhcjsgdGhlIG1vcmUgaXMgbXkgdW5yZXN0LgoKQ0FQVUxFVAoKICAgIE5heSwgZ2VudGxlbWVuLCBwcmVwYXJlIG5vdCB0byBiZSBnb25lOwogICAgV2UgaGF2ZSBhIHRyaWZsaW5nIGZvb2xpc2ggYmFucXVldCB0b3dhcmRzLgogICAgSXMgaXQgZSdlbiBzbz8gd2h5LCB0aGVuLCBJIHRoYW5rIHlvdSBhbGwKICAgIEkgdGhhbmsgeW91LCBob25lc3QgZ2VudGxlbWVuOyBnb29kIG5pZ2h0LgogICAgTW9yZSB0b3JjaGVzIGhlcmUhIENvbWUgb24gdGhlbiwgbGV0J3MgdG8gYmVkLgogICAgQWgsIHNpcnJhaCwgYnkgbXkgZmF5LCBpdCB3YXhlcyBsYXRlOgogICAgSSdsbCB0byBteSByZXN0LgoKICAgIEV4ZXVudCBhbGwgYnV0IEpVTElFVCBhbmQgTnVyc2UKCkpVTElFVAoKICAgIENvbWUgaGl0aGVyLCBudXJzZS4gV2hhdCBpcyB5b25kIGdlbnRsZW1hbj8KCk51cnNlCgogICAgVGhlIHNvbiBhbmQgaGVpciBvZiBvbGQgVGliZXJpby4KCkpVTElFVAoKICAgIFdoYXQncyBoZSB0aGF0IG5vdyBpcyBnb2luZyBvdXQgb2YgZG9vcj8KCk51cnNlCgogICAgTWFycnksIHRoYXQsIEkgdGhpbmssIGJlIHlvdW5nIFBldHJ1Y2lvLgoKSlVMSUVUCgogICAgV2hhdCdzIGhlIHRoYXQgZm9sbG93cyB0aGVyZSwgdGhhdCB3b3VsZCBub3QgZGFuY2UCgpOdXJzZQoKICAgIEkga25vdyBub3QuCgpKVUxJRVQKCiAgICBHbyBhc2sgaGlzIG5hbWU6IGlmIGhlIGJlIG1hcnJpZWQuCiAgICBNeSBncmF2ZSBpcyBsaWtlIHRvIGJlIG15IHdlZGRpbmcgYmVkLgoKTnVyc2UKCiAgICBIaXMgbmFtZSBpcyBSb21lbywgYW5kIGEgTW9udGFndWU7CiAgICBUaGUgb25seSBzb24gb2YgeW91ciBncmVhdCBlbmVteS4KCkpVTElFVAoKICAgIE15IG9ubHkgbG92ZSBzcHJ1bmcgZnJvbSBteSBvbmx5IGhhdGUhCiAgICBUb28gZWFybHkgc2VlbiB1bmtub3duLCBhbmQga25vd24gdG9vIGxhdGUhCiAgICBQcm9kaWdpb3VzIGJpcnRoIG9mIGxvdmUgaXQgaXMgdG8gbWUsCiAgICBUaGF0IEkgbXVzdCBsb3ZlIGEgbG9hdGhlZCBlbmVteS4KCk51cnNlCgogICAgV2hhdCdzIHRoaXMIHdoYXQncyB0aGlzPwoKSlVMSUVUCgogICAgQSByaHltZSBJIGxlYXJuJ2QgZXZlbiBub3cKICAgIE9mIG9uZSBJIGRhbmNlZCB3aXRoYWwuCgogICAgT25lIGNhbGxzIHdpdGhpbiAnSnVsaWV0LicKCk51cnNlCgogICAgQW5vbiwgYW5vbiEKICAgIENvbWUsIGxldCdzIGF3YXk7IHRoZSBzdHJhbmdlcnMgYWxsIGFyZSBnb25lLgoKICAgIEV4ZXVudAoKQUNUIElJClBST0xPR1VFCgogICAgRW50ZXIgQ2hvcnVzIAoKQ2hvcnVzCgogICAgTm93IG9sZCBkZXNpcmUgZG90aCBpbiBoaXMgZGVhdGgtYmVkIGxpZSwKICAgIEFuZCB5b3VuZyBhZmZlY3Rpb24gZ2FwZXMgdG8gYmUgaGlzIGhlaXI7CiAgICBUaGF0IGZhaXIgZm9yIHdoaWNoIGxvdmUgZ3JvYW4nZCBmb3IgYW5kIHdvdWxkIGRpZSwKICAgIFdpdGggdGVuZGVyIEp1bGlldCBtYXRjaCdkLCBpcyBub3cgbm90IGZhaXIuCiAgICBOb3cgUm9tZW8gaXMgYmVsb3ZlZCBhbmQgbG92ZXMgYWdhaW4sCiAgICBBbGlrZSBiZXR3aXRjaGVkIGJ5IHRoZSBjaGFybSBvZiBsb29rcywKICAgIEJ1dCB0byBoaXMgZm9lIHN1cHBvc2VkIGhlIG11c3QgY29tcGxhaW4sCiAgICBBbmQgc2hlIHN0ZWFsIGxvdmUncyBzd2VldCBiYWl0IGZyb20gZmVhcmZ1bCBob29rczoKICAgIEJlaW5nIGhlbGQgYSBmb2UsIGhlIG1heSBub3QgaGF2ZSBhY2Nlc3MKICAgIFRvIGJyZWF0aGUgc3VjaCB2b3dzIGFzIGxvdmVycyB1c2UgdG8gc3dlYXI7CiAgICBBbmQgc2hlIGFzIG11Y2ggaW4gbG92ZSwgaGVyIG1lYW5zIG11Y2ggbGVzcwogICAgVG8gbWVldCBoZXIgbmV3LWJlbG92ZWQgYW55IHdoZXJlOgogICAgQnV0IHBhc3Npb24gbGVuZHMgdGhlbSBwb3dlciwgdGltZSBtZWFucywgdG8gbWVldAogICAgVGVtcGVyaW5nIGV4dHJlbWl0aWVzIHdpdGggZXh0cmVtZSBzd2VldC4KCiAgICBFeGl0CgpTQ0VORSBJLiBBIGxhbmUgYnkgdGhlIHdhbGwgb2YgQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gCgpST01FTwoKICAgIENhbiBJIGdvIGZvcndhcmQgd2hlbiBteSBoZWFydCBpcyBoZXJlPwogICAgVHVybiBiYWNrLCBkdWxsIGVhcnRoLCBhbmQgZmluZCB0aHkgY2VudHJlIG91dC4KCiAgICBIZSBjbGltYnMgdGhlIHdhbGwsIGFuZCBsZWFwcyBkb3duIHdpdGhpbiBpdAoKICAgIEVudGVyIEJFTlZPTElPIGFuZCBNRVJDVVRJTwoKQkVOVk9MSU8KCiAgICBSb21lbyEgbXkgY291c2luIFJvbWVvIQoKTUVSQ1VUSU8KCiAgICBIZSBpcyB3aXNlOwogICAgQW5kLCBvbiBteSBsaWUsIGhhdGggc3RvbCduIGhpbSBob21lIHRvIGJlZC4KCkJFTlZPTElPCgogICAgSGUgcmFuIHRoaXMgd2F5LCBhbmQgbGVhcCdkIHRoaXMgb3JjaGFyZCB3YWxsOgogICAgQ2FsbCwgZ29vZCBNZXJjdXRpby4KCk1FUkNVVElPCgogICAgTmF5LCBJJ2xsIGNvbmp1cmUgdG9vLgogICAgUm9tZW8hIGh1bW91cnMhIG1hZG1hbiEgcGFzc2lvbiEgbG92ZXIhCiAgICBBcHBlYXIgdGhvdSBpbiB0aGUgbGlrZW5lc3Mgb2YgYSBzaWdoOgogICAgU3BlYWsgYnV0IG9uZSByaHltZSwgYW5kIEkgYW0gc2F0aXNmaWVkOwogICAgQ3J5IGJ1dCAnQXkgbWUhJyBwcm9ub3VuY2UgYnV0ICdsb3ZlJyBhbmQgJ2RvdmU7JwogICAgU3BlYWsgdG8gbXkgZ29zc2lwIFZlbnVzIG9uZSBmYWlyIHdvcmQsCiAgICBPbmUgbmljay1uYW1lIGZvciBoZXIgcHVyYmxpbmQgc29uIGFuZCBoZWlyLAogICAgWW91bmcgQWRhbSBDdXBpZCwgaGUgdGhhdCBzaG90IHNvIHRyaW0sCiAgICBXaGVuIEtpbmcgQ29waGV0dWEgbG92ZWQgdGhlIGJlZ2dhci1tYWlkIQogICAgSGUgaGVhcmV0aCBub3QsIGhlIHN0aXJyZXRoIG5vdCwgaGUgbW92ZXRoIG5vdDsKICAgIFRoZSBhcGUgaXMgZGVhZCwgYW5kIEkgbXVzdCBjb25qdXJlIGhpbS4KICAgIEkgY29uanVyZSB0aGVlIGJ5IFJvc2FsaW5lJ3MgYnJpZ2h0IGV5ZXMsCiAgICBCeSBoZXIgaGlnaCBmb3JlaGVhZCBhbmQgaGVyIHNjYXJsZXQgbGlwLAogICAgQnkgaGVyIGZpbmUgZm9vdCwgc3RyYWlnaHQgbGVnIGFuZCBxdWl2ZXJpbmcgdGhpZ2gKICAgIEFuZCB0aGUgZGVtZXNuZXMgdGhhdCB0aGVyZSBhZGphY2VudCBsaWUsCiAgICBUaGF0IGluIHRoeSBsaWtlbmVzcyB0aG91IGFwcGVhciB0byB1cyEKCkJFTlZPTElPCgogICAgQW5kIGlmIGhlIGhlYXIgdGhlZSwgdGhvdSB3aWx0IGFuZ2VyIGhpbS4KCk1FUkNVVElPCgogICAgVGhpcyBjYW5ub3QgYW5nZXIgaGltOiAndHdvdWxkIGFuZ2VyIGhpbQogICAgVG8gcmFpc2UgYSBzcGlyaXQgaW4gaGlzIG1pc3RyZXNzJyBjaXJjbGUKICAgIE9mIHNvbWUgc3RyYW5nZSBuYXR1cmUsIGxldHRpbmcgaXQgdGhlcmUgc3RhbmQKICAgIFRpbGwgc2hlIGhhZCBsYWlkIGl0IGFuZCBjb25qdXJlZCBpdCBkb3duOwogICAgVGhhdCB3ZXJlIHNvbWUgc3BpdGU6IG15IGludm9jYXRpb24KICAgIElzIGZhaXIgYW5kIGhvbmVzdCwgYW5kIGluIGhpcyBtaXN0cmVzIHMnIG5hbWUKICAgIEkgY29uanVyZSBvbmx5IGJ1dCB0byByYWlzZSB1cCBoaW0uCgpCRU5WT0xJTwoKICAgIENvbWUsIGhlIGhhdGggaGlkIGhpbXNlbGYgYW1vbmcgdGhlc2UgdHJlZXMsCiAgICBUbyBiZSBjb25zb3J0ZWQgd2l0aCB0aGUgaHVtb3JvdXMgbmlnaHQ6CiAgICBCbGluZCBpcyBoaXMgbG92ZSBhbmQgYmVzdCBiZWZpdHMgdGhlIGRhcmsuCgpNRVJDVVRJTwoKICAgIElmIGxvdmUgYmUgYmxpbmQsIGxvdmUgY2Fubm90IGhpdCB0aGUgbWFyay4KICAgIE5vdyB3aWxsIGhlIHNpdCB1bmRlciBhIG1lZGxhciB0cmVlLAogICAgQW5kIHdpc2ggaGlzIG1pc3RyZXNzIHdlcmUgdGhhdCBraW5kIG9mIGZydWl0CiAgICBBcyBtYWlkcyBjYWxsIG1lZGxhcnMsIHdoZW4gdGhleSBsYXVnaCBhbG9uZS4KICAgIFJvbWVvLCB0aGF0IHNoZSB3ZXJlLCBPLCB0aGF0IHNoZSB3ZXJlCiAgICBBbiBvcGVuIGV0IGNhZXRlcmEsIHRob3UgYSBwb3BlcmluIHBlYXIhCiAgICBSb21lbywgZ29vZCBuaWdodDogSSdsbCB0byBteSB0cnVja2xlLWJlZDsKICAgIFRoaXMgZmllbGQtYmVkIGlzIHRvbyBjb2xkIGZvciBtZSB0byBzbGVlcDoKICAgIENvbWUsIHNoYWxsIHdlIGdvPwoKQkVOVk9MSU8KCiAgICBHbywgdGhlbjsgZm9yICd0aXMgaW4gdmFpbgogICAgVG8gc2VlayBoaW0gaGVyZSB0aGF0IG1lYW5zIG5vdCB0byBiZSBmb3VuZC4KCiAgICBFeGV1bnQKClNDRU5FIElJLiBDYXB1bGV0J3Mgb3JjaGFyZC4KCiAgICBFbnRlciBST01FTyAKClJPTUVPCgogICAgSGUgamVzdHMgYXQgc2NhcnMgdGhhdCBuZXZlciBmZWx0IGEgd291bmQuCgogICAgSlVMSUVUIGFwcGVhcnMgYWJvdmUgYXQgYSB3aW5kb3cKICAgIEJ1dCwgc29mdCEgd2hhdCBsaWdodCB0aHJvdWdoIHlvbmRlciB3aW5kb3cgYnJlYWtzPwogICAgSXQgaXMgdGhlIGVhc3QsIGFuZCBKdWxpZXQgaXMgdGhlIHN1bi4KICAgIEFyaXNlLCBmYWlyIHN1biwgYW5kIGtpbGwgdGhlIGVudmlvdXMgbW9vbiwKICAgIFdobyBpcyBhbHJlYWR5IHNpY2sgYW5kIHBhbGUgd2l0aCBncmllZiwKICAgIFRoYXQgdGhvdSBoZXIgbWFpZCBhcnQgZmFyIG1vcmUgZmFpciB0aGFuIHNoZToKICAgIEJlIG5vdCBoZXIgbWFpZCwgc2luY2Ugc2hlIGlzIGVudmlvdXM7CiAgICBIZXIgdmVzdGFsIGxpdmVyeSBpcyBidXQgc2ljayBhbmQgZ3JlZW4KICAgIEFuZCBub25lIGJ1dCBmb29scyBkbyB3ZWFyIGl0OyBjYXN0IGl0IG9mZi4KICAgIEl0IGlzIG15IGxhZHksIE8sIGl0IGlzIG15IGxvdmUhCiAgICBPLCB0aGF0IHNoZSBrbmV3IHNoZSB3ZXJlIQogICAgU2hlIHNwZWFrcyB5ZXQgc2hlIHNheXMgbm90aGluZzogd2hhdCBvZiB0aGF0PwogICAgSGVyIGV5ZSBkaXNjb3Vyc2VzOyBJIHdpbGwgYW5zd2VyIGl0LgogICAgSSBhbSB0b28gYm9sZCwgJ3RpcyBub3QgdG8gbWUgc2hlIHNwZWFrczoKICAgIFR3byBvZiB0aGUgZmFpcmVzdCBzdGFycyBpbiBhbGwgdGhlIGhlYXZlbiwKICAgIEhhdmluZyBzb21lIGJ1c2luZXNzLCBkbyBlbnRyZWF0IGhlciBleWVzCiAgICBUbyB0d2lua2xlIGluIHRoZWlyIHNwaGVyZXMgdGlsbCB0aGV5IHJldHVybi4KICAgIFdoYXQgaWYgaGVyIGV5ZXMgd2VyZSB0aGVyZSwgdGhleSBpbiBoZXIgaGVhZD8KICAgIFRoZSBicmlnaHRuZXNzIG9mIGhlciBjaGVlayB3b3VsZCBzaGFtZSB0aG9zZSBzdGFycywKICAgIEFzIGRheWxpZ2h0IGRvdGggYSBsYW1wOyBoZXIgZXllcyBpbiBoZWF2ZW4KICAgIFdvdWxkIHRocm91Z2ggdGhlIGFpcnkgcmVnaW9uIHN0cmVhbSBzbyBicmlnaHQKICAgIFRoYXQgYmlyZHMgd291bGQgc2luZyBhbmQgdGhpbmsgaXQgd2VyZSBub3QgbmlnaHQuCiAgICBTZWUsIGhvdyBzaGUgbGVhbnMgaGVyIGNoZWVrIHVwb24gaGVyIGhhbmQhCiAgICBPLCB0aGF0IEkgd2VyZSBhIGdsb3ZlIHVwb24gdGhhdCBoYW5kLAogICAgVGhhdCBJIG1pZ2h0IHRvdWNoIHRoYXQgY2hlZWshCgpKVUxJRVQKCiAgICBBeSBtZSEKClJPTUVPCgogICAgU2hlIHNwZWFrczoKICAgIE8sIHNwZWFrIGFnYWluLCBicmlnaHQgYW5nZWwhIGZvciB0aG91IGFydAogICAgQXMgZ2xvcmlvdXMgdG8gdGhpcyBuaWdodCwgYmVpbmcgbydlciBteSBoZWFkCiAgICBBcyBpcyBhIHdpbmdlZCBtZXNzZW5nZXIgb2YgaGVhdmVuCiAgICBVbnRvIHRoZSB3aGl0ZS11cHR1cm5lZCB3b25kZXJpbmcgZXllcwogICAgT2YgbW9ydGFscyB0aGF0IGZhbGwgYmFjayB0byBnYXplIG9uIGhpbQogICAgV2hlbiBoZSBiZXN0cmlkZXMgdGhlIGxhenktcGFjaW5nIGNsb3VkcwogICAgQW5kIHNhaWxzIHVwb24gdGhlIGJvc29tIG9mIHRoZSBhaXIuCgpKVUxJRVQKCiAgICBPIFJvbWVvLCBSb21lbyEgd2hlcmVmb3JlIGFydCB0aG91IFJvbWVvPwogICAgRGVueSB0aHkgZmF0aGVyIGFuZCByZWZ1c2UgdGh5IG5hbWU7CiAgICBPciwgaWYgdGhvdSB3aWx0IG5vdCwgYmUgYnV0IHN3b3JuIG15IGxvdmUsCiAgICBBbmQgSSdsbCBubyBsb25nZXIgYmUgYSBDYXB1bGV0LgoKUk9NRU8KCiAgICBbQXNpZGVdIFNoYWxsIEkgaGVhciBtb3JlLCBvciBzaGFsbCBJIHNwZWFrIGF0IHRoaXMCgpKVUxJRVQKCiAgICAnVGlzIGJ1dCB0aHkgbmFtZSB0aGF0IGlzIG15IGVuZW15OwogICAgVGhvdSBhcnQgdGh5c2VsZiwgdGhvdWdoIG5vdCBhIE1vbnRhZ3VlLgogICAgV2hhdCdzIE1vbnRhZ3VlPyBpdCBpcyBub3IgaGFuZCwgbm9yIGZvb3QsCiAgICBOb3IgYXJtLCBub3IgZmFjZSwgbm9yIGFueSBvdGhlciBwYXJ0CiAgICBCZWxvbmdpbmcgdG8gYSBtYW4uIE8sIGJlIHNvbWUgb3RoZXIgbmFtZSEKICAgIFdoYXQncyBpbiBhIG5hbWUIHRoYXQgd2hpY2ggd2UgY2FsbCBhIHJvc2UKICAgIEJ5IGFueSBvdGhlciBuYW1lIHdvdWxkIHNtZWxsIGFzIHN3ZWV0OwogICAgU28gUm9tZW8gd291bGQsIHdlcmUgaGUgbm90IFJvbWVvIGNhbGwnZCwKICAgIFJldGFpbiB0aGF0IGRlYXIgcGVyZmVjdGlvbiB3aGljaCBoZSBvd2VzCiAgICBXaXRob3V0IHRoYXQgdGl0bGUuIFJvbWVvLCBkb2ZmIHRoeSBuYW1lLAogICAgQW5kIGZvciB0aGF0IG5hbWUgd2hpY2ggaXMgbm8gcGFydCBvZiB0aGVlCiAgICBUYWtlIGFsbCBteXNlbGYuCgpST01FTwoKICAgIEkgdGFrZSB0aGVlIGF0IHRoeSB3b3JkOgogICAgQ2FsbCBtZSBidXQgbG92ZSwgYW5kIEknbGwgYmUgbmV3IGJhcHRpemVkOwogICAgSGVuY2Vmb3J0aCBJIG5ldmVyIHdpbGwgYmUgUm9tZW8uCgpKVUxJRVQKCiAgICBXaGF0IG1hbiBhcnQgdGhvdSB0aGF0IHRodXMgYmVzY3JlZW4nZCBpbiBuaWdodAogICAgU28gc3R1bWJsZXN0IG9uIG15IGNvdW5zZWwCgpST01FTwoKICAgIEJ5IGEgbmFtZQogICAgSSBrbm93IG5vdCBob3cgdG8gdGVsbCB0aGVlIHdobyBJIGFtOgogICAgTXkgbmFtZSwgZGVhciBzYWludCwgaXMgaGF0ZWZ1bCB0byBteXNlbGYsCiAgICBCZWNhdXNlIGl0IGlzIGFuIGVuZW15IHRvIHRoZWU7CiAgICBIYWQgSSBpdCB3cml0dGVuLCBJIHdvdWxkIHRlYXIgdGhlIHdvcmQuCgpKVUxJRVQKCiAgICBNeSBlYXJzIGhhdmUgbm90IHlldCBkcnVuayBhIGh1bmRyZWQgd29yZHMKICAgIE9mIHRoYXQgdG9uZ3VlJ3MgdXR0ZXJhbmNlLCB5ZXQgSSBrbm93IHRoZSBzb3VuZDoKICAgIEFydCB0aG91IG5vdCBSb21lbyBhbmQgYSBNb250YWd1ZT8KClJPTUVPCgogICAgTmVpdGhlciwgZmFpciBzYWludCwgaWYgZWl0aGVyIHRoZWUgZGlzbGlrZS4KCkpVTElFVAoKICAgIEhvdyBjYW1lc3QgdGhvdSBoaXRoZXIsIHRlbGwgbWUsIGFuZCB3aGVyZWZvcmUCiAgICBUaGUgb3JjaGFyZCB3YWxscyBhcmUgaGlnaCBhbmQgaGFyZCB0byBjbGltYiwKICAgIEFuZCB0aGUgcGxhY2UgZGVhdGgsIGNvbnNpZGVyaW5nIHdobyB0aG91IGFydCwKICAgIElmIGFueSBvZiBteSBraW5zbWVuIGZpbmQgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBXaXRoIGxvdmUncyBsaWdodCB3aW5ncyBkaWQgSSBvJ2VyLXBlcmNoIHRoZXNlIHdhbGxzOwogICAgRm9yIHN0b255IGxpbWl0cyBjYW5ub3QgaG9sZCBsb3ZlIG91dCwKICAgIEFuZCB3aGF0IGxvdmUgY2FuIGRvIHRoYXQgZGFyZXMgbG92ZSBhdHRlbXB0OwogICAgVGhlcmVmb3JlIHRoeSBraW5zbWVuIGFyZSBubyBsZXQgdG8gbWUuCgpKVUxJRVQKCiAgICBJZiB0aGV5IGRvIHNlZSB0aGVlLCB0aGV5IHdpbGwgbXVyZGVyIHRoZWUuCgpST01FTwoKICAgIEFsYWNrLCB0aGVyZSBsaWVzIG1vcmUgcGVyaWwgaW4gdGhpbmUgZXllCiAgICBUaGFuIHR3ZW50eSBvZiB0aGVpciBzd29yZHM6IGxvb2sgdGhvdSBidXQgc3dlZXQsCiAgICBBbmQgSSBhbSBwcm9vZiBhZ2FpbnN0IHRoZWlyIGVubWl0eS4KCkpVTElFVAoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd29ybGQgdGhleSBzYXcgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBJIGhhdmUgbmlnaHQncyBjbG9hayB0byBoaWRlIG1lIGZyb20gdGhlaXIgc2lnaHQ7CiAgICBBbmQgYnV0IHRob3UgbG92ZSBtZSwgbGV0IHRoZW0gZmluZCBtZSBoZXJlOgogICAgTXkgbGlmZSB3ZXJlIGJldHRlciBlbmRlZCBieSB0aGVpciBoYXRlLAogICAgVGhhbiBkZWF0aCBwcm9yb2d1ZWQsIHdhbnRpbmcgb2YgdGh5IGxvdmUuCgpKVUxJRVQKCiAgICBCeSB3aG9zZSBkaXJlY3Rpb24gZm91bmQnc3QgdGhvdSBvdXQgdGhpcyBwbGFjZT8KClJPTUVPCgogICAgQnkgbG92ZSwgd2hvIGZpcnN0IGRpZCBwcm9tcHQgbWUgdG8gaW5xdWlyZTsKICAgIEhlIGxlbnQgbWUgY291bnNlbCBhbmQgSSBsZW50IGhpbSBleWVzLgogICAgSSBhbSBubyBwaWxvdDsgeWV0LCB3ZXJ0IHRob3UgYXMgZmFyCiAgICBBcyB0aGF0IHZhc3Qgc2hvcmUgd2FzaCdkIHdpdGggdGhlIGZhcnRoZXN0IHNlYSwKICAgIEkgd291bGQgYWR2ZW50dXJlIGZvciBzdWNoIG1lcmNoYW5kaXNlLgoKSlVMSUVUCgogICAgVGhvdSBrbm93J3N0IHRoZSBtYXNrIG9mIG5pZ2h0IGlzIG9uIG15IGZhY2UsCiAgICBFbHNlIHdvdWxkIGEgbWFpZGVuIGJsdXNoIGJlcGFpbnQgbXkgY2hlZWsKICAgIEZvciB0aGF0IHdoaWNoIHRob3UgaGFzdCBoZWFyZCBtZSBzcGVhayB0by1uaWdodAogICAgRmFpbiB3b3VsZCBJIGR3ZWxsIG9uIGZvcm0sIGZhaW4sIGZhaW4gZGVueQogICAgV2hhdCBJIGhhdmUgc3Bva2U6IGJ1dCBmYXJld2VsbCBjb21wbGltZW50IQogICAgRG9zdCB0aG91IGxvdmUgbWUIEkga25vdyB0aG91IHdpbHQgc2F5ICdBeSwnCiAgICBBbmQgSSB3aWxsIHRha2UgdGh5IHdvcmQ6IHlldCBpZiB0aG91IHN3ZWFyJ3N0LAogICAgVGhvdSBtYXlzdCBwcm92ZSBmYWxzZTsgYXQgbG92ZXJzJyBwZXJqdXJpZXMKICAgIFRoZW4gc2F5LCBKb3ZlIGxhdWdocy4gTyBnZW50bGUgUm9tZW8sCiAgICBJZiB0aG91IGRvc3QgbG92ZSwgcHJvbm91bmNlIGl0IGZhaXRoZnVsbHk6CiAgICBPciBpZiB0aG91IHRoaW5rJ3N0IEkgYW0gdG9vIHF1aWNrbHkgd29uLAogICAgSSdsbCBmcm93biBhbmQgYmUgcGVydmVyc2UgYW4gc2F5IHRoZWUgbmF5LAogICAgU28gdGhvdSB3aWx0IHdvbzsgYnV0IGVsc2UsIG5vdCBmb3IgdGhlIHdvcmxkLgogICAgSW4gdHJ1dGgsIGZhaXIgTW9udGFndWUsIEkgYW0gdG9vIGZvbmQsCiAgICBBbmQgdGhlcmVmb3JlIHRob3UgbWF5c3QgdGhpbmsgbXkgJ2hhdmlvciBsaWdodDoKICAgIEJ1dCB0cnVzdCBtZSwgZ2VudGxlbWFuLCBJJ2xsIHByb3ZlIG1vcmUgdHJ1ZQogICAgVGhhbiB0aG9zZSB0aGF0IGhhdmUgbW9yZSBjdW5uaW5nIHRvIGJlIHN0cmFuZ2UuCiAgICBJIHNob3VsZCBoYXZlIGJlZW4gbW9yZSBzdHJhbmdlLCBJIG11c3QgY29uZmVzcywKICAgIEJ1dCB0aGF0IHRob3Ugb3ZlcmhlYXJkJ3N0LCBlcmUgSSB3YXMgd2FyZSwKICAgIE15IHRydWUgbG92ZSdzIHBhc3Npb246IHRoZXJlZm9yZSBwYXJkb24gbWUsCiAgICBBbmQgbm90IGltcHV0ZSB0aGlzIHlpZWxkaW5nIHRvIGxpZ2h0IGxvdmUsCiAgICBXaGljaCB0aGUgZGFyayBuaWdodCBoYXRoIHNvIGRpc2NvdmVyZWQuCgpST01FTwoKICAgIExhZHksIGJ5IHlvbmRlciBibGVzc2VkIG1vb24gSSBzd2VhcgogICAgVGhhdCB0aXBzIHdpdGggc2lsdmVyIGFsbCB0aGVzZSBmcnVpdC10cmVlIHRvcHMtLQoKSlVMSUVUCgogICAgTywgc3dlYXIgbm90IGJ5IHRoZSBtb29uLCB0aGUgaW5jb25zdGFudCBtb29uLAogICAgVGhhdCBtb250aGx5IGNoYW5nZXMgaW4gaGVyIGNpcmNsZWQgb3JiLAogICAgTGVzdCB0aGF0IHRoeSBsb3ZlIHByb3ZlIGxpa2V3aXNlIHZhcmlhYmxlLgoKUk9NRU8KCiAgICBXaGF0IHNoYWxsIEkgc3dlYXIgYnkCgpKVUxJRVQKCiAgICBEbyBub3Qgc3dlYXIgYXQgYWxsOwogICAgT3IsIGlmIHRob3Ugd2lsdCwgc3dlYXIgYnkgdGh5IGdyYWNpb3VzIHNlbGYsCiAgICBXaGljaCBpcyB0aGUgZ29kIG9mIG15IGlkb2xhdHJ5LAogICAgQW5kIEknbGwgYmVsaWV2ZSB0aGVlLgoKUk9NRU8KCiAgICBJZiBteSBoZWFydCdzIGRlYXIgbG92ZS0tCgpKVUxJRVQKCiAgICBXZWxsLCBkbyBub3Qgc3dlYXI6IGFsdGhvdWdoIEkgam95IGluIHRoZWUsCiAgICBJIGhhdmUgbm8gam95IG9mIHRoaXMgY29udHJhY3QgdG8tbmlnaHQ6CiAgICBJdCBpcyB0b28gcmFzaCwgdG9vIHVuYWR2aXNlZCwgdG9vIHN1ZGRlbjsKICAgIFRvbyBsaWtlIHRoZSBsaWdodG5pbmcsIHdoaWNoIGRvdGggY2Vhc2UgdG8gYmUKICAgIEVyZSBvbmUgY2FuIHNheSAnSXQgbGlnaHRlbnMuJyBTd2VldCwgZ29vZCBuaWdodCEKICAgIFRoaXMgYnVkIG9mIGxvdmUsIGJ5IHN1bW1lcidzIHJpcGVuaW5nIGJyZWF0aCwKICAgIE1heSBwcm92ZSBhIGJlYXV0ZW91cyBmbG93ZXIgd2hlbiBuZXh0IHdlIG1lZXQuCiAgICBHb29kIG5pZ2h0LCBnb29kIG5pZ2h0ISBhcyBzd2VldCByZXBvc2UgYW5kIHJlc3QKICAgIENvbWUgdG8gdGh5IGhlYXJ0IGFzIHRoYXQgd2l0aGluIG15IGJyZWFzdCEKClJPTUVPCgogICAgTywgd2lsdCB0aG91IGxlYXZlIG1lIHNvIHVuc2F0aXNmaWVkPwoKSlVMSUVUCgogICAgV2hhdCBzYXRpc2ZhY3Rpb24gY2Fuc3QgdGhvdSBoYXZlIHRvLW5pZ2h0PwoKUk9NRU8KCiAgICBUaGUgZXhjaGFuZ2Ugb2YgdGh5IGxvdmUncyBmYWl0aGZ1bCB2b3cgZm9yIG1pbmUuCgpKVUxJRVQKCiAgICBJIGdhdmUgdGhlZSBtaW5lIGJlZm9yZSB0aG91IGRpZHN0IHJlcXVlc3QgaXQ6CiAgICBBbmQgeWV0IEkgd291bGQgaXQgd2VyZSB0byBnaXZlIGFnYWluLgoKUk9NRU8KCiAgICBXb3VsZHN0IHRob3Ugd2l0aGRyYXcgaXQIGZvciB3aGF0IHB1cnBvc2UsIGxvdmUCgpKVUxJRVQKCiAgICBCdXQgdG8gYmUgZnJhbmssIGFuZCBnaXZlIGl0IHRoZWUgYWdhaW4uCiAgICBBbmQgeWV0IEkgd2lzaCBidXQgZm9yIHRoZSB0aGluZyBJIGhhdmU6CiAgICBNeSBib3VudHkgaXMgYXMgYm91bmRsZXNzIGFzIHRoZSBzZWEsCiAgICBNeSBsb3ZlIGFzIGRlZXA7IHRoZSBtb3JlIEkgZ2l2ZSB0byB0aGVlLAogICAgVGhlIG1vcmUgSSBoYXZlLCBmb3IgYm90aCBhcmUgaW5maW5pdGUuCgogICAgTnVyc2UgY2FsbHMgd2l0aGluCiAgICBJIGhlYXIgc29tZSBub2lzZSB3aXRoaW47IGRlYXIgbG92ZSwgYWRpZXUhCiAgICBBbm9uLCBnb29kIG51cnNlISBTd2VldCBNb250YWd1ZSwgYmUgdHJ1ZS4KICAgIFN0YXkgYnV0IGEgbGl0dGxlLCBJIHdpbGwgY29tZSBhZ2Fpbi4KCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBPIGJsZXNzZWQsIGJsZXNzZWQgbmlnaHQhIEkgYW0gYWZlYXJkLgogICAgQmVpbmcgaW4gbmlnaHQsIGFsbCB0aGlzIGlzIGJ1dCBhIGRyZWFtLAogICAgVG9vIGZsYXR0ZXJpbmctc3dlZXQgdG8gYmUgc3Vic3RhbnRpYWwuCgogICAgUmUtZW50ZXIgSlVMSUVULCBhYm92ZQoKSlVMSUVUCgogICAgVGhyZWUgd29yZHMsIGRlYXIgUm9tZW8sIGFuZCBnb29kIG5pZ2h0IGluZGVlZC4KICAgIElmIHRoYXQgdGh5IGJlbnQgb2YgbG92ZSBiZSBob25vdXJhYmxlLAogICAgVGh5IHB1cnBvc2UgbWFycmlhZ2UsIHNlbmQgbWUgd29yZCB0by1tb3Jyb3csCiAgICBCeSBvbmUgdGhhdCBJJ2xsIHByb2N1cmUgdG8gY29tZSB0byB0aGVlLAogICAgV2hlcmUgYW5kIHdoYXQgdGltZSB0aG91IHdpbHQgcGVyZm9ybSB0aGUgcml0ZTsKICAgIEFuZCBhbGwgbXkgZm9ydHVuZXMgYXQgdGh5IGZvb3QgSSdsbCBsYXkKICAgIEFuZCBmb2xsb3cgdGhlZSBteSBsb3JkIHRocm91Z2hvdXQgdGhlIHdvcmxkLgoKTnVyc2UKCiAgICBbV2l0aGluXSBNYWRhbSEKCkpVTElFVAoKICAgIEkgY29tZSwgYW5vbi4tLUJ1dCBpZiB0aG91IG1lYW4nc3Qgbm90IHdlbGwsCiAgICBJIGRvIGJlc2VlY2ggdGhlZS0tCgpOdXJzZQoKICAgIFtXaXRoaW5dIE1hZGFtIQoKSlVMSUVUCgogICAgQnkgYW5kIGJ5LCBJIGNvbWU6LS0KICAgIFRvIGNlYXNlIHRoeSBzdWl0LCBhbmQgbGVhdmUgbWUgdG8gbXkgZ3JpZWY6CiAgICBUby1tb3Jyb3cgd2lsbCBJIHNlbmQuCgpST01FTwoKICAgIFNvIHRocml2ZSBteSBzb3VsLS0KCkpVTElFVAoKICAgIEEgdGhvdXNhbmQgdGltZXMgZ29vZCBuaWdodCEKCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBBIHRob3VzYW5kIHRpbWVzIHRoZSB3b3JzZSwgdG8gd2FudCB0aHkgbGlnaHQuCiAgICBMb3ZlIGdvZXMgdG93YXJkIGxvdmUsIGFzIHNjaG9vbGJveXMgZnJvbQogICAgdGhlaXIgYm9va3MsCiAgICBCdXQgbG92ZSBmcm9tIGxvdmUsIHRvd2FyZCBzY2hvb2wgd2l0aCBoZWF2eSBsb29rcy4KCiAgICBSZXRpcmluZwoKICAgIFJlLWVudGVyIEpVTElFVCwgYWJvdmUKCkpVTElFVAoKICAgIEhpc3QhIFJvbWVvLCBoaXN0ISBPLCBmb3IgYSBmYWxjb25lcidzIHZvaWNlLAogICAgVG8gbHVyZSB0aGlzIHRhc3NlbC1nZW50bGUgYmFjayBhZ2FpbiEKICAgIEJvbmRhZ2UgaXMgaG9hcnNlLCBhbmQgbWF5IG5vdCBzcGVhayBhbG91ZDsKICAgIEVsc2Ugd291bGQgSSB0ZWFyIHRoZSBjYXZlIHdoZXJlIEVjaG8gbGllcywKICAgIEFuZCBtYWtlIGhlciBhaXJ5IHRvbmd1ZSBtb3JlIGhvYXJzZSB0aGFuIG1pbmUsCiAgICBXaXRoIHJlcGV0aXRpb24gb2YgbXkgUm9tZW8ncyBuYW1lLgoKUk9NRU8KCiAgICBJdCBpcyBteSBzb3VsIHRoYXQgY2FsbHMgdXBvbiBteSBuYW1lOgogICAgSG93IHNpbHZlci1zd2VldCBzb3VuZCBsb3ZlcnMnIHRvbmd1ZXMgYnkgbmlnaHQsCiAgICBMaWtlIHNvZnRlc3QgbXVzaWMgdG8gYXR0ZW5kaW5nIGVhcnMhCgpKVUxJRVQKCiAgICBSb21lbyEKClJPTUVPCgogICAgTXkgZGVhcj8KCkpVTElFVAoKICAgIEF0IHdoYXQgbydjbG9jayB0by1tb3Jyb3cKICAgIFNoYWxsIEkgc2VuZCB0byB0aGVlPwoKUk9NRU8KCiAgICBBdCB0aGUgaG91ciBvZiBuaW5lLgoKSlVMSUVUCgogICAgSSB3aWxsIG5vdCBmYWlsOiAndGlzIHR3ZW50eSB5ZWFycyB0aWxsIHRoZW4uCiAgICBJIGhhdmUgZm9yZ290IHdoeSBJIGRpZCBjYWxsIHRoZWUgYmFjay4KClJPTUVPCgogICAgTGV0IG1lIHN0YW5kIGhlcmUgdGlsbCB0aG91IHJlbWVtYmVyIGl0LgoKSlVMSUVUCgogICAgSSBzaGFsbCBmb3JnZXQsIHRvIGhhdmUgdGhlZSBzdGlsbCBzdGFuZCB0aGVyZSwKICAgIFJlbWVtYmVyaW5nIGhvdyBJIGxvdmUgdGh5IGNvbXBhbnkuCgpST01FTwoKICAgIEFuZCBJJ2xsIHN0aWxsIHN0YXksIHRvIGhhdmUgdGhlZSBzdGlsbCBmb3JnZXQsCiAgICBGb3JnZXR0aW5nIGFueSBvdGhlciBob21lIGJ1dCB0aGlzLgoKSlVMSUVUCgogICAgJ1RpcyBhbG1vc3QgbW9ybmluZzsgSSB3b3VsZCBoYXZlIHRoZWUgZ29uZToKICAgIEFuZCB5ZXQgbm8gZnVydGhlciB0aGFuIGEgd2FudG9uJ3MgYmlyZDsKICAgIFdobyBsZXRzIGl0IGhvcCBhIGxpdHRsZSBmcm9tIGhlciBoYW5kLAogICAgTGlrZSBhIHBvb3IgcHJpc29uZXIgaW4gaGlzIHR3aXN0ZWQgZ3l2ZXMsCiAgICBBbmQgd2l0aCBhIHNpbGsgdGhyZWFkIHBsdWNrcyBpdCBiYWNrIGFnYWluLAogICAgU28gbG92aW5nLWplYWxvdXMgb2YgaGlzIGxpYmVydHkuCgpST01FTwoKICAgIEkgd291bGQgSSB3ZXJlIHRoeSBiaXJkLgoKSlVMSUVUCgogICAgU3dlZXQsIHNvIHdvdWxkIEk6CiAgICBZZXQgSSBzaG91bGQga2lsbCB0aGVlIHdpdGggbXVjaCBjaGVyaXNoaW5nLgogICAgR29vZCBuaWdodCwgZ29vZCBuaWdodCEgcGFydGluZyBpcyBzdWNoCiAgICBzd2VldCBzb3Jyb3csCiAgICBUaGF0IEkgc2hhbGwgc2F5IGdvb2QgbmlnaHQgdGlsbCBpdCBiZSBtb3Jyb3cuCgogICAgRXhpdCBhYm92ZQoKUk9NRU8KCiAgICBTbGVlcCBkd2VsbCB1cG9uIHRoaW5lIGV5ZXMsIHBlYWNlIGluIHRoeSBicmVhc3QhCiAgICBXb3VsZCBJIHdlcmUgc2xlZXAgYW5kIHBlYWNlLCBzbyBzd2VldCB0byByZXN0IQogICAgSGVuY2Ugd2lsbCBJIHRvIG15IGdob3N0bHkgZmF0aGVyJ3MgY2VsbCwKICAgIEhpcyBoZWxwIHRvIGNyYXZlLCBhbmQgbXkgZGVhciBoYXAgdG8gdGVsbC4KCiAgICBFeGl0CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSwgd2l0aCBhIGJhc2tldCAKCkZSSUFSIExBVVJFTkNFCgogICAgVGhlIGdyZXktZXllZCBtb3JuIHNtaWxlcyBvbiB0aGUgZnJvd25pbmcgbmlnaHQsCiAgICBDaGVxdWVyaW5nIHRoZSBlYXN0ZXJuIGNsb3VkcyB3aXRoIHN0cmVha3Mgb2YgbGlnaHQsCiAgICBBbmQgZmxlY2tlZCBkYXJrbmVzcyBsaWtlIGEgZHJ1bmthcmQgcmVlbHMKICAgIEZyb20gZm9ydGggZGF5J3MgcGF0aCBhbmQgVGl0YW4ncyBmaWVyeSB3aGVlbHM6CiAgICBOb3csIGVyZSB0aGUgc3VuIGFkdmFuY2UgaGlzIGJ1cm5pbmcgZXllLAogICAgVGhlIGRheSB0byBjaGVlciBhbmQgbmlnaHQncyBkYW5rIGRldyB0byBkcnksCiAgICBJIG11c3QgdXAtZmlsbCB0aGlzIG9zaWVyIGNhZ2Ugb2Ygb3VycwogICAgV2l0aCBiYWxlZnVsIHdlZWRzIGFuZCBwcmVjaW91cy1qdWljZWQgZmxvd2Vycy4KICAgIFRoZSBlYXJ0aCB0aGF0J3MgbmF0dXJlJ3MgbW90aGVyIGlzIGhlciB0b21iOwogICAgV2hhdCBpcyBoZXIgYnVyeWluZyBncmF2ZSB0aGF0IGlzIGhlciB3b21iLAogICAgQW5kIGZyb20gaGVyIHdvbWIgY2hpbGRyZW4gb2YgZGl2ZXJzIGtpbmQKICAgIFdlIHN1Y2tpbmcgb24gaGVyIG5hdHVyYWwgYm9zb20gZmluZCwKICAgIE1hbnkgZm9yIG1hbnkgdmlydHVlcyBleGNlbGxlbnQsCiAgICBOb25lIGJ1dCBmb3Igc29tZSBhbmQgeWV0IGFsbCBkaWZmZXJlbnQuCiAgICBPLCBtaWNrbGUgaXMgdGhlIHBvd2VyZnVsIGdyYWNlIHRoYXQgbGllcwogICAgSW4gaGVyYnMsIHBsYW50cywgc3RvbmVzLCBhbmQgdGhlaXIgdHJ1ZSBxdWFsaXRpZXM6CiAgICBGb3Igbm91Z2h0IHNvIHZpbGUgdGhhdCBvbiB0aGUgZWFydGggZG90aCBsaXZlCiAgICBCdXQgdG8gdGhlIGVhcnRoIHNvbWUgc3BlY2lhbCBnb29kIGRvdGggZ2l2ZSwKICAgIE5vciBhdWdodCBzbyBnb29kIGJ1dCBzdHJhaW4nZCBmcm9tIHRoYXQgZmFpciB1c2UKICAgIFJldm9sdHMgZnJvbSB0cnVlIGJpcnRoLCBzdHVtYmxpbmcgb24gYWJ1c2U6CiAgICBWaXJ0dWUgaXRzZWxmIHR1cm5zIHZpY2UsIGJlaW5nIG1pc2FwcGxpZWQ7CiAgICBBbmQgdmljZSBzb21ldGltZXMgYnkgYWN0aW9uIGRpZ25pZmllZC4KICAgIFdpdGhpbiB0aGUgaW5mYW50IHJpbmQgb2YgdGhpcyBzbWFsbCBmbG93ZXIKICAgIFBvaXNvbiBoYXRoIHJlc2lkZW5jZSBhbmQgbWVkaWNpbmUgcG93ZXI6CiAgICBGb3IgdGhpcywgYmVpbmcgc21lbHQsIHdpdGggdGhhdCBwYXJ0IGNoZWVycyBlYWNoIHBhcnQ7CiAgICBCZWluZyB0YXN0ZWQsIHNsYXlzIGFsbCBzZW5zZXMgd2l0aCB0aGUgaGVhcnQuCiAgICBUd28gc3VjaCBvcHBvc2VkIGtpbmdzIGVuY2FtcCB0aGVtIHN0aWxsCiAgICBJbiBtYW4gYXMgd2VsbCBhcyBoZXJicywgZ3JhY2UgYW5kIHJ1ZGUgd2lsbDsKICAgIEFuZCB3aGVyZSB0aGUgd29yc2VyIGlzIHByZWRvbWluYW50LAogICAgRnVsbCBzb29uIHRoZSBjYW5rZXIgZGVhdGggZWF0cyB1cCB0aGF0IHBsYW50LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEdvb2QgbW9ycm93LCBmYXRoZXIuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlbmVkaWNpdGUhCiAgICBXaGF0IGVhcmx5IHRvbmd1ZSBzbyBzd2VldCBzYWx1dGV0aCBtZT8KICAgIFlvdW5nIHNvbiwgaXQgYXJndWVzIGEgZGlzdGVtcGVyJ2QgaGVhZAogICAgU28gc29vbiB0byBiaWQgZ29vZCBtb3Jyb3cgdG8gdGh5IGJlZDoKICAgIENhcmUga2VlcHMgaGlzIHdhdGNoIGluIGV2ZXJ5IG9sZCBtYW4ncyBleWUsCiAgICBBbmQgd2hlcmUgY2FyZSBsb2RnZXMsIHNsZWVwIHdpbGwgbmV2ZXIgbGllOwogICAgQnV0IHdoZXJlIHVuYnJ1aXNlZCB5b3V0aCB3aXRoIHVuc3R1ZmYnZCBicmFpbgogICAgRG90aCBjb3VjaCBoaXMgbGltYnMsIHRoZXJlIGdvbGRlbiBzbGVlcCBkb3RoIHJlaWduOgogICAgVGhlcmVmb3JlIHRoeSBlYXJsaW5lc3MgZG90aCBtZSBhc3N1cmUKICAgIFRob3UgYXJ0IHVwLXJvdXNlZCBieSBzb21lIGRpc3RlbXBlcmF0dXJlOwogICAgT3IgaWYgbm90IHNvLCB0aGVuIGhlcmUgSSBoaXQgaXQgcmlnaHQsCiAgICBPdXIgUm9tZW8gaGF0aCBub3QgYmVlbiBpbiBiZWQgdG8tbmlnaHQuCgpST01FTwoKICAgIFRoYXQgbGFzdCBpcyB0cnVlOyB0aGUgc3dlZXRlciByZXN0IHdhcyBtaW5lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHb2QgcGFyZG9uIHNpbiEgd2FzdCB0aG91IHdpdGggUm9zYWxpbmUCgpST01FTwoKICAgIFdpdGggUm9zYWxpbmUsIG15IGdob3N0bHkgZmF0aGVyPyBubzsKICAgIEkgaGF2ZSBmb3Jnb3QgdGhhdCBuYW1lLCBhbmQgdGhhdCBuYW1lJ3Mgd29lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGF0J3MgbXkgZ29vZCBzb246IGJ1dCB3aGVyZSBoYXN0IHRob3UgYmVlbiwgdGhlbj8KClJPTUVPCgogICAgSSdsbCB0ZWxsIHRoZWUsIGVyZSB0aG91IGFzayBpdCBtZSBhZ2Fpbi4KICAgIEkgaGF2ZSBiZWVuIGZlYXN0aW5nIHdpdGggbWluZSBlbmVteSwKICAgIFdoZXJlIG9uIGEgc3VkZGVuIG9uZSBoYXRoIHdvdW5kZWQgbWUsCiAgICBUaGF0J3MgYnkgbWUgd291bmRlZDogYm90aCBvdXIgcmVtZWRpZXMKICAgIFdpdGhpbiB0aHkgaGVscCBhbmQgaG9seSBwaHlzaWMgbGllczoKICAgIEkgYmVhciBubyBoYXRyZWQsIGJsZXNzZWQgbWFuLCBmb3IsIGxvLAogICAgTXkgaW50ZXJjZXNzaW9uIGxpa2V3aXNlIHN0ZWFkcyBteSBmb2UuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlIHBsYWluLCBnb29kIHNvbiwgYW5kIGhvbWVseSBpbiB0aHkgZHJpZnQ7CiAgICBSaWRkbGluZyBjb25mZXNzaW9uIGZpbmRzIGJ1dCByaWRkbGluZyBzaHJpZnQuCgpST01FTwoKICAgIFRoZW4gcGxhaW5seSBrbm93IG15IGhlYXJ0J3MgZGVhciBsb3ZlIGlzIHNldAogICAgT24gdGhlIGZhaXIgZGF1Z2h0ZXIgb2YgcmljaCBDYXB1bGV0OgogICAgQXMgbWluZSBvbiBoZXJzLCBzbyBoZXJzIGlzIHNldCBvbiBtaW5lOwogICAgQW5kIGFsbCBjb21iaW5lZCwgc2F2ZSB3aGF0IHRob3UgbXVzdCBjb21iaW5lCiAgICBCeSBob2x5IG1hcnJpYWdlOiB3aGVuIGFuZCB3aGVyZSBhbmQgaG93CiAgICBXZSBtZXQsIHdlIHdvbydkIGFuZCBtYWRlIGV4Y2hhbmdlIG9mIHZvdywKICAgIEknbGwgdGVsbCB0aGVlIGFzIHdlIHBhc3M7IGJ1dCB0aGlzIEkgcHJheSwKICAgIFRoYXQgdGhvdSBjb25zZW50IHRvIG1hcnJ5IHVzIHRvLWRheS4KCkZSSUFSIExBVVJFTkNFCgogICAgSG9seSBTYWludCBGcmFuY2lzLCB3aGF0IGEgY2hhbmdlIGlzIGhlcmUhCiAgICBJcyBSb3NhbGluZSwgd2hvbSB0aG91IGRpZHN0IGxvdmUgc28gZGVhciwKICAgIFNvIHNvb24gZm9yc2FrZW4IHlvdW5nIG1lbidzIGxvdmUgdGhlbiBsaWVzCiAgICBOb3QgdHJ1bHkgaW4gdGhlaXIgaGVhcnRzLCBidXQgaW4gdGhlaXIgZXllcy4KICAgIEplc3UgTWFyaWEsIHdoYXQgYSBkZWFsIG9mIGJyaW5lCiAgICBIYXRoIHdhc2gnZCB0aHkgc2FsbG93IGNoZWVrcyBmb3IgUm9zYWxpbmUhCiAgICBIb3cgbXVjaCBzYWx0IHdhdGVyIHRocm93biBhd2F5IGluIHdhc3RlLAogICAgVG8gc2Vhc29uIGxvdmUsIHRoYXQgb2YgaXQgZG90aCBub3QgdGFzdGUhCiAgICBUaGUgc3VuIG5vdCB5ZXQgdGh5IHNpZ2hzIGZyb20gaGVhdmVuIGNsZWFycywKICAgIFRoeSBvbGQgZ3JvYW5zIHJpbmcgeWV0IGluIG15IGFuY2llbnQgZWFyczsKICAgIExvLCBoZXJlIHVwb24gdGh5IGNoZWVrIHRoZSBzdGFpbiBkb3RoIHNpdAogICAgT2YgYW4gb2xkIHRlYXIgdGhhdCBpcyBub3Qgd2FzaCdkIG9mZiB5ZXQ6CiAgICBJZiBlJ2VyIHRob3Ugd2FzdCB0aHlzZWxmIGFuZCB0aGVzZSB3b2VzIHRoaW5lLAogICAgVGhvdSBhbmQgdGhlc2Ugd29lcyB3ZXJlIGFsbCBmb3IgUm9zYWxpbmU6CiAgICBBbmQgYXJ0IHRob3UgY2hhbmdlZD8gcHJvbm91bmNlIHRoaXMgc2VudGVuY2UgdGhlbiwKICAgIFdvbWVuIG1heSBmYWxsLCB3aGVuIHRoZXJlJ3Mgbm8gc3RyZW5ndGggaW4gbWVuLgoKUk9NRU8KCiAgICBUaG91IGNoaWQnc3QgbWUgb2Z0IGZvciBsb3ZpbmcgUm9zYWxpbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIEZvciBkb3RpbmcsIG5vdCBmb3IgbG92aW5nLCBwdXBpbCBtaW5lLgoKUk9NRU8KCiAgICBBbmQgYmFkJ3N0IG1lIGJ1cnkgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTm90IGluIGEgZ3JhdmUsCiAgICBUbyBsYXkgb25lIGluLCBhbm90aGVyIG91dCB0byBoYXZlLgoKUk9NRU8KCiAgICBJIHByYXkgdGhlZSwgY2hpZGUgbm90OyBzaGUgd2hvbSBJIGxvdmUgbm93CiAgICBEb3RoIGdyYWNlIGZvciBncmFjZSBhbmQgbG92ZSBmb3IgbG92ZSBhbGxvdzsKICAgIFRoZSBvdGhlciBkaWQgbm90IHNvLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBPLCBzaGUga25ldyB3ZWxsCiAgICBUaHkgbG92ZSBkaWQgcmVhZCBieSByb3RlIGFuZCBjb3VsZCBub3Qgc3BlbGwuCiAgICBCdXQgY29tZSwgeW91bmcgd2F2ZXJlciwgY29tZSwgZ28gd2l0aCBtZSwKICAgIEluIG9uZSByZXNwZWN0IEknbGwgdGh5IGFzc2lzdGFudCBiZTsKICAgIEZvciB0aGlzIGFsbGlhbmNlIG1heSBzbyBoYXBweSBwcm92ZSwKICAgIFRvIHR1cm4geW91ciBob3VzZWhvbGRzJyByYW5jb3VyIHRvIHB1cmUgbG92ZS4KClJPTUVPCgogICAgTywgbGV0IHVzIGhlbmNlOyBJIHN0YW5kIG9uIHN1ZGRlbiBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2lzZWx5IGFuZCBzbG93OyB0aGV5IHN0dW1ibGUgdGhhdCBydW4gZmFzdC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBCRU5WT0xJTyBhbmQgTUVSQ1VUSU8gCgpNRVJDVVRJTwoKICAgIFdoZXJlIHRoZSBkZXZpbCBzaG91bGQgdGhpcyBSb21lbyBiZT8KICAgIENhbWUgaGUgbm90IGhvbWUgdG8tbmlnaHQCgpCRU5WT0xJTwoKICAgIE5vdCB0byBoaXMgZmF0aGVyJ3M7IEkgc3Bva2Ugd2l0aCBoaXMgbWFuLgoKTUVSQ1VUSU8KCiAgICBBaCwgdGhhdCBzYW1lIHBhbGUgaGFyZC1oZWFydGVkIHdlbmNoLCB0aGF0IFJvc2FsaW5lLgogICAgVG9ybWVudHMgaGltIHNvLCB0aGF0IGhlIHdpbGwgc3VyZSBydW4gbWFkLgoKQkVOVk9MSU8KCiAgICBUeWJhbHQsIHRoZSBraW5zbWFuIG9mIG9sZCBDYXB1bGV0LAogICAgSGF0aCBzZW50IGEgbGV0dGVyIHRvIGhpcyBmYXRoZXIncyBob3VzZS4KCk1FUkNVVElPCgogICAgQSBjaGFsbGVuZ2UsIG9uIG15IGxpZmUuCgpCRU5WT0xJTwoKICAgIFJvbWVvIHdpbGwgYW5zd2VyIGl0LgoKTUVSQ1VUSU8KCiAgICBBbnkgbWFuIHRoYXQgY2FuIHdyaXRlIG1heSBhbnN3ZXIgYSBsZXR0ZXIuCgpCRU5WT0xJTwoKICAgIE5heSwgaGUgd2lsbCBhbnN3ZXIgdGhlIGxldHRlcidzIG1hc3RlciwgaG93IGhlCiAgICBkYXJlcywgYmVpbmcgZGFyZWQuCgpNRVJDVVRJTwoKICAgIEFsYXMgcG9vciBSb21lbyEgaGUgaXMgYWxyZWFkeSBkZWFkOyBzdGFiYmVkIHdpdGggYQogICAgd2hpdGUgd2VuY2gncyBibGFjayBleWU7IHNob3QgdGhyb3VnaCB0aGUgZWFyIHdpdGggYQogICAgbG92ZS1zb25nOyB0aGUgdmVyeSBwaW4gb2YgaGlzIGhlYXJ0IGNsZWZ0IHdpdGggdGhlCiAgICBibGluZCBib3ctYm95J3MgYnV0dC1zaGFmdDogYW5kIGlzIGhlIGEgbWFuIHRvCiAgICBlbmNvdW50ZXIgVHliYWx0PwoKQkVOVk9MSU8KCiAgICBXaHksIHdoYXQgaXMgVHliYWx0PwoKTUVSQ1VUSU8KCiAgICBNb3JlIHRoYW4gcHJpbmNlIG9mIGNhdHMsIEkgY2FuIHRlbGwgeW91LiBPLCBoZSBpcwogICAgdGhlIGNvdXJhZ2VvdXMgY2FwdGFpbiBvZiBjb21wbGltZW50cy4gSGUgZmlnaHRzIGFzCiAgICB5b3Ugc2luZyBwcmljay1zb25nLCBrZWVwcyB0aW1lLCBkaXN0YW5jZSwgYW5kCiAgICBwcm9wb3J0aW9uOyByZXN0cyBtZSBoaXMgbWluaW0gcmVzdCwgb25lLCB0d28sIGFuZAogICAgdGhlIHRoaXJkIGluIHlvdXIgYm9zb206IHRoZSB2ZXJ5IGJ1dGNoZXIgb2YgYSBzaWxrCiAgICBidXR0b24sIGEgZHVlbGxpc3QsIGEgZHVlbGxpc3Q7IGEgZ2VudGxlbWFuIG9mIHRoZQogICAgdmVyeSBmaXJzdCBob3VzZSwgb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2F1c2U6CiAgICBhaCwgdGhlIGltbW9ydGFsIHBhc3NhZG8hIHRoZSBwdW50byByZXZlcnNvISB0aGUKICAgIGhhaSEKCkJFTlZPTElPCgogICAgVGhlIHdoYXQCgpNRVJDVVRJTwoKICAgIFRoZSBwb3ggb2Ygc3VjaCBhbnRpYywgbGlzcGluZywgYWZmZWN0aW5nCiAgICBmYW50YXN0aWNvZXM7IHRoZXNlIG5ldyB0dW5lcnMgb2YgYWNjZW50cyEgJ0J5IEplc3UsCiAgICBhIHZlcnkgZ29vZCBibGFkZSEgYSB2ZXJ5IHRhbGwgbWFuISBhIHZlcnkgZ29vZAogICAgd2hvcmUhJyBXaHksIGlzIG5vdCB0aGlzIGEgbGFtZW50YWJsZSB0aGluZywKICAgIGdyYW5kc2lyZSwgdGhhdCB3ZSBzaG91bGQgYmUgdGh1cyBhZmZsaWN0ZWQgd2l0aAogICAgdGhlc2Ugc3RyYW5nZSBmbGllcywgdGhlc2UgZmFzaGlvbi1tb25nZXJzLCB0aGVzZQogICAgcGVyZG9uYS1taSdzLCB3aG8gc3RhbmQgc28gbXVjaCBvbiB0aGUgbmV3IGZvcm0sCiAgICB0aGF0IHRoZXkgY2Fubm90IGF0IGVhc2Ugb24gdGhlIG9sZCBiZW5jaD8gTywgdGhlaXIKICAgIGJvbmVzLCB0aGVpciBib25lcyEKCiAgICBFbnRlciBST01FTwoKQkVOVk9MSU8KCiAgICBIZXJlIGNvbWVzIFJvbWVvLCBoZXJlIGNvbWVzIFJvbWVvLgoKTUVSQ1VUSU8KCiAgICBXaXRob3V0IGhpcyByb2UsIGxpa2UgYSBkcmllZCBoZXJyaW5nOiBmbGVzaCwgZmxlc2gsCiAgICBob3cgYXJ0IHRob3UgZmlzaGlmaWVkISBOb3cgaXMgaGUgZm9yIHRoZSBudW1iZXJzCiAgICB0aGF0IFBldHJhcmNoIGZsb3dlZCBpbjogTGF1cmEgdG8gaGlzIGxhZHkgd2FzIGJ1dCBhCiAgICBraXRjaGVuLXdlbmNoOyBtYXJyeSwgc2hlIGhhZCBhIGJldHRlciBsb3ZlIHRvCiAgICBiZS1yaHltZSBoZXI7IERpZG8gYSBkb3dkeTsgQ2xlb3BhdHJhIGEgZ2lwc3k7CiAgICBIZWxlbiBhbmQgSGVybyBoaWxkaW5ncyBhbmQgaGFybG90czsgVGhpc2JlIGEgZ3JleQogICAgZXllIG9yIHNvLCBidXQgbm90IHRvIHRoZSBwdXJwb3NlLiBTaWduaW9yCiAgICBSb21lbywgYm9uIGpvdXIhIHRoZXJlJ3MgYSBGcmVuY2ggc2FsdXRhdGlvbgogICAgdG8geW91ciBGcmVuY2ggc2xvcC4gWW91IGdhdmUgdXMgdGhlIGNvdW50ZXJmZWl0CiAgICBmYWlybHkgbGFzdCBuaWdodC4KClJPTUVPCgogICAgR29vZCBtb3Jyb3cgdG8geW91IGJvdGguIFdoYXQgY291bnRlcmZlaXQgZGlkIEkgZ2l2ZSB5b3UCgpNRVJDVVRJTwoKICAgIFRoZSBzaGlwLCBzaXIsIHRoZSBzbGlwOyBjYW4geW91IG5vdCBjb25jZWl2ZT8KClJPTUVPCgogICAgUGFyZG9uLCBnb29kIE1lcmN1dGlvLCBteSBidXNpbmVzcyB3YXMgZ3JlYXQ7IGFuZCBpbgogICAgc3VjaCBhIGNhc2UgYXMgbWluZSBhIG1hbiBtYXkgc3RyYWluIGNvdXJ0ZXN5LgoKTUVSQ1VUSU8KCiAgICBUaGF0J3MgYXMgbXVjaCBhcyB0byBzYXksIHN1Y2ggYSBjYXNlIGFzIHlvdXJzCiAgICBjb25zdHJhaW5zIGEgbWFuIHRvIGJvdyBpbiB0aGUgaGFtcy4KClJPTUVPCgogICAgTWVhbmluZywgdG8gY291cnQnc3kuCgpNRVJDVVRJTwoKICAgIFRob3UgaGFzdCBtb3N0IGtpbmRseSBoaXQgaXQuCgpST01FTwoKICAgIEEgbW9zdCBjb3VydGVvdXMgZXhwb3NpdGlvbi4KCk1FUkNVVElPCgogICAgTmF5LCBJIGFtIHRoZSB2ZXJ5IHBpbmsgb2YgY291cnRlc3kuCgpST01FTwoKICAgIFBpbmsgZm9yIGZsb3dlci4KCk1FUkNVVElPCgogICAgUmlnaHQuCgpST01FTwoKICAgIFdoeSwgdGhlbiBpcyBteSBwdW1wIHdlbGwgZmxvd2VyZWQuCgpNRVJDVVRJTwoKICAgIFdlbGwgc2FpZDogZm9sbG93IG1lIHRoaXMgamVzdCBub3cgdGlsbCB0aG91IGhhc3QKICAgIHdvcm4gb3V0IHRoeSBwdW1wLCB0aGF0IHdoZW4gdGhlIHNpbmdsZSBzb2xlIG9mIGl0CiAgICBpcyB3b3JuLCB0aGUgamVzdCBtYXkgcmVtYWluIGFmdGVyIHRoZSB3ZWFyaW5nIHNvbGUgc2luZ3VsYXIuCgpST01FTwoKICAgIE8gc2luZ2xlLXNvbGVkIGplc3QsIHNvbGVseSBzaW5ndWxhciBmb3IgdGhlCiAgICBzaW5nbGVuZXNzLgoKTUVSQ1VUSU8KCiAgICBDb21lIGJldHdlZW4gdXMsIGdvb2QgQmVudm9saW87IG15IHdpdHMgZmFpbnQuCgpST01FTwoKICAgIFN3aXRjaCBhbmQgc3B1cnMsIHN3aXRjaCBhbmQgc3B1cnM7IG9yIEknbGwgY3J5IGEgbWF0Y2guCgpNRVJDVVRJTwoKICAgIE5heSwgaWYgdGh5IHdpdHMgcnVuIHRoZSB3aWxkLWdvb3NlIGNoYXNlLCBJIGhhdmUKICAgIGRvbmUsIGZvciB0aG91IGhhc3QgbW9yZSBvZiB0aGUgd2lsZC1nb29zZSBpbiBvbmUgb2YKICAgIHRoeSB3aXRzIHRoYW4sIEkgYW0gc3VyZSwgSSBoYXZlIGluIG15IHdob2xlIGZpdmU6CiAgICB3YXMgSSB3aXRoIHlvdSB0aGVyZSBmb3IgdGhlIGdvb3NlPwoKUk9NRU8KCiAgICBUaG91IHdhc3QgbmV2ZXIgd2l0aCBtZSBmb3IgYW55IHRoaW5nIHdoZW4gdGhvdSB3YXN0CiAgICBub3QgdGhlcmUgZm9yIHRoZSBnb29zZS4KCk1FUkNVVElPCgogICAgSSB3aWxsIGJpdGUgdGhlZSBieSB0aGUgZWFyIGZvciB0aGF0IGplc3QuCgpST01FTwoKICAgIE5heSwgZ29vZCBnb29zZSwgYml0ZSBub3QuCgpNRVJDVVRJTwoKICAgIFRoeSB3aXQgaXMgYSB2ZXJ5IGJpdHRlciBzd2VldGluZzsgaXQgaXMgYSBtb3N0CiAgICBzaGFycCBzYXVjZS4KClJPTUVPCgogICAgQW5kIGlzIGl0IG5vdCB3ZWxsIHNlcnZlZCBpbiB0byBhIHN3ZWV0IGdvb3NlPwoKTUVSQ1VUSU8KCiAgICBPIGhlcmUncyBhIHdpdCBvZiBjaGV2ZXJpbCwgdGhhdCBzdHJldGNoZXMgZnJvbSBhbgogICAgaW5jaCBuYXJyb3cgdG8gYW4gZWxsIGJyb2FkIQoKUk9NRU8KCiAgICBJIHN0cmV0Y2ggaXQgb3V0IGZvciB0aGF0IHdvcmQgJ2Jyb2FkOycgd2hpY2ggYWRkZWQKICAgIHRvIHRoZSBnb29zZSwgcHJvdmVzIHRoZWUgZmFyIGFuZCB3aWRlIGEgYnJvYWQgZ29vc2UuCgpNRVJDVVRJTwoKICAgIFdoeSwgaXMgbm90IHRoaXMgYmV0dGVyIG5vdyB0aGFuIGdyb2FuaW5nIGZvciBsb3ZlPwogICAgbm93IGFydCB0aG91IHNvY2lhYmxlLCBub3cgYXJ0IHRob3UgUm9tZW87IG5vdyBhcnQKICAgIHRob3Ugd2hhdCB0aG91IGFydCwgYnkgYXJ0IGFzIHdlbGwgYXMgYnkgbmF0dXJlOgogICAgZm9yIHRoaXMgZHJpdmVsbGluZyBsb3ZlIGlzIGxpa2UgYSBncmVhdCBuYXR1cmFsLAogICAgdGhhdCBydW5zIGxvbGxpbmcgdXAgYW5kIGRvd24gdG8gaGlkZSBoaXMgYmF1YmxlIGluIGEgaG9sZS4KCkJFTlZPTElPCgogICAgU3RvcCB0aGVyZSwgc3RvcCB0aGVyZS4KCk1FUkNVVElPCgogICAgVGhvdSBkZXNpcmVzdCBtZSB0byBzdG9wIGluIG15IHRhbGUgYWdhaW5zdCB0aGUgaGFpci4KCkJFTlZPTElPCgogICAgVGhvdSB3b3VsZHN0IGVsc2UgaGF2ZSBtYWRlIHRoeSB0YWxlIGxhcmdlLgoKTUVSQ1VUSU8KCiAgICBPLCB0aG91IGFydCBkZWNlaXZlZDsgSSB3b3VsZCBoYXZlIG1hZGUgaXQgc2hvcnQ6CiAgICBmb3IgSSB3YXMgY29tZSB0byB0aGUgd2hvbGUgZGVwdGggb2YgbXkgdGFsZTsgYW5kCiAgICBtZWFudCwgaW5kZWVkLCB0byBvY2N1cHkgdGhlIGFyZ3VtZW50IG5vIGxvbmdlci4KClJPTUVPCgogICAgSGVyZSdzIGdvb2RseSBnZWFyIQoKICAgIEVudGVyIE51cnNlIGFuZCBQRVRFUgoKTUVSQ1VUSU8KCiAgICBBIHNhaWwsIGEgc2FpbCEKCkJFTlZPTElPCgogICAgVHdvLCB0d287IGEgc2hpcnQgYW5kIGEgc21vY2suCgpOdXJzZQoKICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBNeSBmYW4sIFBldGVyLgoKTUVSQ1VUSU8KCiAgICBHb29kIFBldGVyLCB0byBoaWRlIGhlciBmYWNlOyBmb3IgaGVyIGZhbidzIHRoZQogICAgZmFpcmVyIGZhY2UuCgpOdXJzZQoKICAgIEdvZCB5ZSBnb29kIG1vcnJvdywgZ2VudGxlbWVuLgoKTUVSQ1VUSU8KCiAgICBHb2QgeWUgZ29vZCBkZW4sIGZhaXIgZ2VudGxld29tYW4uCgpOdXJzZQoKICAgIElzIGl0IGdvb2QgZGVuPwoKTUVSQ1VUSU8KCiAgICAnVGlzIG5vIGxlc3MsIEkgdGVsbCB5b3UsIGZvciB0aGUgYmF3ZHkgaGFuZCBvZiB0aGUKICAgIGRpYWwgaXMgbm93IHVwb24gdGhlIHByaWNrIG9mIG5vb24uCgpOdXJzZQoKICAgIE91dCB1cG9uIHlvdSEgd2hhdCBhIG1hbiBhcmUgeW91IQoKUk9NRU8KCiAgICBPbmUsIGdlbnRsZXdvbWFuLCB0aGF0IEdvZCBoYXRoIG1hZGUgZm9yIGhpbXNlbGYgdG8KICAgIG1hci4KCk51cnNlCgogICAgQnkgbXkgdHJvdGgsIGl0IGlzIHdlbGwgc2FpZDsgJ2ZvciBoaW1zZWxmIHRvIG1hciwnCiAgICBxdW90aCBhJz8gR2VudGxlbWVuLCBjYW4gYW55IG9mIHlvdSB0ZWxsIG1lIHdoZXJlIEkKICAgIG1heSBmaW5kIHRoZSB5b3VuZyBSb21lbz8KClJPTUVPCgogICAgSSBjYW4gdGVsbCB5b3U7IGJ1dCB5b3VuZyBSb21lbyB3aWxsIGJlIG9sZGVyIHdoZW4KICAgIHlvdSBoYXZlIGZvdW5kIGhpbSB0aGFuIGhlIHdhcyB3aGVuIHlvdSBzb3VnaHQgaGltOgogICAgSSBhbSB0aGUgeW91bmdlc3Qgb2YgdGhhdCBuYW1lLCBmb3IgZmF1bHQgb2YgYSB3b3JzZS4KCk51cnNlCgogICAgWW91IHNheSB3ZWxsLgoKTUVSQ1VUSU8KCiAgICBZZWEsIGlzIHRoZSB3b3JzdCB3ZWxsPyB2ZXJ5IHdlbGwgdG9vaywgaScgZmFpdGg7CiAgICB3aXNlbHksIHdpc2VseS4KCk51cnNlCgogICAgaWYgeW91IGJlIGhlLCBzaXIsIEkgZGVzaXJlIHNvbWUgY29uZmlkZW5jZSB3aXRoCiAgICB5b3UuCgpCRU5WT0xJTwoKICAgIFNoZSB3aWxsIGluZGl0ZSBoaW0gdG8gc29tZSBzdXBwZXIuCgpNRVJDVVRJTwoKICAgIEEgYmF3ZCwgYSBiYXdkLCBhIGJhd2QhIHNvIGhvIQoKUk9NRU8KCiAgICBXaGF0IGhhc3QgdGhvdSBmb3VuZD8KCk1FUkNVVElPCgogICAgTm8gaGFyZSwgc2lyOyB1bmxlc3MgYSBoYXJlLCBzaXIsIGluIGEgbGVudGVuIHBpZSwKICAgIHRoYXQgaXMgc29tZXRoaW5nIHN0YWxlIGFuZCBob2FyIGVyZSBpdCBiZSBzcGVudC4KCiAgICBTaW5ncwogICAgQW4gb2xkIGhhcmUgaG9hciwKICAgIEFuZCBhbiBvbGQgaGFyZSBob2FyLAogICAgSXMgdmVyeSBnb29kIG1lYXQgaW4gbGVudAogICAgQnV0IGEgaGFyZSB0aGF0IGlzIGhvYXIKICAgIElzIHRvbyBtdWNoIGZvciBhIHNjb3JlLAogICAgV2hlbiBpdCBob2FycyBlcmUgaXQgYmUgc3BlbnQuCiAgICBSb21lbywgd2lsbCB5b3UgY29tZSB0byB5b3VyIGZhdGhlcidzPyB3ZSdsbAogICAgdG8gZGlubmVyLCB0aGl0aGVyLgoKUk9NRU8KCiAgICBJIHdpbGwgZm9sbG93IHlvdS4KCk1FUkNVVElPCgogICAgRmFyZXdlbGwsIGFuY2llbnQgbGFkeTsgZmFyZXdlbGwsCgogICAgU2luZ2luZwogICAgJ2xhZHksIGxhZHksIGxhZHkuJwoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KCk51cnNlCgogICAgTWFycnksIGZhcmV3ZWxsISBJIHByYXkgeW91LCBzaXIsIHdoYXQgc2F1Y3kKICAgIG1lcmNoYW50IHdhcyB0aGlzLCB0aGF0IHdhcyBzbyBmdWxsIG9mIGhpcyByb3BlcnkCgpST01FTwoKICAgIEEgZ2VudGxlbWFuLCBudXJzZSwgdGhhdCBsb3ZlcyB0byBoZWFyIGhpbXNlbGYgdGFsaywKICAgIGFuZCB3aWxsIHNwZWFrIG1vcmUgaW4gYSBtaW51dGUgdGhhbiBoZSB3aWxsIHN0YW5kCiAgICB0byBpbiBhIG1vbnRoLgoKTnVyc2UKCiAgICBBbiBhJyBzcGVhayBhbnkgdGhpbmcgYWdhaW5zdCBtZSwgSSdsbCB0YWtlIGhpbQogICAgZG93biwgYW4gYScgd2VyZSBsdXN0aWVyIHRoYW4gaGUgaXMsIGFuZCB0d2VudHkgc3VjaAogICAgSmFja3M7IGFuZCBpZiBJIGNhbm5vdCwgSSdsbCBmaW5kIHRob3NlIHRoYXQgc2hhbGwuCiAgICBTY3Vydnkga25hdmUhIEkgYW0gbm9uZSBvZiBoaXMgZmxpcnQtZ2lsbHM7IEkgYW0KICAgIG5vbmUgb2YgaGlzIHNrYWlucy1tYXRlcy4gQW5kIHRob3UgbXVzdCBzdGFuZCBieQogICAgdG9vLCBhbmQgc3VmZmVyIGV2ZXJ5IGtuYXZlIHRvIHVzZSBtZSBhdCBoaXMgcGxlYXN1cmUCgpQRVRFUgoKICAgIEkgc2F3IG5vIG1hbiB1c2UgeW91IGEgcGxlYXN1cmU7IGlmIEkgaGFkLCBteSB3ZWFwb24KICAgIHNob3VsZCBxdWlja2x5IGhhdmUgYmVlbiBvdXQsIEkgd2FycmFudCB5b3U6IEkgZGFyZQogICAgZHJhdyBhcyBzb29uIGFzIGFub3RoZXIgbWFuLCBpZiBJIHNlZSBvY2Nhc2lvbiBpbiBhCiAgICBnb29kIHF1YXJyZWwsIGFuZCB0aGUgbGF3IG9uIG15IHNpZGUuCgpOdXJzZQoKICAgIE5vdywgYWZvcmUgR29kLCBJIGFtIHNvIHZleGVkLCB0aGF0IGV2ZXJ5IHBhcnQgYWJvdXQKICAgIG1lIHF1aXZlcnMuIFNjdXJ2eSBrbmF2ZSEgUHJheSB5b3UsIHNpciwgYSB3b3JkOgogICAgYW5kIGFzIEkgdG9sZCB5b3UsIG15IHlvdW5nIGxhZHkgYmFkZSBtZSBpbnF1aXJlIHlvdQogICAgb3V0OyB3aGF0IHNoZSBiYWRlIG1lIHNheSwgSSB3aWxsIGtlZXAgdG8gbXlzZWxmOgogICAgYnV0IGZpcnN0IGxldCBtZSB0ZWxsIHllLCBpZiB5ZSBzaG91bGQgbGVhZCBoZXIgaW50bwogICAgYSBmb29sJ3MgcGFyYWRpc2UsIGFzIHRoZXkgc2F5LCBpdCB3ZXJlIGEgdmVyeSBncm9zcwogICAga2luZCBvZiBiZWhhdmlvciwgYXMgdGhleSBzYXk6IGZvciB0aGUgZ2VudGxld29tYW4KICAgIGlzIHlvdW5nOyBhbmQsIHRoZXJlZm9yZSwgaWYgeW91IHNob3VsZCBkZWFsIGRvdWJsZQogICAgd2l0aCBoZXIsIHRydWx5IGl0IHdlcmUgYW4gaWxsIHRoaW5nIHRvIGJlIG9mZmVyZWQKICAgIHRvIGFueSBnZW50bGV3b21hbiwgYW5kIHZlcnkgd2VhayBkZWFsaW5nLgoKUk9NRU8KCiAgICBOdXJzZSwgY29tbWVuZCBtZSB0byB0aHkgbGFkeSBhbmQgbWlzdHJlc3MuIEkKICAgIHByb3Rlc3QgdW50byB0aGVlLS0KCk51cnNlCgogICAgR29vZCBoZWFydCwgYW5kLCBpJyBmYWl0aCwgSSB3aWxsIHRlbGwgaGVyIGFzIG11Y2g6CiAgICBMb3JkLCBMb3JkLCBzaGUgd2lsbCBiZSBhIGpveWZ1bCB3b21hbi4KClJPTUVPCgogICAgV2hhdCB3aWx0IHRob3UgdGVsbCBoZXIsIG51cnNlPyB0aG91IGRvc3Qgbm90IG1hcmsgbWUuCgpOdXJzZQoKICAgIEkgd2lsbCB0ZWxsIGhlciwgc2lyLCB0aGF0IHlvdSBkbyBwcm90ZXN0OyB3aGljaCwgYXMKICAgIEkgdGFrZSBpdCwgaXMgYSBnZW50bGVtYW5saWtlIG9mZmVyLgoKUk9NRU8KCiAgICBCaWQgaGVyIGRldmlzZQogICAgU29tZSBtZWFucyB0byBjb21lIHRvIHNocmlmdCB0aGlzIGFmdGVybm9vbjsKICAgIEFuZCB0aGVyZSBzaGUgc2hhbGwgYXQgRnJpYXIgTGF1cmVuY2UnIGNlbGwKICAgIEJlIHNocml2ZWQgYW5kIG1hcnJpZWQuIEhlcmUgaXMgZm9yIHRoeSBwYWlucy4KCk51cnNlCgogICAgTm8gdHJ1bHkgc2lyOyBub3QgYSBwZW5ueS4KClJPTUVPCgogICAgR28gdG87IEkgc2F5IHlvdSBzaGFsbC4KCk51cnNlCgogICAgVGhpcyBhZnRlcm5vb24sIHNpcj8gd2VsbCwgc2hlIHNoYWxsIGJlIHRoZXJlLgoKUk9NRU8KCiAgICBBbmQgc3RheSwgZ29vZCBudXJzZSwgYmVoaW5kIHRoZSBhYmJleSB3YWxsOgogICAgV2l0aGluIHRoaXMgaG91ciBteSBtYW4gc2hhbGwgYmUgd2l0aCB0aGVlCiAgICBBbmQgYnJpbmcgdGhlZSBjb3JkcyBtYWRlIGxpa2UgYSB0YWNrbGVkIHN0YWlyOwogICAgV2hpY2ggdG8gdGhlIGhpZ2ggdG9wLWdhbGxhbnQgb2YgbXkgam95CiAgICBNdXN0IGJlIG15IGNvbnZveSBpbiB0aGUgc2VjcmV0IG5pZ2h0LgogICAgRmFyZXdlbGw7IGJlIHRydXN0eSwgYW5kIEknbGwgcXVpdCB0aHkgcGFpbnM6CiAgICBGYXJld2VsbDsgY29tbWVuZCBtZSB0byB0aHkgbWlzdHJlc3MuCgpOdXJzZQoKICAgIE5vdyBHb2QgaW4gaGVhdmVuIGJsZXNzIHRoZWUhIEhhcmsgeW91LCBzaXIuCgpST01FTwoKICAgIFdoYXQgc2F5J3N0IHRob3UsIG15IGRlYXIgbnVyc2UCgpOdXJzZQoKICAgIElzIHlvdXIgbWFuIHNlY3JldD8gRGlkIHlvdSBuZSdlciBoZWFyIHNheSwKICAgIFR3byBtYXkga2VlcCBjb3Vuc2VsLCBwdXR0aW5nIG9uZSBhd2F5PwoKUk9NRU8KCiAgICBJIHdhcnJhbnQgdGhlZSwgbXkgbWFuJ3MgYXMgdHJ1ZSBhcyBzdGVlbC4KCk5VUlNFCgogICAgV2VsbCwgc2lyOyBteSBtaXN0cmVzcyBpcyB0aGUgc3dlZXRlc3QgbGFkeS0tTG9yZCwKICAgIExvcmQhIHdoZW4gJ3R3YXMgYSBsaXR0bGUgcHJhdGluZyB0aGluZzotLU8sIHRoZXJlCiAgICBpcyBhIG5vYmxlbWFuIGluIHRvd24sIG9uZSBQYXJpcywgdGhhdCB3b3VsZCBmYWluCiAgICBsYXkga25pZmUgYWJvYXJkOyBidXQgc2hlLCBnb29kIHNvdWwsIGhhZCBhcyBsaWVmCiAgICBzZWUgYSB0b2FkLCBhIHZlcnkgdG9hZCwgYXMgc2VlIGhpbS4gSSBhbmdlciBoZXIKICAgIHNvbWV0aW1lcyBhbmQgdGVsbCBoZXIgdGhhdCBQYXJpcyBpcyB0aGUgcHJvcGVyZXIKICAgIG1hbjsgYnV0LCBJJ2xsIHdhcnJhbnQgeW91LCB3aGVuIEkgc2F5IHNvLCBzaGUgbG9va3MKICAgIGFzIHBhbGUgYXMgYW55IGNsb3V0IGluIHRoZSB2ZXJzYWwgd29ybGQuIERvdGggbm90CiAgICByb3NlbWFyeSBhbmQgUm9tZW8gYmVnaW4gYm90aCB3aXRoIGEgbGV0dGVyPwoKUk9NRU8KCiAgICBBeSwgbnVyc2U7IHdoYXQgb2YgdGhhdD8gYm90aCB3aXRoIGFuIFIuCgpOdXJzZQoKICAgIEFoLiBtb2NrZXIhIHRoYXQncyB0aGUgZG9nJ3MgbmFtZTsgUiBpcyBmb3IKICAgIHRoZS0tTm87IEkga25vdyBpdCBiZWdpbnMgd2l0aCBzb21lIG90aGVyCiAgICBsZXR0ZXI6LS1hbmQgc2hlIGhhdGggdGhlIHByZXR0aWVzdCBzZW50ZW50aW91cyBvZgogICAgaXQsIG9mIHlvdSBhbmQgcm9zZW1hcnksIHRoYXQgaXQgd291bGQgZG8geW91IGdvb2QKICAgIHRvIGhlYXIgaXQuCgpST01FTwoKICAgIENvbW1lbmQgbWUgdG8gdGh5IGxhZHkuCgpOdXJzZQoKICAgIEF5LCBhIHRob3VzYW5kIHRpbWVzLgoKICAgIEV4aXQgUm9tZW8KICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBQZXRlciwgdGFrZSBteSBmYW4sIGFuZCBnbyBiZWZvcmUgYW5kIGFwYWNlLgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgSlVMSUVUIAoKSlVMSUVUCgogICAgVGhlIGNsb2NrIHN0cnVjayBuaW5lIHdoZW4gSSBkaWQgc2VuZCB0aGUgbnVyc2U7CiAgICBJbiBoYWxmIGFuIGhvdXIgc2hlIHByb21pc2VkIHRvIHJldHVybi4KICAgIFBlcmNoYW5jZSBzaGUgY2Fubm90IG1lZXQgaGltOiB0aGF0J3Mgbm90IHNvLgogICAgTywgc2hlIGlzIGxhbWUhIGxvdmUncyBoZXJhbGRzIHNob3VsZCBiZSB0aG91Z2h0cywKICAgIFdoaWNoIHRlbiB0aW1lcyBmYXN0ZXIgZ2xpZGUgdGhhbiB0aGUgc3VuJ3MgYmVhbXMsCiAgICBEcml2aW5nIGJhY2sgc2hhZG93cyBvdmVyIGxvdXJpbmcgaGlsbHM6CiAgICBUaGVyZWZvcmUgZG8gbmltYmxlLXBpbmlvbidkIGRvdmVzIGRyYXcgbG92ZSwKICAgIEFuZCB0aGVyZWZvcmUgaGF0aCB0aGUgd2luZC1zd2lmdCBDdXBpZCB3aW5ncy4KICAgIE5vdyBpcyB0aGUgc3VuIHVwb24gdGhlIGhpZ2htb3N0IGhpbGwKICAgIE9mIHRoaXMgZGF5J3Mgam91cm5leSwgYW5kIGZyb20gbmluZSB0aWxsIHR3ZWx2ZQogICAgSXMgdGhyZWUgbG9uZyBob3VycywgeWV0IHNoZSBpcyBub3QgY29tZS4KICAgIEhhZCBzaGUgYWZmZWN0aW9ucyBhbmQgd2FybSB5b3V0aGZ1bCBibG9vZCwKICAgIFNoZSB3b3VsZCBiZSBhcyBzd2lmdCBpbiBtb3Rpb24gYXMgYSBiYWxsOwogICAgTXkgd29yZHMgd291bGQgYmFuZHkgaGVyIHRvIG15IHN3ZWV0IGxvdmUsCiAgICBBbmQgaGlzIHRvIG1lOgogICAgQnV0IG9sZCBmb2xrcywgbWFueSBmZWlnbiBhcyB0aGV5IHdlcmUgZGVhZDsKICAgIFVud2llbGR5LCBzbG93LCBoZWF2eSBhbmQgcGFsZSBhcyBsZWFkLgogICAgTyBHb2QsIHNoZSBjb21lcyEKCiAgICBFbnRlciBOdXJzZSBhbmQgUEVURVIKICAgIE8gaG9uZXkgbnVyc2UsIHdoYXQgbmV3cz8KICAgIEhhc3QgdGhvdSBtZXQgd2l0aCBoaW0IFNlbmQgdGh5IG1hbiBhd2F5LgoKTnVyc2UKCiAgICBQZXRlciwgc3RheSBhdCB0aGUgZ2F0ZS4KCiAgICBFeGl0IFBFVEVSCgpKVUxJRVQKCiAgICBOb3csIGdvb2Qgc3dlZXQgbnVyc2UsLS1PIExvcmQsIHdoeSBsb29rJ3N0IHRob3Ugc2FkPwogICAgVGhvdWdoIG5ld3MgYmUgc2FkLCB5ZXQgdGVsbCB0aGVtIG1lcnJpbHk7CiAgICBJZiBnb29kLCB0aG91IHNoYW1lc3QgdGhlIG11c2ljIG9mIHN3ZWV0IG5ld3MKICAgIEJ5IHBsYXlpbmcgaXQgdG8gbWUgd2l0aCBzbyBzb3VyIGEgZmFjZS4KCk51cnNlCgogICAgSSBhbSBhLXdlYXJ5LCBnaXZlIG1lIGxlYXZlIGF3aGlsZToKICAgIEZpZSwgaG93IG15IGJvbmVzIGFjaGUhIHdoYXQgYSBqYXVudCBoYXZlIEkgaGFkIQoKSlVMSUVUCgogICAgSSB3b3VsZCB0aG91IGhhZHN0IG15IGJvbmVzLCBhbmQgSSB0aHkgbmV3czoKICAgIE5heSwgY29tZSwgSSBwcmF5IHRoZWUsIHNwZWFrOyBnb29kLCBnb29kIG51cnNlLCBzcGVhay4KCk51cnNlCgogICAgSmVzdSwgd2hhdCBoYXN0ZT8gY2FuIHlvdSBub3Qgc3RheSBhd2hpbGUCiAgICBEbyB5b3Ugbm90IHNlZSB0aGF0IEkgYW0gb3V0IG9mIGJyZWF0aD8KCkpVTElFVAoKICAgIEhvdyBhcnQgdGhvdSBvdXQgb2YgYnJlYXRoLCB3aGVuIHRob3UgaGFzdCBicmVhdGgKICAgIFRvIHNheSB0byBtZSB0aGF0IHRob3UgYXJ0IG91dCBvZiBicmVhdGgCiAgICBUaGUgZXhjdXNlIHRoYXQgdGhvdSBkb3N0IG1ha2UgaW4gdGhpcyBkZWxheQogICAgSXMgbG9uZ2VyIHRoYW4gdGhlIHRhbGUgdGhvdSBkb3N0IGV4Y3VzZS4KICAgIElzIHRoeSBuZXdzIGdvb2QsIG9yIGJhZD8gYW5zd2VyIHRvIHRoYXQ7CiAgICBTYXkgZWl0aGVyLCBhbmQgSSdsbCBzdGF5IHRoZSBjaXJjdW1zdGFuY2U6CiAgICBMZXQgbWUgYmUgc2F0aXNmaWVkLCBpcyd0IGdvb2Qgb3IgYmFkPwoKTnVyc2UKCiAgICBXZWxsLCB5b3UgaGF2ZSBtYWRlIGEgc2ltcGxlIGNob2ljZTsgeW91IGtub3cgbm90CiAgICBob3cgdG8gY2hvb3NlIGEgbWFuOiBSb21lbyEgbm8sIG5vdCBoZTsgdGhvdWdoIGhpcwogICAgZmFjZSBiZSBiZXR0ZXIgdGhhbiBhbnkgbWFuJ3MsIHlldCBoaXMgbGVnIGV4Y2VscwogICAgYWxsIG1lbidzOyBhbmQgZm9yIGEgaGFuZCwgYW5kIGEgZm9vdCwgYW5kIGEgYm9keSwKICAgIHRob3VnaCB0aGV5IGJlIG5vdCB0byBiZSB0YWxrZWQgb24sIHlldCB0aGV5IGFyZQogICAgcGFzdCBjb21wYXJlOiBoZSBpcyBub3QgdGhlIGZsb3dlciBvZiBjb3VydGVzeSwKICAgIGJ1dCwgSSdsbCB3YXJyYW50IGhpbSwgYXMgZ2VudGxlIGFzIGEgbGFtYi4gR28gdGh5CiAgICB3YXlzLCB3ZW5jaDsgc2VydmUgR29kLiBXaGF0LCBoYXZlIHlvdSBkaW5lZCBhdCBob21lPwoKSlVMSUVUCgogICAgTm8sIG5vOiBidXQgYWxsIHRoaXMgZGlkIEkga25vdyBiZWZvcmUuCiAgICBXaGF0IHNheXMgaGUgb2Ygb3VyIG1hcnJpYWdlPyB3aGF0IG9mIHRoYXQCgpOdXJzZQoKICAgIExvcmQsIGhvdyBteSBoZWFkIGFjaGVzISB3aGF0IGEgaGVhZCBoYXZlIEkhCiAgICBJdCBiZWF0cyBhcyBpdCB3b3VsZCBmYWxsIGluIHR3ZW50eSBwaWVjZXMuCiAgICBNeSBiYWNrIG8nIHQnIG90aGVyIHNpZGUsLS1PLCBteSBiYWNrLCBteSBiYWNrIQogICAgQmVzaHJldyB5b3VyIGhlYXJ0IGZvciBzZW5kaW5nIG1lIGFib3V0LAogICAgVG8gY2F0Y2ggbXkgZGVhdGggd2l0aCBqYXVudGluZyB1cCBhbmQgZG93biEKCkpVTElFVAoKICAgIEknIGZhaXRoLCBJIGFtIHNvcnJ5IHRoYXQgdGhvdSBhcnQgbm90IHdlbGwuCiAgICBTd2VldCwgc3dlZXQsIHN3ZWV0IG51cnNlLCB0ZWxsIG1lLCB3aGF0IHNheXMgbXkgbG92ZT8KCk51cnNlCgogICAgWW91ciBsb3ZlIHNheXMsIGxpa2UgYW4gaG9uZXN0IGdlbnRsZW1hbiwgYW5kIGEKICAgIGNvdXJ0ZW91cywgYW5kIGEga2luZCwgYW5kIGEgaGFuZHNvbWUsIGFuZCwgSQogICAgd2FycmFudCwgYSB2aXJ0dW91cywtLVdoZXJlIGlzIHlvdXIgbW90aGVyPwoKSlVMSUVUCgogICAgV2hlcmUgaXMgbXkgbW90aGVyISB3aHksIHNoZSBpcyB3aXRoaW47CiAgICBXaGVyZSBzaG91bGQgc2hlIGJlPyBIb3cgb2RkbHkgdGhvdSByZXBsaWVzdCEKICAgICdZb3VyIGxvdmUgc2F5cywgbGlrZSBhbiBob25lc3QgZ2VudGxlbWFuLAogICAgV2hlcmUgaXMgeW91ciBtb3RoZXIJwoKTnVyc2UKCiAgICBPIEdvZCdzIGxhZHkgZGVhciEKICAgIEFyZSB5b3Ugc28gaG90PyBtYXJyeSwgY29tZSB1cCwgSSB0cm93OwogICAgSXMgdGhpcyB0aGUgcG91bHRpY2UgZm9yIG15IGFjaGluZyBib25lcz8KICAgIEhlbmNlZm9yd2FyZCBkbyB5b3VyIG1lc3NhZ2VzIHlvdXJzZWxmLgoKSlVMSUVUCgogICAgSGVyZSdzIHN1Y2ggYSBjb2lsISBjb21lLCB3aGF0IHNheXMgUm9tZW8CgpOdXJzZQoKICAgIEhhdmUgeW91IGdvdCBsZWF2ZSB0byBnbyB0byBzaHJpZnQgdG8tZGF5PwoKSlVMSUVUCgogICAgSSBoYXZlLgoKTnVyc2UKCiAgICBUaGVuIGhpZSB5b3UgaGVuY2UgdG8gRnJpYXIgTGF1cmVuY2UnIGNlbGw7CiAgICBUaGVyZSBzdGF5cyBhIGh1c2JhbmQgdG8gbWFrZSB5b3UgYSB3aWZlOgogICAgTm93IGNvbWVzIHRoZSB3YW50b24gYmxvb2QgdXAgaW4geW91ciBjaGVla3MsCiAgICBUaGV5J2xsIGJlIGluIHNjYXJsZXQgc3RyYWlnaHQgYXQgYW55IG5ld3MuCiAgICBIaWUgeW91IHRvIGNodXJjaDsgSSBtdXN0IGFub3RoZXIgd2F5LAogICAgVG8gZmV0Y2ggYSBsYWRkZXIsIGJ5IHRoZSB3aGljaCB5b3VyIGxvdmUKICAgIE11c3QgY2xpbWIgYSBiaXJkJ3MgbmVzdCBzb29uIHdoZW4gaXQgaXMgZGFyazoKICAgIEkgYW0gdGhlIGRydWRnZSBhbmQgdG9pbCBpbiB5b3VyIGRlbGlnaHQsCiAgICBCdXQgeW91IHNoYWxsIGJlYXIgdGhlIGJ1cmRlbiBzb29uIGF0IG5pZ2h0LgogICAgR287IEknbGwgdG8gZGlubmVyOiBoaWUgeW91IHRvIHRoZSBjZWxsLgoKSlVMSUVUCgogICAgSGllIHRvIGhpZ2ggZm9ydHVuZSEgSG9uZXN0IG51cnNlLCBmYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIFZJLiBGcmlhciBMYXVyZW5jZSdzIGNlbGwuCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UgYW5kIFJPTUVPIAoKRlJJQVIgTEFVUkVOQ0UKCiAgICBTbyBzbWlsZSB0aGUgaGVhdmVucyB1cG9uIHRoaXMgaG9seSBhY3QsCiAgICBUaGF0IGFmdGVyIGhvdXJzIHdpdGggc29ycm93IGNoaWRlIHVzIG5vdCEKClJPTUVPCgogICAgQW1lbiwgYW1lbiEgYnV0IGNvbWUgd2hhdCBzb3Jyb3cgY2FuLAogICAgSXQgY2Fubm90IGNvdW50ZXJ2YWlsIHRoZSBleGNoYW5nZSBvZiBqb3kKICAgIFRoYXQgb25lIHNob3J0IG1pbnV0ZSBnaXZlcyBtZSBpbiBoZXIgc2lnaHQ6CiAgICBEbyB0aG91IGJ1dCBjbG9zZSBvdXIgaGFuZHMgd2l0aCBob2x5IHdvcmRzLAogICAgVGhlbiBsb3ZlLWRldm91cmluZyBkZWF0aCBkbyB3aGF0IGhlIGRhcmU7CiAgICBJdCBpcyBlbm91Z2ggSSBtYXkgYnV0IGNhbGwgaGVyIG1pbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFRoZXNlIHZpb2xlbnQgZGVsaWdodHMgaGF2ZSB2aW9sZW50IGVuZHMKICAgIEFuZCBpbiB0aGVpciB0cml1bXBoIGRpZSwgbGlrZSBmaXJlIGFuZCBwb3dkZXIsCiAgICBXaGljaCBhcyB0aGV5IGtpc3MgY29uc3VtZTogdGhlIHN3ZWV0ZXN0IGhvbmV5CiAgICBJcyBsb2F0aHNvbWUgaW4gaGlzIG93biBkZWxpY2lvdXNuZXNzCiAgICBBbmQgaW4gdGhlIHRhc3RlIGNvbmZvdW5kcyB0aGUgYXBwZXRpdGU6CiAgICBUaGVyZWZvcmUgbG92ZSBtb2RlcmF0ZWx5OyBsb25nIGxvdmUgZG90aCBzbzsKICAgIFRvbyBzd2lmdCBhcnJpdmVzIGFzIHRhcmR5IGFzIHRvbyBzbG93LgoKICAgIEVudGVyIEpVTElFVAogICAgSGVyZSBjb21lcyB0aGUgbGFkeTogTywgc28gbGlnaHQgYSBmb290CiAgICBXaWxsIG5lJ2VyIHdlYXIgb3V0IHRoZSBldmVybGFzdGluZyBmbGludDoKICAgIEEgbG92ZXIgbWF5IGJlc3RyaWRlIHRoZSBnb3NzYW1lcgogICAgVGhhdCBpZGxlcyBpbiB0aGUgd2FudG9uIHN1bW1lciBhaXIsCiAgICBBbmQgeWV0IG5vdCBmYWxsOyBzbyBsaWdodCBpcyB2YW5pdHkuCgpKVUxJRVQKCiAgICBHb29kIGV2ZW4gdG8gbXkgZ2hvc3RseSBjb25mZXNzb3IuCgpGUklBUiBMQVVSRU5DRQoKICAgIFJvbWVvIHNoYWxsIHRoYW5rIHRoZWUsIGRhdWdodGVyLCBmb3IgdXMgYm90aC4KCkpVTElFVAoKICAgIEFzIG11Y2ggdG8gaGltLCBlbHNlIGlzIGhpcyB0aGFua3MgdG9vIG11Y2guCgpST01FTwoKICAgIEFoLCBKdWxpZXQsIGlmIHRoZSBtZWFzdXJlIG9mIHRoeSBqb3kKICAgIEJlIGhlYXAnZCBsaWtlIG1pbmUgYW5kIHRoYXQgdGh5IHNraWxsIGJlIG1vcmUKICAgIFRvIGJsYXpvbiBpdCwgdGhlbiBzd2VldGVuIHdpdGggdGh5IGJyZWF0aAogICAgVGhpcyBuZWlnaGJvdXIgYWlyLCBhbmQgbGV0IHJpY2ggbXVzaWMncyB0b25ndWUKICAgIFVuZm9sZCB0aGUgaW1hZ2luZWQgaGFwcGluZXNzIHRoYXQgYm90aAogICAgUmVjZWl2ZSBpbiBlaXRoZXIgYnkgdGhpcyBkZWFyIGVuY291bnRlci4KCkpVTElFVAoKICAgIENvbmNlaXQsIG1vcmUgcmljaCBpbiBtYXR0ZXIgdGhhbiBpbiB3b3JkcywKICAgIEJyYWdzIG9mIGhpcyBzdWJzdGFuY2UsIG5vdCBvZiBvcm5hbWVudDoKICAgIFRoZXkgYXJlIGJ1dCBiZWdnYXJzIHRoYXQgY2FuIGNvdW50IHRoZWlyIHdvcnRoOwogICAgQnV0IG15IHRydWUgbG92ZSBpcyBncm93biB0byBzdWNoIGV4Y2VzcwogICAgSSBjYW5ub3Qgc3VtIHVwIHN1bSBvZiBoYWxmIG15IHdlYWx0aC4KCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgY29tZSB3aXRoIG1lLCBhbmQgd2Ugd2lsbCBtYWtlIHNob3J0IHdvcms7CiAgICBGb3IsIGJ5IHlvdXIgbGVhdmVzLCB5b3Ugc2hhbGwgbm90IHN0YXkgYWxvbmUKICAgIFRpbGwgaG9seSBjaHVyY2ggaW5jb3Jwb3JhdGUgdHdvIGluIG9uZS4KCiAgICBFeGV1bnQKCkFDVCBJSUkKU0NFTkUgSS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgTUVSQ1VUSU8sIEJFTlZPTElPLCBQYWdlLCBhbmQgU2VydmFudHMgCgpCRU5WT0xJTwoKICAgIEkgcHJheSB0aGVlLCBnb29kIE1lcmN1dGlvLCBsZXQncyByZXRpcmU6CiAgICBUaGUgZGF5IGlzIGhvdCwgdGhlIENhcHVsZXRzIGFicm9hZCwKICAgIEFuZCwgaWYgd2UgbWVldCwgd2Ugc2hhbGwgbm90IHNjYXBlIGEgYnJhd2w7CiAgICBGb3Igbm93LCB0aGVzZSBob3QgZGF5cywgaXMgdGhlIG1hZCBibG9vZCBzdGlycmluZy4KCk1FUkNVVElPCgogICAgVGhvdSBhcnQgbGlrZSBvbmUgb2YgdGhvc2UgZmVsbG93cyB0aGF0IHdoZW4gaGUKICAgIGVudGVycyB0aGUgY29uZmluZXMgb2YgYSB0YXZlcm4gY2xhcHMgbWUgaGlzIHN3b3JkCiAgICB1cG9uIHRoZSB0YWJsZSBhbmQgc2F5cyAnR29kIHNlbmQgbWUgbm8gbmVlZCBvZgogICAgdGhlZSEnIGFuZCBieSB0aGUgb3BlcmF0aW9uIG9mIHRoZSBzZWNvbmQgY3VwIGRyYXdzCiAgICBpdCBvbiB0aGUgZHJhd2VyLCB3aGVuIGluZGVlZCB0aGVyZSBpcyBubyBuZWVkLgoKQkVOVk9MSU8KCiAgICBBbSBJIGxpa2Ugc3VjaCBhIGZlbGxvdz8KCk1FUkNVVElPCgogICAgQ29tZSwgY29tZSwgdGhvdSBhcnQgYXMgaG90IGEgSmFjayBpbiB0aHkgbW9vZCBhcwogICAgYW55IGluIEl0YWx5LCBhbmQgYXMgc29vbiBtb3ZlZCB0byBiZSBtb29keSwgYW5kIGFzCiAgICBzb29uIG1vb2R5IHRvIGJlIG1vdmVkLgoKQkVOVk9MSU8KCiAgICBBbmQgd2hhdCB0bz8KCk1FUkNVVElPCgogICAgTmF5LCBhbiB0aGVyZSB3ZXJlIHR3byBzdWNoLCB3ZSBzaG91bGQgaGF2ZSBub25lCiAgICBzaG9ydGx5LCBmb3Igb25lIHdvdWxkIGtpbGwgdGhlIG90aGVyLiBUaG91ISB3aHksCiAgICB0aG91IHdpbHQgcXVhcnJlbCB3aXRoIGEgbWFuIHRoYXQgaGF0aCBhIGhhaXIgbW9yZSwKICAgIG9yIGEgaGFpciBsZXNzLCBpbiBoaXMgYmVhcmQsIHRoYW4gdGhvdSBoYXN0OiB0aG91CiAgICB3aWx0IHF1YXJyZWwgd2l0aCBhIG1hbiBmb3IgY3JhY2tpbmcgbnV0cywgaGF2aW5nIG5vCiAgICBvdGhlciByZWFzb24gYnV0IGJlY2F1c2UgdGhvdSBoYXN0IGhhemVsIGV5ZXM6IHdoYXQKICAgIGV5ZSBidXQgc3VjaCBhbiBleWUgd291bGQgc3B5IG91dCBzdWNoIGEgcXVhcnJlbD8KICAgIFRoeSBoZWFkIGlzIGFzIGZ1biBvZiBxdWFycmVscyBhcyBhbiBlZ2cgaXMgZnVsbCBvZgogICAgbWVhdCwgYW5kIHlldCB0aHkgaGVhZCBoYXRoIGJlZW4gYmVhdGVuIGFzIGFkZGxlIGFzCiAgICBhbiBlZ2cgZm9yIHF1YXJyZWxsaW5nOiB0aG91IGhhc3QgcXVhcnJlbGxlZCB3aXRoIGEKICAgIG1hbiBmb3IgY291Z2hpbmcgaW4gdGhlIHN0cmVldCwgYmVjYXVzZSBoZSBoYXRoCiAgICB3YWtlbmVkIHRoeSBkb2cgdGhhdCBoYXRoIGxhaW4gYXNsZWVwIGluIHRoZSBzdW46CiAgICBkaWRzdCB0aG91IG5vdCBmYWxsIG91dCB3aXRoIGEgdGFpbG9yIGZvciB3ZWFyaW5nCiAgICBoaXMgbmV3IGRvdWJsZXQgYmVmb3JlIEVhc3Rlcj8gd2l0aCBhbm90aGVyLCBmb3IKICAgIHR5aW5nIGhpcyBuZXcgc2hvZXMgd2l0aCBvbGQgcmliYW5kPyBhbmQgeWV0IHRob3UKICAgIHdpbHQgdHV0b3IgbWUgZnJvbSBxdWFycmVsbGluZyEKCkJFTlZPTElPCgogICAgQW4gSSB3ZXJlIHNvIGFwdCB0byBxdWFycmVsIGFzIHRob3UgYXJ0LCBhbnkgbWFuCiAgICBzaG91bGQgYnV5IHRoZSBmZWUtc2ltcGxlIG9mIG15IGxpZmUgZm9yIGFuIGhvdXIgYW5kIGEgcXVhcnRlci4KCk1FUkNVVElPCgogICAgVGhlIGZlZS1zaW1wbGUhIE8gc2ltcGxlIQoKQkVOVk9MSU8KCiAgICBCeSBteSBoZWFkLCBoZXJlIGNvbWUgdGhlIENhcHVsZXRzLgoKTUVSQ1VUSU8KCiAgICBCeSBteSBoZWVsLCBJIGNhcmUgbm90LgoKICAgIEVudGVyIFRZQkFMVCBhbmQgb3RoZXJzCgpUWUJBTFQKCiAgICBGb2xsb3cgbWUgY2xvc2UsIGZvciBJIHdpbGwgc3BlYWsgdG8gdGhlbS4KICAgIEdlbnRsZW1lbiwgZ29vZCBkZW46IGEgd29yZCB3aXRoIG9uZSBvZiB5b3UuCgpNRVJDVVRJTwoKICAgIEFuZCBidXQgb25lIHdvcmQgd2l0aCBvbmUgb2YgdXMIGNvdXBsZSBpdCB3aXRoCiAgICBzb21ldGhpbmc7IG1ha2UgaXQgYSB3b3JkIGFuZCBhIGJsb3cuCgpUWUJBTFQKCiAgICBZb3Ugc2hhbGwgZmluZCBtZSBhcHQgZW5vdWdoIHRvIHRoYXQsIHNpciwgYW4geW91CiAgICB3aWxsIGdpdmUgbWUgb2NjYXNpb24uCgpNRVJDVVRJTwoKICAgIENvdWxkIHlvdSBub3QgdGFrZSBzb21lIG9jY2FzaW9uIHdpdGhvdXQgZ2l2aW5nPwoKVFlCQUxUCgogICAgTWVyY3V0aW8sIHRob3UgY29uc29ydCdzdCB3aXRoIFJvbWVvLC0tCgpNRVJDVVRJTwoKICAgIENvbnNvcnQhIHdoYXQsIGRvc3QgdGhvdSBtYWtlIHVzIG1pbnN0cmVscz8gYW4KICAgIHRob3UgbWFrZSBtaW5zdHJlbHMgb2YgdXMsIGxvb2sgdG8gaGVhciBub3RoaW5nIGJ1dAogICAgZGlzY29yZHM6IGhlcmUncyBteSBmaWRkbGVzdGljazsgaGVyZSdzIHRoYXQgc2hhbGwKICAgIG1ha2UgeW91IGRhbmNlLiAnWm91bmRzLCBjb25zb3J0IQoKQkVOVk9MSU8KCiAgICBXZSB0YWxrIGhlcmUgaW4gdGhlIHB1YmxpYyBoYXVudCBvZiBtZW46CiAgICBFaXRoZXIgd2l0aGRyYXcgdW50byBzb21lIHByaXZhdGUgcGxhY2UsCiAgICBBbmQgcmVhc29uIGNvbGRseSBvZiB5b3VyIGdyaWV2YW5jZXMsCiAgICBPciBlbHNlIGRlcGFydDsgaGVyZSBhbGwgZXllcyBnYXplIG9uIHVzLgoKTUVSQ1VUSU8KCiAgICBNZW4ncyBleWVzIHdlcmUgbWFkZSB0byBsb29rLCBhbmQgbGV0IHRoZW0gZ2F6ZTsKICAgIEkgd2lsbCBub3QgYnVkZ2UgZm9yIG5vIG1hbidzIHBsZWFzdXJlLCBJLgoKICAgIEVudGVyIFJPTUVPCgpUWUJBTFQKCiAgICBXZWxsLCBwZWFjZSBiZSB3aXRoIHlvdSwgc2lyOiBoZXJlIGNvbWVzIG15IG1hbi4KCk1FUkNVVElPCgogICAgQnV0IEknbGwgYmUgaGFuZ2VkLCBzaXIsIGlmIGhlIHdlYXIgeW91ciBsaXZlcnk6CiAgICBNYXJyeSwgZ28gYmVmb3JlIHRvIGZpZWxkLCBoZSdsbCBiZSB5b3VyIGZvbGxvd2VyOwogICAgWW91ciB3b3JzaGlwIGluIHRoYXQgc2Vuc2UgbWF5IGNhbGwgaGltICdtYW4uJwoKVFlCQUxUCgogICAgUm9tZW8sIHRoZSBoYXRlIEkgYmVhciB0aGVlIGNhbiBhZmZvcmQKICAgIE5vIGJldHRlciB0ZXJtIHRoYW4gdGhpcywtLXRob3UgYXJ0IGEgdmlsbGFpbi4KClJPTUVPCgogICAgVHliYWx0LCB0aGUgcmVhc29uIHRoYXQgSSBoYXZlIHRvIGxvdmUgdGhlZQogICAgRG90aCBtdWNoIGV4Y3VzZSB0aGUgYXBwZXJ0YWluaW5nIHJhZ2UKICAgIFRvIHN1Y2ggYSBncmVldGluZzogdmlsbGFpbiBhbSBJIG5vbmU7CiAgICBUaGVyZWZvcmUgZmFyZXdlbGw7IEkgc2VlIHRob3Uga25vdydzdCBtZSBub3QuCgpUWUJBTFQKCiAgICBCb3ksIHRoaXMgc2hhbGwgbm90IGV4Y3VzZSB0aGUgaW5qdXJpZXMKICAgIFRoYXQgdGhvdSBoYXN0IGRvbmUgbWU7IHRoZXJlZm9yZSB0dXJuIGFuZCBkcmF3LgoKUk9NRU8KCiAgICBJIGRvIHByb3Rlc3QsIEkgbmV2ZXIgaW5qdXJlZCB0aGVlLAogICAgQnV0IGxvdmUgdGhlZSBiZXR0ZXIgdGhhbiB0aG91IGNhbnN0IGRldmlzZSwKICAgIFRpbGwgdGhvdSBzaGFsdCBrbm93IHRoZSByZWFzb24gb2YgbXkgbG92ZToKICAgIEFuZCBzbywgZ29vZCBDYXB1bGV0LC0td2hpY2ggbmFtZSBJIHRlbmRlcgogICAgQXMgZGVhcmx5IGFzIG15IG93biwtLWJlIHNhdGlzZmllZC4KCk1FUkNVVElPCgogICAgTyBjYWxtLCBkaXNob25vdXJhYmxlLCB2aWxlIHN1Ym1pc3Npb24hCiAgICBBbGxhIHN0b2NjYXRhIGNhcnJpZXMgaXQgYXdheS4KCiAgICBEcmF3cwogICAgVHliYWx0LCB5b3UgcmF0LWNhdGNoZXIsIHdpbGwgeW91IHdhbGsCgpUWUJBTFQKCiAgICBXaGF0IHdvdWxkc3QgdGhvdSBoYXZlIHdpdGggbWUCgpNRVJDVVRJTwoKICAgIEdvb2Qga2luZyBvZiBjYXRzLCBub3RoaW5nIGJ1dCBvbmUgb2YgeW91ciBuaW5lCiAgICBsaXZlczsgdGhhdCBJIG1lYW4gdG8gbWFrZSBib2xkIHdpdGhhbCwgYW5kIGFzIHlvdQogICAgc2hhbGwgdXNlIG1lIGhlcmVhZnRlciwgZHJ5YmVhdCB0aGUgcmVzdCBvZiB0aGUKICAgIGVpZ2h0LiBXaWxsIHlvdSBwbHVjayB5b3VyIHN3b3JkIG91dCBvZiBoaXMgcGl0Y2hlcgogICAgYnkgdGhlIGVhcnMIG1ha2UgaGFzdGUsIGxlc3QgbWluZSBiZSBhYm91dCB5b3VyCiAgICBlYXJzIGVyZSBpdCBiZSBvdXQuCgpUWUJBTFQKCiAgICBJIGFtIGZvciB5b3UuCgogICAgRHJhd2luZwoKUk9NRU8KCiAgICBHZW50bGUgTWVyY3V0aW8sIHB1dCB0aHkgcmFwaWVyIHVwLgoKTUVSQ1VUSU8KCiAgICBDb21lLCBzaXIsIHlvdXIgcGFzc2Fkby4KCiAgICBUaGV5IGZpZ2h0CgpST01FTwoKICAgIERyYXcsIEJlbnZvbGlvOyBiZWF0IGRvd24gdGhlaXIgd2VhcG9ucy4KICAgIEdlbnRsZW1lbiwgZm9yIHNoYW1lLCBmb3JiZWFyIHRoaXMgb3V0cmFnZSEKICAgIFR5YmFsdCwgTWVyY3V0aW8sIHRoZSBwcmluY2UgZXhwcmVzc2x5IGhhdGgKICAgIEZvcmJpZGRlbiBiYW5keWluZyBpbiBWZXJvbmEgc3RyZWV0czoKICAgIEhvbGQsIFR5YmFsdCEgZ29vZCBNZXJjdXRpbyEKCiAgICBUWUJBTFQgdW5kZXIgUk9NRU8ncyBhcm0gc3RhYnMgTUVSQ1VUSU8sIGFuZCBmbGllcyB3aXRoIGhpcyBmb2xsb3dlcnMKCk1FUkNVVElPCgogICAgSSBhbSBodXJ0LgogICAgQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEgSSBhbSBzcGVkLgogICAgSXMgaGUgZ29uZSwgYW5kIGhhdGggbm90aGluZz8KCkJFTlZPTElPCgogICAgV2hhdCwgYXJ0IHRob3UgaHVydD8KCk1FUkNVVElPCgogICAgQXksIGF5LCBhIHNjcmF0Y2gsIGEgc2NyYXRjaDsgbWFycnksICd0aXMgZW5vdWdoLgogICAgV2hlcmUgaXMgbXkgcGFnZT8gR28sIHZpbGxhaW4sIGZldGNoIGEgc3VyZ2Vvbi4KCiAgICBFeGl0IFBhZ2UKClJPTUVPCgogICAgQ291cmFnZSwgbWFuOyB0aGUgaHVydCBjYW5ub3QgYmUgbXVjaC4KCk1FUkNVVElPCgogICAgTm8sICd0aXMgbm90IHNvIGRlZXAgYXMgYSB3ZWxsLCBub3Igc28gd2lkZSBhcyBhCiAgICBjaHVyY2gtZG9vcjsgYnV0ICd0aXMgZW5vdWdoLCd0d2lsbCBzZXJ2ZTogYXNrIGZvcgogICAgbWUgdG8tbW9ycm93LCBhbmQgeW91IHNoYWxsIGZpbmQgbWUgYSBncmF2ZSBtYW4uIEkKICAgIGFtIHBlcHBlcmVkLCBJIHdhcnJhbnQsIGZvciB0aGlzIHdvcmxkLiBBIHBsYWd1ZSBvJwogICAgYm90aCB5b3VyIGhvdXNlcyEgJ1pvdW5kcywgYSBkb2csIGEgcmF0LCBhIG1vdXNlLCBhCiAgICBjYXQsIHRvIHNjcmF0Y2ggYSBtYW4gdG8gZGVhdGghIGEgYnJhZ2dhcnQsIGEKICAgIHJvZ3VlLCBhIHZpbGxhaW4sIHRoYXQgZmlnaHRzIGJ5IHRoZSBib29rIG9mCiAgICBhcml0aG1ldGljISBXaHkgdGhlIGRldmlsIGNhbWUgeW91IGJldHdlZW4gdXMIEkKICAgIHdhcyBodXJ0IHVuZGVyIHlvdXIgYXJtLgoKUk9NRU8KCiAgICBJIHRob3VnaHQgYWxsIGZvciB0aGUgYmVzdC4KCk1FUkNVVElPCgogICAgSGVscCBtZSBpbnRvIHNvbWUgaG91c2UsIEJlbnZvbGlvLAogICAgT3IgSSBzaGFsbCBmYWludC4gQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEKICAgIFRoZXkgaGF2ZSBtYWRlIHdvcm1zJyBtZWF0IG9mIG1lOiBJIGhhdmUgaXQsCiAgICBBbmQgc291bmRseSB0b286IHlvdXIgaG91c2VzIQoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KClJPTUVPCgogICAgVGhpcyBnZW50bGVtYW4sIHRoZSBwcmluY2UncyBuZWFyIGFsbHksCiAgICBNeSB2ZXJ5IGZyaWVuZCwgaGF0aCBnb3QgaGlzIG1vcnRhbCBodXJ0CiAgICBJbiBteSBiZWhhbGY7IG15IHJlcHV0YXRpb24gc3RhaW4nZAogICAgV2l0aCBUeWJhbHQncyBzbGFuZGVyLC0tVHliYWx0LCB0aGF0IGFuIGhvdXIKICAgIEhhdGggYmVlbiBteSBraW5zbWFuISBPIHN3ZWV0IEp1bGlldCwKICAgIFRoeSBiZWF1dHkgaGF0aCBtYWRlIG1lIGVmZmVtaW5hdGUKICAgIEFuZCBpbiBteSB0ZW1wZXIgc29mdGVuJ2QgdmFsb3VyJ3Mgc3RlZWwhCgogICAgUmUtZW50ZXIgQkVOVk9MSU8KCkJFTlZPTElPCgogICAgTyBSb21lbywgUm9tZW8sIGJyYXZlIE1lcmN1dGlvJ3MgZGVhZCEKICAgIFRoYXQgZ2FsbGFudCBzcGlyaXQgaGF0aCBhc3BpcmVkIHRoZSBjbG91ZHMsCiAgICBXaGljaCB0b28gdW50aW1lbHkgaGVyZSBkaWQgc2Nvcm4gdGhlIGVhcnRoLgoKUk9NRU8KCiAgICBUaGlzIGRheSdzIGJsYWNrIGZhdGUgb24gbW9yZSBkYXlzIGRvdGggZGVwZW5kOwogICAgVGhpcyBidXQgYmVnaW5zIHRoZSB3b2UsIG90aGVycyBtdXN0IGVuZC4KCkJFTlZPTElPCgogICAgSGVyZSBjb21lcyB0aGUgZnVyaW91cyBUeWJhbHQgYmFjayBhZ2Fpbi4KClJPTUVPCgogICAgQWxpdmUsIGluIHRyaXVtcGghIGFuZCBNZXJjdXRpbyBzbGFpbiEKICAgIEF3YXkgdG8gaGVhdmVuLCByZXNwZWN0aXZlIGxlbml0eSwKICAgIEFuZCBmaXJlLWV5ZWQgZnVyeSBiZSBteSBjb25kdWN0IG5vdyEKCiAgICBSZS1lbnRlciBUWUJBTFQKICAgIE5vdywgVHliYWx0LCB0YWtlIHRoZSB2aWxsYWluIGJhY2sgYWdhaW4sCiAgICBUaGF0IGxhdGUgdGhvdSBnYXZlc3QgbWU7IGZvciBNZXJjdXRpbydzIHNvdWwKICAgIElzIGJ1dCBhIGxpdHRsZSB3YXkgYWJvdmUgb3VyIGhlYWRzLAogICAgU3RheWluZyBmb3IgdGhpbmUgdG8ga2VlcCBoaW0gY29tcGFueToKICAgIEVpdGhlciB0aG91LCBvciBJLCBvciBib3RoLCBtdXN0IGdvIHdpdGggaGltLgoKVFlCQUxUCgogICAgVGhvdSwgd3JldGNoZWQgYm95LCB0aGF0IGRpZHN0IGNvbnNvcnQgaGltIGhlcmUsCiAgICBTaGFsdCB3aXRoIGhpbSBoZW5jZS4KClJPTUVPCgogICAgVGhpcyBzaGFsbCBkZXRlcm1pbmUgdGhhdC4KCiAgICBUaGV5IGZpZ2h0OyBUWUJBTFQgZmFsbHMKCkJFTlZPTElPCgogICAgUm9tZW8sIGF3YXksIGJlIGdvbmUhCiAgICBUaGUgY2l0aXplbnMgYXJlIHVwLCBhbmQgVHliYWx0IHNsYWluLgogICAgU3RhbmQgbm90IGFtYXplZDogdGhlIHByaW5jZSB3aWxsIGRvb20gdGhlZSBkZWF0aCwKICAgIElmIHRob3UgYXJ0IHRha2VuOiBoZW5jZSwgYmUgZ29uZSwgYXdheSEKClJPTUVPCgogICAgTywgSSBhbSBmb3J0dW5lJ3MgZm9vbCEKCkJFTlZPTElPCgogICAgV2h5IGRvc3QgdGhvdSBzdGF5PwoKICAgIEV4aXQgUk9NRU8KCiAgICBFbnRlciBDaXRpemVucywgJiBjCgpGaXJzdCBDaXRpemVuCgogICAgV2hpY2ggd2F5IHJhbiBoZSB0aGF0IGtpbGwnZCBNZXJjdXRpbz8KICAgIFR5YmFsdCwgdGhhdCBtdXJkZXJlciwgd2hpY2ggd2F5IHJhbiBoZT8KCkJFTlZPTElPCgogICAgVGhlcmUgbGllcyB0aGF0IFR5YmFsdC4KCkZpcnN0IENpdGl6ZW4KCiAgICBVcCwgc2lyLCBnbyB3aXRoIG1lOwogICAgSSBjaGFyZ2UgdGhlZSBpbiB0aGUgcHJpbmNlcyBuYW1lLCBvYmV5LgoKICAgIEVudGVyIFByaW5jZSwgYXR0ZW5kZWQ7IE1PTlRBR1VFLCBDQVBVTEVULCB0aGVpciBXaXZlcywgYW5kIG90aGVycwoKUFJJTkNFCgogICAgV2hlcmUgYXJlIHRoZSB2aWxlIGJlZ2lubmVycyBvZiB0aGlzIGZyYXkCgpCRU5WT0xJTwoKICAgIE8gbm9ibGUgcHJpbmNlLCBJIGNhbiBkaXNjb3ZlciBhbGwKICAgIFRoZSB1bmx1Y2t5IG1hbmFnZSBvZiB0aGlzIGZhdGFsIGJyYXdsOgogICAgVGhlcmUgbGllcyB0aGUgbWFuLCBzbGFpbiBieSB5b3VuZyBSb21lbywKICAgIFRoYXQgc2xldyB0aHkga2luc21hbiwgYnJhdmUgTWVyY3V0aW8uCgpMQURZIENBUFVMRVQKCiAgICBUeWJhbHQsIG15IGNvdXNpbiEgTyBteSBicm90aGVyJ3MgY2hpbGQhCiAgICBPIHByaW5jZSEgTyBjb3VzaW4hIGh1c2JhbmQhIE8sIHRoZSBibG9vZCBpcyBzcGlsdAogICAgTyBteSBkZWFyIGtpbnNtYW4hIFByaW5jZSwgYXMgdGhvdSBhcnQgdHJ1ZSwKICAgIEZvciBibG9vZCBvZiBvdXJzLCBzaGVkIGJsb29kIG9mIE1vbnRhZ3VlLgogICAgTyBjb3VzaW4sIGNvdXNpbiEKClBSSU5DRQoKICAgIEJlbnZvbGlvLCB3aG8gYmVnYW4gdGhpcyBibG9vZHkgZnJheT8KCkJFTlZPTElPCgogICAgVHliYWx0LCBoZXJlIHNsYWluLCB3aG9tIFJvbWVvJ3MgaGFuZCBkaWQgc2xheTsKICAgIFJvbWVvIHRoYXQgc3Bva2UgaGltIGZhaXIsIGJhZGUgaGltIGJldGhpbmsKICAgIEhvdyBuaWNlIHRoZSBxdWFycmVsIHdhcywgYW5kIHVyZ2VkIHdpdGhhbAogICAgWW91ciBoaWdoIGRpc3BsZWFzdXJlOiBhbGwgdGhpcyB1dHRlcmVkCiAgICBXaXRoIGdlbnRsZSBicmVhdGgsIGNhbG0gbG9vaywga25lZXMgaHVtYmx5IGJvdydkLAogICAgQ291bGQgbm90IHRha2UgdHJ1Y2Ugd2l0aCB0aGUgdW5ydWx5IHNwbGVlbgogICAgT2YgVHliYWx0IGRlYWYgdG8gcGVhY2UsIGJ1dCB0aGF0IGhlIHRpbHRzCiAgICBXaXRoIHBpZXJjaW5nIHN0ZWVsIGF0IGJvbGQgTWVyY3V0aW8ncyBicmVhc3QsCiAgICBXaG8gYWxsIGFzIGhvdCwgdHVybnMgZGVhZGx5IHBvaW50IHRvIHBvaW50LAogICAgQW5kLCB3aXRoIGEgbWFydGlhbCBzY29ybiwgd2l0aCBvbmUgaGFuZCBiZWF0cwogICAgQ29sZCBkZWF0aCBhc2lkZSwgYW5kIHdpdGggdGhlIG90aGVyIHNlbmRzCiAgICBJdCBiYWNrIHRvIFR5YmFsdCwgd2hvc2UgZGV4dGVyaXR5LAogICAgUmV0b3J0cyBpdDogUm9tZW8gaGUgY3JpZXMgYWxvdWQsCiAgICAnSG9sZCwgZnJpZW5kcyEgZnJpZW5kcywgcGFydCEnIGFuZCwgc3dpZnRlciB0aGFuCiAgICBoaXMgdG9uZ3VlLAogICAgSGlzIGFnaWxlIGFybSBiZWF0cyBkb3duIHRoZWlyIGZhdGFsIHBvaW50cywKICAgIEFuZCAndHdpeHQgdGhlbSBydXNoZXM7IHVuZGVybmVhdGggd2hvc2UgYXJtCiAgICBBbiBlbnZpb3VzIHRocnVzdCBmcm9tIFR5YmFsdCBoaXQgdGhlIGxpZmUKICAgIE9mIHN0b3V0IE1lcmN1dGlvLCBhbmQgdGhlbiBUeWJhbHQgZmxlZDsKICAgIEJ1dCBieSBhbmQgYnkgY29tZXMgYmFjayB0byBSb21lbywKICAgIFdobyBoYWQgYnV0IG5ld2x5IGVudGVydGFpbidkIHJldmVuZ2UsCiAgICBBbmQgdG8gJ3QgdGhleSBnbyBsaWtlIGxpZ2h0bmluZywgZm9yLCBlcmUgSQogICAgQ291bGQgZHJhdyB0byBwYXJ0IHRoZW0sIHdhcyBzdG91dCBUeWJhbHQgc2xhaW4uCiAgICBBbmQsIGFzIGhlIGZlbGwsIGRpZCBSb21lbyB0dXJuIGFuZCBmbHkuCiAgICBUaGlzIGlzIHRoZSB0cnV0aCwgb3IgbGV0IEJlbnZvbGlvIGRpZS4KCkxBRFkgQ0FQVUxFVAoKICAgIEhlIGlzIGEga2luc21hbiB0byB0aGUgTW9udGFndWU7CiAgICBBZmZlY3Rpb24gbWFrZXMgaGltIGZhbHNlOyBoZSBzcGVha3Mgbm90IHRydWU6CiAgICBTb21lIHR3ZW50eSBvZiB0aGVtIGZvdWdodCBpbiB0aGlzIGJsYWNrIHN0cmlmZSwKICAgIEFuZCBhbGwgdGhvc2UgdHdlbnR5IGNvdWxkIGJ1dCBraWxsIG9uZSBsaWZlLgogICAgSSBiZWcgZm9yIGp1c3RpY2UsIHdoaWNoIHRob3UsIHByaW5jZSwgbXVzdCBnaXZlOwogICAgUm9tZW8gc2xldyBUeWJhbHQsIFJvbWVvIG11c3Qgbm90IGxpdmUuCgpQUklOQ0UKCiAgICBSb21lbyBzbGV3IGhpbSwgaGUgc2xldyBNZXJjdXRpbzsKICAgIFdobyBub3cgdGhlIHByaWNlIG9mIGhpcyBkZWFyIGJsb29kIGRvdGggb3dlPwoKTU9OVEFHVUUKCiAgICBOb3QgUm9tZW8sIHByaW5jZSwgaGUgd2FzIE1lcmN1dGlvJ3MgZnJpZW5kOwogICAgSGlzIGZhdWx0IGNvbmNsdWRlcyBidXQgd2hhdCB0aGUgbGF3IHNob3VsZCBlbmQsCiAgICBUaGUgbGlmZSBvZiBUeWJhbHQuCgpQUklOQ0UKCiAgICBBbmQgZm9yIHRoYXQgb2ZmZW5jZQogICAgSW1tZWRpYXRlbHkgd2UgZG8gZXhpbGUgaGltIGhlbmNlOgogICAgSSBoYXZlIGFuIGludGVyZXN0IGluIHlvdXIgaGF0ZSdzIHByb2NlZWRpbmcsCiAgICBNeSBibG9vZCBmb3IgeW91ciBydWRlIGJyYXdscyBkb3RoIGxpZSBhLWJsZWVkaW5nOwogICAgQnV0IEknbGwgYW1lcmNlIHlvdSB3aXRoIHNvIHN0cm9uZyBhIGZpbmUKICAgIFRoYXQgeW91IHNoYWxsIGFsbCByZXBlbnQgdGhlIGxvc3Mgb2YgbWluZToKICAgIEkgd2lsbCBiZSBkZWFmIHRvIHBsZWFkaW5nIGFuZCBleGN1c2VzOwogICAgTm9yIHRlYXJzIG5vciBwcmF5ZXJzIHNoYWxsIHB1cmNoYXNlIG91dCBhYnVzZXM6CiAgICBUaGVyZWZvcmUgdXNlIG5vbmU6IGxldCBSb21lbyBoZW5jZSBpbiBoYXN0ZSwKICAgIEVsc2UsIHdoZW4gaGUncyBmb3VuZCwgdGhhdCBob3VyIGlzIGhpcyBsYXN0LgogICAgQmVhciBoZW5jZSB0aGlzIGJvZHkgYW5kIGF0dGVuZCBvdXIgd2lsbDoKICAgIE1lcmN5IGJ1dCBtdXJkZXJzLCBwYXJkb25pbmcgdGhvc2UgdGhhdCBraWxsLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIENhcHVsZXQncyBvcmNoYXJkLgoKICAgIEVudGVyIEpVTElFVCAKCkpVTElFVAoKICAgIEdhbGxvcCBhcGFjZSwgeW91IGZpZXJ5LWZvb3RlZCBzdGVlZHMsCiAgICBUb3dhcmRzIFBob2VidXMnIGxvZGdpbmc6IHN1Y2ggYSB3YWdvbmVyCiAgICBBcyBQaGFldGhvbiB3b3VsZCB3aGlwIHlvdSB0byB0aGUgd2VzdCwKICAgIEFuZCBicmluZyBpbiBjbG91ZHkgbmlnaHQgaW1tZWRpYXRlbHkuCiAgICBTcHJlYWQgdGh5IGNsb3NlIGN1cnRhaW4sIGxvdmUtcGVyZm9ybWluZyBuaWdodCwKICAgIFRoYXQgcnVuYXdheSdzIGV5ZXMgbWF5IHdpbmsgYW5kIFJvbWVvCiAgICBMZWFwIHRvIHRoZXNlIGFybXMsIHVudGFsaydkIG9mIGFuZCB1bnNlZW4uCiAgICBMb3ZlcnMgY2FuIHNlZSB0byBkbyB0aGVpciBhbW9yb3VzIHJpdGVzCiAgICBCeSB0aGVpciBvd24gYmVhdXRpZXM7IG9yLCBpZiBsb3ZlIGJlIGJsaW5kLAogICAgSXQgYmVzdCBhZ3JlZXMgd2l0aCBuaWdodC4gQ29tZSwgY2l2aWwgbmlnaHQsCiAgICBUaG91IHNvYmVyLXN1aXRlZCBtYXRyb24sIGFsbCBpbiBibGFjaywKICAgIEFuZCBsZWFybiBtZSBob3cgdG8gbG9zZSBhIHdpbm5pbmcgbWF0Y2gsCiAgICBQbGF5J2QgZm9yIGEgcGFpciBvZiBzdGFpbmxlc3MgbWFpZGVuaG9vZHM6CiAgICBIb29kIG15IHVubWFubidkIGJsb29kLCBiYXRpbmcgaW4gbXkgY2hlZWtzLAogICAgV2l0aCB0aHkgYmxhY2sgbWFudGxlOyB0aWxsIHN0cmFuZ2UgbG92ZSwgZ3Jvd24gYm9sZCwKICAgIFRoaW5rIHRydWUgbG92ZSBhY3RlZCBzaW1wbGUgbW9kZXN0eS4KICAgIENvbWUsIG5pZ2h0OyBjb21lLCBSb21lbzsgY29tZSwgdGhvdSBkYXkgaW4gbmlnaHQ7CiAgICBGb3IgdGhvdSB3aWx0IGxpZSB1cG9uIHRoZSB3aW5ncyBvZiBuaWdodAogICAgV2hpdGVyIHRoYW4gbmV3IHNub3cgb24gYSByYXZlbidzIGJhY2suCiAgICBDb21lLCBnZW50bGUgbmlnaHQsIGNvbWUsIGxvdmluZywgYmxhY2stYnJvdydkIG5pZ2h0LAogICAgR2l2ZSBtZSBteSBSb21lbzsgYW5kLCB3aGVuIGhlIHNoYWxsIGRpZSwKICAgIFRha2UgaGltIGFuZCBjdXQgaGltIG91dCBpbiBsaXR0bGUgc3RhcnMsCiAgICBBbmQgaGUgd2lsbCBtYWtlIHRoZSBmYWNlIG9mIGhlYXZlbiBzbyBmaW5lCiAgICBUaGF0IGFsbCB0aGUgd29ybGQgd2lsbCBiZSBpbiBsb3ZlIHdpdGggbmlnaHQKICAgIEFuZCBwYXkgbm8gd29yc2hpcCB0byB0aGUgZ2FyaXNoIHN1bi4KICAgIE8sIEkgaGF2ZSBib3VnaHQgdGhlIG1hbnNpb24gb2YgYSBsb3ZlLAogICAgQnV0IG5vdCBwb3NzZXNzJ2QgaXQsIGFuZCwgdGhvdWdoIEkgYW0gc29sZCwKICAgIE5vdCB5ZXQgZW5qb3knZDogc28gdGVkaW91cyBpcyB0aGlzIGRheQogICAgQXMgaXMgdGhlIG5pZ2h0IGJlZm9yZSBzb21lIGZlc3RpdmFsCiAgICBUbyBhbiBpbXBhdGllbnQgY2hpbGQgdGhhdCBoYXRoIG5ldyByb2JlcwogICAgQW5kIG1heSBub3Qgd2VhciB0aGVtLiBPLCBoZXJlIGNvbWVzIG15IG51cnNlLAogICAgQW5kIHNoZSBicmluZ3MgbmV3czsgYW5kIGV2ZXJ5IHRvbmd1ZSB0aGF0IHNwZWFrcwogICAgQnV0IFJvbWVvJ3MgbmFtZSBzcGVha3MgaGVhdmVubHkgZWxvcXVlbmNlLgoKICAgIEVudGVyIE51cnNlLCB3aXRoIGNvcmRzCiAgICBOb3csIG51cnNlLCB3aGF0IG5ld3MIFdoYXQgaGFzdCB0aG91IHRoZXJlPyB0aGUgY29yZHMKICAgIFRoYXQgUm9tZW8gYmlkIHRoZWUgZmV0Y2gCgpOdXJzZQoKICAgIEF5LCBheSwgdGhlIGNvcmRzLgoKICAgIFRocm93cyB0aGVtIGRvd24KCkpVTElFVAoKICAgIEF5IG1lISB3aGF0IG5ld3MIHdoeSBkb3N0IHRob3Ugd3JpbmcgdGh5IGhhbmRzPwoKTnVyc2UKCiAgICBBaCwgd2VsbC1hLWRheSEgaGUncyBkZWFkLCBoZSdzIGRlYWQsIGhlJ3MgZGVhZCEKICAgIFdlIGFyZSB1bmRvbmUsIGxhZHksIHdlIGFyZSB1bmRvbmUhCiAgICBBbGFjayB0aGUgZGF5ISBoZSdzIGdvbmUsIGhlJ3Mga2lsbCdkLCBoZSdzIGRlYWQhCgpKVUxJRVQKCiAgICBDYW4gaGVhdmVuIGJlIHNvIGVudmlvdXMCgpOdXJzZQoKICAgIFJvbWVvIGNhbiwKICAgIFRob3VnaCBoZWF2ZW4gY2Fubm90OiBPIFJvbWVvLCBSb21lbyEKICAgIFdobyBldmVyIHdvdWxkIGhhdmUgdGhvdWdodCBpdD8gUm9tZW8hCgpKVUxJRVQKCiAgICBXaGF0IGRldmlsIGFydCB0aG91LCB0aGF0IGRvc3QgdG9ybWVudCBtZSB0aHVzPwogICAgVGhpcyB0b3J0dXJlIHNob3VsZCBiZSByb2FyJ2QgaW4gZGlzbWFsIGhlbGwuCiAgICBIYXRoIFJvbWVvIHNsYWluIGhpbXNlbGYIHNheSB0aG91IGJ1dCAnSSwnCiAgICBBbmQgdGhhdCBiYXJlIHZvd2VsICdJJyBzaGFsbCBwb2lzb24gbW9yZQogICAgVGhhbiB0aGUgZGVhdGgtZGFydGluZyBleWUgb2YgY29ja2F0cmljZToKICAgIEkgYW0gbm90IEksIGlmIHRoZXJlIGJlIHN1Y2ggYW4gSTsKICAgIE9yIHRob3NlIGV5ZXMgc2h1dCwgdGhhdCBtYWtlIHRoZWUgYW5zd2VyICdJLicKICAgIElmIGhlIGJlIHNsYWluLCBzYXkgJ0knOyBvciBpZiBub3QsIG5vOgogICAgQnJpZWYgc291bmRzIGRldGVybWluZSBvZiBteSB3ZWFsIG9yIHdvZS4KCk51cnNlCgogICAgSSBzYXcgdGhlIHdvdW5kLCBJIHNhdyBpdCB3aXRoIG1pbmUgZXllcywtLQogICAgR29kIHNhdmUgdGhlIG1hcmshLS1oZXJlIG9uIGhpcyBtYW5seSBicmVhc3Q6CiAgICBBIHBpdGVvdXMgY29yc2UsIGEgYmxvb2R5IHBpdGVvdXMgY29yc2U7CiAgICBQYWxlLCBwYWxlIGFzIGFzaGVzLCBhbGwgYmVkYXViJ2QgaW4gYmxvb2QsCiAgICBBbGwgaW4gZ29yZS1ibG9vZDsgSSBzd291bmRlZCBhdCB0aGUgc2lnaHQuCgpKVUxJRVQKCiAgICBPLCBicmVhaywgbXkgaGVhcnQhIHBvb3IgYmFua3J1cHQsIGJyZWFrIGF0IG9uY2UhCiAgICBUbyBwcmlzb24sIGV5ZXMsIG5lJ2VyIGxvb2sgb24gbGliZXJ0eSEKICAgIFZpbGUgZWFydGgsIHRvIGVhcnRoIHJlc2lnbjsgZW5kIG1vdGlvbiBoZXJlOwogICAgQW5kIHRob3UgYW5kIFJvbWVvIHByZXNzIG9uZSBoZWF2eSBiaWVyIQoKTnVyc2UKCiAgICBPIFR5YmFsdCwgVHliYWx0LCB0aGUgYmVzdCBmcmllbmQgSSBoYWQhCiAgICBPIGNvdXJ0ZW91cyBUeWJhbHQhIGhvbmVzdCBnZW50bGVtYW4hCiAgICBUaGF0IGV2ZXIgSSBzaG91bGQgbGl2ZSB0byBzZWUgdGhlZSBkZWFkIQoKSlVMSUVUCgogICAgV2hhdCBzdG9ybSBpcyB0aGlzIHRoYXQgYmxvd3Mgc28gY29udHJhcnkCiAgICBJcyBSb21lbyBzbGF1Z2h0ZXInZCwgYW5kIGlzIFR5YmFsdCBkZWFkPwogICAgTXkgZGVhci1sb3ZlZCBjb3VzaW4sIGFuZCBteSBkZWFyZXIgbG9yZD8KICAgIFRoZW4sIGRyZWFkZnVsIHRydW1wZXQsIHNvdW5kIHRoZSBnZW5lcmFsIGRvb20hCiAgICBGb3Igd2hvIGlzIGxpdmluZywgaWYgdGhvc2UgdHdvIGFyZSBnb25lPwoKTnVyc2UKCiAgICBUeWJhbHQgaXMgZ29uZSwgYW5kIFJvbWVvIGJhbmlzaGVkOwogICAgUm9tZW8gdGhhdCBraWxsJ2QgaGltLCBoZSBpcyBiYW5pc2hlZC4KCkpVTElFVAoKICAgIE8gR29kISBkaWQgUm9tZW8ncyBoYW5kIHNoZWQgVHliYWx0J3MgYmxvb2QCgpOdXJzZQoKICAgIEl0IGRpZCwgaXQgZGlkOyBhbGFzIHRoZSBkYXksIGl0IGRpZCEKCkpVTElFVAoKICAgIE8gc2VycGVudCBoZWFydCwgaGlkIHdpdGggYSBmbG93ZXJpbmcgZmFjZSEKICAgIERpZCBldmVyIGRyYWdvbiBrZWVwIHNvIGZhaXIgYSBjYXZlPwogICAgQmVhdXRpZnVsIHR5cmFudCEgZmllbmQgYW5nZWxpY2FsIQogICAgRG92ZS1mZWF0aGVyJ2QgcmF2ZW4hIHdvbHZpc2gtcmF2ZW5pbmcgbGFtYiEKICAgIERlc3Bpc2VkIHN1YnN0YW5jZSBvZiBkaXZpbmVzdCBzaG93IQogICAgSnVzdCBvcHBvc2l0ZSB0byB3aGF0IHRob3UganVzdGx5IHNlZW0nc3QsCiAgICBBIGRhbW5lZCBzYWludCwgYW4gaG9ub3VyYWJsZSB2aWxsYWluIQogICAgTyBuYXR1cmUsIHdoYXQgaGFkc3QgdGhvdSB0byBkbyBpbiBoZWxsLAogICAgV2hlbiB0aG91IGRpZHN0IGJvd2VyIHRoZSBzcGlyaXQgb2YgYSBmaWVuZAogICAgSW4gbW9yYWwgcGFyYWRpc2Ugb2Ygc3VjaCBzd2VldCBmbGVzaD8KICAgIFdhcyBldmVyIGJvb2sgY29udGFpbmluZyBzdWNoIHZpbGUgbWF0dGVyCiAgICBTbyBmYWlybHkgYm91bmQIE8gdGhhdCBkZWNlaXQgc2hvdWxkIGR3ZWxsCiAgICBJbiBzdWNoIGEgZ29yZ2VvdXMgcGFsYWNlIQoKTnVyc2UKCiAgICBUaGVyZSdzIG5vIHRydXN0LAogICAgTm8gZmFpdGgsIG5vIGhvbmVzdHkgaW4gbWVuOyBhbGwgcGVyanVyZWQsCiAgICBBbGwgZm9yc3dvcm4sIGFsbCBuYXVnaHQsIGFsbCBkaXNzZW1ibGVycy4KICAgIEFoLCB3aGVyZSdzIG15IG1hbj8gZ2l2ZSBtZSBzb21lIGFxdWEgdml0YWU6CiAgICBUaGVzZSBncmllZnMsIHRoZXNlIHdvZXMsIHRoZXNlIHNvcnJvd3MgbWFrZSBtZSBvbGQuCiAgICBTaGFtZSBjb21lIHRvIFJvbWVvIQoKSlVMSUVUCgogICAgQmxpc3RlcidkIGJlIHRoeSB0b25ndWUKICAgIEZvciBzdWNoIGEgd2lzaCEgaGUgd2FzIG5vdCBib3JuIHRvIHNoYW1lOgogICAgVXBvbiBoaXMgYnJvdyBzaGFtZSBpcyBhc2hhbWVkIHRvIHNpdDsKICAgIEZvciAndGlzIGEgdGhyb25lIHdoZXJlIGhvbm91ciBtYXkgYmUgY3Jvd24nZAogICAgU29sZSBtb25hcmNoIG9mIHRoZSB1bml2ZXJzYWwgZWFydGguCiAgICBPLCB3aGF0IGEgYmVhc3Qgd2FzIEkgdG8gY2hpZGUgYXQgaGltIQoKTnVyc2UKCiAgICBXaWxsIHlvdSBzcGVhayB3ZWxsIG9mIGhpbSB0aGF0IGtpbGwnZCB5b3VyIGNvdXNpbj8KCkpVTElFVAoKICAgIFNoYWxsIEkgc3BlYWsgaWxsIG9mIGhpbSB0aGF0IGlzIG15IGh1c2JhbmQCiAgICBBaCwgcG9vciBteSBsb3JkLCB3aGF0IHRvbmd1ZSBzaGFsbCBzbW9vdGggdGh5IG5hbWUsCiAgICBXaGVuIEksIHRoeSB0aHJlZS1ob3VycyB3aWZlLCBoYXZlIG1hbmdsZWQgaXQCiAgICBCdXQsIHdoZXJlZm9yZSwgdmlsbGFpbiwgZGlkc3QgdGhvdSBraWxsIG15IGNvdXNpbj8KICAgIFRoYXQgdmlsbGFpbiBjb3VzaW4gd291bGQgaGF2ZSBraWxsJ2QgbXkgaHVzYmFuZDoKICAgIEJhY2ssIGZvb2xpc2ggdGVhcnMsIGJhY2sgdG8geW91ciBuYXRpdmUgc3ByaW5nOwogICAgWW91ciB0cmlidXRhcnkgZHJvcHMgYmVsb25nIHRvIHdvZSwKICAgIFdoaWNoIHlvdSwgbWlzdGFraW5nLCBvZmZlciB1cCB0byBqb3kuCiAgICBNeSBodXNiYW5kIGxpdmVzLCB0aGF0IFR5YmFsdCB3b3VsZCBoYXZlIHNsYWluOwogICAgQW5kIFR5YmFsdCdzIGRlYWQsIHRoYXQgd291bGQgaGF2ZSBzbGFpbiBteSBodXNiYW5kOgogICAgQWxsIHRoaXMgaXMgY29tZm9ydDsgd2hlcmVmb3JlIHdlZXAgSSB0aGVuPwogICAgU29tZSB3b3JkIHRoZXJlIHdhcywgd29yc2VyIHRoYW4gVHliYWx0J3MgZGVhdGgsCiAgICBUaGF0IG11cmRlcidkIG1lOiBJIHdvdWxkIGZvcmdldCBpdCBmYWluOwogICAgQnV0LCBPLCBpdCBwcmVzc2VzIHRvIG15IG1lbW9yeSwKICAgIExpa2UgZGFtbmVkIGd1aWx0eSBkZWVkcyB0byBzaW5uZXJzJyBtaW5kczoKICAgICdUeWJhbHQgaXMgZGVhZCwgYW5kIFJvbWVvLS1iYW5pc2hlZDsnCiAgICBUaGF0ICdiYW5pc2hlZCwnIHRoYXQgb25lIHdvcmQgJ2JhbmlzaGVkLCcKICAgIEhhdGggc2xhaW4gdGVuIHRob3VzYW5kIFR5YmFsdHMuIFR5YmFsdCdzIGRlYXRoCiAgICBXYXMgd29lIGVub3VnaCwgaWYgaXQgaGFkIGVuZGVkIHRoZXJlOgogICAgT3IsIGlmIHNvdXIgd29lIGRlbGlnaHRzIGluIGZlbGxvd3NoaXAKICAgIEFuZCBuZWVkbHkgd2lsbCBiZSByYW5rJ2Qgd2l0aCBvdGhlciBncmllZnMsCiAgICBXaHkgZm9sbG93J2Qgbm90LCB3aGVuIHNoZSBzYWlkICdUeWJhbHQncyBkZWFkLCcKICAgIFRoeSBmYXRoZXIsIG9yIHRoeSBtb3RoZXIsIG5heSwgb3IgYm90aCwKICAgIFdoaWNoIG1vZGVybiBsYW1lbnRhdGlvbnMgbWlnaHQgaGF2ZSBtb3ZlZD8KICAgIEJ1dCB3aXRoIGEgcmVhci13YXJkIGZvbGxvd2luZyBUeWJhbHQncyBkZWF0aCwKICAgICdSb21lbyBpcyBiYW5pc2hlZCwnIHRvIHNwZWFrIHRoYXQgd29yZCwKICAgIElzIGZhdGhlciwgbW90aGVyLCBUeWJhbHQsIFJvbWVvLCBKdWxpZXQsCiAgICBBbGwgc2xhaW4sIGFsbCBkZWFkLiAnUm9tZW8gaXMgYmFuaXNoZWQhJwogICAgVGhlcmUgaXMgbm8gZW5kLCBubyBsaW1pdCwgbWVhc3VyZSwgYm91bmQsCiAgICBJbiB0aGF0IHdvcmQncyBkZWF0aDsgbm8gd29yZHMgY2FuIHRoYXQgd29lIHNvdW5kLgogICAgV2hlcmUgaXMgbXkgZmF0aGVyLCBhbmQgbXkgbW90aGVyLCBudXJzZT8KCk51cnNlCgogICAgV2VlcGluZyBhbmQgd2FpbGluZyBvdmVyIFR5YmFsdCdzIGNvcnNlOgogICAgV2lsbCB5b3UgZ28gdG8gdGhlbT8gSSB3aWxsIGJyaW5nIHlvdSB0aGl0aGVyLgoKSlVMSUVUCgogICAgV2FzaCB0aGV5IGhpcyB3b3VuZHMgd2l0aCB0ZWFyczogbWluZSBzaGFsbCBiZSBzcGVudCwKICAgIFdoZW4gdGhlaXJzIGFyZSBkcnksIGZvciBSb21lbydzIGJhbmlzaG1lbnQuCiAgICBUYWtlIHVwIHRob3NlIGNvcmRzOiBwb29yIHJvcGVzLCB5b3UgYXJlIGJlZ3VpbGVkLAogICAgQm90aCB5b3UgYW5kIEk7IGZvciBSb21lbyBpcyBleGlsZWQ6CiAgICBIZSBtYWRlIHlvdSBmb3IgYSBoaWdod2F5IHRvIG15IGJlZDsKICAgIEJ1dCBJLCBhIG1haWQsIGRpZSBtYWlkZW4td2lkb3dlZC4KICAgIENvbWUsIGNvcmRzLCBjb21lLCBudXJzZTsgSSdsbCB0byBteSB3ZWRkaW5nLWJlZDsKICAgIEFuZCBkZWF0aCwgbm90IFJvbWVvLCB0YWtlIG15IG1haWRlbmhlYWQhCgpOdXJzZQoKICAgIEhpZSB0byB5b3VyIGNoYW1iZXI6IEknbGwgZmluZCBSb21lbwogICAgVG8gY29tZm9ydCB5b3U6IEkgd290IHdlbGwgd2hlcmUgaGUgaXMuCiAgICBIYXJrIHllLCB5b3VyIFJvbWVvIHdpbGwgYmUgaGVyZSBhdCBuaWdodDoKICAgIEknbGwgdG8gaGltOyBoZSBpcyBoaWQgYXQgTGF1cmVuY2UnIGNlbGwuCgpKVUxJRVQKCiAgICBPLCBmaW5kIGhpbSEgZ2l2ZSB0aGlzIHJpbmcgdG8gbXkgdHJ1ZSBrbmlnaHQsCiAgICBBbmQgYmlkIGhpbSBjb21lIHRvIHRha2UgaGlzIGxhc3QgZmFyZXdlbGwuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSAKCkZSSUFSIExBVVJFTkNFCgogICAgUm9tZW8sIGNvbWUgZm9ydGg7IGNvbWUgZm9ydGgsIHRob3UgZmVhcmZ1bCBtYW46CiAgICBBZmZsaWN0aW9uIGlzIGVuYW1vdXInZCBvZiB0aHkgcGFydHMsCiAgICBBbmQgdGhvdSBhcnQgd2VkZGVkIHRvIGNhbGFtaXR5LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEZhdGhlciwgd2hhdCBuZXdzPyB3aGF0IGlzIHRoZSBwcmluY2UncyBkb29tPwogICAgV2hhdCBzb3Jyb3cgY3JhdmVzIGFjcXVhaW50YW5jZSBhdCBteSBoYW5kLAogICAgVGhhdCBJIHlldCBrbm93IG5vdD8KCkZSSUFSIExBVVJFTkNFCgogICAgVG9vIGZhbWlsaWFyCiAgICBJcyBteSBkZWFyIHNvbiB3aXRoIHN1Y2ggc291ciBjb21wYW55OgogICAgSSBicmluZyB0aGVlIHRpZGluZ3Mgb2YgdGhlIHByaW5jZSdzIGRvb20uCgpST01FTwoKICAgIFdoYXQgbGVzcyB0aGFuIGRvb21zLWRheSBpcyB0aGUgcHJpbmNlJ3MgZG9vbT8KCkZSSUFSIExBVVJFTkNFCgogICAgQSBnZW50bGVyIGp1ZGdtZW50IHZhbmlzaCdkIGZyb20gaGlzIGxpcHMsCiAgICBOb3QgYm9keSdzIGRlYXRoLCBidXQgYm9keSdzIGJhbmlzaG1lbnQuCgpST01FTwoKICAgIEhhLCBiYW5pc2htZW50ISBiZSBtZXJjaWZ1bCwgc2F5ICdkZWF0aDsnCiAgICBGb3IgZXhpbGUgaGF0aCBtb3JlIHRlcnJvciBpbiBoaXMgbG9vaywKICAgIE11Y2ggbW9yZSB0aGFuIGRlYXRoOiBkbyBub3Qgc2F5ICdiYW5pc2htZW50LicKCkZSSUFSIExBVVJFTkNFCgogICAgSGVuY2UgZnJvbSBWZXJvbmEgYXJ0IHRob3UgYmFuaXNoZWQ6CiAgICBCZSBwYXRpZW50LCBmb3IgdGhlIHdvcmxkIGlzIGJyb2FkIGFuZCB3aWRlLgoKUk9NRU8KCiAgICBUaGVyZSBpcyBubyB3b3JsZCB3aXRob3V0IFZlcm9uYSB3YWxscywKICAgIEJ1dCBwdXJnYXRvcnksIHRvcnR1cmUsIGhlbGwgaXRzZWxmLgogICAgSGVuY2UtYmFuaXNoZWQgaXMgYmFuaXNoJ2QgZnJvbSB0aGUgd29ybGQsCiAgICBBbmQgd29ybGQncyBleGlsZSBpcyBkZWF0aDogdGhlbiBiYW5pc2hlZCwKICAgIElzIGRlYXRoIG1pcy10ZXJtJ2Q6IGNhbGxpbmcgZGVhdGggYmFuaXNobWVudCwKICAgIFRob3UgY3V0dCdzdCBteSBoZWFkIG9mZiB3aXRoIGEgZ29sZGVuIGF4ZSwKICAgIEFuZCBzbWlsZXN0IHVwb24gdGhlIHN0cm9rZSB0aGF0IG11cmRlcnMgbWUuCgpGUklBUiBMQVVSRU5DRQoKICAgIE8gZGVhZGx5IHNpbiEgTyBydWRlIHVudGhhbmtmdWxuZXNzIQogICAgVGh5IGZhdWx0IG91ciBsYXcgY2FsbHMgZGVhdGg7IGJ1dCB0aGUga2luZCBwcmluY2UsCiAgICBUYWtpbmcgdGh5IHBhcnQsIGhhdGggcnVzaCdkIGFzaWRlIHRoZSBsYXcsCiAgICBBbmQgdHVybidkIHRoYXQgYmxhY2sgd29yZCBkZWF0aCB0byBiYW5pc2htZW50OgogICAgVGhpcyBpcyBkZWFyIG1lcmN5LCBhbmQgdGhvdSBzZWVzdCBpdCBub3QuCgpST01FTwoKICAgICdUaXMgdG9ydHVyZSwgYW5kIG5vdCBtZXJjeTogaGVhdmVuIGlzIGhlcmUsCiAgICBXaGVyZSBKdWxpZXQgbGl2ZXM7IGFuZCBldmVyeSBjYXQgYW5kIGRvZwogICAgQW5kIGxpdHRsZSBtb3VzZSwgZXZlcnkgdW53b3J0aHkgdGhpbmcsCiAgICBMaXZlIGhlcmUgaW4gaGVhdmVuIGFuZCBtYXkgbG9vayBvbiBoZXI7CiAgICBCdXQgUm9tZW8gbWF5IG5vdDogbW9yZSB2YWxpZGl0eSwKICAgIE1vcmUgaG9ub3VyYWJsZSBzdGF0ZSwgbW9yZSBjb3VydHNoaXAgbGl2ZXMKICAgIEluIGNhcnJpb24tZmxpZXMgdGhhbiBSb21lbzogdGhleSBteSBzZWl6ZQogICAgT24gdGhlIHdoaXRlIHdvbmRlciBvZiBkZWFyIEp1bGlldCdzIGhhbmQKICAgIEFuZCBzdGVhbCBpbW1vcnRhbCBibGVzc2luZyBmcm9tIGhlciBsaXBzLAogICAgV2hvIGV2ZW4gaW4gcHVyZSBhbmQgdmVzdGFsIG1vZGVzdHksCiAgICBTdGlsbCBibHVzaCwgYXMgdGhpbmtpbmcgdGhlaXIgb3duIGtpc3NlcyBzaW47CiAgICBCdXQgUm9tZW8gbWF5IG5vdDsgaGUgaXMgYmFuaXNoZWQ6CiAgICBGbGllcyBtYXkgZG8gdGhpcywgYnV0IEkgZnJvbSB0aGlzIG11c3QgZmx5OgogICAgVGhleSBhcmUgZnJlZSBtZW4sIGJ1dCBJIGFtIGJhbmlzaGVkLgogICAgQW5kIHNheSdzdCB0aG91IHlldCB0aGF0IGV4aWxlIGlzIG5vdCBkZWF0aD8KICAgIEhhZHN0IHRob3Ugbm8gcG9pc29uIG1peCdkLCBubyBzaGFycC1ncm91bmQga25pZmUsCiAgICBObyBzdWRkZW4gbWVhbiBvZiBkZWF0aCwgdGhvdWdoIG5lJ2VyIHNvIG1lYW4sCiAgICBCdXQgJ2JhbmlzaGVkJyB0byBraWxsIG1lPy0tJ2JhbmlzaGVkJz8KICAgIE8gZnJpYXIsIHRoZSBkYW1uZWQgdXNlIHRoYXQgd29yZCBpbiBoZWxsOwogICAgSG93bGluZ3MgYXR0ZW5kIGl0OiBob3cgaGFzdCB0aG91IHRoZSBoZWFydCwKICAgIEJlaW5nIGEgZGl2aW5lLCBhIGdob3N0bHkgY29uZmVzc29yLAogICAgQSBzaW4tYWJzb2x2ZXIsIGFuZCBteSBmcmllbmQgcHJvZmVzcydkLAogICAgVG8gbWFuZ2xlIG1lIHdpdGggdGhhdCB3b3JkICdiYW5pc2hlZCcCgpGUklBUiBMQVVSRU5DRQoKICAgIFRob3UgZm9uZCBtYWQgbWFuLCBoZWFyIG1lIGJ1dCBzcGVhayBhIHdvcmQuCgpST01FTwoKICAgIE8sIHRob3Ugd2lsdCBzcGVhayBhZ2FpbiBvZiBiYW5pc2htZW50LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJJ2xsIGdpdmUgdGhlZSBhcm1vdXIgdG8ga2VlcCBvZmYgdGhhdCB3b3JkOgogICAgQWR2ZXJzaXR5J3Mgc3dlZXQgbWlsaywgcGhpbG9zb3BoeSwKICAgIFRvIGNvbWZvcnQgdGhlZSwgdGhvdWdoIHRob3UgYXJ0IGJhbmlzaGVkLgoKUk9NRU8KCiAgICBZZXQgJ2JhbmlzaGVkJz8gSGFuZyB1cCBwaGlsb3NvcGh5IQogICAgVW5sZXNzIHBoaWxvc29waHkgY2FuIG1ha2UgYSBKdWxpZXQsCiAgICBEaXNwbGFudCBhIHRvd24sIHJldmVyc2UgYSBwcmluY2UncyBkb29tLAogICAgSXQgaGVscHMgbm90LCBpdCBwcmV2YWlscyBub3Q6IHRhbGsgbm8gbW9yZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTywgdGhlbiBJIHNlZSB0aGF0IG1hZG1lbiBoYXZlIG5vIGVhcnMuCgpST01FTwoKICAgIEhvdyBzaG91bGQgdGhleSwgd2hlbiB0aGF0IHdpc2UgbWVuIGhhdmUgbm8gZXllcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTGV0IG1lIGRpc3B1dGUgd2l0aCB0aGVlIG9mIHRoeSBlc3RhdGUuCgpST01FTwoKICAgIFRob3UgY2Fuc3Qgbm90IHNwZWFrIG9mIHRoYXQgdGhvdSBkb3N0IG5vdCBmZWVsOgogICAgV2VydCB0aG91IGFzIHlvdW5nIGFzIEksIEp1bGlldCB0aHkgbG92ZSwKICAgIEFuIGhvdXIgYnV0IG1hcnJpZWQsIFR5YmFsdCBtdXJkZXJlZCwKICAgIERvdGluZyBsaWtlIG1lIGFuZCBsaWtlIG1lIGJhbmlzaGVkLAogICAgVGhlbiBtaWdodHN0IHRob3Ugc3BlYWssIHRoZW4gbWlnaHRzdCB0aG91IHRlYXIgdGh5IGhhaXIsCiAgICBBbmQgZmFsbCB1cG9uIHRoZSBncm91bmQsIGFzIEkgZG8gbm93LAogICAgVGFraW5nIHRoZSBtZWFzdXJlIG9mIGFuIHVubWFkZSBncmF2ZS4KCiAgICBLbm9ja2luZyB3aXRoaW4KCkZSSUFSIExBVVJFTkNFCgogICAgQXJpc2U7IG9uZSBrbm9ja3M7IGdvb2QgUm9tZW8sIGhpZGUgdGh5c2VsZi4KClJPTUVPCgogICAgTm90IEk7IHVubGVzcyB0aGUgYnJlYXRoIG9mIGhlYXJ0c2ljayBncm9hbnMsCiAgICBNaXN0LWxpa2UsIGluZm9sZCBtZSBmcm9tIHRoZSBzZWFyY2ggb2YgZXllcy4KCiAgICBLbm9ja2luZwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIYXJrLCBob3cgdGhleSBrbm9jayEgV2hvJ3MgdGhlcmUIFJvbWVvLCBhcmlzZTsKICAgIFRob3Ugd2lsdCBiZSB0YWtlbi4gU3RheSBhd2hpbGUhIFN0YW5kIHVwOwoKICAgIEtub2NraW5nCiAgICBSdW4gdG8gbXkgc3R1ZHkuIEJ5IGFuZCBieSEgR29kJ3Mgd2lsbCwKICAgIFdoYXQgc2ltcGxlbmVzcyBpcyB0aGlzISBJIGNvbWUsIEkgY29tZSEKCiAgICBLbm9ja2luZwogICAgV2hvIGtub2NrcyBzbyBoYXJkPyB3aGVuY2UgY29tZSB5b3UIHdoYXQncyB5b3VyIHdpbGwCgpOdXJzZQoKICAgIFtXaXRoaW5dIExldCBtZSBjb21lIGluLCBhbmQgeW91IHNoYWxsIGtub3cKICAgIG15IGVycmFuZDsKICAgIEkgY29tZSBmcm9tIExhZHkgSnVsaWV0LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXZWxjb21lLCB0aGVuLgoKICAgIEVudGVyIE51cnNlCgpOdXJzZQoKICAgIE8gaG9seSBmcmlhciwgTywgdGVsbCBtZSwgaG9seSBmcmlhciwKICAgIFdoZXJlIGlzIG15IGxhZHkncyBsb3JkLCB3aGVyZSdzIFJvbWVvPwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGVyZSBvbiB0aGUgZ3JvdW5kLCB3aXRoIGhpcyBvd24gdGVhcnMgbWFkZSBkcnVuay4KCk51cnNlCgogICAgTywgaGUgaXMgZXZlbiBpbiBteSBtaXN0cmVzcycgY2FzZSwKICAgIEp1c3QgaW4gaGVyIGNhc2UhIE8gd29mdWwgc3ltcGF0aHkhCiAgICBQaXRlb3VzIHByZWRpY2FtZW50ISBFdmVuIHNvIGxpZXMgc2hlLAogICAgQmx1YmJlcmluZyBhbmQgd2VlcGluZywgd2VlcGluZyBhbmQgYmx1YmJlcmluZy4KICAgIFN0YW5kIHVwLCBzdGFuZCB1cDsgc3RhbmQsIGFuZCB5b3UgYmUgYSBtYW46CiAgICBGb3IgSnVsaWV0J3Mgc2FrZSwgZm9yIGhlciBzYWtlLCByaXNlIGFuZCBzdGFuZDsKICAgIFdoeSBzaG91bGQgeW91IGZhbGwgaW50byBzbyBkZWVwIGFuIE8CgpST01FTwoKICAgIE51cnNlIQoKTnVyc2UKCiAgICBBaCBzaXIhIGFoIHNpciEgV2VsbCwgZGVhdGgncyB0aGUgZW5kIG9mIGFsbC4KClJPTUVPCgogICAgU3Bha2VzdCB0aG91IG9mIEp1bGlldD8gaG93IGlzIGl0IHdpdGggaGVyPwogICAgRG90aCBzaGUgbm90IHRoaW5rIG1lIGFuIG9sZCBtdXJkZXJlciwKICAgIE5vdyBJIGhhdmUgc3RhaW4nZCB0aGUgY2hpbGRob29kIG9mIG91ciBqb3kKICAgIFdpdGggYmxvb2QgcmVtb3ZlZCBidXQgbGl0dGxlIGZyb20gaGVyIG93bj8KICAgIFdoZXJlIGlzIHNoZT8gYW5kIGhvdyBkb3RoIHNoZT8gYW5kIHdoYXQgc2F5cwogICAgTXkgY29uY2VhbCdkIGxhZHkgdG8gb3VyIGNhbmNlbGwnZCBsb3ZlPwoKTnVyc2UKCiAgICBPLCBzaGUgc2F5cyBub3RoaW5nLCBzaXIsIGJ1dCB3ZWVwcyBhbmQgd2VlcHM7CiAgICBBbmQgbm93IGZhbGxzIG9uIGhlciBiZWQ7IGFuZCB0aGVuIHN0YXJ0cyB1cCwKICAgIEFuZCBUeWJhbHQgY2FsbHM7IGFuZCB0aGVuIG9uIFJvbWVvIGNyaWVzLAogICAgQW5kIHRoZW4gZG93biBmYWxscyBhZ2Fpbi4KClJPTUVPCgogICAgQXMgaWYgdGhhdCBuYW1lLAogICAgU2hvdCBmcm9tIHRoZSBkZWFkbHkgbGV2ZWwgb2YgYSBndW4sCiAgICBEaWQgbXVyZGVyIGhlcjsgYXMgdGhhdCBuYW1lJ3MgY3Vyc2VkIGhhbmQKICAgIE11cmRlcidkIGhlciBraW5zbWFuLiBPLCB0ZWxsIG1lLCBmcmlhciwgdGVsbCBtZSwKICAgIEluIHdoYXQgdmlsZSBwYXJ0IG9mIHRoaXMgYW5hdG9teQogICAgRG90aCBteSBuYW1lIGxvZGdlPyB0ZWxsIG1lLCB0aGF0IEkgbWF5IHNhY2sKICAgIFRoZSBoYXRlZnVsIG1hbnNpb24uCgogICAgRHJhd2luZyBoaXMgc3dvcmQKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZCB0aHkgZGVzcGVyYXRlIGhhbmQ6CiAgICBBcnQgdGhvdSBhIG1hbj8gdGh5IGZvcm0gY3JpZXMgb3V0IHRob3UgYXJ0OgogICAgVGh5IHRlYXJzIGFyZSB3b21hbmlzaDsgdGh5IHdpbGQgYWN0cyBkZW5vdGUKICAgIFRoZSB1bnJlYXNvbmFibGUgZnVyeSBvZiBhIGJlYXN0OgogICAgVW5zZWVtbHkgd29tYW4gaW4gYSBzZWVtaW5nIG1hbiEKICAgIE9yIGlsbC1iZXNlZW1pbmcgYmVhc3QgaW4gc2VlbWluZyBib3RoIQogICAgVGhvdSBoYXN0IGFtYXplZCBtZTogYnkgbXkgaG9seSBvcmRlciwKICAgIEkgdGhvdWdodCB0aHkgZGlzcG9zaXRpb24gYmV0dGVyIHRlbXBlcidkLgogICAgSGFzdCB0aG91IHNsYWluIFR5YmFsdD8gd2lsdCB0aG91IHNsYXkgdGh5c2VsZj8KICAgIEFuZCBzdGF5IHRoeSBsYWR5IHRvbyB0aGF0IGxpdmVzIGluIHRoZWUsCiAgICBCeSBkb2luZyBkYW1uZWQgaGF0ZSB1cG9uIHRoeXNlbGYCiAgICBXaHkgcmFpbCdzdCB0aG91IG9uIHRoeSBiaXJ0aCwgdGhlIGhlYXZlbiwgYW5kIGVhcnRoPwogICAgU2luY2UgYmlydGgsIGFuZCBoZWF2ZW4sIGFuZCBlYXJ0aCwgYWxsIHRocmVlIGRvIG1lZXQKICAgIEluIHRoZWUgYXQgb25jZTsgd2hpY2ggdGhvdSBhdCBvbmNlIHdvdWxkc3QgbG9zZS4KICAgIEZpZSwgZmllLCB0aG91IHNoYW1lc3QgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDsKICAgIFdoaWNoLCBsaWtlIGEgdXN1cmVyLCBhYm91bmQnc3QgaW4gYWxsLAogICAgQW5kIHVzZXN0IG5vbmUgaW4gdGhhdCB0cnVlIHVzZSBpbmRlZWQKICAgIFdoaWNoIHNob3VsZCBiZWRlY2sgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDoKICAgIFRoeSBub2JsZSBzaGFwZSBpcyBidXQgYSBmb3JtIG9mIHdheCwKICAgIERpZ3Jlc3NpbmcgZnJvbSB0aGUgdmFsb3VyIG9mIGEgbWFuOwogICAgVGh5IGRlYXIgbG92ZSBzd29ybiBidXQgaG9sbG93IHBlcmp1cnksCiAgICBLaWxsaW5nIHRoYXQgbG92ZSB3aGljaCB0aG91IGhhc3Qgdm93J2QgdG8gY2hlcmlzaDsKICAgIFRoeSB3aXQsIHRoYXQgb3JuYW1lbnQgdG8gc2hhcGUgYW5kIGxvdmUsCiAgICBNaXNzaGFwZW4gaW4gdGhlIGNvbmR1Y3Qgb2YgdGhlbSBib3RoLAogICAgTGlrZSBwb3dkZXIgaW4gYSBza2l0bGVzcyBzb2xkaWVyJ3MgZmxhc2ssCiAgICBJcyBzZXQgYWZpcmUgYnkgdGhpbmUgb3duIGlnbm9yYW5jZSwKICAgIEFuZCB0aG91IGRpc21lbWJlcidkIHdpdGggdGhpbmUgb3duIGRlZmVuY2UuCiAgICBXaGF0LCByb3VzZSB0aGVlLCBtYW4hIHRoeSBKdWxpZXQgaXMgYWxpdmUsCiAgICBGb3Igd2hvc2UgZGVhciBzYWtlIHRob3Ugd2FzdCBidXQgbGF0ZWx5IGRlYWQ7CiAgICBUaGVyZSBhcnQgdGhvdSBoYXBweTogVHliYWx0IHdvdWxkIGtpbGwgdGhlZSwKICAgIEJ1dCB0aG91IHNsZXcnc3QgVHliYWx0OyB0aGVyZSBhcmUgdGhvdSBoYXBweSB0b286CiAgICBUaGUgbGF3IHRoYXQgdGhyZWF0ZW4nZCBkZWF0aCBiZWNvbWVzIHRoeSBmcmllbmQKICAgIEFuZCB0dXJucyBpdCB0byBleGlsZTsgdGhlcmUgYXJ0IHRob3UgaGFwcHk6CiAgICBBIHBhY2sgb2YgYmxlc3NpbmdzIGxpZ2h0cyB1cCB1cG9uIHRoeSBiYWNrOwogICAgSGFwcGluZXNzIGNvdXJ0cyB0aGVlIGluIGhlciBiZXN0IGFycmF5OwogICAgQnV0LCBsaWtlIGEgbWlzYmVoYXZlZCBhbmQgc3VsbGVuIHdlbmNoLAogICAgVGhvdSBwb3V0J3N0IHVwb24gdGh5IGZvcnR1bmUgYW5kIHRoeSBsb3ZlOgogICAgVGFrZSBoZWVkLCB0YWtlIGhlZWQsIGZvciBzdWNoIGRpZSBtaXNlcmFibGUuCiAgICBHbywgZ2V0IHRoZWUgdG8gdGh5IGxvdmUsIGFzIHdhcyBkZWNyZWVkLAogICAgQXNjZW5kIGhlciBjaGFtYmVyLCBoZW5jZSBhbmQgY29tZm9ydCBoZXI6CiAgICBCdXQgbG9vayB0aG91IHN0YXkgbm90IHRpbGwgdGhlIHdhdGNoIGJlIHNldCwKICAgIEZvciB0aGVuIHRob3UgY2Fuc3Qgbm90IHBhc3MgdG8gTWFudHVhOwogICAgV2hlcmUgdGhvdSBzaGFsdCBsaXZlLCB0aWxsIHdlIGNhbiBmaW5kIGEgdGltZQogICAgVG8gYmxhemUgeW91ciBtYXJyaWFnZSwgcmVjb25jaWxlIHlvdXIgZnJpZW5kcywKICAgIEJlZyBwYXJkb24gb2YgdGhlIHByaW5jZSwgYW5kIGNhbGwgdGhlZSBiYWNrCiAgICBXaXRoIHR3ZW50eSBodW5kcmVkIHRob3VzYW5kIHRpbWVzIG1vcmUgam95CiAgICBUaGFuIHRob3Ugd2VudCdzdCBmb3J0aCBpbiBsYW1lbnRhdGlvbi4KICAgIEdvIGJlZm9yZSwgbnVyc2U6IGNvbW1lbmQgbWUgdG8gdGh5IGxhZHk7CiAgICBBbmQgYmlkIGhlciBoYXN0ZW4gYWxsIHRoZSBob3VzZSB0byBiZWQsCiAgICBXaGljaCBoZWF2eSBzb3Jyb3cgbWFrZXMgdGhlbSBhcHQgdW50bzoKICAgIFJvbWVvIGlzIGNvbWluZy4KCk51cnNlCgogICAgTyBMb3JkLCBJIGNvdWxkIGhhdmUgc3RheSdkIGhlcmUgYWxsIHRoZSBuaWdodAogICAgVG8gaGVhciBnb29kIGNvdW5zZWw6IE8sIHdoYXQgbGVhcm5pbmcgaXMhCiAgICBNeSBsb3JkLCBJJ2xsIHRlbGwgbXkgbGFkeSB5b3Ugd2lsbCBjb21lLgoKUk9NRU8KCiAgICBEbyBzbywgYW5kIGJpZCBteSBzd2VldCBwcmVwYXJlIHRvIGNoaWRlLgoKTnVyc2UKCiAgICBIZXJlLCBzaXIsIGEgcmluZyBzaGUgYmlkIG1lIGdpdmUgeW91LCBzaXI6CiAgICBIaWUgeW91LCBtYWtlIGhhc3RlLCBmb3IgaXQgZ3Jvd3MgdmVyeSBsYXRlLgoKICAgIEV4aXQKClJPTUVPCgogICAgSG93IHdlbGwgbXkgY29tZm9ydCBpcyByZXZpdmVkIGJ5IHRoaXMhCgpGUklBUiBMQVVSRU5DRQoKICAgIEdvIGhlbmNlOyBnb29kIG5pZ2h0OyBhbmQgaGVyZSBzdGFuZHMgYWxsIHlvdXIgc3RhdGU6CiAgICBFaXRoZXIgYmUgZ29uZSBiZWZvcmUgdGhlIHdhdGNoIGJlIHNldCwKICAgIE9yIGJ5IHRoZSBicmVhayBvZiBkYXkgZGlzZ3Vpc2VkIGZyb20gaGVuY2U6CiAgICBTb2pvdXJuIGluIE1hbnR1YTsgSSdsbCBmaW5kIG91dCB5b3VyIG1hbiwKICAgIEFuZCBoZSBzaGFsbCBzaWduaWZ5IGZyb20gdGltZSB0byB0aW1lCiAgICBFdmVyeSBnb29kIGhhcCB0byB5b3UgdGhhdCBjaGFuY2VzIGhlcmU6CiAgICBHaXZlIG1lIHRoeSBoYW5kOyAndGlzIGxhdGU6IGZhcmV3ZWxsOyBnb29kIG5pZ2h0LgoKUk9NRU8KCiAgICBCdXQgdGhhdCBhIGpveSBwYXN0IGpveSBjYWxscyBvdXQgb24gbWUsCiAgICBJdCB3ZXJlIGEgZ3JpZWYsIHNvIGJyaWVmIHRvIHBhcnQgd2l0aCB0aGVlOiBGYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHJvb20gaW4gQ2FwdWxldCdzIGhvdXNlLgoKICAgIEVudGVyIENBUFVMRVQsIExBRFkgQ0FQVUxFVCwgYW5kIFBBUklTIAoKQ0FQVUxFVAoKICAgIFRoaW5ncyBoYXZlIGZhbGwnbiBvdXQsIHNpciwgc28gdW5sdWNraWx5LAogICAgVGhhdCB3ZSBoYXZlIGhhZCBubyB0aW1lIHRvIG1vdmUgb3VyIGRhdWdodGVyOgogICAgTG9vayB5b3UsIHNoZSBsb3ZlZCBoZXIga2luc21hbiBUeWJhbHQgZGVhcmx5LAogICAgQW5kIHNvIGRpZCBJOi0tV2VsbCwgd2Ugd2VyZSBib3JuIHRvIGRpZS4KICAgICdUaXMgdmVyeSBsYXRlLCBzaGUnbGwgbm90IGNvbWUgZG93biB0by1uaWdodDoKICAgIEkgcHJvbWlzZSB5b3UsIGJ1dCBmb3IgeW91ciBjb21wYW55LAogICAgSSB3b3VsZCBoYXZlIGJlZW4gYS1iZWQgYW4gaG91ciBhZ28uCgpQQVJJUwoKICAgIFRoZXNlIHRpbWVzIG9mIHdvZSBhZmZvcmQgbm8gdGltZSB0byB3b28uCiAgICBNYWRhbSwgZ29vZCBuaWdodDogY29tbWVuZCBtZSB0byB5b3VyIGRhdWdodGVyLgoKTEFEWSBDQVBVTEVUCgogICAgSSB3aWxsLCBhbmQga25vdyBoZXIgbWluZCBlYXJseSB0by1tb3Jyb3c7CiAgICBUby1uaWdodCBzaGUgaXMgbWV3J2QgdXAgdG8gaGVyIGhlYXZpbmVzcy4KCkNBUFVMRVQKCiAgICBTaXIgUGFyaXMsIEkgd2lsbCBtYWtlIGEgZGVzcGVyYXRlIHRlbmRlcgogICAgT2YgbXkgY2hpbGQncyBsb3ZlOiBJIHRoaW5rIHNoZSB3aWxsIGJlIHJ1bGVkCiAgICBJbiBhbGwgcmVzcGVjdHMgYnkgbWU7IG5heSwgbW9yZSwgSSBkb3VidCBpdCBub3QuCiAgICBXaWZlLCBnbyB5b3UgdG8gaGVyIGVyZSB5b3UgZ28gdG8gYmVkOwogICAgQWNxdWFpbnQgaGVyIGhlcmUgb2YgbXkgc29uIFBhcmlzJyBsb3ZlOwogICAgQW5kIGJpZCBoZXIsIG1hcmsgeW91IG1lLCBvbiBXZWRuZXNkYXkgbmV4dC0tCiAgICBCdXQsIHNvZnQhIHdoYXQgZGF5IGlzIHRoaXMCgpQQVJJUwoKICAgIE1vbmRheSwgbXkgbG9yZCwKCkNBUFVMRVQKCiAgICBNb25kYXkhIGhhLCBoYSEgV2VsbCwgV2VkbmVzZGF5IGlzIHRvbyBzb29uLAogICAgTycgVGh1cnNkYXkgbGV0IGl0IGJlOiBvJyBUaHVyc2RheSwgdGVsbCBoZXIsCiAgICBTaGUgc2hhbGwgYmUgbWFycmllZCB0byB0aGlzIG5vYmxlIGVhcmwuCiAgICBXaWxsIHlvdSBiZSByZWFkeT8gZG8geW91IGxpa2UgdGhpcyBoYXN0ZT8KICAgIFdlJ2xsIGtlZXAgbm8gZ3JlYXQgYWRvLC0tYSBmcmllbmQgb3IgdHdvOwogICAgRm9yLCBoYXJrIHlvdSwgVHliYWx0IGJlaW5nIHNsYWluIHNvIGxhdGUsCiAgICBJdCBtYXkgYmUgdGhvdWdodCB3ZSBoZWxkIGhpbSBjYXJlbGVzc2x5LAogICAgQmVpbmcgb3VyIGtpbnNtYW4sIGlmIHdlIHJldmVsIG11Y2g6CiAgICBUaGVyZWZvcmUgd2UnbGwgaGF2ZSBzb21lIGhhbGYgYSBkb3plbiBmcmllbmRzLAogICAgQW5kIHRoZXJlIGFuIGVuZC4gQnV0IHdoYXQgc2F5IHlvdSB0byBUaHVyc2RheT8KClBBUklTCgogICAgTXkgbG9yZCwgSSB3b3VsZCB0aGF0IFRodXJzZGF5IHdlcmUgdG8tbW9ycm93LgoKQ0FQVUxFVAoKICAgIFdlbGwgZ2V0IHlvdSBnb25lOiBvJyBUaHVyc2RheSBiZSBpdCwgdGhlbi4KICAgIEdvIHlvdSB0byBKdWxpZXQgZXJlIHlvdSBnbyB0byBiZWQsCiAgICBQcmVwYXJlIGhlciwgd2lmZSwgYWdhaW5zdCB0aGlzIHdlZGRpbmctZGF5LgogICAgRmFyZXdlbGwsIG15IGxvcmQuIExpZ2h0IHRvIG15IGNoYW1iZXIsIGhvIQogICAgQWZvcmUgbWUhIGl0IGlzIHNvIHZlcnkgdmVyeSBsYXRlLAogICAgVGhhdCB3ZSBtYXkgY2FsbCBpdCBlYXJseSBieSBhbmQgYnkuCiAgICBHb29kIG5pZ2h0LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gYW5kIEpVTElFVCBhYm92ZSwgYXQgdGhlIHdpbmRvdyAKCkpVTElFVAoKICAgIFdpbHQgdGhvdSBiZSBnb25lPyBpdCBpcyBub3QgeWV0IG5lYXIgZGF5OgogICAgSXQgd2FzIHRoZSBuaWdodGluZ2FsZSwgYW5kIG5vdCB0aGUgbGFyaywKICAgIFRoYXQgcGllcmNlZCB0aGUgZmVhcmZ1bCBob2xsb3cgb2YgdGhpbmUgZWFyOwogICAgTmlnaHRseSBzaGUgc2luZ3Mgb24geW9uIHBvbWVncmFuYXRlLXRyZWU6CiAgICBCZWxpZXZlIG1lLCBsb3ZlLCBpdCB3YXMgdGhlIG5pZ2h0aW5nYWxlLgoKUk9NRU8KCiAgICBJdCB3YXMgdGhlIGxhcmssIHRoZSBoZXJhbGQgb2YgdGhlIG1vcm4sCiAgICBObyBuaWdodGluZ2FsZTogbG9vaywgbG92ZSwgd2hhdCBlbnZpb3VzIHN0cmVha3MKICAgIERvIGxhY2UgdGhlIHNldmVyaW5nIGNsb3VkcyBpbiB5b25kZXIgZWFzdDoKICAgIE5pZ2h0J3MgY2FuZGxlcyBhcmUgYnVybnQgb3V0LCBhbmQgam9jdW5kIGRheQogICAgU3RhbmRzIHRpcHRvZSBvbiB0aGUgbWlzdHkgbW91bnRhaW4gdG9wcy4KICAgIEkgbXVzdCBiZSBnb25lIGFuZCBsaXZlLCBvciBzdGF5IGFuZCBkaWUuCgpKVUxJRVQKCiAgICBZb24gbGlnaHQgaXMgbm90IGRheS1saWdodCwgSSBrbm93IGl0LCBJOgogICAgSXQgaXMgc29tZSBtZXRlb3IgdGhhdCB0aGUgc3VuIGV4aGFsZXMsCiAgICBUbyBiZSB0byB0aGVlIHRoaXMgbmlnaHQgYSB0b3JjaC1iZWFyZXIsCiAgICBBbmQgbGlnaHQgdGhlZSBvbiB0aHkgd2F5IHRvIE1hbnR1YToKICAgIFRoZXJlZm9yZSBzdGF5IHlldDsgdGhvdSBuZWVkJ3N0IG5vdCB0byBiZSBnb25lLgoKUk9NRU8KCiAgICBMZXQgbWUgYmUgdGEnZW4sIGxldCBtZSBiZSBwdXQgdG8gZGVhdGg7CiAgICBJIGFtIGNvbnRlbnQsIHNvIHRob3Ugd2lsdCBoYXZlIGl0IHNvLgogICAgSSdsbCBzYXkgeW9uIGdyZXkgaXMgbm90IHRoZSBtb3JuaW5nJ3MgZXllLAogICAgJ1RpcyBidXQgdGhlIHBhbGUgcmVmbGV4IG9mIEN5bnRoaWEncyBicm93OwogICAgTm9yIHRoYXQgaXMgbm90IHRoZSBsYXJrLCB3aG9zZSBub3RlcyBkbyBiZWF0CiAgICBUaGUgdmF1bHR5IGhlYXZlbiBzbyBoaWdoIGFib3ZlIG91ciBoZWFkczoKICAgIEkgaGF2ZSBtb3JlIGNhcmUgdG8gc3RheSB0aGFuIHdpbGwgdG8gZ286CiAgICBDb21lLCBkZWF0aCwgYW5kIHdlbGNvbWUhIEp1bGlldCB3aWxscyBpdCBzby4KICAgIEhvdyBpcyd0LCBteSBzb3VsPyBsZXQncyB0YWxrOyBpdCBpcyBub3QgZGF5LgoKSlVMSUVUCgogICAgSXQgaXMsIGl0IGlzOiBoaWUgaGVuY2UsIGJlIGdvbmUsIGF3YXkhCiAgICBJdCBpcyB0aGUgbGFyayB0aGF0IHNpbmdzIHNvIG91dCBvZiB0dW5lLAogICAgU3RyYWluaW5nIGhhcnNoIGRpc2NvcmRzIGFuZCB1bnBsZWFzaW5nIHNoYXJwcy4KICAgIFNvbWUgc2F5IHRoZSBsYXJrIG1ha2VzIHN3ZWV0IGRpdmlzaW9uOwogICAgVGhpcyBkb3RoIG5vdCBzbywgZm9yIHNoZSBkaXZpZGV0aCB1czoKICAgIFNvbWUgc2F5IHRoZSBsYXJrIGFuZCBsb2F0aGVkIHRvYWQgY2hhbmdlIGV5ZXMsCiAgICBPLCBub3cgSSB3b3VsZCB0aGV5IGhhZCBjaGFuZ2VkIHZvaWNlcyB0b28hCiAgICBTaW5jZSBhcm0gZnJvbSBhcm0gdGhhdCB2b2ljZSBkb3RoIHVzIGFmZnJheSwKICAgIEh1bnRpbmcgdGhlZSBoZW5jZSB3aXRoIGh1bnQnc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cmUgd2VlcGluZyBmb3IgeW91ciBjb3VzaW4ncyBkZWF0aD8KICAgIFdoYXQsIHdpbHQgdGhvdSB3YXNoIGhpbSBmcm9tIGhpcyBncmF2ZSB3aXRoIHRlYXJzPwogICAgQW4gaWYgdGhvdSBjb3VsZHN0LCB0aG91IGNvdWxkc3Qgbm90IG1ha2UgaGltIGxpdmU7CiAgICBUaGVyZWZvcmUsIGhhdmUgZG9uZTogc29tZSBncmllZiBzaG93cyBtdWNoIG9mIGxvdmU7CiAgICBCdXQgbXVjaCBvZiBncmllZiBzaG93cyBzdGlsbCBzb21lIHdhbnQgb2Ygd2l0LgoKSlVMSUVUCgogICAgWWV0IGxldCBtZSB3ZWVwIGZvciBzdWNoIGEgZmVlbGluZyBsb3NzLgoKTEFEWSBDQVBVTEVUCgogICAgU28gc2hhbGwgeW91IGZlZWwgdGhlIGxvc3MsIGJ1dCBub3QgdGhlIGZyaWVuZAogICAgV2hpY2ggeW91IHdlZXAgZm9yLgoKSlVMSUVUCgogICAgRmVlbGluZyBzbyB0aGUgbG9zcywKICAgIENhbm5vdCBjaG9vc2UgYnV0IGV2ZXIgd2VlcCB0aGUgZnJpZW5kLgoKTEFEWSBDQVBVTEVUCgogICAgV2VsbCwgZ2lybCwgdGhvdSB3ZWVwJ3N0IG5vdCBzbyBtdWNoIGZvciBoaXMgZGVhdGgsCiAgICBBcyB0aGF0IHRoZSB2aWxsYWluIGxpdmVzIHdoaWNoIHNsYXVnaHRlcidkIGhpbS4KCkpVTElFVAoKICAgIFdoYXQgdmlsbGFpbiBtYWRhbT8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoYXQgc2FtZSB2aWxsYWluLCBSb21lby4KCkpVTElFVAoKICAgIFtBc2lkZV0gVmlsbGFpbiBhbmQgaGUgYmUgbWFueSBtaWxlcyBhc3VuZGVyLi0tCiAgICBHb2QgUGFyZG9uIGhpbSEgSSBkbywgd2l0aCBhbGwgbXkgaGVhcnQ7CiAgICBBbmQgeWV0IG5vIG1hbiBsaWtlIGhlIGRvdGggZ3JpZXZlIG15IGhlYXJ0LgoKTEFEWSBDQVBVTEVUCgogICAgVGhhdCBpcywgYmVjYXVzZSB0aGUgdHJhaXRvciBtdXJkZXJlciBsaXZlcy4KCkpVTElFVAoKICAgIEF5LCBtYWRhbSwgZnJvbSB0aGUgcmVhY2ggb2YgdGhlc2UgbXkgaGFuZHM6CiAgICBXb3VsZCBub25lIGJ1dCBJIG1pZ2h0IHZlbmdlIG15IGNvdXNpbidzIGRlYXRoIQoKTEFEWSBDQVBVTEVUCgogICAgV2Ugd2lsbCBoYXZlIHZlbmdlYW5jZSBmb3IgaXQsIGZlYXIgdGhvdSBub3Q6CiAgICBUaGVuIHdlZXAgbm8gbW9yZS4gSSdsbCBzZW5kIHRvIG9uZSBpbiBNYW50dWEsCiAgICBXaGVyZSB0aGF0IHNhbWUgYmFuaXNoJ2QgcnVuYWdhdGUgZG90aCBsaXZlLAogICAgU2hhbGwgZ2l2ZSBoaW0gc3VjaCBhbiB1bmFjY3VzdG9tJ2QgZHJhbSwKICAgIFRoYXQgaGUgc2hhbGwgc29vbiBrZWVwIFR5YmFsdCBjb21wYW55OgogICAgQW5kIHRoZW4sIEkgaG9wZSwgdGhvdSB3aWx0IGJlIHNhdGlzZmllZC4KCkpVTElFVAoKICAgIEluZGVlZCwgSSBuZXZlciBzaGFsbCBiZSBzYXRpc2ZpZWQKICAgIFdpdGggUm9tZW8sIHRpbGwgSSBiZWhvbGQgaGltLS1kZWFkLS0KICAgIElzIG15IHBvb3IgaGVhcnQgZm9yIGEga2luc21hbiB2ZXgnZC4KICAgIE1hZGFtLCBpZiB5b3UgY291bGQgZmluZCBvdXQgYnV0IGEgbWFuCiAgICBUbyBiZWFyIGEgcG9pc29uLCBJIHdvdWxkIHRlbXBlciBpdDsKICAgIFRoYXQgUm9tZW8gc2hvdWxkLCB1cG9uIHJlY2VpcHQgdGhlcmVvZiwKICAgIFNvb24gc2xlZXAgaW4gcXVpZXQuIE8sIGhvdyBteSBoZWFydCBhYmhvcnMKICAgIFRvIGhlYXIgaGltIG5hbWVkLCBhbmQgY2Fubm90IGNvbWUgdG8gaGltLgogICAgVG8gd3JlYWsgdGhlIGxvdmUgSSBib3JlIG15IGNvdXNpbgogICAgVXBvbiBoaXMgYm9keSB0aGF0IHNsYXVnaHRlcidkIGhpbSEKCkxBRFkgQ0FQVUxFVAoKICAgIEZpbmQgdGhvdSB0aGUgbWVhbnMsIGFuZCBJJ2xsIGZpbmQgc3VjaCBhIG1hbi4KICAgIEJ1dCBub3cgSSdsbCB0ZWxsIHRoZWUgam95ZnVsIHRpZGluZ3MsIGdpcmwuCgpKVUxJRVQKCiAgICBBbmQgam95IGNvbWVzIHdlbGwgaW4gc3VjaCBhIG5lZWR5IHRpbWU6CiAgICBXaGF0IGFyZSB0aGV5LCBJIGJlc2VlY2ggeW91ciBsYWR5c2hpcD8KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHdlbGwsIHRob3UgaGFzdCBhIGNhcmVmdWwgZmF0aGVyLCBjaGlsZDsKICAgIE9uZSB3aG8sIHRvIHB1dCB0aGVlIGZyb20gdGh5IGhlYXZpbmVzcywKICAgIEhhdGggc29ydGVkIG91dCBhIHN1ZGRlbiBkYXkgb2Ygam95LAogICAgVGhhdCB0aG91IGV4cGVjdCdzdCBub3Qgbm9yIEkgbG9vaydkIG5vdCBmb3IuCgpKVUxJRVQKCiAgICBNYWRhbSwgaW4gaGFwcHkgdGltZSwgd2hhdCBkYXkgaXMgdGhhdD8KCkxBRFkgQ0FQVUxFVAoKICAgIE1hcnJ5LCBteSBjaGlsZCwgZWFybHkgbmV4dCBUaHVyc2RheSBtb3JuLAogICAgVGhlIGdhbGxhbnQsIHlvdW5nIGFuZCBub2JsZSBnZW50bGVtYW4sCiAgICBUaGUgQ291bnR5IFBhcmlzLCBhdCBTYWludCBQZXRlcidzIENodXJjaCwKICAgIFNoYWxsIGhhcHBpbHkgbWFrZSB0aGVlIHRoZXJlIGEgam95ZnVsIGJyaWRlLgoKSlVMSUVUCgogICAgTm93LCBieSBTYWludCBQZXRlcidzIENodXJjaCBhbmQgUGV0ZXIgdG9vLAogICAgSGUgc2hhbGwgbm90IG1ha2UgbWUgdGhlcmUgYSBqb3lmdWwgYnJpZGUuCiAgICBJIHdvbmRlciBhdCB0aGlzIGhhc3RlOyB0aGF0IEkgbXVzdCB3ZWQKICAgIEVyZSBoZSwgdGhhdCBzaG91bGQgYmUgaHVzYmFuZCwgY29tZXMgdG8gd29vLgogICAgSSBwcmF5IHlvdSwgdGVsbCBteSBsb3JkIGFuZCBmYXRoZXIsIG1hZGFtLAogICAgSSB3aWxsIG5vdCBtYXJyeSB5ZXQ7IGFuZCwgd2hlbiBJIGRvLCBJIHN3ZWFyLAogICAgSXQgc2hhbGwgYmUgUm9tZW8sIHdob20geW91IGtub3cgSSBoYXRlLAogICAgUmF0aGVyIHRoYW4gUGFyaXMuIFRoZXNlIGFyZSBuZXdzIGluZGVlZCEKCkxBRFkgQ0FQVUxFVAoKICAgIEhlcmUgY29tZXMgeW91ciBmYXRoZXI7IHRlbGwgaGltIHNvIHlvdXJzZWxmLAogICAgQW5kIHNlZSBob3cgaGUgd2lsbCB0YWtlIGl0IGF0IHlvdXIgaGFuZHMuCgogICAgRW50ZXIgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBXaGVuIHRoZSBzdW4gc2V0cywgdGhlIGFpciBkb3RoIGRyaXp6bGUgZGV3OwogICAgQnV0IGZvciB0aGUgc3Vuc2V0IG9mIG15IGJyb3RoZXIncyBzb24KICAgIEl0IHJhaW5zIGRvd25yaWdodC4KICAgIEhvdyBub3chIGEgY29uZHVpdCwgZ2lybD8gd2hhdCwgc3RpbGwgaW4gdGVhcnMCiAgICBFdmVybW9yZSBzaG93ZXJpbmcIEluIG9uZSBsaXR0bGUgYm9keQogICAgVGhvdSBjb3VudGVyZmVpdCdzdCBhIGJhcmssIGEgc2VhLCBhIHdpbmQ7CiAgICBGb3Igc3RpbGwgdGh5IGV5ZXMsIHdoaWNoIEkgbWF5IGNhbGwgdGhlIHNlYSwKICAgIERvIGViYiBhbmQgZmxvdyB3aXRoIHRlYXJzOyB0aGUgYmFyayB0aHkgYm9keSBpcywKICAgIFNhaWxpbmcgaW4gdGhpcyBzYWx0IGZsb29kOyB0aGUgd2luZHMsIHRoeSBzaWdoczsKICAgIFdobywgcmFnaW5nIHdpdGggdGh5IHRlYXJzLCBhbmQgdGhleSB3aXRoIHRoZW0sCiAgICBXaXRob3V0IGEgc3VkZGVuIGNhbG0sIHdpbGwgb3ZlcnNldAogICAgVGh5IHRlbXBlc3QtdG9zc2VkIGJvZHkuIEhvdyBub3csIHdpZmUhCiAgICBIYXZlIHlvdSBkZWxpdmVyJ2QgdG8gaGVyIG91ciBkZWNyZWUCgpMQURZIENBUFVMRVQKCiAgICBBeSwgc2lyOyBidXQgc2hlIHdpbGwgbm9uZSwgc2hlIGdpdmVzIHlvdSB0aGFua3MuCiAgICBJIHdvdWxkIHRoZSBmb29sIHdlcmUgbWFycmllZCB0byBoZXIgZ3JhdmUhCgpDQVBVTEVUCgogICAgU29mdCEgdGFrZSBtZSB3aXRoIHlvdSwgdGFrZSBtZSB3aXRoIHlvdSwgd2lmZS4KICAgIEhvdyEgd2lsbCBzaGUgbm9uZT8gZG90aCBzaGUgbm90IGdpdmUgdXMgdGhhbmtzPwogICAgSXMgc2hlIG5vdCBwcm91ZD8gZG90aCBzaGUgbm90IGNvdW50IGhlciBibGVzdCwKICAgIFVud29ydGh5IGFzIHNoZSBpcywgdGhhdCB3ZSBoYXZlIHdyb3VnaHQKICAgIFNvIHdvcnRoeSBhIGdlbnRsZW1hbiB0byBiZSBoZXIgYnJpZGVncm9vbT8KCkpVTElFVAoKICAgIE5vdCBwcm91ZCwgeW91IGhhdmU7IGJ1dCB0aGFua2Z1bCwgdGhhdCB5b3UgaGF2ZToKICAgIFByb3VkIGNhbiBJIG5ldmVyIGJlIG9mIHdoYXQgSSBoYXRlOwogICAgQnV0IHRoYW5rZnVsIGV2ZW4gZm9yIGhhdGUsIHRoYXQgaXMgbWVhbnQgbG92ZS4KCkNBUFVMRVQKCiAgICBIb3cgbm93LCBob3cgbm93LCBjaG9wLWxvZ2ljISBXaGF0IGlzIHRoaXMCiAgICAnUHJvdWQsJyBhbmQgJ0kgdGhhbmsgeW91LCcgYW5kICdJIHRoYW5rIHlvdSBub3Q7JwogICAgQW5kIHlldCAnbm90IHByb3VkLCcgbWlzdHJlc3MgbWluaW9uLCB5b3UsCiAgICBUaGFuayBtZSBubyB0aGFua2luZ3MsIG5vciwgcHJvdWQgbWUgbm8gcHJvdWRzLAogICAgQnV0IGZldHRsZSB5b3VyIGZpbmUgam9pbnRzICdnYWluc3QgVGh1cnNkYXkgbmV4dCwKICAgIFRvIGdvIHdpdGggUGFyaXMgdG8gU2FpbnQgUGV0ZXIncyBDaHVyY2gsCiAgICBPciBJIHdpbGwgZHJhZyB0aGVlIG9uIGEgaHVyZGxlIHRoaXRoZXIuCiAgICBPdXQsIHlvdSBncmVlbi1zaWNrbmVzcyBjYXJyaW9uISBvdXQsIHlvdSBiYWdnYWdlIQogICAgWW91IHRhbGxvdy1mYWNlIQoKTEFEWSBDQVBVTEVUCgogICAgRmllLCBmaWUhIHdoYXQsIGFyZSB5b3UgbWFkPwoKSlVMSUVUCgogICAgR29vZCBmYXRoZXIsIEkgYmVzZWVjaCB5b3Ugb24gbXkga25lZXMsCiAgICBIZWFyIG1lIHdpdGggcGF0aWVuY2UgYnV0IHRvIHNwZWFrIGEgd29yZC4KCkNBUFVMRVQKCiAgICBIYW5nIHRoZWUsIHlvdW5nIGJhZ2dhZ2UhIGRpc29iZWRpZW50IHdyZXRjaCEKICAgIEkgdGVsbCB0aGVlIHdoYXQ6IGdldCB0aGVlIHRvIGNodXJjaCBvJyBUaHVyc2RheSwKICAgIE9yIG5ldmVyIGFmdGVyIGxvb2sgbWUgaW4gdGhlIGZhY2U6CiAgICBTcGVhayBub3QsIHJlcGx5IG5vdCwgZG8gbm90IGFuc3dlciBtZTsKICAgIE15IGZpbmdlcnMgaXRjaC4gV2lmZSwgd2Ugc2NhcmNlIHRob3VnaHQgdXMgYmxlc3QKICAgIFRoYXQgR29kIGhhZCBsZW50IHVzIGJ1dCB0aGlzIG9ubHkgY2hpbGQ7CiAgICBCdXQgbm93IEkgc2VlIHRoaXMgb25lIGlzIG9uZSB0b28gbXVjaCwKICAgIEFuZCB0aGF0IHdlIGhhdmUgYSBjdXJzZSBpbiBoYXZpbmcgaGVyOgogICAgT3V0IG9uIGhlciwgaGlsZGluZyEKCk51cnNlCgogICAgR29kIGluIGhlYXZlbiBibGVzcyBoZXIhCiAgICBZb3UgYXJlIHRvIGJsYW1lLCBteSBsb3JkLCB0byByYXRlIGhlciBzby4KCkNBUFVMRVQKCiAgICBBbmQgd2h5LCBteSBsYWR5IHdpc2RvbT8gaG9sZCB5b3VyIHRvbmd1ZSwKICAgIEdvb2QgcHJ1ZGVuY2U7IHNtYXR0ZXIgd2l0aCB5b3VyIGdvc3NpcHMsIGdvLgoKTnVyc2UKCiAgICBJIHNwZWFrIG5vIHRyZWFzb24uCgpDQVBVTEVUCgogICAgTywgR29kIHllIGdvZC1kZW4uCgpOdXJzZQoKICAgIE1heSBub3Qgb25lIHNwZWFrPwoKQ0FQVUxFVAoKICAgIFBlYWNlLCB5b3UgbXVtYmxpbmcgZm9vbCEKICAgIFV0dGVyIHlvdXIgZ3Jhdml0eSBvJ2VyIGEgZ29zc2lwJ3MgYm93bDsKICAgIEZvciBoZXJlIHdlIG5lZWQgaXQgbm90LgoKTEFEWSBDQVBVTEVUCgogICAgWW91IGFyZSB0b28gaG90LgoKQ0FQVUxFVAoKICAgIEdvZCdzIGJyZWFkISBpdCBtYWtlcyBtZSBtYWQ6CiAgICBEYXksIG5pZ2h0LCBob3VyLCB0aWRlLCB0aW1lLCB3b3JrLCBwbGF5LAogICAgQWxvbmUsIGluIGNvbXBhbnksIHN0aWxsIG15IGNhcmUgaGF0aCBiZWVuCiAgICBUbyBoYXZlIGhlciBtYXRjaCdkOiBhbmQgaGF2aW5nIG5vdyBwcm92aWRlZAogICAgQSBnZW50bGVtYW4gb2Ygbm9ibGUgcGFyZW50YWdlLAogICAgT2YgZmFpciBkZW1lc25lcywgeW91dGhmdWwsIGFuZCBub2JseSB0cmFpbidkLAogICAgU3R1ZmYnZCwgYXMgdGhleSBzYXksIHdpdGggaG9ub3VyYWJsZSBwYXJ0cywKICAgIFByb3BvcnRpb24nZCBhcyBvbmUncyB0aG91Z2h0IHdvdWxkIHdpc2ggYSBtYW47CiAgICBBbmQgdGhlbiB0byBoYXZlIGEgd3JldGNoZWQgcHVsaW5nIGZvb2wsCiAgICBBIHdoaW5pbmcgbWFtbWV0LCBpbiBoZXIgZm9ydHVuZSdzIHRlbmRlciwKICAgIFRvIGFuc3dlciAnSSdsbCBub3Qgd2VkOyBJIGNhbm5vdCBsb3ZlLAogICAgSSBhbSB0b28geW91bmc7IEkgcHJheSB5b3UsIHBhcmRvbiBtZS4nCiAgICBCdXQsIGFzIHlvdSB3aWxsIG5vdCB3ZWQsIEknbGwgcGFyZG9uIHlvdToKICAgIEdyYXplIHdoZXJlIHlvdSB3aWxsIHlvdSBzaGFsbCBub3QgaG91c2Ugd2l0aCBtZToKICAgIExvb2sgdG8ndCwgdGhpbmsgb24ndCwgSSBkbyBub3QgdXNlIHRvIGplc3QuCiAgICBUaHVyc2RheSBpcyBuZWFyOyBsYXkgaGFuZCBvbiBoZWFydCwgYWR2aXNlOgogICAgQW4geW91IGJlIG1pbmUsIEknbGwgZ2l2ZSB5b3UgdG8gbXkgZnJpZW5kOwogICAgQW5kIHlvdSBiZSBub3QsIGhhbmcsIGJlZywgc3RhcnZlLCBkaWUgaW4KICAgIHRoZSBzdHJlZXRzLAogICAgRm9yLCBieSBteSBzb3VsLCBJJ2xsIG5lJ2VyIGFja25vd2xlZGdlIHRoZWUsCiAgICBOb3Igd2hhdCBpcyBtaW5lIHNoYWxsIG5ldmVyIGRvIHRoZWUgZ29vZDoKICAgIFRydXN0IHRvJ3QsIGJldGhpbmsgeW91OyBJJ2xsIG5vdCBiZSBmb3Jzd29ybi4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBJcyB0aGVyZSBubyBwaXR5IHNpdHRpbmcgaW4gdGhlIGNsb3VkcywKICAgIFRoYXQgc2VlcyBpbnRvIHRoZSBib3R0b20gb2YgbXkgZ3JpZWYCiAgICBPLCBzd2VldCBteSBtb3RoZXIsIGNhc3QgbWUgbm90IGF3YXkhCiAgICBEZWxheSB0aGlzIG1hcnJpYWdlIGZvciBhIG1vbnRoLCBhIHdlZWs7CiAgICBPciwgaWYgeW91IGRvIG5vdCwgbWFrZSB0aGUgYnJpZGFsIGJlZAogICAgSW4gdGhhdCBkaW0gbW9udW1lbnQgd2hlcmUgVHliYWx0IGxpZXMuCgpMQURZIENBUFVMRVQKCiAgICBUYWxrIG5vdCB0byBtZSwgZm9yIEknbGwgbm90IHNwZWFrIGEgd29yZDoKICAgIERvIGFzIHRob3Ugd2lsdCwgZm9yIEkgaGF2ZSBkb25lIHdpdGggdGhlZS4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIEdvZCEtLU8gbnVyc2UsIGhvdyBzaGFsbCB0aGlzIGJlIHByZXZlbnRlZD8KICAgIE15IGh1c2JhbmQgaXMgb24gZWFydGgsIG15IGZhaXRoIGluIGhlYXZlbjsKICAgIEhvdyBzaGFsbCB0aGF0IGZhaXRoIHJldHVybiBhZ2FpbiB0byBlYXJ0aCwKICAgIFVubGVzcyB0aGF0IGh1c2JhbmQgc2VuZCBpdCBtZSBmcm9tIGhlYXZlbgogICAgQnkgbGVhdmluZyBlYXJ0aD8gY29tZm9ydCBtZSwgY291bnNlbCBtZS4KICAgIEFsYWNrLCBhbGFjaywgdGhhdCBoZWF2ZW4gc2hvdWxkIHByYWN0aXNlIHN0cmF0YWdlbXMKICAgIFVwb24gc28gc29mdCBhIHN1YmplY3QgYXMgbXlzZWxmIQogICAgV2hhdCBzYXknc3QgdGhvdT8gaGFzdCB0aG91IG5vdCBhIHdvcmQgb2Ygam95PwogICAgU29tZSBjb21mb3J0LCBudXJzZS4KCk51cnNlCgogICAgRmFpdGgsIGhlcmUgaXQgaXMuCiAgICBSb21lbyBpcyBiYW5pc2gnZDsgYW5kIGFsbCB0aGUgd29ybGQgdG8gbm90aGluZywKICAgIFRoYXQgaGUgZGFyZXMgbmUnZXIgY29tZSBiYWNrIHRvIGNoYWxsZW5nZSB5b3U7CiAgICBPciwgaWYgaGUgZG8sIGl0IG5lZWRzIG11c3QgYmUgYnkgc3RlYWx0aC4KICAgIFRoZW4sIHNpbmNlIHRoZSBjYXNlIHNvIHN0YW5kcyBhcyBub3cgaXQgZG90aCwKICAgIEkgdGhpbmsgaXQgYmVzdCB5b3UgbWFycmllZCB3aXRoIHRoZSBjb3VudHkuCiAgICBPLCBoZSdzIGEgbG92ZWx5IGdlbnRsZW1hbiEKICAgIFJvbWVvJ3MgYSBkaXNoY2xvdXQgdG8gaGltOiBhbiBlYWdsZSwgbWFkYW0sCiAgICBIYXRoIG5vdCBzbyBncmVlbiwgc28gcXVpY2ssIHNvIGZhaXIgYW4gZXllCiAgICBBcyBQYXJpcyBoYXRoLiBCZXNocmV3IG15IHZlcnkgaGVhcnQsCiAgICBJIHRoaW5rIHlvdSBhcmUgaGFwcHkgaW4gdGhpcyBzZWNvbmQgbWF0Y2gsCiAgICBGb3IgaXQgZXhjZWxzIHlvdXIgZmlyc3Q6IG9yIGlmIGl0IGRpZCBub3QsCiAgICBZb3VyIGZpcnN0IGlzIGRlYWQ7IG9yICd0d2VyZSBhcyBnb29kIGhlIHdlcmUsCiAgICBBcyBsaXZpbmcgaGVyZSBhbmQgeW91IG5vIHVzZSBvZiBoaW0uCgpKVUxJRVQKCiAgICBTcGVha2VzdCB0aG91IGZyb20gdGh5IGhlYXJ0PwoKTnVyc2UKCiAgICBBbmQgZnJvbSBteSBzb3VsIHRvbzsKICAgIE9yIGVsc2UgYmVzaHJldyB0aGVtIGJvdGguCgpKVUxJRVQKCiAgICBBbWVuIQoKTnVyc2UKCiAgICBXaGF0PwoKSlVMSUVUCgogICAgV2VsbCwgdGhvdSBoYXN0IGNvbWZvcnRlZCBtZSBtYXJ2ZWxsb3VzIG11Y2guCiAgICBHbyBpbjogYW5kIHRlbGwgbXkgbGFkeSBJIGFtIGdvbmUsCiAgICBIYXZpbmcgZGlzcGxlYXNlZCBteSBmYXRoZXIsIHRvIExhdXJlbmNlJyBjZWxsLAogICAgVG8gbWFrZSBjb25mZXNzaW9uIGFuZCB0byBiZSBhYnNvbHZlZC4KCk51cnNlCgogICAgTWFycnksIEkgd2lsbDsgYW5kIHRoaXMgaXMgd2lzZWx5IGRvbmUuCgogICAgRXhpdAoKSlVMSUVUCgogICAgQW5jaWVudCBkYW1uYXRpb24hIE8gbW9zdCB3aWNrZWQgZmllbmQhCiAgICBJcyBpdCBtb3JlIHNpbiB0byB3aXNoIG1lIHRodXMgZm9yc3dvcm4sCiAgICBPciB0byBkaXNwcmFpc2UgbXkgbG9yZCB3aXRoIHRoYXQgc2FtZSB0b25ndWUKICAgIFdoaWNoIHNoZSBoYXRoIHByYWlzZWQgaGltIHdpdGggYWJvdmUgY29tcGFyZQogICAgU28gbWFueSB0aG91c2FuZCB0aW1lcz8gR28sIGNvdW5zZWxsb3I7CiAgICBUaG91IGFuZCBteSBib3NvbSBoZW5jZWZvcnRoIHNoYWxsIGJlIHR3YWluLgogICAgSSdsbCB0byB0aGUgZnJpYXIsIHRvIGtub3cgaGlzIHJlbWVkeToKICAgIElmIGFsbCBlbHNlIGZhaWwsIG15c2VsZiBoYXZlIHBvd2VyIHRvIGRpZS4KCiAgICBFeGl0CgpBQ1QgSVYKU0NFTkUgSS4gRnJpYXIgTGF1cmVuY2UncyBjZWxsLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUyAKCkZSSUFSIExBVVJFTkNFCgogICAgT24gVGh1cnNkYXksIHNpcj8gdGhlIHRpbWUgaXMgdmVyeSBzaG9ydC4KClBBUklTCgogICAgTXkgZmF0aGVyIENhcHVsZXQgd2lsbCBoYXZlIGl0IHNvOwogICAgQW5kIEkgYW0gbm90aGluZyBzbG93IHRvIHNsYWNrIGhpcyBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgWW91IHNheSB5b3UgZG8gbm90IGtub3cgdGhlIGxhZHkncyBtaW5kOgogICAgVW5ldmVuIGlzIHRoZSBjb3Vyc2UsIEkgbGlrZSBpdCBub3QuCgpQQVJJUwoKICAgIEltbW9kZXJhdGVseSBzaGUgd2VlcHMgZm9yIFR5YmFsdCdzIGRlYXRoLAogICAgQW5kIHRoZXJlZm9yZSBoYXZlIEkgbGl0dGxlIHRhbGsnZCBvZiBsb3ZlOwogICAgRm9yIFZlbnVzIHNtaWxlcyBub3QgaW4gYSBob3VzZSBvZiB0ZWFycy4KICAgIE5vdywgc2lyLCBoZXIgZmF0aGVyIGNvdW50cyBpdCBkYW5nZXJvdXMKICAgIFRoYXQgc2hlIGRvdGggZ2l2ZSBoZXIgc29ycm93IHNvIG11Y2ggc3dheSwKICAgIEFuZCBpbiBoaXMgd2lzZG9tIGhhc3RlcyBvdXIgbWFycmlhZ2UsCiAgICBUbyBzdG9wIHRoZSBpbnVuZGF0aW9uIG9mIGhlciB0ZWFyczsKICAgIFdoaWNoLCB0b28gbXVjaCBtaW5kZWQgYnkgaGVyc2VsZiBhbG9uZSwKICAgIE1heSBiZSBwdXQgZnJvbSBoZXIgYnkgc29jaWV0eToKICAgIE5vdyBkbyB5b3Uga25vdyB0aGUgcmVhc29uIG9mIHRoaXMgaGFzdGUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFtBc2lkZV0gSSB3b3VsZCBJIGtuZXcgbm90IHdoeSBpdCBzaG91bGQgYmUgc2xvdydkLgogICAgTG9vaywgc2lyLCBoZXJlIGNvbWVzIHRoZSBsYWR5IHRvd2FyZHMgbXkgY2VsbC4KCiAgICBFbnRlciBKVUxJRVQKClBBUklTCgogICAgSGFwcGlseSBtZXQsIG15IGxhZHkgYW5kIG15IHdpZmUhCgpKVUxJRVQKCiAgICBUaGF0IG1heSBiZSwgc2lyLCB3aGVuIEkgbWF5IGJlIGEgd2lmZS4KClBBUklTCgogICAgVGhhdCBtYXkgYmUgbXVzdCBiZSwgbG92ZSwgb24gVGh1cnNkYXkgbmV4dC4KCkpVTElFVAoKICAgIFdoYXQgbXVzdCBiZSBzaGFsbCBiZS4KCkZSSUFSIExBVVJFTkNFCgogICAgVGhhdCdzIGEgY2VydGFpbiB0ZXh0LgoKUEFSSVMKCiAgICBDb21lIHlvdSB0byBtYWtlIGNvbmZlc3Npb24gdG8gdGhpcyBmYXRoZXICgpKVUxJRVQKCiAgICBUbyBhbnN3ZXIgdGhhdCwgSSBzaG91bGQgY29uZmVzcyB0byB5b3UuCgpQQVJJUwoKICAgIERvIG5vdCBkZW55IHRvIGhpbSB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSSB3aWxsIGNvbmZlc3MgdG8geW91IHRoYXQgSSBsb3ZlIGhpbS4KClBBUklTCgogICAgU28gd2lsbCB5ZSwgSSBhbSBzdXJlLCB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSWYgSSBkbyBzbywgaXQgd2lsbCBiZSBvZiBtb3JlIHByaWNlLAogICAgQmVpbmcgc3Bva2UgYmVoaW5kIHlvdXIgYmFjaywgdGhhbiB0byB5b3VyIGZhY2UuCgpQQVJJUwoKICAgIFBvb3Igc291bCwgdGh5IGZhY2UgaXMgbXVjaCBhYnVzZWQgd2l0aCB0ZWFycy4KCkpVTElFVAoKICAgIFRoZSB0ZWFycyBoYXZlIGdvdCBzbWFsbCB2aWN0b3J5IGJ5IHRoYXQ7CiAgICBGb3IgaXQgd2FzIGJhZCBlbm91Z2ggYmVmb3JlIHRoZWlyIHNwaXRlLgoKUEFSSVMKCiAgICBUaG91IHdyb25nJ3N0IGl0LCBtb3JlIHRoYW4gdGVhcnMsIHdpdGggdGhhdCByZXBvcnQuCgpKVUxJRVQKCiAgICBUaGF0IGlzIG5vIHNsYW5kZXIsIHNpciwgd2hpY2ggaXMgYSB0cnV0aDsKICAgIEFuZCB3aGF0IEkgc3Bha2UsIEkgc3Bha2UgaXQgdG8gbXkgZmFjZS4KClBBUklTCgogICAgVGh5IGZhY2UgaXMgbWluZSwgYW5kIHRob3UgaGFzdCBzbGFuZGVyJ2QgaXQuCgpKVUxJRVQKCiAgICBJdCBtYXkgYmUgc28sIGZvciBpdCBpcyBub3QgbWluZSBvd24uCiAgICBBcmUgeW91IGF0IGxlaXN1cmUsIGhvbHkgZmF0aGVyLCBub3c7CiAgICBPciBzaGFsbCBJIGNvbWUgdG8geW91IGF0IGV2ZW5pbmcgbWFzcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTXkgbGVpc3VyZSBzZXJ2ZXMgbWUsIHBlbnNpdmUgZGF1Z2h0ZXIsIG5vdy4KICAgIE15IGxvcmQsIHdlIG11c3QgZW50cmVhdCB0aGUgdGltZSBhbG9uZS4KClBBUklTCgogICAgR29kIHNoaWVsZCBJIHNob3VsZCBkaXN0dXJiIGRldm90aW9uIQogICAgSnVsaWV0LCBvbiBUaHVyc2RheSBlYXJseSB3aWxsIEkgcm91c2UgeWU6CiAgICBUaWxsIHRoZW4sIGFkaWV1OyBhbmQga2VlcCB0aGlzIGhvbHkga2lzcy4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIHNodXQgdGhlIGRvb3IhIGFuZCB3aGVuIHRob3UgaGFzdCBkb25lIHNvLAogICAgQ29tZSB3ZWVwIHdpdGggbWU7IHBhc3QgaG9wZSwgcGFzdCBjdXJlLCBwYXN0IGhlbHAhCgpGUklBUiBMQVVSRU5DRQoKICAgIEFoLCBKdWxpZXQsIEkgYWxyZWFkeSBrbm93IHRoeSBncmllZjsKICAgIEl0IHN0cmFpbnMgbWUgcGFzdCB0aGUgY29tcGFzcyBvZiBteSB3aXRzOgogICAgSSBoZWFyIHRob3UgbXVzdCwgYW5kIG5vdGhpbmcgbWF5IHByb3JvZ3VlIGl0LAogICAgT24gVGh1cnNkYXkgbmV4dCBiZSBtYXJyaWVkIHRvIHRoaXMgY291bnR5LgoKSlVMSUVUCgogICAgVGVsbCBtZSBub3QsIGZyaWFyLCB0aGF0IHRob3UgaGVhcidzdCBvZiB0aGlzLAogICAgVW5sZXNzIHRob3UgdGVsbCBtZSBob3cgSSBtYXkgcHJldmVudCBpdDoKICAgIElmLCBpbiB0aHkgd2lzZG9tLCB0aG91IGNhbnN0IGdpdmUgbm8gaGVscCwKICAgIERvIHRob3UgYnV0IGNhbGwgbXkgcmVzb2x1dGlvbiB3aXNlLAogICAgQW5kIHdpdGggdGhpcyBrbmlmZSBJJ2xsIGhlbHAgaXQgcHJlc2VudGx5LgogICAgR29kIGpvaW4nZCBteSBoZWFydCBhbmQgUm9tZW8ncywgdGhvdSBvdXIgaGFuZHM7CiAgICBBbmQgZXJlIHRoaXMgaGFuZCwgYnkgdGhlZSB0byBSb21lbyBzZWFsJ2QsCiAgICBTaGFsbCBiZSB0aGUgbGFiZWwgdG8gYW5vdGhlciBkZWVkLAogICAgT3IgbXkgdHJ1ZSBoZWFydCB3aXRoIHRyZWFjaGVyb3VzIHJldm9sdAogICAgVHVybiB0byBhbm90aGVyLCB0aGlzIHNoYWxsIHNsYXkgdGhlbSBib3RoOgogICAgVGhlcmVmb3JlLCBvdXQgb2YgdGh5IGxvbmctZXhwZXJpZW5jZWQgdGltZSwKICAgIEdpdmUgbWUgc29tZSBwcmVzZW50IGNvdW5zZWwsIG9yLCBiZWhvbGQsCiAgICAnVHdpeHQgbXkgZXh0cmVtZXMgYW5kIG1lIHRoaXMgYmxvb2R5IGtuaWZlCiAgICBTaGFsbCBwbGF5IHRoZSB1bXBpcmUsIGFyYml0cmF0aW5nIHRoYXQKICAgIFdoaWNoIHRoZSBjb21taXNzaW9uIG9mIHRoeSB5ZWFycyBhbmQgYXJ0CiAgICBDb3VsZCB0byBubyBpc3N1ZSBvZiB0cnVlIGhvbm91ciBicmluZy4KICAgIEJlIG5vdCBzbyBsb25nIHRvIHNwZWFrOyBJIGxvbmcgdG8gZGllLAogICAgSWYgd2hhdCB0aG91IHNwZWFrJ3N0IHNwZWFrIG5vdCBvZiByZW1lZHkuCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvbGQsIGRhdWdodGVyOiBJIGRvIHNweSBhIGtpbmQgb2YgaG9wZSwKICAgIFdoaWNoIGNyYXZlcyBhcyBkZXNwZXJhdGUgYW4gZXhlY3V0aW9uLgogICAgQXMgdGhhdCBpcyBkZXNwZXJhdGUgd2hpY2ggd2Ugd291bGQgcHJldmVudC4KICAgIElmLCByYXRoZXIgdGhhbiB0byBtYXJyeSBDb3VudHkgUGFyaXMsCiAgICBUaG91IGhhc3QgdGhlIHN0cmVuZ3RoIG9mIHdpbGwgdG8gc2xheSB0aHlzZWxmLAogICAgVGhlbiBpcyBpdCBsaWtlbHkgdGhvdSB3aWx0IHVuZGVydGFrZQogICAgQSB0aGluZyBsaWtlIGRlYXRoIHRvIGNoaWRlIGF3YXkgdGhpcyBzaGFtZSwKICAgIFRoYXQgY29wZXN0IHdpdGggZGVhdGggaGltc2VsZiB0byBzY2FwZSBmcm9tIGl0OgogICAgQW5kLCBpZiB0aG91IGRhcmVzdCwgSSdsbCBnaXZlIHRoZWUgcmVtZWR5LgoKSlVMSUVUCgogICAgTywgYmlkIG1lIGxlYXAsIHJhdGhlciB0aGFuIG1hcnJ5IFBhcmlzLAogICAgRnJvbSBvZmYgdGhlIGJhdHRsZW1lbnRzIG9mIHlvbmRlciB0b3dlcjsKICAgIE9yIHdhbGsgaW4gdGhpZXZpc2ggd2F5czsgb3IgYmlkIG1lIGx1cmsKICAgIFdoZXJlIHNlcnBlbnRzIGFyZTsgY2hhaW4gbWUgd2l0aCByb2FyaW5nIGJlYXJzOwogICAgT3Igc2h1dCBtZSBuaWdodGx5IGluIGEgY2hhcm5lbC1ob3VzZSwKICAgIE8nZXItY292ZXInZCBxdWl0ZSB3aXRoIGRlYWQgbWVuJ3MgcmF0dGxpbmcgYm9uZXMsCiAgICBXaXRoIHJlZWt5IHNoYW5rcyBhbmQgeWVsbG93IGNoYXBsZXNzIHNrdWxsczsKICAgIE9yIGJpZCBtZSBnbyBpbnRvIGEgbmV3LW1hZGUgZ3JhdmUKICAgIEFuZCBoaWRlIG1lIHdpdGggYSBkZWFkIG1hbiBpbiBoaXMgc2hyb3VkOwogICAgVGhpbmdzIHRoYXQsIHRvIGhlYXIgdGhlbSB0b2xkLCBoYXZlIG1hZGUgbWUgdHJlbWJsZTsKICAgIEFuZCBJIHdpbGwgZG8gaXQgd2l0aG91dCBmZWFyIG9yIGRvdWJ0LAogICAgVG8gbGl2ZSBhbiB1bnN0YWluJ2Qgd2lmZSB0byBteSBzd2VldCBsb3ZlLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIb2xkLCB0aGVuOyBnbyBob21lLCBiZSBtZXJyeSwgZ2l2ZSBjb25zZW50CiAgICBUbyBtYXJyeSBQYXJpczogV2VkbmVzZGF5IGlzIHRvLW1vcnJvdzoKICAgIFRvLW1vcnJvdyBuaWdodCBsb29rIHRoYXQgdGhvdSBsaWUgYWxvbmU7CiAgICBMZXQgbm90IHRoeSBudXJzZSBsaWUgd2l0aCB0aGVlIGluIHRoeSBjaGFtYmVyOgogICAgVGFrZSB0aG91IHRoaXMgdmlhbCwgYmVpbmcgdGhlbiBpbiBiZWQsCiAgICBBbmQgdGhpcyBkaXN0aWxsZWQgbGlxdW9yIGRyaW5rIHRob3Ugb2ZmOwogICAgV2hlbiBwcmVzZW50bHkgdGhyb3VnaCBhbGwgdGh5IHZlaW5zIHNoYWxsIHJ1bgogICAgQSBjb2xkIGFuZCBkcm93c3kgaHVtb3VyLCBmb3Igbm8gcHVsc2UKICAgIFNoYWxsIGtlZXAgaGlzIG5hdGl2ZSBwcm9ncmVzcywgYnV0IHN1cmNlYXNlOgogICAgTm8gd2FybXRoLCBubyBicmVhdGgsIHNoYWxsIHRlc3RpZnkgdGhvdSBsaXZlc3Q7CiAgICBUaGUgcm9zZXMgaW4gdGh5IGxpcHMgYW5kIGNoZWVrcyBzaGFsbCBmYWRlCiAgICBUbyBwYWx5IGFzaGVzLCB0aHkgZXllcycgd2luZG93cyBmYWxsLAogICAgTGlrZSBkZWF0aCwgd2hlbiBoZSBzaHV0cyB1cCB0aGUgZGF5IG9mIGxpZmU7CiAgICBFYWNoIHBhcnQsIGRlcHJpdmVkIG9mIHN1cHBsZSBnb3Zlcm5tZW50LAogICAgU2hhbGwsIHN0aWZmIGFuZCBzdGFyayBhbmQgY29sZCwgYXBwZWFyIGxpa2UgZGVhdGg6CiAgICBBbmQgaW4gdGhpcyBib3Jyb3cnZCBsaWtlbmVzcyBvZiBzaHJ1bmsgZGVhdGgKICAgIFRob3Ugc2hhbHQgY29udGludWUgdHdvIGFuZCBmb3J0eSBob3VycywKICAgIEFuZCB0aGVuIGF3YWtlIGFzIGZyb20gYSBwbGVhc2FudCBzbGVlcC4KICAgIE5vdywgd2hlbiB0aGUgYnJpZGVncm9vbSBpbiB0aGUgbW9ybmluZyBjb21lcwogICAgVG8gcm91c2UgdGhlZSBmcm9tIHRoeSBiZWQsIHRoZXJlIGFydCB0aG91IGRlYWQ6CiAgICBUaGVuLCBhcyB0aGUgbWFubmVyIG9mIG91ciBjb3VudHJ5IGlzLAogICAgSW4gdGh5IGJlc3Qgcm9iZXMgdW5jb3ZlcidkIG9uIHRoZSBiaWVyCiAgICBUaG91IHNoYWx0IGJlIGJvcm5lIHRvIHRoYXQgc2FtZSBhbmNpZW50IHZhdWx0CiAgICBXaGVyZSBhbGwgdGhlIGtpbmRyZWQgb2YgdGhlIENhcHVsZXRzIGxpZS4KICAgIEluIHRoZSBtZWFuIHRpbWUsIGFnYWluc3QgdGhvdSBzaGFsdCBhd2FrZSwKICAgIFNoYWxsIFJvbWVvIGJ5IG15IGxldHRlcnMga25vdyBvdXIgZHJpZnQsCiAgICBBbmQgaGl0aGVyIHNoYWxsIGhlIGNvbWU6IGFuZCBoZSBhbmQgSQogICAgV2lsbCB3YXRjaCB0aHkgd2FraW5nLCBhbmQgdGhhdCB2ZXJ5IG5pZ2h0CiAgICBTaGFsbCBSb21lbyBiZWFyIHRoZWUgaGVuY2UgdG8gTWFudHVhLgogICAgQW5kIHRoaXMgc2hhbGwgZnJlZSB0aGVlIGZyb20gdGhpcyBwcmVzZW50IHNoYW1lOwogICAgSWYgbm8gaW5jb25zdGFudCB0b3ksIG5vciB3b21hbmlzaCBmZWFyLAogICAgQWJhdGUgdGh5IHZhbG91ciBpbiB0aGUgYWN0aW5nIGl0LgoKSlVMSUVUCgogICAgR2l2ZSBtZSwgZ2l2ZSBtZSEgTywgdGVsbCBub3QgbWUgb2YgZmVhciEKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZDsgZ2V0IHlvdSBnb25lLCBiZSBzdHJvbmcgYW5kIHByb3NwZXJvdXMKICAgIEluIHRoaXMgcmVzb2x2ZTogSSdsbCBzZW5kIGEgZnJpYXIgd2l0aCBzcGVlZAogICAgVG8gTWFudHVhLCB3aXRoIG15IGxldHRlcnMgdG8gdGh5IGxvcmQuCgpKVUxJRVQKCiAgICBMb3ZlIGdpdmUgbWUgc3RyZW5ndGghIGFuZCBzdHJlbmd0aCBzaGFsbCBoZWxwIGFmZm9yZC4KICAgIEZhcmV3ZWxsLCBkZWFyIGZhdGhlciEKCiAgICBFeGV1bnQKClNDRU5FIElJLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIE51cnNlLCBhbmQgdHdvIFNlcnZpbmdtZW4gCgpDQVBVTEVUCgogICAgU28gbWFueSBndWVzdHMgaW52aXRlIGFzIGhlcmUgYXJlIHdyaXQuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGdvIGhpcmUgbWUgdHdlbnR5IGN1bm5pbmcgY29va3MuCgpTZWNvbmQgU2VydmFudAoKICAgIFlvdSBzaGFsbCBoYXZlIG5vbmUgaWxsLCBzaXI7IGZvciBJJ2xsIHRyeSBpZiB0aGV5CiAgICBjYW4gbGljayB0aGVpciBmaW5nZXJzLgoKQ0FQVUxFVAoKICAgIEhvdyBjYW5zdCB0aG91IHRyeSB0aGVtIHNvPwoKU2Vjb25kIFNlcnZhbnQKCiAgICBNYXJyeSwgc2lyLCAndGlzIGFuIGlsbCBjb29rIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBvd24gZmluZ2VyczogdGhlcmVmb3JlIGhlIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBmaW5nZXJzIGdvZXMgbm90IHdpdGggbWUuCgpDQVBVTEVUCgogICAgR28sIGJlIGdvbmUuCgogICAgRXhpdCBTZWNvbmQgU2VydmFudAogICAgV2Ugc2hhbGwgYmUgbXVjaCB1bmZ1cm5pc2hlZCBmb3IgdGhpcyB0aW1lLgogICAgV2hhdCwgaXMgbXkgZGF1Z2h0ZXIgZ29uZSB0byBGcmlhciBMYXVyZW5jZT8KCk51cnNlCgogICAgQXksIGZvcnNvb3RoLgoKQ0FQVUxFVAoKICAgIFdlbGwsIGhlIG1heSBjaGFuY2UgdG8gZG8gc29tZSBnb29kIG9uIGhlcjoKICAgIEEgcGVldmlzaCBzZWxmLXdpbGwnZCBoYXJsb3RyeSBpdCBpcy4KCk51cnNlCgogICAgU2VlIHdoZXJlIHNoZSBjb21lcyBmcm9tIHNocmlmdCB3aXRoIG1lcnJ5IGxvb2suCgogICAgRW50ZXIgSlVMSUVUCgpDQVBVTEVUCgogICAgSG93IG5vdywgbXkgaGVhZHN0cm9uZyEgd2hlcmUgaGF2ZSB5b3UgYmVlbiBnYWRkaW5nPwoKSlVMSUVUCgogICAgV2hlcmUgSSBoYXZlIGxlYXJuJ2QgbWUgdG8gcmVwZW50IHRoZSBzaW4KICAgIE9mIGRpc29iZWRpZW50IG9wcG9zaXRpb24KICAgIFRvIHlvdSBhbmQgeW91ciBiZWhlc3RzLCBhbmQgYW0gZW5qb2luJ2QKICAgIEJ5IGhvbHkgTGF1cmVuY2UgdG8gZmFsbCBwcm9zdHJhdGUgaGVyZSwKICAgIEFuZCBiZWcgeW91ciBwYXJkb246IHBhcmRvbiwgSSBiZXNlZWNoIHlvdSEKICAgIEhlbmNlZm9yd2FyZCBJIGFtIGV2ZXIgcnVsZWQgYnkgeW91LgoKQ0FQVUxFVAoKICAgIFNlbmQgZm9yIHRoZSBjb3VudHk7IGdvIHRlbGwgaGltIG9mIHRoaXM6CiAgICBJJ2xsIGhhdmUgdGhpcyBrbm90IGtuaXQgdXAgdG8tbW9ycm93IG1vcm5pbmcuCgpKVUxJRVQKCiAgICBJIG1ldCB0aGUgeW91dGhmdWwgbG9yZCBhdCBMYXVyZW5jZScgY2VsbDsKICAgIEFuZCBnYXZlIGhpbSB3aGF0IGJlY29tZWQgbG92ZSBJIG1pZ2h0LAogICAgTm90IHN0ZXAgbydlciB0aGUgYm91bmRzIG9mIG1vZGVzdHkuCgpDQVBVTEVUCgogICAgV2h5LCBJIGFtIGdsYWQgb24ndDsgdGhpcyBpcyB3ZWxsOiBzdGFuZCB1cDoKICAgIFRoaXMgaXMgYXMndCBzaG91bGQgYmUuIExldCBtZSBzZWUgdGhlIGNvdW50eTsKICAgIEF5LCBtYXJyeSwgZ28sIEkgc2F5LCBhbmQgZmV0Y2ggaGltIGhpdGhlci4KICAgIE5vdywgYWZvcmUgR29kISB0aGlzIHJldmVyZW5kIGhvbHkgZnJpYXIsCiAgICBPdXIgd2hvbGUgY2l0eSBpcyBtdWNoIGJvdW5kIHRvIGhpbS4KCkpVTElFVAoKICAgIE51cnNlLCB3aWxsIHlvdSBnbyB3aXRoIG1lIGludG8gbXkgY2xvc2V0LAogICAgVG8gaGVscCBtZSBzb3J0IHN1Y2ggbmVlZGZ1bCBvcm5hbWVudHMKICAgIEFzIHlvdSB0aGluayBmaXQgdG8gZnVybmlzaCBtZSB0by1tb3Jyb3cCgpMQURZIENBUFVMRVQKCiAgICBObywgbm90IHRpbGwgVGh1cnNkYXk7IHRoZXJlIGlzIHRpbWUgZW5vdWdoLgoKQ0FQVUxFVAoKICAgIEdvLCBudXJzZSwgZ28gd2l0aCBoZXI6IHdlJ2xsIHRvIGNodXJjaCB0by1tb3Jyb3cuCgogICAgRXhldW50IEpVTElFVCBhbmQgTnVyc2UKCkxBRFkgQ0FQVUxFVAoKICAgIFdlIHNoYWxsIGJlIHNob3J0IGluIG91ciBwcm92aXNpb246CiAgICAnVGlzIG5vdyBuZWFyIG5pZ2h0LgoKQ0FQVUxFVAoKICAgIFR1c2gsIEkgd2lsbCBzdGlyIGFib3V0LAogICAgQW5kIGFsbCB0aGluZ3Mgc2hhbGwgYmUgd2VsbCwgSSB3YXJyYW50IHRoZWUsIHdpZmU6CiAgICBHbyB0aG91IHRvIEp1bGlldCwgaGVscCB0byBkZWNrIHVwIGhlcjsKICAgIEknbGwgbm90IHRvIGJlZCB0by1uaWdodDsgbGV0IG1lIGFsb25lOwogICAgSSdsbCBwbGF5IHRoZSBob3VzZXdpZmUgZm9yIHRoaXMgb25jZS4gV2hhdCwgaG8hCiAgICBUaGV5IGFyZSBhbGwgZm9ydGguIFdlbGwsIEkgd2lsbCB3YWxrIG15c2VsZgogICAgVG8gQ291bnR5IFBhcmlzLCB0byBwcmVwYXJlIGhpbSB1cAogICAgQWdhaW5zdCB0by1tb3Jyb3c6IG15IGhlYXJ0IGlzIHdvbmRyb3VzIGxpZ2h0LAogICAgU2luY2UgdGhpcyBzYW1lIHdheXdhcmQgZ2lybCBpcyBzbyByZWNsYWltJ2QuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEp1bGlldCdzIGNoYW1iZXIuCgogICAgRW50ZXIgSlVMSUVUIGFuZCBOdXJzZSAKCkpVTElFVAoKICAgIEF5LCB0aG9zZSBhdHRpcmVzIGFyZSBiZXN0OiBidXQsIGdlbnRsZSBudXJzZSwKICAgIEkgcHJheSB0aGVlLCBsZWF2ZSBtZSB0byBteSBzZWxmIHRvLW5pZ2h0LAogICAgRm9yIEkgaGF2ZSBuZWVkIG9mIG1hbnkgb3Jpc29ucwogICAgVG8gbW92ZSB0aGUgaGVhdmVucyB0byBzbWlsZSB1cG9uIG15IHN0YXRlLAogICAgV2hpY2gsIHdlbGwgdGhvdSBrbm93J3N0LCBpcyBjcm9zcywgYW5kIGZ1bGwgb2Ygc2luLgoKICAgIEVudGVyIExBRFkgQ0FQVUxFVAoKTEFEWSBDQVBVTEVUCgogICAgV2hhdCwgYXJlIHlvdSBidXN5LCBobz8gbmVlZCB5b3UgbXkgaGVscD8KCkpVTElFVAoKICAgIE5vLCBtYWRhbTsgd2UgaGF2ZSBjdWxsJ2Qgc3VjaCBuZWNlc3NhcmllcwogICAgQXMgYXJlIGJlaG92ZWZ1bCBmb3Igb3VyIHN0YXRlIHRvLW1vcnJvdzoKICAgIFNvIHBsZWFzZSB5b3UsIGxldCBtZSBub3cgYmUgbGVmdCBhbG9uZSwKICAgIEFuZCBsZXQgdGhlIG51cnNlIHRoaXMgbmlnaHQgc2l0IHVwIHdpdGggeW91OwogICAgRm9yLCBJIGFtIHN1cmUsIHlvdSBoYXZlIHlvdXIgaGFuZHMgZnVsbCBhbGwsCiAgICBJbiB0aGlzIHNvIHN1ZGRlbiBidXNpbmVzcy4KCkxBRFkgQ0FQVUxFVAoKICAgIEdvb2QgbmlnaHQ6CiAgICBHZXQgdGhlZSB0byBiZWQsIGFuZCByZXN0OyBmb3IgdGhvdSBoYXN0IG5lZWQuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkpVTElFVAoKICAgIEZhcmV3ZWxsISBHb2Qga25vd3Mgd2hlbiB3ZSBzaGFsbCBtZWV0IGFnYWluLgogICAgSSBoYXZlIGEgZmFpbnQgY29sZCBmZWFyIHRocmlsbHMgdGhyb3VnaCBteSB2ZWlucywKICAgIFRoYXQgYWxtb3N0IGZyZWV6ZXMgdXAgdGhlIGhlYXQgb2YgbGlmZToKICAgIEknbGwgY2FsbCB0aGVtIGJhY2sgYWdhaW4gdG8gY29tZm9ydCBtZToKICAgIE51cnNlISBXaGF0IHNob3VsZCBzaGUgZG8gaGVyZT8KICAgIE15IGRpc21hbCBzY2VuZSBJIG5lZWRzIG11c3QgYWN0IGFsb25lLgogICAgQ29tZSwgdmlhbC4KICAgIFdoYXQgaWYgdGhpcyBtaXh0dXJlIGRvIG5vdCB3b3JrIGF0IGFsbD8KICAgIFNoYWxsIEkgYmUgbWFycmllZCB0aGVuIHRvLW1vcnJvdyBtb3JuaW5nPwogICAgTm8sIG5vOiB0aGlzIHNoYWxsIGZvcmJpZCBpdDogbGllIHRob3UgdGhlcmUuCgogICAgTGF5aW5nIGRvd24gaGVyIGRhZ2dlcgogICAgV2hhdCBpZiBpdCBiZSBhIHBvaXNvbiwgd2hpY2ggdGhlIGZyaWFyCiAgICBTdWJ0bHkgaGF0aCBtaW5pc3RlcidkIHRvIGhhdmUgbWUgZGVhZCwKICAgIExlc3QgaW4gdGhpcyBtYXJyaWFnZSBoZSBzaG91bGQgYmUgZGlzaG9ub3VyJ2QsCiAgICBCZWNhdXNlIGhlIG1hcnJpZWQgbWUgYmVmb3JlIHRvIFJvbWVvPwogICAgSSBmZWFyIGl0IGlzOiBhbmQgeWV0LCBtZXRoaW5rcywgaXQgc2hvdWxkIG5vdCwKICAgIEZvciBoZSBoYXRoIHN0aWxsIGJlZW4gdHJpZWQgYSBob2x5IG1hbi4KICAgIEhvdyBpZiwgd2hlbiBJIGFtIGxhaWQgaW50byB0aGUgdG9tYiwKICAgIEkgd2FrZSBiZWZvcmUgdGhlIHRpbWUgdGhhdCBSb21lbwogICAgQ29tZSB0byByZWRlZW0gbWUIHRoZXJlJ3MgYSBmZWFyZnVsIHBvaW50IQogICAgU2hhbGwgSSBub3QsIHRoZW4sIGJlIHN0aWZsZWQgaW4gdGhlIHZhdWx0LAogICAgVG8gd2hvc2UgZm91bCBtb3V0aCBubyBoZWFsdGhzb21lIGFpciBicmVhdGhlcyBpbiwKICAgIEFuZCB0aGVyZSBkaWUgc3RyYW5nbGVkIGVyZSBteSBSb21lbyBjb21lcz8KICAgIE9yLCBpZiBJIGxpdmUsIGlzIGl0IG5vdCB2ZXJ5IGxpa2UsCiAgICBUaGUgaG9ycmlibGUgY29uY2VpdCBvZiBkZWF0aCBhbmQgbmlnaHQsCiAgICBUb2dldGhlciB3aXRoIHRoZSB0ZXJyb3Igb2YgdGhlIHBsYWNlLC0tCiAgICBBcyBpbiBhIHZhdWx0LCBhbiBhbmNpZW50IHJlY2VwdGFjbGUsCiAgICBXaGVyZSwgZm9yIHRoZXNlIG1hbnkgaHVuZHJlZCB5ZWFycywgdGhlIGJvbmVzCiAgICBPZiBhbGwgbXkgYnVyaWVkIGFuY2VzdG9ycyBhcmUgcGFja2VkOgogICAgV2hlcmUgYmxvb2R5IFR5YmFsdCwgeWV0IGJ1dCBncmVlbiBpbiBlYXJ0aCwKICAgIExpZXMgZmVzdGVyaW5nIGluIGhpcyBzaHJvdWQ7IHdoZXJlLCBhcyB0aGV5IHNheSwKICAgIEF0IHNvbWUgaG91cnMgaW4gdGhlIG5pZ2h0IHNwaXJpdHMgcmVzb3J0Oy0tCiAgICBBbGFjaywgYWxhY2ssIGlzIGl0IG5vdCBsaWtlIHRoYXQgSSwKICAgIFNvIGVhcmx5IHdha2luZywgd2hhdCB3aXRoIGxvYXRoc29tZSBzbWVsbHMsCiAgICBBbmQgc2hyaWVrcyBsaWtlIG1hbmRyYWtlcycgdG9ybiBvdXQgb2YgdGhlIGVhcnRoLAogICAgVGhhdCBsaXZpbmcgbW9ydGFscywgaGVhcmluZyB0aGVtLCBydW4gbWFkOi0tCiAgICBPLCBpZiBJIHdha2UsIHNoYWxsIEkgbm90IGJlIGRpc3RyYXVnaHQsCiAgICBFbnZpcm9uZWQgd2l0aCBhbGwgdGhlc2UgaGlkZW91cyBmZWFycz8KICAgIEFuZCBtYWRseSBwbGF5IHdpdGggbXkgZm9yZWZhdGhlcidzIGpvaW50cz8KICAgIEFuZCBwbHVjayB0aGUgbWFuZ2xlZCBUeWJhbHQgZnJvbSBoaXMgc2hyb3VkPwogICAgQW5kLCBpbiB0aGlzIHJhZ2UsIHdpdGggc29tZSBncmVhdCBraW5zbWFuJ3MgYm9uZSwKICAgIEFzIHdpdGggYSBjbHViLCBkYXNoIG91dCBteSBkZXNwZXJhdGUgYnJhaW5zPwogICAgTywgbG9vayEgbWV0aGlua3MgSSBzZWUgbXkgY291c2luJ3MgZ2hvc3QKICAgIFNlZWtpbmcgb3V0IFJvbWVvLCB0aGF0IGRpZCBzcGl0IGhpcyBib2R5CiAgICBVcG9uIGEgcmFwaWVyJ3MgcG9pbnQ6IHN0YXksIFR5YmFsdCwgc3RheSEKICAgIFJvbWVvLCBJIGNvbWUhIHRoaXMgZG8gSSBkcmluayB0byB0aGVlLgoKICAgIFNoZSBmYWxscyB1cG9uIGhlciBiZWQsIHdpdGhpbiB0aGUgY3VydGFpbnMKClNDRU5FIElWLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgSG9sZCwgdGFrZSB0aGVzZSBrZXlzLCBhbmQgZmV0Y2ggbW9yZSBzcGljZXMsIG51cnNlLgoKTnVyc2UKCiAgICBUaGV5IGNhbGwgZm9yIGRhdGVzIGFuZCBxdWluY2VzIGluIHRoZSBwYXN0cnkuCgogICAgRW50ZXIgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIENvbWUsIHN0aXIsIHN0aXIsIHN0aXIhIHRoZSBzZWNvbmQgY29jayBoYXRoIGNyb3cnZCwKICAgIFRoZSBjdXJmZXctYmVsbCBoYXRoIHJ1bmcsICd0aXMgdGhyZWUgbydjbG9jazoKICAgIExvb2sgdG8gdGhlIGJha2VkIG1lYXRzLCBnb29kIEFuZ2VsaWNhOgogICAgU3BhcmUgbm90IGZvciB0aGUgY29zdC4KCk51cnNlCgogICAgR28sIHlvdSBjb3QtcXVlYW4sIGdvLAogICAgR2V0IHlvdSB0byBiZWQ7IGZhaXRoLCBZb3UnbGwgYmUgc2ljayB0by1tb3Jyb3cKICAgIEZvciB0aGlzIG5pZ2h0J3Mgd2F0Y2hpbmcuCgpDQVBVTEVUCgogICAgTm8sIG5vdCBhIHdoaXQ6IHdoYXQhIEkgaGF2ZSB3YXRjaCdkIGVyZSBub3cKICAgIEFsbCBuaWdodCBmb3IgbGVzc2VyIGNhdXNlLCBhbmQgbmUnZXIgYmVlbiBzaWNrLgoKTEFEWSBDQVBVTEVUCgogICAgQXksIHlvdSBoYXZlIGJlZW4gYSBtb3VzZS1odW50IGluIHlvdXIgdGltZTsKICAgIEJ1dCBJIHdpbGwgd2F0Y2ggeW91IGZyb20gc3VjaCB3YXRjaGluZyBub3cuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBBIGplYWxvdXMgaG9vZCwgYSBqZWFsb3VzIGhvb2QhCgogICAgRW50ZXIgdGhyZWUgb3IgZm91ciBTZXJ2aW5nbWVuLCB3aXRoIHNwaXRzLCBsb2dzLCBhbmQgYmFza2V0cwogICAgTm93LCBmZWxsb3csCiAgICBXaGF0J3MgdGhlcmUCgpGaXJzdCBTZXJ2YW50CgogICAgVGhpbmdzIGZvciB0aGUgY29vaywgc2lyOyBidXQgSSBrbm93IG5vdCB3aGF0LgoKQ0FQVUxFVAoKICAgIE1ha2UgaGFzdGUsIG1ha2UgaGFzdGUuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGZldGNoIGRyaWVyIGxvZ3M6CiAgICBDYWxsIFBldGVyLCBoZSB3aWxsIHNob3cgdGhlZSB3aGVyZSB0aGV5IGFyZS4KClNlY29uZCBTZXJ2YW50CgogICAgSSBoYXZlIGEgaGVhZCwgc2lyLCB0aGF0IHdpbGwgZmluZCBvdXQgbG9ncywKICAgIEFuZCBuZXZlciB0cm91YmxlIFBldGVyIGZvciB0aGUgbWF0dGVyLgoKICAgIEV4aXQKCkNBUFVMRVQKCiAgICBNYXNzLCBhbmQgd2VsbCBzYWlkOyBhIG1lcnJ5IHdob3Jlc29uLCBoYSEKICAgIFRob3Ugc2hhbHQgYmUgbG9nZ2VyLWhlYWQuIEdvb2QgZmFpdGgsICd0aXMgZGF5OgogICAgVGhlIGNvdW50eSB3aWxsIGJlIGhlcmUgd2l0aCBtdXNpYyBzdHJhaWdodCwKICAgIEZvciBzbyBoZSBzYWlkIGhlIHdvdWxkOiBJIGhlYXIgaGltIG5lYXIuCgogICAgTXVzaWMgd2l0aGluCiAgICBOdXJzZSEgV2lmZSEgV2hhdCwgaG8hIFdoYXQsIG51cnNlLCBJIHNheSEKCiAgICBSZS1lbnRlciBOdXJzZQogICAgR28gd2FrZW4gSnVsaWV0LCBnbyBhbmQgdHJpbSBoZXIgdXA7CiAgICBJJ2xsIGdvIGFuZCBjaGF0IHdpdGggUGFyaXM6IGhpZSwgbWFrZSBoYXN0ZSwKICAgIE1ha2UgaGFzdGU7IHRoZSBicmlkZWdyb29tIGhlIGlzIGNvbWUgYWxyZWFkeToKICAgIE1ha2UgaGFzdGUsIEkgc2F5LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gSnVsaWV0J3MgY2hhbWJlci4KCiAgICBFbnRlciBOdXJzZSAKCk51cnNlCgogICAgTWlzdHJlc3MhIHdoYXQsIG1pc3RyZXNzISBKdWxpZXQhIGZhc3QsIEkgd2FycmFudCBoZXIsIHNoZToKICAgIFdoeSwgbGFtYiEgd2h5LCBsYWR5ISBmaWUsIHlvdSBzbHVnLWEtYmVkIQogICAgV2h5LCBsb3ZlLCBJIHNheSEgbWFkYW0hIHN3ZWV0LWhlYXJ0ISB3aHksIGJyaWRlIQogICAgV2hhdCwgbm90IGEgd29yZD8geW91IHRha2UgeW91ciBwZW5ueXdvcnRocyBub3c7CiAgICBTbGVlcCBmb3IgYSB3ZWVrOyBmb3IgdGhlIG5leHQgbmlnaHQsIEkgd2FycmFudCwKICAgIFRoZSBDb3VudHkgUGFyaXMgaGF0aCBzZXQgdXAgaGlzIHJlc3QsCiAgICBUaGF0IHlvdSBzaGFsbCByZXN0IGJ1dCBsaXR0bGUuIEdvZCBmb3JnaXZlIG1lLAogICAgTWFycnksIGFuZCBhbWVuLCBob3cgc291bmQgaXMgc2hlIGFzbGVlcCEKICAgIEkgbXVzdCBuZWVkcyB3YWtlIGhlci4gTWFkYW0sIG1hZGFtLCBtYWRhbSEKICAgIEF5LCBsZXQgdGhlIGNvdW50eSB0YWtlIHlvdSBpbiB5b3VyIGJlZDsKICAgIEhlJ2xsIGZyaWdodCB5b3UgdXAsIGknIGZhaXRoLiBXaWxsIGl0IG5vdCBiZT8KCiAgICBVbmRyYXdzIHRoZSBjdXJ0YWlucwogICAgV2hhdCwgZHJlc3MnZCEgYW5kIGluIHlvdXIgY2xvdGhlcyEgYW5kIGRvd24gYWdhaW4hCiAgICBJIG11c3QgbmVlZHMgd2FrZSB5b3U7IExhZHkhIGxhZHkhIGxhZHkhCiAgICBBbGFzLCBhbGFzISBIZWxwLCBoZWxwISBteSBsYWR5J3MgZGVhZCEKICAgIE8sIHdlbGwtYS1kYXksIHRoYXQgZXZlciBJIHdhcyBib3JuIQogICAgU29tZSBhcXVhIHZpdGFlLCBobyEgTXkgbG9yZCEgbXkgbGFkeSEKCiAgICBFbnRlciBMQURZIENBUFVMRVQKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgaGVyZT8KCk51cnNlCgogICAgTyBsYW1lbnRhYmxlIGRheSEKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgaXMgdGhlIG1hdHRlcj8KCk51cnNlCgogICAgTG9vaywgbG9vayEgTyBoZWF2eSBkYXkhCgpMQURZIENBUFVMRVQKCiAgICBPIG1lLCBPIG1lISBNeSBjaGlsZCwgbXkgb25seSBsaWZlLAogICAgUmV2aXZlLCBsb29rIHVwLCBvciBJIHdpbGwgZGllIHdpdGggdGhlZSEKICAgIEhlbHAsIGhlbHAhIENhbGwgaGVscC4KCiAgICBFbnRlciBDQVBVTEVUCgpDQVBVTEVUCgogICAgRm9yIHNoYW1lLCBicmluZyBKdWxpZXQgZm9ydGg7IGhlciBsb3JkIGlzIGNvbWUuCgpOdXJzZQoKICAgIFNoZSdzIGRlYWQsIGRlY2Vhc2VkLCBzaGUncyBkZWFkOyBhbGFjayB0aGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgQWxhY2sgdGhlIGRheSwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCEKCkNBUFVMRVQKCiAgICBIYSEgbGV0IG1lIHNlZSBoZXI6IG91dCwgYWxhcyEgc2hlJ3MgY29sZDoKICAgIEhlciBibG9vZCBpcyBzZXR0bGVkLCBhbmQgaGVyIGpvaW50cyBhcmUgc3RpZmY7CiAgICBMaWZlIGFuZCB0aGVzZSBsaXBzIGhhdmUgbG9uZyBiZWVuIHNlcGFyYXRlZDoKICAgIERlYXRoIGxpZXMgb24gaGVyIGxpa2UgYW4gdW50aW1lbHkgZnJvc3QKICAgIFVwb24gdGhlIHN3ZWV0ZXN0IGZsb3dlciBvZiBhbGwgdGhlIGZpZWxkLgoKTnVyc2UKCiAgICBPIGxhbWVudGFibGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgTyB3b2Z1bCB0aW1lIQoKQ0FQVUxFVAoKICAgIERlYXRoLCB0aGF0IGhhdGggdGEnZW4gaGVyIGhlbmNlIHRvIG1ha2UgbWUgd2FpbCwKICAgIFRpZXMgdXAgbXkgdG9uZ3VlLCBhbmQgd2lsbCBub3QgbGV0IG1lIHNwZWFrLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUywgd2l0aCBNdXNpY2lhbnMKCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgaXMgdGhlIGJyaWRlIHJlYWR5IHRvIGdvIHRvIGNodXJjaD8KCkNBUFVMRVQKCiAgICBSZWFkeSB0byBnbywgYnV0IG5ldmVyIHRvIHJldHVybi4KICAgIE8gc29uISB0aGUgbmlnaHQgYmVmb3JlIHRoeSB3ZWRkaW5nLWRheQogICAgSGF0aCBEZWF0aCBsYWluIHdpdGggdGh5IHdpZmUuIFRoZXJlIHNoZSBsaWVzLAogICAgRmxvd2VyIGFzIHNoZSB3YXMsIGRlZmxvd2VyZWQgYnkgaGltLgogICAgRGVhdGggaXMgbXkgc29uLWluLWxhdywgRGVhdGggaXMgbXkgaGVpcjsKICAgIE15IGRhdWdodGVyIGhlIGhhdGggd2VkZGVkOiBJIHdpbGwgZGllLAogICAgQW5kIGxlYXZlIGhpbSBhbGw7IGxpZmUsIGxpdmluZywgYWxsIGlzIERlYXRoJ3MuCgpQQVJJUwoKICAgIEhhdmUgSSB0aG91Z2h0IGxvbmcgdG8gc2VlIHRoaXMgbW9ybmluZydzIGZhY2UsCiAgICBBbmQgZG90aCBpdCBnaXZlIG1lIHN1Y2ggYSBzaWdodCBhcyB0aGlzPwoKTEFEWSBDQVBVTEVUCgogICAgQWNjdXJzZWQsIHVuaGFwcHksIHdyZXRjaGVkLCBoYXRlZnVsIGRheSEKICAgIE1vc3QgbWlzZXJhYmxlIGhvdXIgdGhhdCBlJ2VyIHRpbWUgc2F3CiAgICBJbiBsYXN0aW5nIGxhYm91ciBvZiBoaXMgcGlsZ3JpbWFnZSEKICAgIEJ1dCBvbmUsIHBvb3Igb25lLCBvbmUgcG9vciBhbmQgbG92aW5nIGNoaWxkLAogICAgQnV0IG9uZSB0aGluZyB0byByZWpvaWNlIGFuZCBzb2xhY2UgaW4sCiAgICBBbmQgY3J1ZWwgZGVhdGggaGF0aCBjYXRjaCdkIGl0IGZyb20gbXkgc2lnaHQhCgpOdXJzZQoKICAgIE8gd29lISBPIHdvZnVsLCB3b2Z1bCwgd29mdWwgZGF5IQogICAgTW9zdCBsYW1lbnRhYmxlIGRheSwgbW9zdCB3b2Z1bCBkYXksCiAgICBUaGF0IGV2ZXIsIGV2ZXIsIEkgZGlkIHlldCBiZWhvbGQhCiAgICBPIGRheSEgTyBkYXkhIE8gZGF5ISBPIGhhdGVmdWwgZGF5IQogICAgTmV2ZXIgd2FzIHNlZW4gc28gYmxhY2sgYSBkYXkgYXMgdGhpczoKICAgIE8gd29mdWwgZGF5LCBPIHdvZnVsIGRheSEKClBBUklTCgogICAgQmVndWlsZWQsIGRpdm9yY2VkLCB3cm9uZ2VkLCBzcGl0ZWQsIHNsYWluIQogICAgTW9zdCBkZXRlc3RhYmxlIGRlYXRoLCBieSB0aGVlIGJlZ3VpbCdkLAogICAgQnkgY3J1ZWwgY3J1ZWwgdGhlZSBxdWl0ZSBvdmVydGhyb3duIQogICAgTyBsb3ZlISBPIGxpZmUhIG5vdCBsaWZlLCBidXQgbG92ZSBpbiBkZWF0aCEKCkNBUFVMRVQKCiAgICBEZXNwaXNlZCwgZGlzdHJlc3NlZCwgaGF0ZWQsIG1hcnR5cidkLCBraWxsJ2QhCiAgICBVbmNvbWZvcnRhYmxlIHRpbWUsIHdoeSBjYW1lc3QgdGhvdSBub3cKICAgIFRvIG11cmRlciwgbXVyZGVyIG91ciBzb2xlbW5pdHkCiAgICBPIGNoaWxkISBPIGNoaWxkISBteSBzb3VsLCBhbmQgbm90IG15IGNoaWxkIQogICAgRGVhZCBhcnQgdGhvdSEgQWxhY2shIG15IGNoaWxkIGlzIGRlYWQ7CiAgICBBbmQgd2l0aCBteSBjaGlsZCBteSBqb3lzIGFyZSBidXJpZWQuCgpGUklBUiBMQVVSRU5DRQoKICAgIFBlYWNlLCBobywgZm9yIHNoYW1lISBjb25mdXNpb24ncyBjdXJlIGxpdmVzIG5vdAogICAgSW4gdGhlc2UgY29uZnVzaW9ucy4gSGVhdmVuIGFuZCB5b3Vyc2VsZgogICAgSGFkIHBhcnQgaW4gdGhpcyBmYWlyIG1haWQ7IG5vdyBoZWF2ZW4gaGF0aCBhbGwsCiAgICBBbmQgYWxsIHRoZSBiZXR0ZXIgaXMgaXQgZm9yIHRoZSBtYWlkOgogICAgWW91ciBwYXJ0IGluIGhlciB5b3UgY291bGQgbm90IGtlZXAgZnJvbSBkZWF0aCwKICAgIEJ1dCBoZWF2ZW4ga2VlcHMgaGlzIHBhcnQgaW4gZXRlcm5hbCBsaWZlLgogICAgVGhlIG1vc3QgeW91IHNvdWdodCB3YXMgaGVyIHByb21vdGlvbjsKICAgIEZvciAndHdhcyB5b3VyIGhlYXZlbiBzaGUgc2hvdWxkIGJlIGFkdmFuY2VkOgogICAgQW5kIHdlZXAgeWUgbm93LCBzZWVpbmcgc2hlIGlzIGFkdmFuY2VkCiAgICBBYm92ZSB0aGUgY2xvdWRzLCBhcyBoaWdoIGFzIGhlYXZlbiBpdHNlbGYCiAgICBPLCBpbiB0aGlzIGxvdmUsIHlvdSBsb3ZlIHlvdXIgY2hpbGQgc28gaWxsLAogICAgVGhhdCB5b3UgcnVuIG1hZCwgc2VlaW5nIHRoYXQgc2hlIGlzIHdlbGw6CiAgICBTaGUncyBub3Qgd2VsbCBtYXJyaWVkIHRoYXQgbGl2ZXMgbWFycmllZCBsb25nOwogICAgQnV0IHNoZSdzIGJlc3QgbWFycmllZCB0aGF0IGRpZXMgbWFycmllZCB5b3VuZy4KICAgIERyeSB1cCB5b3VyIHRlYXJzLCBhbmQgc3RpY2sgeW91ciByb3NlbWFyeQogICAgT24gdGhpcyBmYWlyIGNvcnNlOyBhbmQsIGFzIHRoZSBjdXN0b20gaXMsCiAgICBJbiBhbGwgaGVyIGJlc3QgYXJyYXkgYmVhciBoZXIgdG8gY2h1cmNoOgogICAgRm9yIHRob3VnaCBmb25kIG5hdHVyZSBiaWRzIHVzIGFuIGxhbWVudCwKICAgIFlldCBuYXR1cmUncyB0ZWFycyBhcmUgcmVhc29uJ3MgbWVycmltZW50LgoKQ0FQVUxFVAoKICAgIEFsbCB0aGluZ3MgdGhhdCB3ZSBvcmRhaW5lZCBmZXN0aXZhbCwKICAgIFR1cm4gZnJvbSB0aGVpciBvZmZpY2UgdG8gYmxhY2sgZnVuZXJhbDsKICAgIE91ciBpbnN0cnVtZW50cyB0byBtZWxhbmNob2x5IGJlbGxzLAogICAgT3VyIHdlZGRpbmcgY2hlZXIgdG8gYSBzYWQgYnVyaWFsIGZlYXN0LAogICAgT3VyIHNvbGVtbiBoeW1ucyB0byBzdWxsZW4gZGlyZ2VzIGNoYW5nZSwKICAgIE91ciBicmlkYWwgZmxvd2VycyBzZXJ2ZSBmb3IgYSBidXJpZWQgY29yc2UsCiAgICBBbmQgYWxsIHRoaW5ncyBjaGFuZ2UgdGhlbSB0byB0aGUgY29udHJhcnkuCgpGUklBUiBMQVVSRU5DRQoKICAgIFNpciwgZ28geW91IGluOyBhbmQsIG1hZGFtLCBnbyB3aXRoIGhpbTsKICAgIEFuZCBnbywgU2lyIFBhcmlzOyBldmVyeSBvbmUgcHJlcGFyZQogICAgVG8gZm9sbG93IHRoaXMgZmFpciBjb3JzZSB1bnRvIGhlciBncmF2ZToKICAgIFRoZSBoZWF2ZW5zIGRvIGxvdXIgdXBvbiB5b3UgZm9yIHNvbWUgaWxsOwogICAgTW92ZSB0aGVtIG5vIG1vcmUgYnkgY3Jvc3NpbmcgdGhlaXIgaGlnaCB3aWxsLgoKICAgIEV4ZXVudCBDQVBVTEVULCBMQURZIENBUFVMRVQsIFBBUklTLCBhbmQgRlJJQVIgTEFVUkVOQ0UKCkZpcnN0IE11c2ljaWFuCgogICAgRmFpdGgsIHdlIG1heSBwdXQgdXAgb3VyIHBpcGVzLCBhbmQgYmUgZ29uZS4KCk51cnNlCgogICAgSG9uZXN0IGdvb2RmZWxsb3dzLCBhaCwgcHV0IHVwLCBwdXQgdXA7CiAgICBGb3IsIHdlbGwgeW91IGtub3csIHRoaXMgaXMgYSBwaXRpZnVsIGNhc2UuCgogICAgRXhpdAoKRmlyc3QgTXVzaWNpYW4KCiAgICBBeSwgYnkgbXkgdHJvdGgsIHRoZSBjYXNlIG1heSBiZSBhbWVuZGVkLgoKICAgIEVudGVyIFBFVEVSCgpQRVRFUgoKICAgIE11c2ljaWFucywgTywgbXVzaWNpYW5zLCAnSGVhcnQncyBlYXNlLCBIZWFydCdzCiAgICBlYXNlOicgTywgYW4geW91IHdpbGwgaGF2ZSBtZSBsaXZlLCBwbGF5ICdIZWFydCdzIGVhc2UuJwoKRmlyc3QgTXVzaWNpYW4KCiAgICBXaHkgJ0hlYXJ0J3MgZWFzZT8nCgpQRVRFUgoKICAgIE8sIG11c2ljaWFucywgYmVjYXVzZSBteSBoZWFydCBpdHNlbGYgcGxheXMgJ015CiAgICBoZWFydCBpcyBmdWxsIG9mIHdvZTonIE8sIHBsYXkgbWUgc29tZSBtZXJyeSBkdW1wLAogICAgdG8gY29tZm9ydCBtZS4KCkZpcnN0IE11c2ljaWFuCgogICAgTm90IGEgZHVtcCB3ZTsgJ3RpcyBubyB0aW1lIHRvIHBsYXkgbm93LgoKUEVURVIKCiAgICBZb3Ugd2lsbCBub3QsIHRoZW4CgpGaXJzdCBNdXNp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Rocm9uZTsKICAgIEFuZCBhbGwgdGhpcyBkYXkgYW4gdW5hY2N1c3RvbSdkIHNwaXJpdAogICAgTGlmdHMgbWUgYWJvdmUgdGhlIGdyb3VuZCB3aXRoIGNoZWVyZnVsIHRob3VnaHRzLgogICAgSSBkcmVhbXQgbXkgbGFkeSBjYW1lIGFuZCBmb3VuZCBtZSBkZWFkLS0KICAgIFN0cmFuZ2UgZHJlYW0sIHRoYXQgZ2l2ZXMgYSBkZWFkIG1hbiBsZWF2ZQogICAgdG8gdGhpbmshLS0KICAgIEFuZCBicmVhdGhlZCBzdWNoIGxpZmUgd2l0aCBraXNzZXMgaW4gbXkgbGlwcywKICAgIFRoYXQgSSByZXZpdmVkLCBhbmQgd2FzIGFuIGVtcGVyb3IuCiAgICBBaCBtZSEgaG93IHN3ZWV0IGlzIGxvdmUgaXRzZWxmIHBvc3Nlc3MnZCwKICAgIFdoZW4gYnV0IGxvdmUncyBzaGFkb3dzIGFyZSBzbyByaWNoIGluIGpveSEKCiAgICBFbnRlciBCQUxUSEFTQVIsIGJvb3RlZAogICAgTmV3cyBmcm9tIFZlcm9uYSEtLUhvdyBub3csIEJhbHRoYXNhciEKICAgIERvc3QgdGhvdSBub3QgYnJpbmcgbWUgbGV0dGVycyBmcm9tIHRoZSBmcmlhcj8KICAgIEhvdyBkb3RoIG15IGxhZHkIElzIG15IGZhdGhlciB3ZWxsPwogICAgSG93IGZhcmVzIG15IEp1bGlldD8gdGhhdCBJIGFzayBhZ2FpbjsKICAgIEZvciBub3RoaW5nIGNhbiBiZSBpbGwsIGlmIHNoZSBiZSB3ZWxsLgoKQkFMVEhBU0FSCgogICAgVGhlbiBzaGUgaXMgd2VsbCwgYW5kIG5vdGhpbmcgY2FuIGJlIGlsbDoKICAgIEhlciBib2R5IHNsZWVwcyBpbiBDYXBlbCdzIG1vbnVtZW50LAogICAgQW5kIGhlciBpbW1vcnRhbCBwYXJ0IHdpdGggYW5nZWxzIGxpdmVzLgogICAgSSBzYXcgaGVyIGxhaWQgbG93IGluIGhlciBraW5kcmVkJ3MgdmF1bHQsCiAgICBBbmQgcHJlc2VudGx5IHRvb2sgcG9zdCB0byB0ZWxsIGl0IHlvdToKICAgIE8sIHBhcmRvbiBtZSBmb3IgYnJpbmdpbmcgdGhlc2UgaWxsIG5ld3MsCiAgICBTaW5jZSB5b3UgZGlkIGxlYXZlIGl0IGZvciBteSBvZmZpY2UsIHNpci4KClJPTUVPCgogICAgSXMgaXQgZXZlbiBzbz8gdGhlbiBJIGRlZnkgeW91LCBzdGFycyEKICAgIFRob3Uga25vdydzdCBteSBsb2RnaW5nOiBnZXQgbWUgaW5rIGFuZCBwYXBlciwKICAgIEFuZCBoaXJlIHBvc3QtaG9yc2VzOyBJIHdpbGwgaGVuY2UgdG8tbmlnaHQuCgpCQUxUSEFTQVIKCiAgICBJIGRvIGJlc2VlY2ggeW91LCBzaXIsIGhhdmUgcGF0aWVuY2U6CiAgICBZb3VyIGxvb2tzIGFyZSBwYWxlIGFuZCB3aWxkLCBhbmQgZG8gaW1wb3J0CiAgICBTb21lIG1pc2FkdmVudHVyZS4KClJPTUVPCgogICAgVHVzaCwgdGhvdSBhcnQgZGVjZWl2ZWQ6CiAgICBMZWF2ZSBtZSwgYW5kIGRvIHRoZSB0aGluZyBJIGJpZCB0aGVlIGRvLgogICAgSGFzdCB0aG91IG5vIGxldHRlcnMgdG8gbWUgZnJvbSB0aGUgZnJpYXICgpCQUxUSEFTQVIKCiAgICBObywgbXkgZ29vZCBsb3JkLgoKUk9NRU8KCiAgICBObyBtYXR0ZXI6IGdldCB0aGVlIGdvbmUsCiAgICBBbmQgaGlyZSB0aG9zZSBob3JzZXM7IEknbGwgYmUgd2l0aCB0aGVlIHN0cmFpZ2h0LgoKICAgIEV4aXQgQkFMVEhBU0FSCiAgICBXZWxsLCBKdWxpZXQsIEkgd2lsbCBsaWUgd2l0aCB0aGVlIHRvLW5pZ2h0LgogICAgTGV0J3Mgc2VlIGZvciBtZWFuczogTyBtaXNjaGllZiwgdGhvdSBhcnQgc3dpZnQKICAgIFRvIGVudGVyIGluIHRoZSB0aG91Z2h0cyBvZiBkZXNwZXJhdGUgbWVuIQogICAgSSBkbyByZW1lbWJlciBhbiBhcG90aGVjYXJ5LC0tCiAgICBBbmQgaGVyZWFib3V0cyBoZSBkd2VsbHMsLS13aGljaCBsYXRlIEkgbm90ZWQKICAgIEluIHRhdHRlcidkIHdlZWRzLCB3aXRoIG92ZXJ3aGVsbWluZyBicm93cywKICAgIEN1bGxpbmcgb2Ygc2ltcGxlczsgbWVhZ3JlIHdlcmUgaGlzIGxvb2tzLAogICAgU2hhcnAgbWlzZXJ5IGhhZCB3b3JuIGhpbSB0byB0aGUgYm9uZXM6CiAgICBBbmQgaW4gaGlzIG5lZWR5IHNob3AgYSB0b3J0b2lzZSBodW5nLAogICAgQW4gYWxsaWdhdG9yIHN0dWZmJ2QsIGFuZCBvdGhlciBza2lucwogICAgT2YgaWxsLXNoYXBlZCBmaXNoZXM7IGFuZCBhYm91dCBoaXMgc2hlbHZlcwogICAgQSBiZWdnYXJseSBhY2NvdW50IG9mIGVtcHR5IGJveGVzLAogICAgR3JlZW4gZWFydGhlbiBwb3RzLCBibGFkZGVycyBhbmQgbXVzdHkgc2VlZHMsCiAgICBSZW1uYW50cyBvZiBwYWNrdGhyZWFkIGFuZCBvbGQgY2FrZXMgb2Ygcm9zZXMsCiAgICBXZXJlIHRoaW5seSBzY2F0dGVyJ2QsIHRvIG1ha2UgdXAgYSBzaG93LgogICAgTm90aW5nIHRoaXMgcGVudXJ5LCB0byBteXNlbGYgSSBzYWlkCiAgICAnQW4gaWYgYSBtYW4gZGlkIG5lZWQgYSBwb2lzb24gbm93LAogICAgV2hvc2Ugc2FsZSBpcyBwcmVzZW50IGRlYXRoIGluIE1hbnR1YSwKICAgIEhlcmUgbGl2ZXMgYSBjYWl0aWZmIHdyZXRjaCB3b3VsZCBzZWxsIGl0IGhpbS4nCiAgICBPLCB0aGlzIHNhbWUgdGhvdWdodCBkaWQgYnV0IGZvcmVydW4gbXkgbmVlZDsKICAgIEFuZCB0aGlzIHNhbWUgbmVlZHkgbWFuIG11c3Qgc2VsbCBpdCBtZS4KICAgIEFzIEkgcmVtZW1iZXIsIHRoaXMgc2hvdWxkIGJlIHRoZSBob3VzZS4KICAgIEJlaW5nIGhvbGlkYXksIHRoZSBiZWdnYXIncyBzaG9wIGlzIHNodXQuCiAgICBXaGF0LCBobyEgYXBvdGhlY2FyeSEKCiAgICBFbnRlciBBcG90aGVjYXJ5CgpBcG90aGVjYXJ5CgogICAgV2hvIGNhbGxzIHNvIGxvdWQCgpST01FTwoKICAgIENvbWUgaGl0aGVyLCBtYW4uIEkgc2VlIHRoYXQgdGhvdSBhcnQgcG9vcjoKICAgIEhvbGQsIHRoZXJlIGlzIGZvcnR5IGR1Y2F0czogbGV0IG1lIGhhdmUKICAgIEEgZHJhbSBvZiBwb2lzb24sIHN1Y2ggc29vbi1zcGVlZGluZyBnZWFyCiAgICBBcyB3aWxsIGRpc3BlcnNlIGl0c2VsZiB0aHJvdWdoIGFsbCB0aGUgdmVpbnMKICAgIFRoYXQgdGhlIGxpZmUtd2VhcnkgdGFrZXIgbWF5IGZhbGwgZGVhZAogICAgQW5kIHRoYXQgdGhlIHRydW5rIG1heSBiZSBkaXNjaGFyZ2VkIG9mIGJyZWF0aAogICAgQXMgdmlvbGVudGx5IGFzIGhhc3R5IHBvd2RlciBmaXJlZAogICAgRG90aCBodXJyeSBmcm9tIHRoZSBmYXRhbCBjYW5ub24ncyB3b21iLgoKQXBvdGhlY2FyeQoKICAgIFN1Y2ggbW9ydGFsIGRydWdzIEkgaGF2ZTsgYnV0IE1hbnR1YSdzIGxhdwogICAgSXMgZGVhdGggdG8gYW55IGhlIHRoYXQgdXR0ZXJzIHRoZW0uCgpST01FTwoKICAgIEFydCB0aG91IHNvIGJhcmUgYW5kIGZ1bGwgb2Ygd3JldGNoZWRuZXNzLAogICAgQW5kIGZlYXInc3QgdG8gZGllPyBmYW1pbmUgaXMgaW4gdGh5IGNoZWVrcywKICAgIE5lZWQgYW5kIG9wcHJlc3Npb24gc3RhcnZldGggaW4gdGhpbmUgZXllcywKICAgIENvbnRlbXB0IGFuZCBiZWdnYXJ5IGhhbmdzIHVwb24gdGh5IGJhY2s7CiAgICBUaGUgd29ybGQgaXMgbm90IHRoeSBmcmllbmQgbm9yIHRoZSB3b3JsZCdzIGxhdzsKICAgIFRoZSB3b3JsZCBhZmZvcmRzIG5vIGxhdyB0byBtYWtlIHRoZWUgcmljaDsKICAgIFRoZW4gYmUgbm90IHBvb3IsIGJ1dCBicmVhayBpdCwgYW5kIHRha2UgdGhpcy4KCkFwb3RoZWNhcnkKCiAgICBNeSBwb3ZlcnR5LCBidXQgbm90IG15IHdpbGwsIGNvbnNlbnRzLgoKUk9NRU8KCiAgICBJIHBheSB0aHkgcG92ZXJ0eSwgYW5kIG5vdCB0aHkgd2lsbC4KCkFwb3RoZWNhcnkKCiAgICBQdXQgdGhpcyBpbiBhbnkgbGlxdWlkIHRoaW5nIHlvdSB3aWxsLAogICAgQW5kIGRyaW5rIGl0IG9mZjsgYW5kLCBpZiB5b3UgaGFkIHRoZSBzdHJlbmd0aAogICAgT2YgdHdlbnR5IG1lbiwgaXQgd291bGQgZGlzcGF0Y2ggeW91IHN0cmFpZ2h0LgoKUk9NRU8KCiAgICBUaGVyZSBpcyB0aHkgZ29sZCwgd29yc2UgcG9pc29uIHRvIG1lbidzIHNvdWxzLAogICAgRG9pbmcgbW9yZSBtdXJkZXJzIGluIHRoaXMgbG9hdGhzb21lIHdvcmxkLAogICAgVGhhbiB0aGVzZSBwb29yIGNvbXBvdW5kcyB0aGF0IHRob3UgbWF5c3Qgbm90IHNlbGwuCiAgICBJIHNlbGwgdGhlZSBwb2lzb247IHRob3UgaGFzdCBzb2xkIG1lIG5vbmUuCiAgICBGYXJld2VsbDogYnV5IGZvb2QsIGFuZCBnZXQgdGh5c2VsZiBpbiBmbGVzaC4KICAgIENvbWUsIGNvcmRpYWwgYW5kIG5vdCBwb2lzb24sIGdvIHdpdGggbWUKICAgIFRvIEp1bGlldCdzIGdyYXZlOyBmb3IgdGhlcmUgbXVzdCBJIHVzZSB0aGVlLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBKT0hOIAoKRlJJQVIgSk9ITgoKICAgIEhvbHkgRnJhbmNpc2NhbiBmcmlhciEgYnJvdGhlciwgaG8hCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UKCkZSSUFSIExBVVJFTkNFCgogICAgVGhpcyBzYW1lIHNob3VsZCBiZSB0aGUgdm9pY2Ugb2YgRnJpYXIgSm9obi4KICAgIFdlbGNvbWUgZnJvbSBNYW50dWE6IHdoYXQgc2F5cyBSb21lbz8KICAgIE9yLCBpZiBoaXMgbWluZCBiZSB3cml0LCBnaXZlIG1lIGhpcyBsZXR0ZXIuCgpGUklBUiBKT0hOCgogICAgR29pbmcgdG8gZmluZCBhIGJhcmUtZm9vdCBicm90aGVyIG91dAogICAgT25lIG9mIG91ciBvcmRlciwgdG8gYXNzb2NpYXRlIG1lLAogICAgSGVyZSBpbiB0aGlzIGNpdHkgdmlzaXRpbmcgdGhlIHNpY2ssCiAgICBBbmQgZmluZGluZyBoaW0sIHRoZSBzZWFyY2hlcnMgb2YgdGhlIHRvd24sCiAgICBTdXNwZWN0aW5nIHRoYXQgd2UgYm90aCB3ZXJlIGluIGEgaG91c2UKICAgIFdoZXJlIHRoZSBpbmZlY3Rpb3VzIHBlc3RpbGVuY2UgZGlkIHJlaWduLAogICAgU2VhbCdkIHVwIHRoZSBkb29ycywgYW5kIHdvdWxkIG5vdCBsZXQgdXMgZm9ydGg7CiAgICBTbyB0aGF0IG15IHNwZWVkIHRvIE1hbnR1YSB0aGVyZSB3YXMgc3RheSdkLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXaG8gYmFyZSBteSBsZXR0ZXIsIHRoZW4sIHRvIFJvbWVvPwoKRlJJQVIgSk9ITgoKICAgIEkgY291bGQgbm90IHNlbmQgaXQsLS1oZXJlIGl0IGlzIGFnYWluLC0tCiAgICBOb3IgZ2V0IGEgbWVzc2VuZ2VyIHRvIGJyaW5nIGl0IHRoZWUsCiAgICBTbyBmZWFyZnVsIHdlcmUgdGhleSBvZiBpbmZlY3Rpb24uCgpGUklBUiBMQVVSRU5DRQoKICAgIFVuaGFwcHkgZm9ydHVuZSEgYnkgbXkgYnJvdGhlcmhvb2QsCiAgICBUaGUgbGV0dGVyIHdhcyBub3QgbmljZSBidXQgZnVsbCBvZiBjaGFyZ2UKICAgIE9mIGRlYXIgaW1wb3J0LCBhbmQgdGhlIG5lZ2xlY3RpbmcgaXQKICAgIE1heSBkbyBtdWNoIGRhbmdlci4gRnJpYXIgSm9obiwgZ28gaGVuY2U7CiAgICBHZXQgbWUgYW4gaXJvbiBjcm93LCBhbmQgYnJpbmcgaXQgc3RyYWlnaHQKICAgIFVudG8gbXkgY2VsbC4KCkZSSUFSIEpPSE4KCiAgICBCcm90aGVyLCBJJ2xsIGdvIGFuZCBicmluZyBpdCB0aGVlLgoKICAgIEV4aXQKCkZSSUFSIExBVVJFTkNFCgogICAgTm93IG11c3QgSSB0byB0aGUgbW9udW1lbnQgYWxvbmU7CiAgICBXaXRoaW4gdGhyZWUgaG91cnMgd2lsbCBmYWlyIEp1bGlldCB3YWtlOgogICAgU2hlIHdpbGwgYmVzaHJldyBtZSBtdWNoIHRoYXQgUm9tZW8KICAgIEhhdGggaGFkIG5vIG5vdGljZSBvZiB0aGVzZSBhY2NpZGVudHM7CiAgICBCdXQgSSB3aWxsIHdyaXRlIGFnYWluIHRvIE1hbnR1YSwKICAgIEFuZCBrZWVwIGhlciBhdCBteSBjZWxsIHRpbGwgUm9tZW8gY29tZTsKICAgIFBvb3IgbGl2aW5nIGNvcnNlLCBjbG9zZWQgaW4gYSBkZWFkIG1hbidzIHRvbWIhCgogICAgRXhpdAoKU0NFTkUgSUlJLiBBIGNodXJjaHlhcmQ7IGluIGl0IGEgdG9tYiBiZWxvbmdpbmcgdG8gdGhlIENhcHVsZXRzLgoKICAgIEVudGVyIFBBUklTLCBhbmQgaGlzIFBhZ2UgYmVhcmluZyBmbG93ZXJzIGFuZCBhIHRvcmNoIAoKUEFSSVMKCiAgICBHaXZlIG1lIHRoeSB0b3JjaCwgYm95OiBoZW5jZSwgYW5kIHN0YW5kIGFsb29mOgogICAgWWV0IHB1dCBpdCBvdXQsIGZvciBJIHdvdWxkIG5vdCBiZSBzZWVuLgogICAgVW5kZXIgeW9uZCB5ZXctdHJlZXMgbGF5IHRoZWUgYWxsIGFsb25nLAogICAgSG9sZGluZyB0aGluZSBlYXIgY2xvc2UgdG8gdGhlIGhvbGxvdyBncm91bmQ7CiAgICBTbyBzaGFsbCBubyBmb290IHVwb24gdGhlIGNodXJjaHlhcmQgdHJlYWQsCiAgICBCZWluZyBsb29zZSwgdW5maXJtLCB3aXRoIGRpZ2dpbmcgdXAgb2YgZ3JhdmVzLAogICAgQnV0IHRob3Ugc2hhbHQgaGVhciBpdDogd2hpc3RsZSB0aGVuIHRvIG1lLAogICAgQXMgc2lnbmFsIHRoYXQgdGhvdSBoZWFyJ3N0IHNvbWV0aGluZyBhcHByb2FjaC4KICAgIEdpdmUgbWUgdGhvc2UgZmxvd2Vycy4gRG8gYXMgSSBiaWQgdGhlZSwgZ28uCgpQQUdFCgogICAgW0FzaWRlXSBJIGFtIGFsbW9zdCBhZnJhaWQgdG8gc3RhbmQgYWxvbmUKICAgIEhlcmUgaW4gdGhlIGNodXJjaHlhcmQ7IHlldCBJIHdpbGwgYWR2ZW50dXJlLgoKICAgIFJldGlyZXMKClBBUklTCgogICAgU3dlZXQgZmxvd2VyLCB3aXRoIGZsb3dlcnMgdGh5IGJyaWRhbCBiZWQgSSBzdHJldywtLQogICAgTyB3b2UhIHRoeSBjYW5vcHkgaXMgZHVzdCBhbmQgc3RvbmVzOy0tCiAgICBXaGljaCB3aXRoIHN3ZWV0IHdhdGVyIG5pZ2h0bHkgSSB3aWxsIGRldywKICAgIE9yLCB3YW50aW5nIHRoYXQsIHdpdGggdGVhcnMgZGlzdGlsbCdkIGJ5IG1vYW5zOgogICAgVGhlIG9ic2VxdWllcyB0aGF0IEkgZm9yIHRoZWUgd2lsbCBrZWVwCiAgICBOaWdodGx5IHNoYWxsIGJlIHRvIHN0cmV3IHRoeSBncmF2ZSBhbmQgd2VlcC4KCiAgICBUaGUgUGFnZSB3aGlzdGxlcwogICAgVGhlIGJveSBnaXZlcyB3YXJuaW5nIHNvbWV0aGluZyBkb3RoIGFwcHJvYWNoLgogICAgV2hhdCBjdXJzZWQgZm9vdCB3YW5kZXJzIHRoaXMgd2F5IHRvLW5pZ2h0LAogICAgVG8gY3Jvc3MgbXkgb2JzZXF1aWVzIGFuZCB0cnVlIGxvdmUncyByaXRlPwogICAgV2hhdCB3aXRoIGEgdG9yY2ghIG11ZmZsZSBtZSwgbmlnaHQsIGF3aGlsZS4KCiAgICBSZXRpcmVzCgogICAgRW50ZXIgUk9NRU8gYW5kIEJBTFRIQVNBUiwgd2l0aCBhIHRvcmNoLCBtYXR0b2NrLCAmIGMKClJPTUVPCgogICAgR2l2ZSBtZSB0aGF0IG1hdHRvY2sgYW5kIHRoZSB3cmVuY2hpbmcgaXJvbi4KICAgIEhvbGQsIHRha2UgdGhpcyBsZXR0ZXI7IGVhcmx5IGluIHRoZSBtb3JuaW5nCiAgICBTZWUgdGhvdSBkZWxpdmVyIGl0IHRvIG15IGxvcmQgYW5kIGZhdGhlci4KICAgIEdpdmUgbWUgdGhlIGxpZ2h0OiB1cG9uIHRoeSBsaWZlLCBJIGNoYXJnZSB0aGVlLAogICAgV2hhdGUnZXIgdGhvdSBoZWFyJ3N0IG9yIHNlZXN0LCBzdGFuZCBhbGwgYWxvb2YsCiAgICBBbmQgZG8gbm90IGludGVycnVwdCBtZSBpbiBteSBjb3Vyc2UuCiAgICBXaHkgSSBkZXNjZW5kIGludG8gdGhpcyBiZWQgb2YgZGVhdGgsCiAgICBJcyBwYXJ0bHkgdG8gYmVob2xkIG15IGxhZHkncyBmYWNlOwogICAgQnV0IGNoaWVmbHkgdG8gdGFrZSB0aGVuY2UgZnJvbSBoZXIgZGVhZCBmaW5nZXIKICAgIEEgcHJlY2lvdXMgcmluZywgYSByaW5nIHRoYXQgSSBtdXN0IHVzZQogICAgSW4gZGVhciBlbXBsb3ltZW50OiB0aGVyZWZvcmUgaGVuY2UsIGJlIGdvbmU6CiAgICBCdXQgaWYgdGhvdSwgamVhbG91cywgZG9zdCByZXR1cm4gdG8gcHJ5CiAgICBJbiB3aGF0IEkgZnVydGhlciBzaGFsbCBpbnRlbmQgdG8gZG8sCiAgICBCeSBoZWF2ZW4sIEkgd2lsbCB0ZWFyIHRoZWUgam9pbnQgYnkgam9pbnQKICAgIEFuZCBzdHJldyB0aGlzIGh1bmdyeSBjaHVyY2h5YXJkIHdpdGggdGh5IGxpbWJzOgogICAgVGhlIHRpbWUgYW5kIG15IGludGVudHMgYXJlIHNhdmFnZS13aWxkLAogICAgTW9yZSBmaWVyY2UgYW5kIG1vcmUgaW5leG9yYWJsZSBmYXIKICAgIFRoYW4gZW1wdHkgdGlnZXJzIG9yIHRoZSByb2FyaW5nIHNlYS4KCkJBTFRIQVNBUgoKICAgIEkgd2lsbCBiZSBnb25lLCBzaXIsIGFuZCBub3QgdHJvdWJsZSB5b3UuCgpST01FTwoKICAgIFNvIHNoYWx0IHRob3Ugc2hvdyBtZSBmcmllbmRzaGlwLiBUYWtlIHRob3UgdGhhdDoKICAgIExpdmUsIGFuZCBiZSBwcm9zcGVyb3VzOiBhbmQgZmFyZXdlbGwsIGdvb2QgZmVsbG93LgoKQkFMVEhBU0FSCgogICAgW0FzaWRlXSBGb3IgYWxsIHRoaXMgc2FtZSwgSSdsbCBoaWRlIG1lIGhlcmVhYm91dDoKICAgIEhpcyBsb29rcyBJIGZlYXIsIGFuZCBoaXMgaW50ZW50cyBJIGRvdWJ0LgoKICAgIFJldGlyZXMKClJPTUVPCgogICAgVGhvdSBkZXRlc3RhYmxlIG1hdywgdGhvdSB3b21iIG9mIGRlYXRoLAogICAgR29yZ2VkIHdpdGggdGhlIGRlYXJlc3QgbW9yc2VsIG9mIHRoZSBlYXJ0aCwKICAgIFRodXMgSSBlbmZvcmNlIHRoeSByb3R0ZW4gamF3cyB0byBvcGVuLAogICAgQW5kLCBpbiBkZXNwaXRlLCBJJ2xsIGNyYW0gdGhlZSB3aXRoIG1vcmUgZm9vZCEKCiAgICBPcGVucyB0aGUgdG9tYgoKUEFSSVMKCiAgICBUaGlzIGlzIHRoYXQgYmFuaXNoJ2QgaGF1Z2h0eSBNb250YWd1ZSwKICAgIFRoYXQgbXVyZGVyJ2QgbXkgbG92ZSdzIGNvdXNpbiwgd2l0aCB3aGljaCBncmllZiwKICAgIEl0IGlzIHN1cHBvc2VkLCB0aGUgZmFpciBjcmVhdHVyZSBkaWVkOwogICAgQW5kIGhlcmUgaXMgY29tZSB0byBkbyBzb21lIHZpbGxhbm91cyBzaGFtZQogICAgVG8gdGhlIGRlYWQgYm9kaWVzOiBJIHdpbGwgYXBwcmVoZW5kIGhpbS4KCiAgICBDb21lcyBmb3J3YXJkCiAgICBTdG9wIHRoeSB1bmhhbGxvdydkIHRvaWwsIHZpbGUgTW9udGFndWUhCiAgICBDYW4gdmVuZ2VhbmNlIGJlIHB1cnN1ZWQgZnVydGhlciB0aGFuIGRlYXRoPwogICAgQ29uZGVtbmVkIHZpbGxhaW4sIEkgZG8gYXBwcmVoZW5kIHRoZWU6CiAgICBPYmV5LCBhbmQgZ28gd2l0aCBtZTsgZm9yIHRob3UgbXVzdCBkaWUuCgpST01FTwoKICAgIEkgbXVzdCBpbmRlZWQ7IGFuZCB0aGVyZWZvcmUgY2FtZSBJIGhpdGhlci4KICAgIEdvb2QgZ2VudGxlIHlvdXRoLCB0ZW1wdCBub3QgYSBkZXNwZXJhdGUgbWFuOwogICAgRmx5IGhlbmNlLCBhbmQgbGVhdmUgbWU6IHRoaW5rIHVwb24gdGhlc2UgZ29uZTsKICAgIExldCB0aGVtIGFmZnJpZ2h0IHRoZWUuIEkgYmVzZWVjaCB0aGVlLCB5b3V0aCwKICAgIFB1dCBub3QgYW5vdGhlciBzaW4gdXBvbiBteSBoZWFkLAogICAgQnkgdXJnaW5nIG1lIHRvIGZ1cnk6IE8sIGJlIGdvbmUhCiAgICBCeSBoZWF2ZW4sIEkgbG92ZSB0aGVlIGJldHRlciB0aGFuIG15c2VsZjsKICAgIEZvciBJIGNvbWUgaGl0aGVyIGFybSdkIGFnYWluc3QgbXlzZWxmOgogICAgU3RheSBub3QsIGJlIGdvbmU7IGxpdmUsIGFuZCBoZXJlYWZ0ZXIgc2F5LAogICAgQSBtYWRtYW4ncyBtZXJjeSBiYWRlIHRoZWUgcnVuIGF3YXkuCgpQQVJJUwoKICAgIEkgZG8gZGVmeSB0aHkgY29uanVyYXRpb25zLAogICAgQW5kIGFwcHJlaGVuZCB0aGVlIGZvciBhIGZlbG9uIGhlcmUuCgpST01FTwoKICAgIFdpbHQgdGhvdSBwcm92b2tlIG1lPyB0aGVuIGhhdmUgYXQgdGhlZSwgYm95IQoKICAgIFRoZXkgZmlnaHQKClBBR0UKCiAgICBPIExvcmQsIHRoZXkgZmlnaHQhIEkgd2lsbCBnbyBjYWxsIHRoZSB3YXRjaC4KCiAgICBFeGl0CgpQQVJJUwoKICAgIE8sIEkgYW0gc2xhaW4hCgogICAgRmFsbHMKICAgIElmIHRob3UgYmUgbWVyY2lmdWwsCiAgICBPcGVuIHRoZSB0b21iLCBsYXkgbWUgd2l0aCBKdWxpZXQuCgogICAgRGllcwoKUk9NRU8KCiAgICBJbiBmYWl0aCwgSSB3aWxsLiBMZXQgbWUgcGVydXNlIHRoaXMgZmFjZS4KICAgIE1lcmN1dGlvJ3Mga2luc21hbiwgbm9ibGUgQ291bnR5IFBhcmlzIQogICAgV2hhdCBzYWlkIG15IG1hbiwgd2hlbiBteSBiZXRvc3NlZCBzb3VsCiAgICBEaWQgbm90IGF0dGVuZCBoaW0gYXMgd2Ugcm9kZT8gSSB0aGluawogICAgSGUgdG9sZCBtZSBQYXJpcyBzaG91bGQgaGF2ZSBtYXJyaWVkIEp1bGlldDoKICAgIFNhaWQgaGUgbm90IHNvPyBvciBkaWQgSSBkcmVhbSBpdCBzbz8KICAgIE9yIGFtIEkgbWFkLCBoZWFyaW5nIGhpbSB0YWxrIG9mIEp1bGlldCwKICAgIFRvIHRoaW5rIGl0IHdhcyBzbz8gTywgZ2l2ZSBtZSB0aHkgaGFuZCwKICAgIE9uZSB3cml0IHdpdGggbWUgaW4gc291ciBtaXNmb3J0dW5lJ3MgYm9vayEKICAgIEknbGwgYnVyeSB0aGVlIGluIGEgdHJpdW1waGFudCBncmF2ZTsKICAgIEEgZ3JhdmUIE8gbm8hIGEgbGFudGVybiwgc2xhdWdodGVyJ2QgeW91dGgsCiAgICBGb3IgaGVyZSBsaWVzIEp1bGlldCwgYW5kIGhlciBiZWF1dHkgbWFrZXMKICAgIFRoaXMgdmF1bHQgYSBmZWFzdGluZyBwcmVzZW5jZSBmdWxsIG9mIGxpZ2h0LgogICAgRGVhdGgsIGxpZSB0aG91IHRoZXJlLCBieSBhIGRlYWQgbWFuIGludGVycidkLgoKICAgIExheWluZyBQQVJJUyBpbiB0aGUgdG9tYgogICAgSG93IG9mdCB3aGVuIG1lbiBhcmUgYXQgdGhlIHBvaW50IG9mIGRlYXRoCiAgICBIYXZlIHRoZXkgYmVlbiBtZXJyeSEgd2hpY2ggdGhlaXIga2VlcGVycyBjYWxsCiAgICBBIGxpZ2h0bmluZyBiZWZvcmUgZGVhdGg6IE8sIGhvdyBtYXkgSQogICAgQ2FsbCB0aGlzIGEgbGlnaHRuaW5nPyBPIG15IGxvdmUhIG15IHdpZmUhCiAgICBEZWF0aCwgdGhhdCBoYXRoIHN1Y2snZCB0aGUgaG9uZXkgb2YgdGh5IGJyZWF0aCwKICAgIEhhdGggaGFkIG5vIHBvd2VyIHlldCB1cG9uIHRoeSBiZWF1dHk6CiAgICBUaG91IGFydCBub3QgY29ucXVlcidkOyBiZWF1dHkncyBlbnNpZ24geWV0CiAgICBJcyBjcmltc29uIGluIHRoeSBsaXBzIGFuZCBpbiB0aHkgY2hlZWtzLAogICAgQW5kIGRlYXRoJ3MgcGFsZSBmbGFnIGlzIG5vdCBhZHZhbmNlZCB0aGVyZS4KICAgIFR5YmFsdCwgbGllc3QgdGhvdSB0aGVyZSBpbiB0aHkgYmxvb2R5IHNoZWV0PwogICAgTywgd2hhdCBtb3JlIGZhdm91ciBjYW4gSSBkbyB0byB0aGVlLAogICAgVGhhbiB3aXRoIHRoYXQgaGFuZCB0aGF0IGN1dCB0aHkgeW91dGggaW4gdHdhaW4KICAgIFRvIHN1bmRlciBoaXMgdGhhdCB3YXMgdGhpbmUgZW5lbXkCiAgICBGb3JnaXZlIG1lLCBjb3VzaW4hIEFoLCBkZWFyIEp1bGlldCwKICAgIFdoeSBhcnQgdGhvdSB5ZXQgc28gZmFpcj8gc2hhbGwgSSBiZWxpZXZlCiAgICBUaGF0IHVuc3Vic3RhbnRpYWwgZGVhdGggaXMgYW1vcm91cywKICAgIEFuZCB0aGF0IHRoZSBsZWFuIGFiaG9ycmVkIG1vbnN0ZXIga2VlcHMKICAgIFRoZWUgaGVyZSBpbiBkYXJrIHRvIGJlIGhpcyBwYXJhbW91cj8KICAgIEZvciBmZWFyIG9mIHRoYXQsIEkgc3RpbGwgd2lsbCBzdGF5IHdpdGggdGhlZTsKICAgIEFuZCBuZXZlciBmcm9tIHRoaXMgcGFsYWNlIG9mIGRpbSBuaWdodAogICAgRGVwYXJ0IGFnYWluOiBoZXJlLCBoZXJlIHdpbGwgSSByZW1haW4KICAgIFdpdGggd29ybXMgdGhhdCBhcmUgdGh5IGNoYW1iZXItbWFpZHM7IE8sIGhlcmUKICAgIFdpbGwgSSBzZXQgdXAgbXkgZXZlcmxhc3RpbmcgcmVzdCwKICAgIEFuZCBzaGFrZSB0aGUgeW9rZSBvZiBpbmF1c3BpY2lvdXMgc3RhcnMKICAgIEZyb20gdGhpcyB3b3JsZC13ZWFyaWVkIGZsZXNoLiBFeWVzLCBsb29rIHlvdXIgbGFzdCEKICAgIEFybXMsIHRha2UgeW91ciBsYXN0IGVtYnJhY2UhIGFuZCwgbGlwcywgTyB5b3UKICAgIFRoZSBkb29ycyBvZiBicmVhdGgsIHNlYWwgd2l0aCBhIHJpZ2h0ZW91cyBraXNzCiAgICBBIGRhdGVsZXNzIGJhcmdhaW4gdG8gZW5ncm9zc2luZyBkZWF0aCEKICAgIENvbWUsIGJpdHRlciBjb25kdWN0LCBjb21lLCB1bnNhdm91cnkgZ3VpZGUhCiAgICBUaG91IGRlc3BlcmF0ZSBwaWxvdCwgbm93IGF0IG9uY2UgcnVuIG9uCiAgICBUaGUgZGFzaGluZyByb2NrcyB0aHkgc2VhLXNpY2sgd2VhcnkgYmFyayEKICAgIEhlcmUncyB0byBteSBsb3ZlIQoKICAgIERyaW5rcwogICAgTyB0cnVlIGFwb3RoZWNhcnkhCiAgICBUaHkgZHJ1Z3MgYXJlIHF1aWNrLiBUaHVzIHdpdGggYSBraXNzIEkgZGllLgoKICAgIERpZXMKCiAgICBFbnRlciwgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgY2h1cmNoeWFyZCwgRlJJQVIgTEFVUkVOQ0UsIHdpdGggYSBsYW50ZXJuLCBjcm93LCBhbmQgc3BhZGUKCkZSSUFSIExBVVJFTkNFCgogICAgU2FpbnQgRnJhbmNpcyBiZSBteSBzcGVlZCEgaG93IG9mdCB0by1uaWdodAogICAgSGF2ZSBteSBvbGQgZmVldCBzdHVtYmxlZCBhdCBncmF2ZXMhIFdobydzIHRoZXJlPwoKQkFMVEhBU0FSCgogICAgSGVyZSdzIG9uZSwgYSBmcmllbmQsIGFuZCBvbmUgdGhhdCBrbm93cyB5b3Ugd2VsbC4KCkZSSUFSIExBVVJFTkNFCgogICAgQmxpc3MgYmUgdXBvbiB5b3UhIFRlbGwgbWUsIGdvb2QgbXkgZnJpZW5kLAogICAgV2hhdCB0b3JjaCBpcyB5b25kLCB0aGF0IHZhaW5seSBsZW5kcyBoaXMgbGlnaHQKICAgIFRvIGdydWJzIGFuZCBleWVsZXNzIHNrdWxscz8gYXMgSSBkaXNjZXJuLAogICAgSXQgYnVybmV0aCBpbiB0aGUgQ2FwZWwncyBtb251bWVudC4KCkJBTFRIQVNBUgoKICAgIEl0IGRvdGggc28sIGhvbHkgc2lyOyBhbmQgdGhlcmUncyBteSBtYXN0ZXIsCiAgICBPbmUgdGhhdCB5b3UgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2hvIGlzIGl0PwoKQkFMVEhBU0FSCgogICAgUm9tZW8uCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvdyBsb25nIGhhdGggaGUgYmVlbiB0aGVyZT8KCkJBTFRIQVNBUgoKICAgIEZ1bGwgaGFsZiBhbiBob3VyLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHbyB3aXRoIG1lIHRvIHRoZSB2YXVsdC4KCkJBTFRIQVNBUgoKICAgIEkgZGFyZSBub3QsIHNpcgogICAgTXkgbWFzdGVyIGtub3dzIG5vdCBidXQgSSBhbSB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CwgYm95OiB3aGljaCB3YXkCgpKVUxJRVQKCiAgICBZZWEsIG5vaXNlPyB0aGVuIEknbGwgYmUgYnJpZWYuIE8gaGFwcHkgZGFnZ2VyIQoKICAgIFNuYXRjaGluZyBST01FTydzIGRhZ2dlcgogICAgVGhpcyBpcyB0aHkgc2hlYXRoOwoKICAgIFN0YWJzIGhlcnNlbGYKICAgIHRoZXJlIHJ1c3QsIGFuZCBsZXQgbWUgZGllLgoKICAgIEZhbGxzIG9uIFJPTUVPJ3MgYm9keSwgYW5kIGRpZXMKCiAgICBFbnRlciBXYXRjaCwgd2l0aCB0aGUgUGFnZSBvZiBQQVJJUwoKUEFHRQoKICAgIFRoaXMgaXMgdGhlIHBsYWNlOyB0aGVyZSwgd2hlcmUgdGhlIHRvcmNoIGRvdGggYnVybi4KCkZpcnN0IFdhdGNobWFuCgogICAgVGhlIGdyb3VuZCBpcyBibG9vZHk7IHNlYXJjaCBhYm91dCB0aGUgY2h1cmNoeWFyZDoKICAgIEdvLCBzb21lIG9mIHlvdSwgd2hvZSdlciB5b3UgZmluZCBhdHRhY2guCiAgICBQaXRpZnVsIHNpZ2h0ISBoZXJlIGxpZXMgdGhlIGNvdW50eSBzbGFpbiwKICAgIEFuZCBKdWxpZXQgYmxlZWRpbmcsIHdhcm0sIGFuZCBuZXdseSBkZWFkLAogICAgV2hvIGhlcmUgaGF0aCBsYWluIHRoZXNlIHR3byBkYXlzIGJ1cmllZC4KICAgIEdvLCB0ZWxsIHRoZSBwcmluY2U6IHJ1biB0byB0aGUgQ2FwdWxldHM6CiAgICBSYWlzZSB1cCB0aGUgTW9udGFndWVzOiBzb21lIG90aGVycyBzZWFyY2g6CiAgICBXZSBzZWUgdGhlIGdyb3VuZCB3aGVyZW9uIHRoZXNlIHdvZXMgZG8gbGllOwogICAgQnV0IHRoZSB0cnVlIGdyb3VuZCBvZiBhbGwgdGhlc2UgcGl0ZW91cyB3b2VzCiAgICBXZSBjYW5ub3Qgd2l0aG91dCBjaXJjdW1zdGFuY2UgZGVzY3J5LgoKICAgIFJlLWVudGVyIHNvbWUgb2YgdGhlIFdhdGNoLCB3aXRoIEJBTFRIQVNBUgoKU2Vjb25kIFdhdGNobWFuCgogICAgSGVyZSdzIFJvbWVvJ3MgbWFuOyB3ZSBmb3VuZCBoaW0gaW4gdGhlIGNodXJjaHlhcmQuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhvbGQgaGltIGluIHNhZmV0eSwgdGlsbCB0aGUgcHJpbmNlIGNvbWUgaGl0aGVyLgoKICAgIFJlLWVudGVyIG90aGVycyBvZiB0aGUgV2F0Y2gsIHdpdGggRlJJQVIgTEFVUkVOQ0UKClRoaXJkIFdhdGNobWFuCgogICAgSGVyZSBpcyBhIGZyaWFyLCB0aGF0IHRyZW1ibGVzLCBzaWdocyBhbmQgd2VlcHM6CiAgICBXZSB0b29rIHRoaXMgbWF0dG9jayBhbmQgdGhpcyBzcGFkZSBmcm9tIGhpbSwKICAgIEFzIGhlIHdhcyBjb21pbmcgZnJvbSB0aGlzIGNodXJjaHlhcmQgc2lkZS4KCkZpcnN0IFdhdGNobWFuCgogICAgQSBncmVhdCBzdXNwaWNpb246IHN0YXkgdGhlIGZyaWFyIHRvby4KCiAgICBFbnRlciB0aGUgUFJJTkNFIGFuZCBBdHRlbmRhbnRzCgpQUklOQ0UKCiAgICBXaGF0IG1pc2FkdmVudHVyZSBpcyBzbyBlYXJseSB1cCwKICAgIFRoYXQgY2FsbHMgb3VyIHBlcnNvbiBmcm9tIG91ciBtb3JuaW5nJ3MgcmVzdD8KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIGFuZCBvdGhlcnMKCkNBUFVMRVQKCiAgICBXaGF0IHNob3VsZCBpdCBiZSwgdGhhdCB0aGV5IHNvIHNocmllayBhYnJvYWQCgpMQURZIENBUFVMRVQKCiAgICBUaGUgcGVvcGxlIGluIHRoZSBzdHJlZXQgY3J5IFJvbWVvLAogICAgU29tZSBKdWxpZXQsIGFuZCBzb21lIFBhcmlzOyBhbmQgYWxsIHJ1biwKICAgIFdpdGggb3BlbiBvdXRjcnkgdG93YXJkIG91ciBtb251bWVudC4KClBSSU5DRQoKICAgIFdoYXQgZmVhciBpcyB0aGlzIHdoaWNoIHN0YXJ0bGVzIGluIG91ciBlYXJzPwoKRmlyc3QgV2F0Y2htYW4KCiAgICBTb3ZlcmVpZ24sIGhlcmUgbGllcyB0aGUgQ291bnR5IFBhcmlzIHNsYWluOwogICAgQW5kIFJvbWVvIGRlYWQ7IGFuZCBKdWxpZXQsIGRlYWQgYmVmb3JlLAogICAgV2FybSBhbmQgbmV3IGtpbGwnZC4KClBSSU5DRQoKICAgIFNlYXJjaCwgc2VlaywgYW5kIGtub3cgaG93IHRoaXMgZm91bCBtdXJkZXIgY29tZXMuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhlcmUgaXMgYSBmcmlhciwgYW5kIHNsYXVnaHRlcidkIFJvbWVvJ3MgbWFuOwogICAgV2l0aCBpbnN0cnVtZW50cyB1cG9uIHRoZW0sIGZpdCB0byBvcGVuCiAgICBUaGVzZSBkZWFkIG1lbidzIHRvbWJzLgoKQ0FQVUxFVAoKICAgIE8gaGVhdmVucyEgTyB3aWZlLCBsb29rIGhvdyBvdXIgZGF1Z2h0ZXIgYmxlZWRzIQogICAgVGhpcyBkYWdnZXIgaGF0aCBtaXN0YSdlbi0tZm9yLCBsbywgaGlzIGhvdXNlCiAgICBJcyBlbXB0eSBvbiB0aGUgYmFjayBvZiBNb250YWd1ZSwtLQogICAgQW5kIGl0IG1pcy1zaGVhdGhlZCBpbiBteSBkYXVnaHRlcidzIGJvc29tIQoKTEFEWSBDQVBVTEVUCgogICAgTyBtZSEgdGhpcyBzaWdodCBvZiBkZWF0aCBpcyBhcyBhIGJlbGwsCiAgICBUaGF0IHdhcm5zIG15IG9sZCBhZ2UgdG8gYSBzZXB1bGNocmUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIG90aGVycwoKUFJJTkNFCgogICAgQ29tZSwgTW9udGFndWU7IGZvciB0aG91IGFydCBlYXJseSB1cCwKICAgIFRvIHNlZSB0aHkgc29uIGFuZCBoZWlyIG1vcmUgZWFybHkgZG93bi4KCk1PTlRBR1VFCgogICAgQWxhcywgbXkgbGllZ2UsIG15IHdpZmUgaXMgZGVhZCB0by1uaWdodDsKICAgIEdyaWVmIG9mIG15IHNvbidzIGV4aWxlIGhhdGggc3RvcHAnZCBoZXIgYnJlYXRoOgogICAgV2hhdCBmdXJ0aGVyIHdvZSBjb25zcGlyZXMgYWdhaW5zdCBtaW5lIGFnZT8KClBSSU5DRQoKICAgIExvb2ssIGFuZCB0aG91IHNoYWx0IHNlZS4KCk1PTlRBR1VFCgogICAgTyB0aG91IHVudGF1Z2h0ISB3aGF0IG1hbm5lcnMgaXMgaW4gdGhpcz8KICAgIFRvIHByZXNzIGJlZm9yZSB0aHkgZmF0aGVyIHRvIGEgZ3JhdmUCgpQUklOQ0UKCiAgICBTZWFsIHVwIHRoZSBtb3V0aCBvZiBvdXRyYWdlIGZvciBhIHdoaWxlLAogICAgVGlsbCB3ZSBjYW4gY2xlYXIgdGhlc2UgYW1iaWd1aXRpZXMsCiAgICBBbmQga25vdyB0aGVpciBzcHJpbmcsIHRoZWlyIGhlYWQsIHRoZWlyCiAgICB0cnVlIGRlc2NlbnQ7CiAgICBBbmQgdGhlbiB3aWxsIEkgYmUgZ2VuZXJhbCBvZiB5b3VyIHdvZXMsCiAgICBBbmQgbGVhZCB5b3UgZXZlbiB0byBkZWF0aDogbWVhbnRpbWUgZm9yYmVhciwKICAgIEFuZCBsZXQgbWlzY2hhbmNlIGJlIHNsYXZlIHRvIHBhdGllbmNlLgogICAgQnJpbmcgZm9ydGggdGhlIHBhcnRpZXMgb2Ygc3VzcGljaW9uLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJIGFtIHRoZSBncmVhdGVzdCwgYWJsZSB0byBkbyBsZWFzdCwKICAgIFlldCBtb3N0IHN1c3BlY3RlZCwgYXMgdGhlIHRpbWUgYW5kIHBsYWNlCiAgICBEb3RoIG1ha2UgYWdhaW5zdCBtZSBvZiB0aGlzIGRpcmVmdWwgbXVyZGVyOwogICAgQW5kIGhlcmUgSSBzdGFuZCwgYm90aCB0byBpbXBlYWNoIGFuZCBwdXJnZQogICAgTXlzZWxmIGNvbmRlbW5lZCBhbmQgbXlzZWxmIGV4Y3VzZWQuCgpQUklOQ0UKCiAgICBUaGVuIHNheSBhdCBvbmNlIHdoYXQgdGhvdSBkb3N0IGtub3cgaW4gdGhpcy4KCkZSSUFSIExBVVJFTkNFCgogICAgSSB3aWxsIGJlIGJyaWVmLCBmb3IgbXkgc2hvcnQgZGF0ZSBvZiBicmVhdGgKICAgIElzIG5vdCBzbyBsb25nIGFzIGlzIGEgdGVkaW91cyB0YWxlLgogICAgUm9tZW8sIHRoZXJlIGRlYWQsIHdhcyBodXNiYW5kIHRvIHRoYXQgSnVsaWV0OwogICAgQW5kIHNoZSwgdGhlcmUgZGVhZCwgdGhhdCBSb21lbydzIGZhaXRoZnVsIHdpZmU6CiAgICBJIG1hcnJpZWQgdGhlbTsgYW5kIHRoZWlyIHN0b2wnbiBtYXJyaWFnZS1kYXkKICAgIFdhcyBUeWJhbHQncyBkb29tcy1kYXksIHdob3NlIHVudGltZWx5IGRlYXRoCiAgICBCYW5pc2gnZCB0aGUgbmV3LW1hZGUgYnJpZGVncm9vbSBmcm9tIHRoZSBjaXR5LAogICAgRm9yIHdob20sIGFuZCBub3QgZm9yIFR5YmFsdCwgSnVsaWV0IHBpbmVkLgogICAgWW91LCB0byByZW1vdmUgdGhhdCBzaWVnZSBvZiBncmllZiBmcm9tIGhlciwKICAgIEJldHJvdGgnZCBhbmQgd291bGQgaGF2ZSBtYXJyaWVkIGhlciBwZXJmb3JjZQogICAgVG8gQ291bnR5IFBhcmlzOiB0aGVuIGNvbWVzIHNoZSB0byBtZSwKICAgIEFuZCwgd2l0aCB3aWxkIGxvb2tzLCBiaWQgbWUgZGV2aXNlIHNvbWUgbWVhbgogICAgVG8gcmlkIGhlciBmcm9tIHRoaXMgc2Vjb25kIG1hcnJpYWdlLAogICAgT3IgaW4gbXkgY2VsbCB0aGVyZSB3b3VsZCBzaGUga2lsbCBoZXJzZWxmLgogICAgVGhlbiBnYXZlIEkgaGVyLCBzbyB0dXRvcidkIGJ5IG15IGFydCwKICAgIEEgc2xlZXBpbmcgcG90aW9uOyB3aGljaCBzbyB0b29rIGVmZmVjdAogICAgQXMgSSBpbnRlbmRlZCwgZm9yIGl0IHdyb3VnaHQgb24gaGVyCiAgICBUaGUgZm9ybSBvZiBkZWF0aDogbWVhbnRpbWUgSSB3cml0IHRvIFJvbWVvLAogICAgVGhhdCBoZSBzaG91bGQgaGl0aGVyIGNvbWUgYXMgdGhpcyBkaXJlIG5pZ2h0LAogICAgVG8gaGVscCB0byB0YWtlIGhlciBmcm9tIGhlciBib3Jyb3cnZCBncmF2ZSwKICAgIEJlaW5nIHRoZSB0aW1lIHRoZSBwb3Rpb24ncyBmb3JjZSBzaG91bGQgY2Vhc2UuCiAgICBCdXQgaGUgd2hpY2ggYm9yZSBteSBsZXR0ZXIsIEZyaWFyIEpvaG4sCiAgICBXYXMgc3RheSdkIGJ5IGFjY2lkZW50LCBhbmQgeWVzdGVybmlnaHQKICAgIFJldHVybidkIG15IGxldHRlciBiYWNrLiBUaGVuIGFsbCBhbG9uZQogICAgQXQgdGhlIHByZWZpeGVkIGhvdXIgb2YgaGVyIHdha2luZywKICAgIENhbWUgSSB0byB0YWtlIGhlciBmcm9tIGhlciBraW5kcmVkJ3MgdmF1bHQ7CiAgICBNZWFuaW5nIHRvIGtlZXAgaGVyIGNsb3NlbHkgYXQgbXkgY2VsbCwKICAgIFRpbGwgSSBjb252ZW5pZW50bHkgY291bGQgc2VuZCB0byBSb21lbzoKICAgIEJ1dCB3aGVuIEkgY2FtZSwgc29tZSBtaW51dGUgZXJlIHRoZSB0aW1lCiAgICBPZiBoZXIgYXdha2luZywgaGVyZSB1bnRpbWVseSBsYXkKICAgIFRoZSBub2JsZSBQYXJpcyBhbmQgdHJ1ZSBSb21lbyBkZWFkLgogICAgU2hlIHdha2VzOyBhbmQgSSBlbnRyZWF0ZWQgaGVyIGNvbWUgZm9ydGgsCiAgICBBbmQgYmVhciB0aGlzIHdvcmsgb2YgaGVhdmVuIHdpdGggcGF0aWVuY2U6CiAgICBCdXQgdGhlbiBhIG5vaXNlIGRpZCBzY2FyZSBtZSBmcm9tIHRoZSB0b21iOwogICAgQW5kIHNoZSwgdG9vIGRlc3BlcmF0ZSwgd291bGQgbm90IGdvIHdpdGggbWUsCiAgICBCdXQsIGFzIGl0IHNlZW1zLCBkaWQgdmlvbGVuY2Ugb24gaGVyc2VsZi4KICAgIEFsbCB0aGlzIEkga25vdzsgYW5kIHRvIHRoZSBtYXJyaWFnZQogICAgSGVyIG51cnNlIGlzIHByaXZ5OiBhbmQsIGlmIGF1Z2h0IGluIHRoaXMKICAgIE1pc2NhcnJpZWQgYnkgbXkgZmF1bHQsIGxldCBteSBvbGQgbGlmZQogICAgQmUgc2FjcmlmaWNlZCwgc29tZSBob3VyIGJlZm9yZSBoaXMgdGltZSwKICAgIFVudG8gdGhlIHJpZ291ciBvZiBzZXZlcmVzdCBsYXcuCgpQUklOQ0UKCiAgICBXZSBzdGlsbCBoYXZlIGtub3duIHRoZWUgZm9yIGEgaG9seSBtYW4uCiAgICBXaGVyZSdzIFJvbWVvJ3MgbWFuPyB3aGF0IGNhbiBoZSBzYXkgaW4gdGhpcz8KCkJBTFRIQVNBUgoKICAgIEkgYnJvdWdodCBteSBtYXN0ZXIgbmV3cyBvZiBKdWxpZXQncyBkZWF0aDsKICAgIEFuZCB0aGVuIGluIHBvc3QgaGUgY2FtZSBmcm9tIE1hbnR1YQogICAgVG8gdGhpcyBzYW1lIHBsYWNlLCB0byB0aGlzIHNhbWUgbW9udW1lbnQuCiAgICBUaGlzIGxldHRlciBoZSBlYXJseSBiaWQgbWUgZ2l2ZSBoaXMgZmF0aGVyLAogICAgQW5kIHRocmVhdGVuZWQgbWUgd2l0aCBkZWF0aCwgZ29pbmcgaW4gdGhlIHZhdWx0LAogICAgSSBkZXBhcnRlZCBub3QgYW5kIGxlZnQgaGltIHRoZXJlLgoKUFJJTkNFCgogICAgR2l2ZSBtZSB0aGUgbGV0dGVyOyBJIHdpbGwgbG9vayBvbiBpdC4KICAgIFdoZXJlIGlzIHRoZSBjb3VudHkncyBwYWdlLCB0aGF0IHJhaXNlZCB0aGUgd2F0Y2gCiAgICBTaXJyYWgsIHdoYXQgbWFkZSB5b3VyIG1hc3RlciBpbiB0aGlzIHBsYWNlPwoKUEFHRQoKICAgIEhlIGNhbWUgd2l0aCBmbG93ZXJzIHRvIHN0cmV3IGhpcyBsYWR5J3MgZ3JhdmU7CiAgICBBbmQgYmlkIG1lIHN0YW5kIGFsb29mLCBhbmQgc28gSSBkaWQ6CiAgICBBbm9uIGNvbWVzIG9uZSB3aXRoIGxpZ2h0IHRvIG9wZSB0aGUgdG9tYjsKICAgIEFuZCBieSBhbmQgYnkgbXkgbWFzdGVyIGRyZXcgb24gaGltOwogICAgQW5kIHRoZW4gSSByYW4gYXdheSB0byBjYWxsIHRoZSB3YXRjaC4KClBSSU5DRQoKICAgIFRoaXMgbGV0dGVyIGRvdGggbWFrZSBnb29kIHRoZSBmcmlhcidzIHdvcmRzLAogICAgVGhlaXIgY291cnNlIG9mIGxvdmUsIHRoZSB0aWRpbmdzIG9mIGhlciBkZWF0aDoKICAgIEFuZCBoZXJlIGhlIHdyaXRlcyB0aGF0IGhlIGRpZCBidXkgYSBwb2lzb24KICAgIE9mIGEgcG9vciAncG90aGVjYXJ5LCBhbmQgdGhlcmV3aXRoYWwKICAgIENhbWUgdG8gdGhpcyB2YXVsdCB0byBkaWUsIGFuZCBsaWUgd2l0aCBKdWxpZXQuCiAgICBXaGVyZSBiZSB0aGVzZSBlbmVtaWVzPyBDYXB1bGV0ISBNb250YWd1ZSEKICAgIFNlZSwgd2hhdCBhIHNjb3VyZ2UgaXMgbGFpZCB1cG9uIHlvdXIgaGF0ZSwKICAgIFRoYXQgaGVhdmVuIGZpbmRzIG1lYW5zIHRvIGtpbGwgeW91ciBqb3lzIHdpdGggbG92ZS4KICAgIEFuZCBJIGZvciB3aW5raW5nIGF0IHlvdXIgZGlzY29yZHMgdG9vCiAgICBIYXZlIGxvc3QgYSBicmFjZSBvZiBraW5zbWVuOiBhbGwgYXJlIHB1bmlzaCdkLgoKQ0FQVUxFVAoKICAgIE8gYnJvdGhlciBNb250YWd1ZSwgZ2l2ZSBtZSB0aHkgaGFuZDoKICAgIFRoaXMgaXMgbXkgZGF1Z2h0ZXIncyBqb2ludHVyZSwgZm9yIG5vIG1vcmUKICAgIENhbiBJIGRlbWFuZC4KCk1PTlRBR1VFCgogICAgQnV0IEkgY2FuIGdpdmUgdGhlZSBtb3JlOgogICAgRm9yIEkgd2lsbCByYWlzZSBoZXIgc3RhdHVlIGluIHB1cmUgZ29sZDsKICAgIFRoYXQgd2hpbGUgVmVyb25hIGJ5IHRoYXQgbmFtZSBpcyBrbm93biwKICAgIFRoZXJlIHNoYWxsIG5vIGZpZ3VyZSBhdCBzdWNoIHJhdGUgYmUgc2V0CiAgICBBcyB0aGF0IG9mIHRydWUgYW5kIGZhaXRoZnVsIEp1bGlldC4KCkNBUFVMRVQKCiAgICBBcyByaWNoIHNoYWxsIFJvbWVvJ3MgYnkgaGlzIGxhZHkncyBsaWU7CiAgICBQb29yIHNhY3JpZmljZXMgb2Ygb3VyIGVubWl0eSEKClBSSU5DRQoKICAgIEEgZ2xvb21pbmcgcGVhY2UgdGhpcyBtb3JuaW5nIHdpdGggaXQgYnJpbmdzOwogICAgVGhlIHN1biwgZm9yIHNvcnJvdywgd2lsbCBub3Qgc2hvdyBoaXMgaGVhZDoKICAgIEdvIGhlbmNlLCB0byBoYXZlIG1vcmUgdGFsayBvZiB0aGVzZSBzYWQgdGhpbmdzOwogICAgU29tZSBzaGFsbCBiZSBwYXJkb24nZCwgYW5kIHNvbWUgcHVuaXNoZWQ6CiAgICBGb3IgbmV2ZXIgd2FzIGEgc3Rvcnkgb2YgbW9yZSB3b2UKICAgIFRoYW4gdGhpcyBvZiBKdWxpZXQgYW5kIGhlciBSb21lby4KCiAgICBFeGV1bnQK

Chuck Cartledge
Chuck Cartledge
Chuck Cartledge

httpantonio-ferraroeupnword-clouds-in-r-packages-wordcloud2-and-tmrm(list=ls())library(wordcloud2)library(NLP)library(tm)library(RCurl) Necessary steps 1 Use imagesgooglecom to find an outline of the shape to fill (tmpusapng) 2 Use gimp to fill the outline with black 3 Use a command like wordcloud2(TDMasDF size = 20 figPath=tmpusapng backgroundColor = white fontFamily=Loma) to populate shape 4 Result is a web page with javascript embedded to create image and allow mouse overs Clean corpuscleanCorpus lt- function(corpus) corpustmp lt- tm_map(corpus removePunctuation) corpustmp lt- tm_map(corpustmpstripWhitespace) corpustmp lt- tm_map(corpustmptolower) corpustmp lt- tm_map(corpustmp PlainTextDocument) corpustmp lt- tm_map(corpustmpremoveWords stopwords(english)) return(corpustmp) Build TDMgenerateTDM lt- function(path) sdir lt-path scor lt-Corpus(DirSource(directory = sdir encoding= UTF-8)) scorcl lt- cleanCorpus(scor) stdm lt- TermDocumentMatrix(scorcl) stdminitData lt- function(path) if (direxists(path) == FALSE) If the directory does not exist create and populate with dummy data dummyDataFile lt- romeoAndJulietbase64 fileName lt- sprintf(sdummyDatatxt path) print(sprintf(Creating and populating the file s with dummy data fileName)) dircreate(path recursive = TRUE) write(base64( paste( readLines(dummyDataFile) collapse=) encode=FALSE) file=fileName) main lt- function() options(stringsAsFactors = FALSE) The working directory pathName lt- Text initData(pathName) Get the Term Document Matrix TDM lt- generateTDM(pathName) Do I need a matrix or a DF We will see TDMasMatrix lt- asmatrix(TDM) TDMasDFlt-dataframe(TDMasMatrix) TDMasDF$words lt-rownames(TDMasDF) Column headers colnames(TDMasDF) lt- c(freq word) TDMasDFlt-TDMasDF[ c(word freq)] TDMasDF lt- TDMasDF[order(TDMasDF$freqdecreasing=TRUE)] The results a lt- wordcloud2(TDMasDF size = 03 shape=star backgroundColor = black fontFamily=Loma) print(a) a lt- letterCloud(TDMasDF word=USA size = 03 fontFamily=Loma backgroundColor = black) print(a) a lt- wordcloud2(TDMasDF size = 13 figPath=heartpng backgroundColor = white fontFamily=Loma color=red) print(a) TDMasDF$freq lt- log(TDMasDF$freq) a lt- wordcloud2(TDMasDF size = 12 figPath=usapng backgroundColor = white shuffle=FALSE minRotation = 0 maxRotation = 2pi) print(a) print(The program has ended)main()

Chuck Cartledge
Page 2: Creating Shaped Wordclouds Using R - clc-ent.comThe wordcloud2 function behaves slightly di erently than most of the other R plot func-tions that I’ve used. The result from both

1 Introduction

The R library wordcloud provides an easy way to create an image showing how often a word(or tag) appears in a corpus (see Figure 1 on the following page) In a word cloud the sizeof a word indicates how often that word appears Word cloud words can be colored as well

While word clouds are easy to create often the clouds could be shaped differently tocreate a more lasting and profound impression (see Figure 2 on page 3)

2 Discussion

The R library wordcloud21 provides the capability of creating a word cloud that takes theshape of an image or the shape of letters The collection of predefined shapes include

bull rsquocardiodrsquo ndash a heart shape

bull rsquocirclersquo ndash the default

bull rsquodiamondrsquo ndash an alias for a square

bull rsquopentagonrsquo ndash the five sided object

bull rsquostarrsquo ndash a five pointed star

bull rsquotrianglersquo ndash a triangle with the wide base at the bottom

bull rsquotriangle-forwardrsquo ndash a triangle with the wide base at the left

This collection of shapes (when combined with a user specified background color) maybe enough to satisfy a wide variety of needs But it is the figPath option that offers themost potential

The figPath option can point to a figure that contains the image the cloud path shouldfill

Here are the steps to create an ldquointerestingrdquo shape to fill with a word cloud

1 Downloadcreate an image with only two items (see Figure 3 on page 4)

bull A white background and

bull A black outline of the shape

2 Fill the interior of the shape with the same color as the outline (see Figure 4 on page 5)

3 Pass the location of the filled image as the figPath parameter (see Figure 5 on page 6)

Figure 1 A sample word cloud based on Romeo and Juliet The image was created usingwordcloud function in the wordcloud library and the text from ldquoRomeo and Julietrdquo

2

Figure 2 A more interesting word cloud based on Romeo and Juliette The image wascreated using wordcloud2 function in the wordcloud2 library and the text from ldquoRomeo andJulietrdquo

3

Figure 3 An empty word cloud figure

4

Figure 4 A filled word cloud figure

5

Figure 5 A filled USA word cloud figure

The wordcloud2 function behaves slightly differently than most of the other R plot func-tions that Irsquove used The result from both wordcloud2 and letterCloud is not displayablewithin R These functions actually create an HTML page in a temporary directory with em-bedded JavaScript that performs the placement of the words within the shape and providesa level of interaction after the page is displayed R ldquounderstandsrdquo that the product fromthese functions is an HTML widget and starts up the default browser to show the page Thepage and its sub-directories are removed when R ends

The fact that the page uses JavaScript introduces some interesting aspects Buried in theJavaScript used by the page to place the words in the cloud are a plethora of Mathrandom()calls The JavaScript specification says that the Mathrandom() function has to return avalue greater than or equal to 0 and less than 1 which is reasonable for a random functionThe specification also says that the implementation of the random function is up to theJavaScript application and does not specify how the numbers are to be generated Meaningthat the same HTML page being viewed by two different browsers may generate two differentsequences of random numbers Most random number generators have the capability of settinga seed value so that a repeatable sequence can be generated JavaScript does not supportthe idea of a random number seed The HTML page and collection of directories can bemoved to a server where they are available for use and support

All of this means that each loading and viewing of the page will generate a different

1Available fromhttpsgithubcomLchiffonwordcloud2

6

image and there is no practical way to ldquoget backrdquo to an image that was goodIn the Files section (see Section A on page 9) is an R script and support files to work

with The R script was used to create various images (see Figure 6 on the following page)

3 Conclusion

The wordcloud2 library enables you to create word clouds of arbitrary shape inside an HTMLusing JavaScript to position and orient each word Each HTML page and its associatedlibrary files are placed in individual directories that are removed when the creating R processterminates Pages and files can be moved or copied for safe keeping if desired Because thepages use the Mathrandom() JavaScript function each time the page is loaded words willbe positioned differently in the cloud If the desired shape has an internal hole then it ispossible that some words may not be placed in the cloud

wordcloud2 allows you to create word clouds to support your data visualization needs

7

(a) A heart

(b) The letters ldquoUSArdquo

(c) A star

(d) The USA

Figure 6 A collection of sample word clouds These images were created with the attachedR script

8

A Misc files

The files used to create all these figures are attached to this report They are

1 romeoAndJulietbase64 ndash default text used to demonstrate the software

2 heartpng ndash a heart shape with a hole

3 usapng ndash an outline of the continental United States

4 wordCloudR ndash an R script to demonstrate making word clouds

9

ClJvbWVvIGFuZCBKdWxpZXQKU2hha2VzcGVhcmUgaG9tZXBhZ2UgfCBSb21lbyBhbmQgSnVsaWV0IHwgRW50aXJlIHBsYXkKQUNUIEkKUFJPTE9HVUUKCiAgICBUd28gaG91c2Vob2xkcywgYm90aCBhbGlrZSBpbiBkaWduaXR5LAogICAgSW4gZmFpciBWZXJvbmEsIHdoZXJlIHdlIGxheSBvdXIgc2NlbmUsCiAgICBGcm9tIGFuY2llbnQgZ3J1ZGdlIGJyZWFrIHRvIG5ldyBtdXRpbnksCiAgICBXaGVyZSBjaXZpbCBibG9vZCBtYWtlcyBjaXZpbCBoYW5kcyB1bmNsZWFuLgogICAgRnJvbSBmb3J0aCB0aGUgZmF0YWwgbG9pbnMgb2YgdGhlc2UgdHdvIGZvZXMKICAgIEEgcGFpciBvZiBzdGFyLWNyb3NzJ2QgbG92ZXJzIHRha2UgdGhlaXIgbGlmZTsKICAgIFdob3NlIG1pc2FkdmVudHVyZWQgcGl0ZW91cyBvdmVydGhyb3dzCiAgICBEbyB3aXRoIHRoZWlyIGRlYXRoIGJ1cnkgdGhlaXIgcGFyZW50cycgc3RyaWZlLgogICAgVGhlIGZlYXJmdWwgcGFzc2FnZSBvZiB0aGVpciBkZWF0aC1tYXJrJ2QgbG92ZSwKICAgIEFuZCB0aGUgY29udGludWFuY2Ugb2YgdGhlaXIgcGFyZW50cycgcmFnZSwKICAgIFdoaWNoLCBidXQgdGhlaXIgY2hpbGRyZW4ncyBlbmQsIG5vdWdodCBjb3VsZCByZW1vdmUsCiAgICBJcyBub3cgdGhlIHR3byBob3VycycgdHJhZmZpYyBvZiBvdXIgc3RhZ2U7CiAgICBUaGUgd2hpY2ggaWYgeW91IHdpdGggcGF0aWVudCBlYXJzIGF0dGVuZCwKICAgIFdoYXQgaGVyZSBzaGFsbCBtaXNzLCBvdXIgdG9pbCBzaGFsbCBzdHJpdmUgdG8gbWVuZC4KClNDRU5FIEkuIFZlcm9uYS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgU0FNUFNPTiBhbmQgR1JFR09SWSwgb2YgdGhlIGhvdXNlIG9mIENhcHVsZXQsIGFybWVkIHdpdGggc3dvcmRzIGFuZCBidWNrbGVycyAKClNBTVBTT04KCiAgICBHcmVnb3J5LCBvJyBteSB3b3JkLCB3ZSdsbCBub3QgY2FycnkgY29hbHMuCgpHUkVHT1JZCgogICAgTm8sIGZvciB0aGVuIHdlIHNob3VsZCBiZSBjb2xsaWVycy4KClNBTVBTT04KCiAgICBJIG1lYW4sIGFuIHdlIGJlIGluIGNob2xlciwgd2UnbGwgZHJhdy4KCkdSRUdPUlkKCiAgICBBeSwgd2hpbGUgeW91IGxpdmUsIGRyYXcgeW91ciBuZWNrIG91dCBvJyB0aGUgY29sbGFyLgoKU0FNUFNPTgoKICAgIEkgc3RyaWtlIHF1aWNrbHksIGJlaW5nIG1vdmVkLgoKR1JFR09SWQoKICAgIEJ1dCB0aG91IGFydCBub3QgcXVpY2tseSBtb3ZlZCB0byBzdHJpa2UuCgpTQU1QU09OCgogICAgQSBkb2cgb2YgdGhlIGhvdXNlIG9mIE1vbnRhZ3VlIG1vdmVzIG1lLgoKR1JFR09SWQoKICAgIFRvIG1vdmUgaXMgdG8gc3RpcjsgYW5kIHRvIGJlIHZhbGlhbnQgaXMgdG8gc3RhbmQ6CiAgICB0aGVyZWZvcmUsIGlmIHRob3UgYXJ0IG1vdmVkLCB0aG91IHJ1bm4nc3QgYXdheS4KClNBTVBTT04KCiAgICBBIGRvZyBvZiB0aGF0IGhvdXNlIHNoYWxsIG1vdmUgbWUgdG8gc3RhbmQ6IEkgd2lsbAogICAgdGFrZSB0aGUgd2FsbCBvZiBhbnkgbWFuIG9yIG1haWQgb2YgTW9udGFndWUncy4KCkdSRUdPUlkKCiAgICBUaGF0IHNob3dzIHRoZWUgYSB3ZWFrIHNsYXZlOyBmb3IgdGhlIHdlYWtlc3QgZ29lcwogICAgdG8gdGhlIHdhbGwuCgpTQU1QU09OCgogICAgVHJ1ZTsgYW5kIHRoZXJlZm9yZSB3b21lbiwgYmVpbmcgdGhlIHdlYWtlciB2ZXNzZWxzLAogICAgYXJlIGV2ZXIgdGhydXN0IHRvIHRoZSB3YWxsOiB0aGVyZWZvcmUgSSB3aWxsIHB1c2gKICAgIE1vbnRhZ3VlJ3MgbWVuIGZyb20gdGhlIHdhbGwsIGFuZCB0aHJ1c3QgaGlzIG1haWRzCiAgICB0byB0aGUgd2FsbC4KCkdSRUdPUlkKCiAgICBUaGUgcXVhcnJlbCBpcyBiZXR3ZWVuIG91ciBtYXN0ZXJzIGFuZCB1cyB0aGVpciBtZW4uCgpTQU1QU09OCgogICAgJ1RpcyBhbGwgb25lLCBJIHdpbGwgc2hvdyBteXNlbGYgYSB0eXJhbnQ6IHdoZW4gSQogICAgaGF2ZSBmb3VnaHQgd2l0aCB0aGUgbWVuLCBJIHdpbGwgYmUgY3J1ZWwgd2l0aCB0aGUKICAgIG1haWRzLCBhbmQgY3V0IG9mZiB0aGVpciBoZWFkcy4KCkdSRUdPUlkKCiAgICBUaGUgaGVhZHMgb2YgdGhlIG1haWRzPwoKU0FNUFNPTgoKICAgIEF5LCB0aGUgaGVhZHMgb2YgdGhlIG1haWRzLCBvciB0aGVpciBtYWlkZW5oZWFkczsKICAgIHRha2UgaXQgaW4gd2hhdCBzZW5zZSB0aG91IHdpbHQuCgpHUkVHT1JZCgogICAgVGhleSBtdXN0IHRha2UgaXQgaW4gc2Vuc2UgdGhhdCBmZWVsIGl0LgoKU0FNUFNPTgoKICAgIE1lIHRoZXkgc2hhbGwgZmVlbCB3aGlsZSBJIGFtIGFibGUgdG8gc3RhbmQ6IGFuZAogICAgJ3RpcyBrbm93biBJIGFtIGEgcHJldHR5IHBpZWNlIG9mIGZsZXNoLgoKR1JFR09SWQoKICAgICdUaXMgd2VsbCB0aG91IGFydCBub3QgZmlzaDsgaWYgdGhvdSBoYWRzdCwgdGhvdQogICAgaGFkc3QgYmVlbiBwb29yIEpvaG4uIERyYXcgdGh5IHRvb2whIGhlcmUgY29tZXMKICAgIHR3byBvZiB0aGUgaG91c2Ugb2YgdGhlIE1vbnRhZ3Vlcy4KClNBTVBTT04KCiAgICBNeSBuYWtlZCB3ZWFwb24gaXMgb3V0OiBxdWFycmVsLCBJIHdpbGwgYmFjayB0aGVlLgoKR1JFR09SWQoKICAgIEhvdyEgdHVybiB0aHkgYmFjayBhbmQgcnVuPwoKU0FNUFNPTgoKICAgIEZlYXIgbWUgbm90LgoKR1JFR09SWQoKICAgIE5vLCBtYXJyeTsgSSBmZWFyIHRoZWUhCgpTQU1QU09OCgogICAgTGV0IHVzIHRha2UgdGhlIGxhdyBvZiBvdXIgc2lkZXM7IGxldCB0aGVtIGJlZ2luLgoKR1JFR09SWQoKICAgIEkgd2lsbCBmcm93biBhcyBJIHBhc3MgYnksIGFuZCBsZXQgdGhlbSB0YWtlIGl0IGFzCiAgICB0aGV5IGxpc3QuCgpTQU1QU09OCgogICAgTmF5LCBhcyB0aGV5IGRhcmUuIEkgd2lsbCBiaXRlIG15IHRodW1iIGF0IHRoZW07CiAgICB3aGljaCBpcyBhIGRpc2dyYWNlIHRvIHRoZW0sIGlmIHRoZXkgYmVhciBpdC4KCiAgICBFbnRlciBBQlJBSEFNIGFuZCBCQUxUSEFTQVIKCkFCUkFIQU0KCiAgICBEbyB5b3UgYml0ZSB5b3VyIHRodW1iIGF0IHVzLCBzaXICgpTQU1QU09OCgogICAgSSBkbyBiaXRlIG15IHRodW1iLCBzaXIuCgpBQlJBSEFNCgogICAgRG8geW91IGJpdGUgeW91ciB0aHVtYiBhdCB1cywgc2lyPwoKU0FNUFNPTgoKICAgIFtBc2lkZSB0byBHUkVHT1JZXSBJcyB0aGUgbGF3IG9mIG91ciBzaWRlLCBpZiBJIHNheQogICAgYXkCgpHUkVHT1JZCgogICAgTm8uCgpTQU1QU09OCgogICAgTm8sIHNpciwgSSBkbyBub3QgYml0ZSBteSB0aHVtYiBhdCB5b3UsIHNpciwgYnV0IEkKICAgIGJpdGUgbXkgdGh1bWIsIHNpci4KCkdSRUdPUlkKCiAgICBEbyB5b3UgcXVhcnJlbCwgc2lyPwoKQUJSQUhBTQoKICAgIFF1YXJyZWwgc2lyISBubywgc2lyLgoKU0FNUFNPTgoKICAgIElmIHlvdSBkbywgc2lyLCBJIGFtIGZvciB5b3U6IEkgc2VydmUgYXMgZ29vZCBhIG1hbiBhcyB5b3UuCgpBQlJBSEFNCgogICAgTm8gYmV0dGVyLgoKU0FNUFNPTgoKICAgIFdlbGwsIHNpci4KCkdSRUdPUlkKCiAgICBTYXkgJ2JldHRlcjonIGhlcmUgY29tZXMgb25lIG9mIG15IG1hc3RlcidzIGtpbnNtZW4uCgpTQU1QU09OCgogICAgWWVzLCBiZXR0ZXIsIHNpci4KCkFCUkFIQU0KCiAgICBZb3UgbGllLgoKU0FNUFNPTgoKICAgIERyYXcsIGlmIHlvdSBiZSBtZW4uIEdyZWdvcnksIHJlbWVtYmVyIHRoeSBzd2FzaGluZyBibG93LgoKICAgIFRoZXkgZmlnaHQKCiAgICBFbnRlciBCRU5WT0xJTwoKQkVOVk9MSU8KCiAgICBQYXJ0LCBmb29scyEKICAgIFB1dCB1cCB5b3VyIHN3b3JkczsgeW91IGtub3cgbm90IHdoYXQgeW91IGRvLgoKICAgIEJlYXRzIGRvd24gdGhlaXIgc3dvcmRzCgogICAgRW50ZXIgVFlCQUxUCgpUWUJBTFQKCiAgICBXaGF0LCBhcnQgdGhvdSBkcmF3biBhbW9uZyB0aGVzZSBoZWFydGxlc3MgaGluZHMCiAgICBUdXJuIHRoZWUsIEJlbnZvbGlvLCBsb29rIHVwb24gdGh5IGRlYXRoLgoKQkVOVk9MSU8KCiAgICBJIGRvIGJ1dCBrZWVwIHRoZSBwZWFjZTogcHV0IHVwIHRoeSBzd29yZCwKICAgIE9yIG1hbmFnZSBpdCB0byBwYXJ0IHRoZXNlIG1lbiB3aXRoIG1lLgoKVFlCQUxUCgogICAgV2hhdCwgZHJhd24sIGFuZCB0YWxrIG9mIHBlYWNlISBJIGhhdGUgdGhlIHdvcmQsCiAgICBBcyBJIGhhdGUgaGVsbCwgYWxsIE1vbnRhZ3VlcywgYW5kIHRoZWU6CiAgICBIYXZlIGF0IHRoZWUsIGNvd2FyZCEKCiAgICBUaGV5IGZpZ2h0CgogICAgRW50ZXIsIHNldmVyYWwgb2YgYm90aCBob3VzZXMsIHdobyBqb2luIHRoZSBmcmF5OyB0aGVuIGVudGVyIENpdGl6ZW5zLCB3aXRoIGNsdWJzCgpGaXJzdCBDaXRpemVuCgogICAgQ2x1YnMsIGJpbGxzLCBhbmQgcGFydGlzYW5zISBzdHJpa2UhIGJlYXQgdGhlbSBkb3duIQogICAgRG93biB3aXRoIHRoZSBDYXB1bGV0cyEgZG93biB3aXRoIHRoZSBNb250YWd1ZXMhCgogICAgRW50ZXIgQ0FQVUxFVCBpbiBoaXMgZ293biwgYW5kIExBRFkgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgdGhpcz8gR2l2ZSBtZSBteSBsb25nIHN3b3JkLCBobyEKCkxBRFkgQ0FQVUxFVAoKICAgIEEgY3J1dGNoLCBhIGNydXRjaCEgd2h5IGNhbGwgeW91IGZvciBhIHN3b3JkPwoKQ0FQVUxFVAoKICAgIE15IHN3b3JkLCBJIHNheSEgT2xkIE1vbnRhZ3VlIGlzIGNvbWUsCiAgICBBbmQgZmxvdXJpc2hlcyBoaXMgYmxhZGUgaW4gc3BpdGUgb2YgbWUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIExBRFkgTU9OVEFHVUUKCk1PTlRBR1VFCgogICAgVGhvdSB2aWxsYWluIENhcHVsZXQsLS1Ib2xkIG1lIG5vdCwgbGV0IG1lIGdvLgoKTEFEWSBNT05UQUdVRQoKICAgIFRob3Ugc2hhbHQgbm90IHN0aXIgYSBmb290IHRvIHNlZWsgYSBmb2UuCgogICAgRW50ZXIgUFJJTkNFLCB3aXRoIEF0dGVuZGFudHMKClBSSU5DRQoKICAgIFJlYmVsbGlvdXMgc3ViamVjdHMsIGVuZW1pZXMgdG8gcGVhY2UsCiAgICBQcm9mYW5lcnMgb2YgdGhpcyBuZWlnaGJvdXItc3RhaW5lZCBzdGVlbCwtLQogICAgV2lsbCB0aGV5IG5vdCBoZWFyPyBXaGF0LCBobyEgeW91IG1lbiwgeW91IGJlYXN0cywKICAgIFRoYXQgcXVlbmNoIHRoZSBmaXJlIG9mIHlvdXIgcGVybmljaW91cyByYWdlCiAgICBXaXRoIHB1cnBsZSBmb3VudGFpbnMgaXNzdWluZyBmcm9tIHlvdXIgdmVpbnMsCiAgICBPbiBwYWluIG9mIHRvcnR1cmUsIGZyb20gdGhvc2UgYmxvb2R5IGhhbmRzCiAgICBUaHJvdyB5b3VyIG1pc3RlbXBlcidkIHdlYXBvbnMgdG8gdGhlIGdyb3VuZCwKICAgIEFuZCBoZWFyIHRoZSBzZW50ZW5jZSBvZiB5b3VyIG1vdmVkIHByaW5jZS4KICAgIFRocmVlIGNpdmlsIGJyYXdscywgYnJlZCBvZiBhbiBhaXJ5IHdvcmQsCiAgICBCeSB0aGVlLCBvbGQgQ2FwdWxldCwgYW5kIE1vbnRhZ3VlLAogICAgSGF2ZSB0aHJpY2UgZGlzdHVyYidkIHRoZSBxdWlldCBvZiBvdXIgc3RyZWV0cywKICAgIEFuZCBtYWRlIFZlcm9uYSdzIGFuY2llbnQgY2l0aXplbnMKICAgIENhc3QgYnkgdGhlaXIgZ3JhdmUgYmVzZWVtaW5nIG9ybmFtZW50cywKICAgIFRvIHdpZWxkIG9sZCBwYXJ0aXNhbnMsIGluIGhhbmRzIGFzIG9sZCwKICAgIENhbmtlcidkIHdpdGggcGVhY2UsIHRvIHBhcnQgeW91ciBjYW5rZXInZCBoYXRlOgogICAgSWYgZXZlciB5b3UgZGlzdHVyYiBvdXIgc3RyZWV0cyBhZ2FpbiwKICAgIFlvdXIgbGl2ZXMgc2hhbGwgcGF5IHRoZSBmb3JmZWl0IG9mIHRoZSBwZWFjZS4KICAgIEZvciB0aGlzIHRpbWUsIGFsbCB0aGUgcmVzdCBkZXBhcnQgYXdheToKICAgIFlvdSBDYXB1bGV0OyBzaGFsbCBnbyBhbG9uZyB3aXRoIG1lOgogICAgQW5kLCBNb250YWd1ZSwgY29tZSB5b3UgdGhpcyBhZnRlcm5vb24sCiAgICBUbyBrbm93IG91ciBmdXJ0aGVyIHBsZWFzdXJlIGluIHRoaXMgY2FzZSwKICAgIFRvIG9sZCBGcmVlLXRvd24sIG91ciBjb21tb24ganVkZ21lbnQtcGxhY2UuCiAgICBPbmNlIG1vcmUsIG9uIHBhaW4gb2YgZGVhdGgsIGFsbCBtZW4gZGVwYXJ0LgoKICAgIEV4ZXVudCBhbGwgYnV0IE1PTlRBR1VFLCBMQURZIE1PTlRBR1VFLCBhbmQgQkVOVk9MSU8KCk1PTlRBR1VFCgogICAgV2hvIHNldCB0aGlzIGFuY2llbnQgcXVhcnJlbCBuZXcgYWJyb2FjaD8KICAgIFNwZWFrLCBuZXBoZXcsIHdlcmUgeW91IGJ5IHdoZW4gaXQgYmVnYW4CgpCRU5WT0xJTwoKICAgIEhlcmUgd2VyZSB0aGUgc2VydmFudHMgb2YgeW91ciBhZHZlcnNhcnksCiAgICBBbmQgeW91cnMsIGNsb3NlIGZpZ2h0aW5nIGVyZSBJIGRpZCBhcHByb2FjaDoKICAgIEkgZHJldyB0byBwYXJ0IHRoZW06IGluIHRoZSBpbnN0YW50IGNhbWUKICAgIFRoZSBmaWVyeSBUeWJhbHQsIHdpdGggaGlzIHN3b3JkIHByZXBhcmVkLAogICAgV2hpY2gsIGFzIGhlIGJyZWF0aGVkIGRlZmlhbmNlIHRvIG15IGVhcnMsCiAgICBIZSBzd3VuZyBhYm91dCBoaXMgaGVhZCBhbmQgY3V0IHRoZSB3aW5kcywKICAgIFdobyBub3RoaW5nIGh1cnQgd2l0aGFsIGhpc3MnZCBoaW0gaW4gc2Nvcm46CiAgICBXaGlsZSB3ZSB3ZXJlIGludGVyY2hhbmdpbmcgdGhydXN0cyBhbmQgYmxvd3MsCiAgICBDYW1lIG1vcmUgYW5kIG1vcmUgYW5kIGZvdWdodCBvbiBwYXJ0IGFuZCBwYXJ0LAogICAgVGlsbCB0aGUgcHJpbmNlIGNhbWUsIHdobyBwYXJ0ZWQgZWl0aGVyIHBhcnQuCgpMQURZIE1PTlRBR1VFCgogICAgTywgd2hlcmUgaXMgUm9tZW8IHNhdyB5b3UgaGltIHRvLWRheT8KICAgIFJpZ2h0IGdsYWQgSSBhbSBoZSB3YXMgbm90IGF0IHRoaXMgZnJheS4KCkJFTlZPTElPCgogICAgTWFkYW0sIGFuIGhvdXIgYmVmb3JlIHRoZSB3b3JzaGlwcCdkIHN1bgogICAgUGVlcidkIGZvcnRoIHRoZSBnb2xkZW4gd2luZG93IG9mIHRoZSBlYXN0LAogICAgQSB0cm91YmxlZCBtaW5kIGRyYXZlIG1lIHRvIHdhbGsgYWJyb2FkOwogICAgV2hlcmUsIHVuZGVybmVhdGggdGhlIGdyb3ZlIG9mIHN5Y2Ftb3JlCiAgICBUaGF0IHdlc3R3YXJkIHJvb3RldGggZnJvbSB0aGUgY2l0eSdzIHNpZGUsCiAgICBTbyBlYXJseSB3YWxraW5nIGRpZCBJIHNlZSB5b3VyIHNvbjoKICAgIFRvd2FyZHMgaGltIEkgbWFkZSwgYnV0IGhlIHdhcyB3YXJlIG9mIG1lCiAgICBBbmQgc3RvbGUgaW50byB0aGUgY292ZXJ0IG9mIHRoZSB3b29kOgogICAgSSwgbWVhc3VyaW5nIGhpcyBhZmZlY3Rpb25zIGJ5IG15IG93biwKICAgIFRoYXQgbW9zdCBhcmUgYnVzaWVkIHdoZW4gdGhleSdyZSBtb3N0IGFsb25lLAogICAgUHVyc3VlZCBteSBodW1vdXIgbm90IHB1cnN1aW5nIGhpcywKICAgIEFuZCBnbGFkbHkgc2h1bm4nZCB3aG8gZ2xhZGx5IGZsZWQgZnJvbSBtZS4KCk1PTlRBR1VFCgogICAgTWFueSBhIG1vcm5pbmcgaGF0aCBoZSB0aGVyZSBiZWVuIHNlZW4sCiAgICBXaXRoIHRlYXJzIGF1Z21lbnRpbmcgdGhlIGZyZXNoIG1vcm5pbmcgZGV3LgogICAgQWRkaW5nIHRvIGNsb3VkcyBtb3JlIGNsb3VkcyB3aXRoIGhpcyBkZWVwIHNpZ2hzOwogICAgQnV0IGFsbCBzbyBzb29uIGFzIHRoZSBhbGwtY2hlZXJpbmcgc3VuCiAgICBTaG91bGQgaW4gdGhlIGZ1cnRoZXN0IGVhc3QgYmVnaW4gdG8gZHJhdwogICAgVGhlIHNoYWR5IGN1cnRhaW5zIGZyb20gQXVyb3JhJ3MgYmVkLAogICAgQXdheSBmcm9tIHRoZSBsaWdodCBzdGVhbHMgaG9tZSBteSBoZWF2eSBzb24sCiAgICBBbmQgcHJpdmF0ZSBpbiBoaXMgY2hhbWJlciBwZW5zIGhpbXNlbGYsCiAgICBTaHV0cyB1cCBoaXMgd2luZG93cywgbG9ja3MgZmFyIGRheWxpZ2h0IG91dAogICAgQW5kIG1ha2VzIGhpbXNlbGYgYW4gYXJ0aWZpY2lhbCBuaWdodDoKICAgIEJsYWNrIGFuZCBwb3J0ZW50b3VzIG11c3QgdGhpcyBodW1vdXIgcHJvdmUsCiAgICBVbmxlc3MgZ29vZCBjb3Vuc2VsIG1heSB0aGUgY2F1c2UgcmVtb3ZlLgoKQkVOVk9MSU8KCiAgICBNeSBub2JsZSB1bmNsZSwgZG8geW91IGtub3cgdGhlIGNhdXNlPwoKTU9OVEFHVUUKCiAgICBJIG5laXRoZXIga25vdyBpdCBub3IgY2FuIGxlYXJuIG9mIGhpbS4KCkJFTlZPTElPCgogICAgSGF2ZSB5b3UgaW1wb3J0dW5lZCBoaW0gYnkgYW55IG1lYW5zPwoKTU9OVEFHVUUKCiAgICBCb3RoIGJ5IG15c2VsZiBhbmQgbWFueSBvdGhlciBmcmllbmRzOgogICAgQnV0IGhlLCBoaXMgb3duIGFmZmVjdGlvbnMnIGNvdW5zZWxsb3IsCiAgICBJcyB0byBoaW1zZWxmLS1JIHdpb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UVPCgogICAgR29vZCBoZWFydCwgYXQgd2hhdD8KCkJFTlZPTElPCgogICAgQXQgdGh5IGdvb2QgaGVhcnQncyBvcHByZXNzaW9uLgoKUk9NRU8KCiAgICBXaHksIHN1Y2ggaXMgbG92ZSdzIHRyYW5zZ3Jlc3Npb24uCiAgICBHcmllZnMgb2YgbWluZSBvd24gbGllIGhlYXZ5IGluIG15IGJyZWFzdCwKICAgIFdoaWNoIHRob3Ugd2lsdCBwcm9wYWdhdGUsIHRvIGhhdmUgaXQgcHJlc3QKICAgIFdpdGggbW9yZSBvZiB0aGluZTogdGhpcyBsb3ZlIHRoYXQgdGhvdSBoYXN0IHNob3duCiAgICBEb3RoIGFkZCBtb3JlIGdyaWVmIHRvIHRvbyBtdWNoIG9mIG1pbmUgb3duLgogICAgTG92ZSBpcyBhIHNtb2tlIHJhaXNlZCB3aXRoIHRoZSBmdW1lIG9mIHNpZ2hzOwogICAgQmVpbmcgcHVyZ2VkLCBhIGZpcmUgc3BhcmtsaW5nIGluIGxvdmVycycgZXllczsKICAgIEJlaW5nIHZleCdkIGEgc2VhIG5vdXJpc2gnZCB3aXRoIGxvdmVycycgdGVhcnM6CiAgICBXaGF0IGlzIGl0IGVsc2UIGEgbWFkbmVzcyBtb3N0IGRpc2NyZWV0LAogICAgQSBjaG9raW5nIGdhbGwgYW5kIGEgcHJlc2VydmluZyBzd2VldC4KICAgIEZhcmV3ZWxsLCBteSBjb3ouCgpCRU5WT0xJTwoKICAgIFNvZnQhIEkgd2lsbCBnbyBhbG9uZzsKICAgIEFuIGlmIHlvdSBsZWF2ZSBtZSBzbywgeW91IGRvIG1lIHdyb25nLgoKUk9NRU8KCiAgICBUdXQsIEkgaGF2ZSBsb3N0IG15c2VsZjsgSSBhbSBub3QgaGVyZTsKICAgIFRoaXMgaXMgbm90IFJvbWVvLCBoZSdzIHNvbWUgb3RoZXIgd2hlcmUuCgpCRU5WT0xJTwoKICAgIFRlbGwgbWUgaW4gc2FkbmVzcywgd2hvIGlzIHRoYXQgeW91IGxvdmUuCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIEkgZ3JvYW4gYW5kIHRlbGwgdGhlZT8KCkJFTlZPTElPCgogICAgR3JvYW4hIHdoeSwgbm8uCiAgICBCdXQgc2FkbHkgdGVsbCBtZSB3aG8uCgpST01FTwoKICAgIEJpZCBhIHNpY2sgbWFuIGluIHNhZG5lc3MgbWFrZSBoaXMgd2lsbDoKICAgIEFoLCB3b3JkIGlsbCB1cmdlZCB0byBvbmUgdGhhdCBpcyBzbyBpbGwhCiAgICBJbiBzYWRuZXNzLCBjb3VzaW4sIEkgZG8gbG92ZSBhIHdvbWFuLgoKQkVOVk9MSU8KCiAgICBJIGFpbSdkIHNvIG5lYXIsIHdoZW4gSSBzdXBwb3NlZCB5b3UgbG92ZWQuCgpST01FTwoKICAgIEEgcmlnaHQgZ29vZCBtYXJrLW1hbiEgQW5kIHNoZSdzIGZhaXIgSSBsb3ZlLgoKQkVOVk9MSU8KCiAgICBBIHJpZ2h0IGZhaXIgbWFyaywgZmFpciBjb3osIGlzIHNvb25lc3QgaGl0LgoKUk9NRU8KCiAgICBXZWxsLCBpbiB0aGF0IGhpdCB5b3UgbWlzczogc2hlJ2xsIG5vdCBiZSBoaXQKICAgIFdpdGggQ3VwaWQncyBhcnJvdzsgc2hlIGhhdGggRGlhbidzIHdpdDsKICAgIEFuZCwgaW4gc3Ryb25nIHByb29mIG9mIGNoYXN0aXR5IHdlbGwgYXJtJ2QsCiAgICBGcm9tIGxvdmUncyB3ZWFrIGNoaWxkaXNoIGJvdyBzaGUgbGl2ZXMgdW5oYXJtJ2QuCiAgICBTaGUgd2lsbCBub3Qgc3RheSB0aGUgc2llZ2Ugb2YgbG92aW5nIHRlcm1zLAogICAgTm9yIGJpZGUgdGhlIGVuY291bnRlciBvZiBhc3NhaWxpbmcgZXllcywKICAgIE5vciBvcGUgaGVyIGxhcCB0byBzYWludC1zZWR1Y2luZyBnb2xkOgogICAgTywgc2hlIGlzIHJpY2ggaW4gYmVhdXR5LCBvbmx5IHBvb3IsCiAgICBUaGF0IHdoZW4gc2hlIGRpZXMgd2l0aCBiZWF1dHkgZGllcyBoZXIgc3RvcmUuCgpCRU5WT0xJTwoKICAgIFRoZW4gc2hlIGhhdGggc3dvcm4gdGhhdCBzaGUgd2lsbCBzdGlsbCBsaXZlIGNoYXN0ZT8KClJPTUVPCgogICAgU2hlIGhhdGgsIGFuZCBpbiB0aGF0IHNwYXJpbmcgbWFrZXMgaHVnZSB3YXN0ZSwKICAgIEZvciBiZWF1dHkgc3RhcnZlZCB3aXRoIGhlciBzZXZlcml0eQogICAgQ3V0cyBiZWF1dHkgb2ZmIGZyb20gYWxsIHBvc3Rlcml0eS4KICAgIFNoZSBpcyB0b28gZmFpciwgdG9vIHdpc2UsIHdpc2VseSB0b28gZmFpciwKICAgIFRvIG1lcml0IGJsaXNzIGJ5IG1ha2luZyBtZSBkZXNwYWlyOgogICAgU2hlIGhhdGggZm9yc3dvcm4gdG8gbG92ZSwgYW5kIGluIHRoYXQgdm93CiAgICBEbyBJIGxpdmUgZGVhZCB0aGF0IGxpdmUgdG8gdGVsbCBpdCBub3cuCgpCRU5WT0xJTwoKICAgIEJlIHJ1bGVkIGJ5IG1lLCBmb3JnZXQgdG8gdGhpbmsgb2YgaGVyLgoKUk9NRU8KCiAgICBPLCB0ZWFjaCBtZSBob3cgSSBzaG91bGQgZm9yZ2V0IHRvIHRoaW5rLgoKQkVOVk9MSU8KCiAgICBCeSBnaXZpbmcgbGliZXJ0eSB1bnRvIHRoaW5lIGV5ZXM7CiAgICBFeGFtaW5lIG90aGVyIGJlYXV0aWVzLgoKUk9NRU8KCiAgICAnVGlzIHRoZSB3YXkKICAgIFRvIGNhbGwgaGVycyBleHF1aXNpdGUsIGluIHF1ZXN0aW9uIG1vcmU6CiAgICBUaGVzZSBoYXBweSBtYXNrcyB0aGF0IGtpc3MgZmFpciBsYWRpZXMnIGJyb3dzCiAgICBCZWluZyBibGFjayBwdXQgdXMgaW4gbWluZCB0aGV5IGhpZGUgdGhlIGZhaXI7CiAgICBIZSB0aGF0IGlzIHN0cnVja2VuIGJsaW5kIGNhbm5vdCBmb3JnZXQKICAgIFRoZSBwcmVjaW91cyB0cmVhc3VyZSBvZiBoaXMgZXllc2lnaHQgbG9zdDoKICAgIFNob3cgbWUgYSBtaXN0cmVzcyB0aGF0IGlzIHBhc3NpbmcgZmFpciwKICAgIFdoYXQgZG90aCBoZXIgYmVhdXR5IHNlcnZlLCBidXQgYXMgYSBub3RlCiAgICBXaGVyZSBJIG1heSByZWFkIHdobyBwYXNzJ2QgdGhhdCBwYXNzaW5nIGZhaXICiAgICBGYXJld2VsbDogdGhvdSBjYW5zdCBub3QgdGVhY2ggbWUgdG8gZm9yZ2V0LgoKQkVOVk9MSU8KCiAgICBJJ2xsIHBheSB0aGF0IGRvY3RyaW5lLCBvciBlbHNlIGRpZSBpbiBkZWJ0LgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEEgc3RyZWV0LgoKICAgIEVudGVyIENBUFVMRVQsIFBBUklTLCBhbmQgU2VydmFudCAKCkNBUFVMRVQKCiAgICBCdXQgTW9udGFndWUgaXMgYm91bmQgYXMgd2VsbCBhcyBJLAogICAgSW4gcGVuYWx0eSBhbGlrZTsgYW5kICd0aXMgbm90IGhhcmQsIEkgdGhpbmssCiAgICBGb3IgbWVuIHNvIG9sZCBhcyB3ZSB0byBrZWVwIHRoZSBwZWFjZS4KClBBUklTCgogICAgT2YgaG9ub3VyYWJsZSByZWNrb25pbmcgYXJlIHlvdSBib3RoOwogICAgQW5kIHBpdHkgJ3RpcyB5b3UgbGl2ZWQgYXQgb2RkcyBzbyBsb25nLgogICAgQnV0IG5vdywgbXkgbG9yZCwgd2hhdCBzYXkgeW91IHRvIG15IHN1aXQCgpDQVBVTEVUCgogICAgQnV0IHNheWluZyBvJ2VyIHdoYXQgSSBoYXZlIHNhaWQgYmVmb3JlOgogICAgTXkgY2hpbGQgaXMgeWV0IGEgc3RyYW5nZXIgaW4gdGhlIHdvcmxkOwogICAgU2hlIGhhdGggbm90IHNlZW4gdGhlIGNoYW5nZSBvZiBmb3VydGVlbiB5ZWFycywKICAgIExldCB0d28gbW9yZSBzdW1tZXJzIHdpdGhlciBpbiB0aGVpciBwcmlkZSwKICAgIEVyZSB3ZSBtYXkgdGhpbmsgaGVyIHJpcGUgdG8gYmUgYSBicmlkZS4KClBBUklTCgogICAgWW91bmdlciB0aGFuIHNoZSBhcmUgaGFwcHkgbW90aGVycyBtYWRlLgoKQ0FQVUxFVAoKICAgIEFuZCB0b28gc29vbiBtYXJyJ2QgYXJlIHRob3NlIHNvIGVhcmx5IG1hZGUuCiAgICBUaGUgZWFydGggaGF0aCBzd2FsbG93J2QgYWxsIG15IGhvcGVzIGJ1dCBzaGUsCiAgICBTaGUgaXMgdGhlIGhvcGVmdWwgbGFkeSBvZiBteSBlYXJ0aDoKICAgIEJ1dCB3b28gaGVyLCBnZW50bGUgUGFyaXMsIGdldCBoZXIgaGVhcnQsCiAgICBNeSB3aWxsIHRvIGhlciBjb25zZW50IGlzIGJ1dCBhIHBhcnQ7CiAgICBBbiBzaGUgYWdyZWUsIHdpdGhpbiBoZXIgc2NvcGUgb2YgY2hvaWNlCiAgICBMaWVzIG15IGNvbnNlbnQgYW5kIGZhaXIgYWNjb3JkaW5nIHZvaWNlLgogICAgVGhpcyBuaWdodCBJIGhvbGQgYW4gb2xkIGFjY3VzdG9tJ2QgZmVhc3QsCiAgICBXaGVyZXRvIEkgaGF2ZSBpbnZpdGVkIG1hbnkgYSBndWVzdCwKICAgIFN1Y2ggYXMgSSBsb3ZlOyBhbmQgeW91LCBhbW9uZyB0aGUgc3RvcmUsCiAgICBPbmUgbW9yZSwgbW9zdCB3ZWxjb21lLCBtYWtlcyBteSBudW1iZXIgbW9yZS4KICAgIEF0IG15IHBvb3IgaG91c2UgbG9vayB0byBiZWhvbGQgdGhpcyBuaWdodAogICAgRWFydGgtdHJlYWRpbmcgc3RhcnMgdGhhdCBtYWtlIGRhcmsgaGVhdmVuIGxpZ2h0OgogICAgU3VjaCBjb21mb3J0IGFzIGRvIGx1c3R5IHlvdW5nIG1lbiBmZWVsCiAgICBXaGVuIHdlbGwtYXBwYXJlbGwnZCBBcHJpbCBvbiB0aGUgaGVlbAogICAgT2YgbGltcGluZyB3aW50ZXIgdHJlYWRzLCBldmVuIHN1Y2ggZGVsaWdodAogICAgQW1vbmcgZnJlc2ggZmVtYWxlIGJ1ZHMgc2hhbGwgeW91IHRoaXMgbmlnaHQKICAgIEluaGVyaXQgYXQgbXkgaG91c2U7IGhlYXIgYWxsLCBhbGwgc2VlLAogICAgQW5kIGxpa2UgaGVyIG1vc3Qgd2hvc2UgbWVyaXQgbW9zdCBzaGFsbCBiZToKICAgIFdoaWNoIG9uIG1vcmUgdmlldywgb2YgbWFueSBtaW5lIGJlaW5nIG9uZQogICAgTWF5IHN0YW5kIGluIG51bWJlciwgdGhvdWdoIGluIHJlY2tvbmluZyBub25lLAogICAgQ29tZSwgZ28gd2l0aCBtZS4KCiAgICBUbyBTZXJ2YW50LCBnaXZpbmcgYSBwYXBlcgogICAgR28sIHNpcnJhaCwgdHJ1ZGdlIGFib3V0CiAgICBUaHJvdWdoIGZhaXIgVmVyb25hOyBmaW5kIHRob3NlIHBlcnNvbnMgb3V0CiAgICBXaG9zZSBuYW1lcyBhcmUgd3JpdHRlbiB0aGVyZSwgYW5kIHRvIHRoZW0gc2F5LAogICAgTXkgaG91c2UgYW5kIHdlbGNvbWUgb24gdGhlaXIgcGxlYXN1cmUgc3RheS4KCiAgICBFeGV1bnQgQ0FQVUxFVCBhbmQgUEFSSVMKClNlcnZhbnQKCiAgICBGaW5kIHRoZW0gb3V0IHdob3NlIG5hbWVzIGFyZSB3cml0dGVuIGhlcmUhIEl0IGlzCiAgICB3cml0dGVuLCB0aGF0IHRoZSBzaG9lbWFrZXIgc2hvdWxkIG1lZGRsZSB3aXRoIGhpcwogICAgeWFyZCwgYW5kIHRoZSB0YWlsb3Igd2l0aCBoaXMgbGFzdCwgdGhlIGZpc2hlciB3aXRoCiAgICBoaXMgcGVuY2lsLCBhbmQgdGhlIHBhaW50ZXIgd2l0aCBoaXMgbmV0czsgYnV0IEkgYW0KICAgIHNlbnQgdG8gZmluZCB0aG9zZSBwZXJzb25zIHdob3NlIG5hbWVzIGFyZSBoZXJlCiAgICB3cml0LCBhbmQgY2FuIG5ldmVyIGZpbmQgd2hhdCBuYW1lcyB0aGUgd3JpdGluZwogICAgcGVyc29uIGhhdGggaGVyZSB3cml0LiBJIG11c3QgdG8gdGhlIGxlYXJuZWQuLS1JbiBnb29kIHRpbWUuCgogICAgRW50ZXIgQkVOVk9MSU8gYW5kIFJPTUVPCgpCRU5WT0xJTwoKICAgIFR1dCwgbWFuLCBvbmUgZmlyZSBidXJucyBvdXQgYW5vdGhlcidzIGJ1cm5pbmcsCiAgICBPbmUgcGFpbiBpcyBsZXNzZW4nZCBieSBhbm90aGVyJ3MgYW5ndWlzaDsKICAgIFR1cm4gZ2lkZHksIGFuZCBiZSBob2xwIGJ5IGJhY2t3YXJkIHR1cm5pbmc7CiAgICBPbmUgZGVzcGVyYXRlIGdyaWVmIGN1cmVzIHdpdGggYW5vdGhlcidzIGxhbmd1aXNoOgogICAgVGFrZSB0aG91IHNvbWUgbmV3IGluZmVjdGlvbiB0byB0aHkgZXllLAogICAgQW5kIHRoZSByYW5rIHBvaXNvbiBvZiB0aGUgb2xkIHdpbGwgZGllLgoKUk9NRU8KCiAgICBZb3VyIHBsYWludGFpbi1sZWFmIGlzIGV4Y2VsbGVudCBmb3IgdGhhdC4KCkJFTlZPTElPCgogICAgRm9yIHdoYXQsIEkgcHJheSB0aGVlPwoKUk9NRU8KCiAgICBGb3IgeW91ciBicm9rZW4gc2hpbi4KCkJFTlZPTElPCgogICAgV2h5LCBSb21lbywgYXJ0IHRob3UgbWFkPwoKUk9NRU8KCiAgICBOb3QgbWFkLCBidXQgYm91bmQgbW9yZSB0aGFuIGEgbWFkLW1hbiBpczsKICAgIFNodXQgdXAgaW4gcHJpc29uLCBrZXB0IHdpdGhvdXQgbXkgZm9vZCwKICAgIFdoaXBwJ2QgYW5kIHRvcm1lbnRlZCBhbmQtLUdvZC1kZW4sIGdvb2QgZmVsbG93LgoKU2VydmFudAoKICAgIEdvZCBnaScgZ29kLWRlbi4gSSBwcmF5LCBzaXIsIGNhbiB5b3UgcmVhZD8KClJPTUVPCgogICAgQXksIG1pbmUgb3duIGZvcnR1bmUgaW4gbXkgbWlzZXJ5LgoKU2VydmFudAoKICAgIFBlcmhhcHMgeW91IGhhdmUgbGVhcm5lZCBpdCB3aXRob3V0IGJvb2s6IGJ1dCwgSQogICAgcHJheSwgY2FuIHlvdSByZWFkIGFueSB0aGluZyB5b3Ugc2VlPwoKUk9NRU8KCiAgICBBeSwgaWYgSSBrbm93IHRoZSBsZXR0ZXJzIGFuZCB0aGUgbGFuZ3VhZ2UuCgpTZXJ2YW50CgogICAgWWUgc2F5IGhvbmVzdGx5OiByZXN0IHlvdSBtZXJyeSEKClJPTUVPCgogICAgU3RheSwgZmVsbG93OyBJIGNhbiByZWFkLgoKICAgIFJlYWRzCiAgICAnU2lnbmlvciBNYXJ0aW5vIGFuZCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOwogICAgQ291bnR5IEFuc2VsbWUgYW5kIGhpcyBiZWF1dGVvdXMgc2lzdGVyczsgdGhlIGxhZHkKICAgIHdpZG93IG9mIFZpdHJhdmlvOyBTaWduaW9yIFBsYWNlbnRpbyBhbmQgaGlzIGxvdmVseQogICAgbmllY2VzOyBNZXJjdXRpbyBhbmQgaGlzIGJyb3RoZXIgVmFsZW50aW5lOyBtaW5lCiAgICB1bmNsZSBDYXB1bGV0LCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOyBteSBmYWlyIG5pZWNlCiAgICBSb3NhbGluZTsgTGl2aWE7IFNpZ25pb3IgVmFsZW50aW8gYW5kIGhpcyBjb3VzaW4KICAgIFR5YmFsdCwgTHVjaW8gYW5kIHRoZSBsaXZlbHkgSGVsZW5hLicgQSBmYWlyCiAgICBhc3NlbWJseTogd2hpdGhlciBzaG91bGQgdGhleSBjb21lPwoKU2VydmFudAoKICAgIFVwLgoKUk9NRU8KCiAgICBXaGl0aGVyPwoKU2VydmFudAoKICAgIFRvIHN1cHBlcjsgdG8gb3VyIGhvdXNlLgoKUk9NRU8KCiAgICBXaG9zZSBob3VzZT8KClNlcnZhbnQKCiAgICBNeSBtYXN0ZXIncy4KClJPTUVPCgogICAgSW5kZWVkLCBJIHNob3VsZCBoYXZlIGFzaydkIHlvdSB0aGF0IGJlZm9yZS4KClNlcnZhbnQKCiAgICBOb3cgSSdsbCB0ZWxsIHlvdSB3aXRob3V0IGFza2luZzogbXkgbWFzdGVyIGlzIHRoZQogICAgZ3JlYXQgcmljaCBDYXB1bGV0OyBhbmQgaWYgeW91IGJlIG5vdCBvZiB0aGUgaG91c2UKICAgIG9mIE1vbnRhZ3VlcywgSSBwcmF5LCBjb21lIGFuZCBjcnVzaCBhIGN1cCBvZiB3aW5lLgogICAgUmVzdCB5b3UgbWVycnkhCgogICAgRXhpdAoKQkVOVk9MSU8KCiAgICBBdCB0aGlzIHNhbWUgYW5jaWVudCBmZWFzdCBvZiBDYXB1bGV0J3MKICAgIFN1cHMgdGhlIGZhaXIgUm9zYWxpbmUgd2hvbSB0aG91IHNvIGxvdmVzdCwKICAgIFdpdGggYWxsIHRoZSBhZG1pcmVkIGJlYXV0aWVzIG9mIFZlcm9uYToKICAgIEdvIHRoaXRoZXI7IGFuZCwgd2l0aCB1bmF0dGFpbnRlZCBleWUsCiAgICBDb21wYXJlIGhlciBmYWNlIHdpdGggc29tZSB0aGF0IEkgc2hhbGwgc2hvdywKICAgIEFuZCBJIHdpbGwgbWFrZSB0aGVlIHRoaW5rIHRoeSBzd2FuIGEgY3Jvdy4KClJPTUVPCgogICAgV2hlbiB0aGUgZGV2b3V0IHJlbGlnaW9uIG9mIG1pbmUgZXllCiAgICBNYWludGFpbnMgc3VjaCBmYWxzZWhvb2QsIHRoZW4gdHVybiB0ZWFycyB0byBmaXJlczsKICAgIEFuZCB0aGVzZSwgd2hvIG9mdGVuIGRyb3duJ2QgY291bGQgbmV2ZXIgZGllLAogICAgVHJhbnNwYXJlbnQgaGVyZXRpY3MsIGJlIGJ1cm50IGZvciBsaWFycyEKICAgIE9uZSBmYWlyZXIgdGhhbiBteSBsb3ZlISB0aGUgYWxsLXNlZWluZyBzdW4KICAgIE5lJ2VyIHNhdyBoZXIgbWF0Y2ggc2luY2UgZmlyc3QgdGhlIHdvcmxkIGJlZ3VuLgoKQkVOVk9MSU8KCiAgICBUdXQsIHlvdSBzYXcgaGVyIGZhaXIsIG5vbmUgZWxzZSBiZWluZyBieSwKICAgIEhlcnNlbGYgcG9pc2VkIHdpdGggaGVyc2VsZiBpbiBlaXRoZXIgZXllOgogICAgQnV0IGluIHRoYXQgY3J5c3RhbCBzY2FsZXMgbGV0IHRoZXJlIGJlIHdlaWdoJ2QKICAgIFlvdXIgbGFkeSdzIGxvdmUgYWdhaW5zdCBzb21lIG90aGVyIG1haWQKICAgIFRoYXQgSSB3aWxsIHNob3cgeW91IHNoaW5pbmcgYXQgdGhpcyBmZWFzdCwKICAgIEFuZCBzaGUgc2hhbGwgc2NhbnQgc2hvdyB3ZWxsIHRoYXQgbm93IHNob3dzIGJlc3QuCgpST01FTwoKICAgIEknbGwgZ28gYWxvbmcsIG5vIHN1Y2ggc2lnaHQgdG8gYmUgc2hvd24sCiAgICBCdXQgdG8gcmVqb2ljZSBpbiBzcGxlbmRvciBvZiBtaW5lIG93bi4KCiAgICBFeGV1bnQKClNDRU5FIElJSS4gQSByb29tIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgTnVyc2UsIHdoZXJlJ3MgbXkgZGF1Z2h0ZXIIGNhbGwgaGVyIGZvcnRoIHRvIG1lLgoKTnVyc2UKCiAgICBOb3csIGJ5IG15IG1haWRlbmhlYWQsIGF0IHR3ZWx2ZSB5ZWFyIG9sZCwKICAgIEkgYmFkZSBoZXIgY29tZS4gV2hhdCwgbGFtYiEgd2hhdCwgbGFkeWJpcmQhCiAgICBHb2QgZm9yYmlkISBXaGVyZSdzIHRoaXMgZ2lybD8gV2hhdCwgSnVsaWV0IQoKICAgIEVudGVyIEpVTElFVAoKSlVMSUVUCgogICAgSG93IG5vdyEgd2hvIGNhbGxzPwoKTnVyc2UKCiAgICBZb3VyIG1vdGhlci4KCkpVTElFVAoKICAgIE1hZGFtLCBJIGFtIGhlcmUuCiAgICBXaGF0IGlzIHlvdXIgd2lsbD8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoaXMgaXMgdGhlIG1hdHRlcjotLU51cnNlLCBnaXZlIGxlYXZlIGF3aGlsZSwKICAgIFdlIG11c3QgdGFsayBpbiBzZWNyZXQ6LS1udXJzZSwgY29tZSBiYWNrIGFnYWluOwogICAgSSBoYXZlIHJlbWVtYmVyJ2QgbWUsIHRob3UncyBoZWFyIG91ciBjb3Vuc2VsLgogICAgVGhvdSBrbm93J3N0IG15IGRhdWdodGVyJ3Mgb2YgYSBwcmV0dHkgYWdlLgoKTnVyc2UKCiAgICBGYWl0aCwgSSBjYW4gdGVsbCBoZXIgYWdlIHVudG8gYW4gaG91ci4KCkxBRFkgQ0FQVUxFVAoKICAgIFNoZSdzIG5vdCBmb3VydGVlbi4KCk51cnNlCgogICAgSSdsbCBsYXkgZm91cnRlZW4gb2YgbXkgdGVldGgsLS0KICAgIEFuZCB5ZXQsIHRvIG15IHRlZXRoIGJlIGl0IHNwb2tlbiwgSSBoYXZlIGJ1dCBmb3VyLS0KICAgIFNoZSBpcyBub3QgZm91cnRlZW4uIEhvdyBsb25nIGlzIGl0IG5vdwogICAgVG8gTGFtbWFzLXRpZGUCgpMQURZIENBUFVMRVQKCiAgICBBIGZvcnRuaWdodCBhbmQgb2RkIGRheXMuCgpOdXJzZQoKICAgIEV2ZW4gb3Igb2RkLCBvZiBhbGwgZGF5cyBpbiB0aGUgeWVhciwKICAgIENvbWUgTGFtbWFzLWV2ZSBhdCBuaWdodCBzaGFsbCBzaGUgYmUgZm91cnRlZW4uCiAgICBTdXNhbiBhbmQgc2hlLS1Hb2QgcmVzdCBhbGwgQ2hyaXN0aWFuIHNvdWxzIS0tCiAgICBXZXJlIG9mIGFuIGFnZTogd2VsbCwgU3VzYW4gaXMgd2l0aCBHb2Q7CiAgICBTaGUgd2FzIHRvbyBnb29kIGZvciBtZTogYnV0LCBhcyBJIHNhaWQsCiAgICBPbiBMYW1tYXMtZXZlIGF0IG5pZ2h0IHNoYWxsIHNoZSBiZSBmb3VydGVlbjsKICAgIFRoYXQgc2hhbGwgc2hlLCBtYXJyeTsgSSByZW1lbWJlciBpdCB3ZWxsLgogICAgJ1RpcyBzaW5jZSB0aGUgZWFydGhxdWFrZSBub3cgZWxldmVuIHllYXJzOwogICAgQW5kIHNoZSB3YXMgd2VhbidkLC0tSSBuZXZlciBzaGFsbCBmb3JnZXQgaXQsLS0KICAgIE9mIGFsbCB0aGUgZGF5cyBvZiB0aGUgeWVhciwgdXBvbiB0aGF0IGRheToKICAgIEZvciBJIGhhZCB0aGVuIGxhaWQgd29ybXdvb2QgdG8gbXkgZHVnLAogICAgU2l0dGluZyBpbiB0aGUgc3VuIHVuZGVyIHRoZSBkb3ZlLWhvdXNlIHdhbGw7CiAgICBNeSBsb3JkIGFuZCB5b3Ugd2VyZSB0aGVuIGF0IE1hbnR1YTotLQogICAgTmF5LCBJIGRvIGJlYXIgYSBicmFpbjotLWJ1dCwgYXMgSSBzYWlkLAogICAgV2hlbiBpdCBkaWQgdGFzdGUgdGhlIHdvcm13b29kIG9uIHRoZSBuaXBwbGUKICAgIE9mIG15IGR1ZyBhbmQgZmVsdCBpdCBiaXR0ZXIsIHByZXR0eSBmb29sLAogICAgVG8gc2VlIGl0IHRldGNoeSBhbmQgZmFsbCBvdXQgd2l0aCB0aGUgZHVnIQogICAgU2hha2UgcXVvdGggdGhlIGRvdmUtaG91c2U6ICd0d2FzIG5vIG5lZWQsIEkgdHJvdywKICAgIFRvIGJpZCBtZSB0cnVkZ2U6CiAgICBBbmQgc2luY2UgdGhhdCB0aW1lIGl0IGlzIGVsZXZlbiB5ZWFyczsKICAgIEZvciB0aGVuIHNoZSBjb3VsZCBzdGFuZCBhbG9uZTsgbmF5LCBieSB0aGUgcm9vZCwKICAgIFNoZSBjb3VsZCBoYXZlIHJ1biBhbmQgd2FkZGxlZCBhbGwgYWJvdXQ7CiAgICBGb3IgZXZlbiB0aGUgZGF5IGJlZm9yZSwgc2hlIGJyb2tlIGhlciBicm93OgogICAgQW5kIHRoZW4gbXkgaHVzYmFuZC0tR29kIGJlIHdpdGggaGlzIHNvdWwhCiAgICBBJyB3YXMgYSBtZXJyeSBtYW4tLXRvb2sgdXAgdGhlIGNoaWxkOgogICAgJ1llYSwnIHF1b3RoIGhlLCAnZG9zdCB0aG91IGZhbGwgdXBvbiB0aHkgZmFjZT8KICAgIFRob3Ugd2lsdCBmYWxsIGJhY2t3YXJkIHdoZW4gdGhvdSBoYXN0IG1vcmUgd2l0OwogICAgV2lsdCB0aG91IG5vdCwgSnVsZT8nIGFuZCwgYnkgbXkgaG9saWRhbWUsCiAgICBUaGUgcHJldHR5IHdyZXRjaCBsZWZ0IGNyeWluZyBhbmQgc2FpZCAnQXkuJwogICAgVG8gc2VlLCBub3csIGhvdyBhIGplc3Qgc2hhbGwgY29tZSBhYm91dCEKICAgIEkgd2FycmFudCwgYW4gSSBzaG91bGQgbGl2ZSBhIHRob3VzYW5kIHllYXJzLAogICAgSSBuZXZlciBzaG91bGQgZm9yZ2V0IGl0OiAnV2lsdCB0aG91IG5vdCwgSnVsZT8nIHF1b3RoIGhlOwogICAgQW5kLCBwcmV0dHkgZm9vbCwgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKTEFEWSBDQVBVTEVUCgogICAgRW5vdWdoIG9mIHRoaXM7IEkgcHJheSB0aGVlLCBob2xkIHRoeSBwZWFjZS4KCk51cnNlCgogICAgWWVzLCBtYWRhbTogeWV0IEkgY2Fubm90IGNob29zZSBidXQgbGF1Z2gsCiAgICBUbyB0aGluayBpdCBzaG91bGQgbGVhdmUgY3J5aW5nIGFuZCBzYXkgJ0F5LicKICAgIEFuZCB5ZXQsIEkgd2FycmFudCwgaXQgaGFkIHVwb24gaXRzIGJyb3cKICAgIEEgYnVtcCBhcyBiaWcgYXMgYSB5b3VuZyBjb2NrZXJlbCdzIHN0b25lOwogICAgQSBwYXJsb3VzIGtub2NrOyBhbmQgaXQgY3JpZWQgYml0dGVybHk6CiAgICAnWWVhLCcgcXVvdGggbXkgaHVzYmFuZCwnZmFsbCdzdCB1cG9uIHRoeSBmYWNlPwogICAgVGhvdSB3aWx0IGZhbGwgYmFja3dhcmQgd2hlbiB0aG91IGNvbWVzdCB0byBhZ2U7CiAgICBXaWx0IHRob3Ugbm90LCBKdWxlPycgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKSlVMSUVUCgogICAgQW5kIHN0aW50IHRob3UgdG9vLCBJIHByYXkgdGhlZSwgbnVyc2UsIHNheSBJLgoKTnVyc2UKCiAgICBQZWFjZSwgSSBoYXZlIGRvbmUuIEdvZCBtYXJrIHRoZWUgdG8gaGlzIGdyYWNlIQogICAgVGhvdSB3YXN0IHRoZSBwcmV0dGllc3QgYmFiZSB0aGF0IGUnZXIgSSBudXJzZWQ6CiAgICBBbiBJIG1pZ2h0IGxpdmUgdG8gc2VlIHRoZWUgbWFycmllZCBvbmNlLAogICAgSSBoYXZlIG15IHdpc2guCgpMQURZIENBUFVMRVQKCiAgICBNYXJyeSwgdGhhdCAnbWFycnknIGlzIHRoZSB2ZXJ5IHRoZW1lCiAgICBJIGNhbWUgdG8gdGFsayBvZi4gVGVsbCBtZSwgZGF1Z2h0ZXIgSnVsaWV0LAogICAgSG93IHN0YW5kcyB5b3VyIGRpc3Bvc2l0aW9uIHRvIGJlIG1hcnJpZWQCgpKVUxJRVQKCiAgICBJdCBpcyBhbiBob25vdXIgdGhhdCBJIGRyZWFtIG5vdCBvZi4KCk51cnNlCgogICAgQW4gaG9ub3VyISB3ZXJlIG5vdCBJIHRoaW5lIG9ubHkgbnVyc2UsCiAgICBJIHdvdWxkIHNheSB0aG91IGhhZHN0IHN1Y2snZCB3aXNkb20gZnJvbSB0aHkgdGVhdC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHRoaW5rIG9mIG1hcnJpYWdlIG5vdzsgeW91bmdlciB0aGFuIHlvdSwKICAgIEhlcmUgaW4gVmVyb25hLCBsYWRpZXMgb2YgZXN0ZWVtLAogICAgQXJlIG1hZGUgYWxyZWFkeSBtb3RoZXJzOiBieSBteSBjb3VudCwKICAgIEkgd2FzIHlvdXIgbW90aGVyIG11Y2ggdXBvbiB0aGVzZSB5ZWFycwogICAgVGhhdCB5b3UgYXJlIG5vdyBhIG1haWQuIFRodXMgdGhlbiBpbiBicmllZjoKICAgIFRoZSB2YWxpYW50IFBhcmlzIHNlZWtzIHlvdSBmb3IgaGlzIGxvdmUuCgpOdXJzZQoKICAgIEEgbWFuLCB5b3VuZyBsYWR5ISBsYWR5LCBzdWNoIGEgbWFuCiAgICBBcyBhbGwgdGhlIHdvcmxkLS13aHksIGhlJ3MgYSBtYW4gb2Ygd2F4LgoKTEFEWSBDQVBVTEVUCgogICAgVmVyb25hJ3Mgc3VtbWVyIGhhdGggbm90IHN1Y2ggYSBmbG93ZXIuCgpOdXJzZQoKICAgIE5heSwgaGUncyBhIGZsb3dlcjsgaW4gZmFpdGgsIGEgdmVyeSBmbG93ZXIuCgpMQURZIENBUFVMRVQKCiAgICBXaGF0IHNheSB5b3UIGNhbiB5b3UgbG92ZSB0aGUgZ2VudGxlbWFuPwogICAgVGhpcyBuaWdodCB5b3Ugc2hhbGwgYmVob2xkIGhpbSBhdCBvdXIgZmVhc3Q7CiAgICBSZWFkIG8nZXIgdGhlIHZvbHVtZSBvZiB5b3VuZyBQYXJpcycgZmFjZSwKICAgIEFuZCBmaW5kIGRlbGlnaHQgd3JpdCB0aGVyZSB3aXRoIGJlYXV0eSdzIHBlbjsKICAgIEV4YW1pbmUgZXZlcnkgbWFycmllZCBsaW5lYW1lbnQsCiAgICBBbmQgc2VlIGhvdyBvbmUgYW5vdGhlciBsZW5kcyBjb250ZW50CiAgICBBbmQgd2hhdCBvYnNjdXJlZCBpbiB0aGlzIGZhaXIgdm9sdW1lIGxpZXMKICAgIEZpbmQgd3JpdHRlbiBpbiB0aGUgbWFyZ2VudCBvZiBoaXMgZXllcy4KICAgIFRoaXMgcHJlY2lvdXMgYm9vayBvZiBsb3ZlLCB0aGlzIHVuYm91bmQgbG92ZXIsCiAgICBUbyBiZWF1dGlmeSBoaW0sIG9ubHkgbGFja3MgYSBjb3ZlcjoKICAgIFRoZSBmaXNoIGxpdmVzIGluIHRoZSBzZWEsIGFuZCAndGlzIG11Y2ggcHJpZGUKICAgIEZvciBmYWlyIHdpdGhvdXQgdGhlIGZhaXIgd2l0aGluIHRvIGhpZGU6CiAgICBUaGF0IGJvb2sgaW4gbWFueSdzIGV5ZXMgZG90aCBzaGFyZSB0aGUgZ2xvcnksCiAgICBUaGF0IGluIGdvbGQgY2xhc3BzIGxvY2tzIGluIHRoZSBnb2xkZW4gc3Rvcnk7CiAgICBTbyBzaGFsbCB5b3Ugc2hhcmUgYWxsIHRoYXQgaGUgZG90aCBwb3NzZXNzLAogICAgQnkgaGF2aW5nIGhpbSwgbWFraW5nIHlvdXJzZWxmIG5vIGxlc3MuCgpOdXJzZQoKICAgIE5vIGxlc3MhIG5heSwgYmlnZ2VyOyB3b21lbiBncm93IGJ5IG1lbi4KCkxBRFkgQ0FQVUxFVAoKICAgIFNwZWFrIGJyaWVmbHksIGNhbiB5b3UgbGlrZSBvZiBQYXJpcycgbG92ZT8KCkpVTElFVAoKICAgIEknbGwgbG9vayB0byBsaWtlLCBpZiBsb29raW5nIGxpa2luZyBtb3ZlOgogICAgQnV0IG5vIG1vcmUgZGVlcCB3aWxsIEkgZW5kYXJ0IG1pbmUgZXllCiAgICBUaGFuIHlvdXIgY29uc2VudCBnaXZlcyBzdHJlbmd0aCB0byBtYWtlIGl0IGZseS4KCiAgICBFbnRlciBhIFNlcnZhbnQKClNlcnZhbnQKCiAgICBNYWRhbSwgdGhlIGd1ZXN0cyBhcmUgY29tZSwgc3VwcGVyIHNlcnZlZCB1cCwgeW91CiAgICBjYWxsZWQsIG15IHlvdW5nIGxhZHkgYXNrZWQgZm9yLCB0aGUgbnVyc2UgY3Vyc2VkIGluCiAgICB0aGUgcGFudHJ5LCBhbmQgZXZlcnkgdGhpbmcgaW4gZXh0cmVtaXR5LiBJIG11c3QKICAgIGhlbmNlIHRvIHdhaXQ7IEkgYmVzZWVjaCB5b3UsIGZvbGxvdyBzdHJhaWdodC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlIGZvbGxvdyB0aGVlLgoKICAgIEV4aXQgU2VydmFudAogICAgSnVsaWV0LCB0aGUgY291bnR5IHN0YXlzLgoKTnVyc2UKCiAgICBHbywgZ2lybCwgc2VlayBoYXBweSBuaWdodHMgdG8gaGFwcHkgZGF5cy4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBST01FTywgTUVSQ1VUSU8sIEJFTlZPTElPLCB3aXRoIGZpdmUgb3Igc2l4IE1hc2tlcnMsIFRvcmNoLWJlYXJlcnMsIGFuZCBvdGhlcnMgCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIHRoaXMgc3BlZWNoIGJlIHNwb2tlIGZvciBvdXIgZXhjdXNlPwogICAgT3Igc2hhbGwgd2Ugb24gd2l0aG91dCBhIGFwb2xvZ3kCgpCRU5WT0xJTwoKICAgIFRoZSBkYXRlIGlzIG91dCBvZiBzdWNoIHByb2xpeGl0eToKICAgIFdlJ2xsIGhhdmUgbm8gQ3VwaWQgaG9vZHdpbmsnZCB3aXRoIGEgc2NhcmYsCiAgICBCZWFyaW5nIGEgVGFydGFyJ3MgcGFpbnRlZCBib3cgb2YgbGF0aCwKICAgIFNjYXJpbmcgdGhlIGxhZGllcyBsaWtlIGEgY3Jvdy1rZWVwZXI7CiAgICBOb3Igbm8gd2l0aG91dC1ib29rIHByb2xvZ3VlLCBmYWludGx5IHNwb2tlCiAgICBBZnRlciB0aGUgcHJvbXB0ZXIsIGZvciBvdXIgZW50cmFuY2U6CiAgICBCdXQgbGV0IHRoZW0gbWVhc3VyZSB1cyBieSB3aGF0IHRoZXkgd2lsbDsKICAgIFdlJ2xsIG1lYXN1cmUgdGhlbSBhIG1lYXN1cmUsIGFuZCBiZSBnb25lLgoKUk9NRU8KCiAgICBHaXZlIG1lIGEgdG9yY2g6IEkgYW0gbm90IGZvciB0aGlzIGFtYmxpbmc7CiAgICBCZWluZyBidXQgaGVhdnksIEkgd2lsbCBiZWFyIHRoZSBsaWdodC4KCk1FUkNVVElPCgogICAgTmF5LCBnZW50bGUgUm9tZW8sIHdlIG11c3QgaGF2ZSB5b3UgZGFuY2UuCgpST01FTwoKICAgIE5vdCBJLCBiZWxpZXZlIG1lOiB5b3UgaGF2ZSBkYW5jaW5nIHNob2VzCiAgICBXaXRoIG5pbWJsZSBzb2xlczogSSBoYXZlIGEgc291bCBvZiBsZWFkCiAgICBTbyBzdGFrZXMgbWUgdG8gdGhlIGdyb3VuZCBJIGNhbm5vdCBtb3ZlLgoKTUVSQ1VUSU8KCiAgICBZb3UgYXJlIGEgbG92ZXI7IGJvcnJvdyBDdXBpZCdzIHdpbmdzLAogICAgQW5kIHNvYXIgd2l0aCB0aGVtIGFib3ZlIGEgY29tbW9uIGJvdW5kLgoKUk9NRU8KCiAgICBJIGFtIHRvbyBzb3JlIGVucGllcmNlZCB3aXRoIGhpcyBzaGFmdAogICAgVG8gc29hciB3aXRoIGhpcyBsaWdodCBmZWF0aGVycywgYW5kIHNvIGJvdW5kLAogICAgSSBjYW5ub3QgYm91bmQgYSBwaXRjaCBhYm92ZSBkdWxsIHdvZToKICAgIFVuZGVyIGxvdmUncyBoZWF2eSBidXJkZW4gZG8gSSBzaW5rLgoKTUVSQ1VUSU8KCiAgICBBbmQsIHRvIHNpbmsgaW4gaXQsIHNob3VsZCB5b3UgYnVyZGVuIGxvdmU7CiAgICBUb28gZ3JlYXQgb3BwcmVzc2lvbiBmb3IgYSB0ZW5kZXIgdGhpbmcuCgpST01FTwoKICAgIElzIGxvdmUgYSB0ZW5kZXIgdGhpbmcIGl0IGlzIHRvbyByb3VnaCwKICAgIFRvbyBydWRlLCB0b28gYm9pc3Rlcm91cywgYW5kIGl0IHByaWNrcyBsaWtlIHRob3JuLgoKTUVSQ1VUSU8KCiAgICBJZiBsb3ZlIGJlIHJvdWdoIHdpdGggeW91LCBiZSByb3VnaCB3aXRoIGxvdmU7CiAgICBQcmljayBsb3ZlIGZvciBwcmlja2luZywgYW5kIHlvdSBiZWF0IGxvdmUgZG93bi4KICAgIEdpdmUgbWUgYSBjYXNlIHRvIHB1dCBteSB2aXNhZ2UgaW46CiAgICBBIHZpc29yIGZvciBhIHZpc29yISB3aGF0IGNhcmUgSQogICAgV2hhdCBjdXJpb3VzIGV5ZSBkb3RoIHF1b3RlIGRlZm9ybWl0aWVzPwogICAgSGVyZSBhcmUgdGhlIGJlZXRsZSBicm93cyBzaGFsbCBibHVzaCBmb3IgbWUuCgpCRU5WT0xJTwoKICAgIENvbWUsIGtub2NrIGFuZCBlbnRlcjsgYW5kIG5vIHNvb25lciBpbiwKICAgIEJ1dCBldmVyeSBtYW4gYmV0YWtlIGhpbSB0byBoaXMgbGVncy4KClJPTUVPCgogICAgQSB0b3JjaCBmb3IgbWU6IGxldCB3YW50b25zIGxpZ2h0IG9mIGhlYXJ0CiAgICBUaWNrbGUgdGhlIHNlbnNlbGVzcyBydXNoZXMgd2l0aCB0aGVpciBoZWVscywKICAgIEZvciBJIGFtIHByb3ZlcmInZCB3aXRoIGEgZ3JhbmRzaXJlIHBocmFzZTsKICAgIEknbGwgYmUgYSBjYW5kbGUtaG9sZGVyLCBhbmQgbG9vayBvbi4KICAgIFRoZSBnYW1lIHdhcyBuZSdlciBzbyBmYWlyLCBhbmQgSSBhbSBkb25lLgoKTUVSQ1VUSU8KCiAgICBUdXQsIGR1bidzIHRoZSBtb3VzZSwgdGhlIGNvbnN0YWJsZSdzIG93biB3b3JkOgogICAgSWYgdGhvdSBhcnQgZHVuLCB3ZSdsbCBkcmF3IHRoZWUgZnJvbSB0aGUgbWlyZQogICAgT2YgdGhpcyBzaXItcmV2ZXJlbmNlIGxvdmUsIHdoZXJlaW4gdGhvdSBzdGljaydzdAogICAgVXAgdG8gdGhlIGVhcnMuIENvbWUsIHdlIGJ1cm4gZGF5bGlnaHQsIGhvIQoKUk9NRU8KCiAgICBOYXksIHRoYXQncyBub3Qgc28uCgpNRVJDVVRJTwoKICAgIEkgbWVhbiwgc2lyLCBpbiBkZWxheQogICAgV2Ugd2FzdGUgb3VyIGxpZ2h0cyBpbiB2YWluLCBsaWtlIGxhbXBzIGJ5IGRheS4KICAgIFRha2Ugb3VyIGdvb2QgbWVhbmluZywgZm9yIG91ciBqdWRnbWVudCBzaXRzCiAgICBGaXZlIHRpbWVzIGluIHRoYXQgZXJlIG9uY2UgaW4gb3VyIGZpdmUgd2l0cy4KClJPTUVPCgogICAgQW5kIHdlIG1lYW4gd2VsbCBpbiBnb2luZyB0byB0aGlzIG1hc2s7CiAgICBCdXQgJ3RpcyBubyB3aXQgdG8gZ28uCgpNRVJDVVRJTwoKICAgIFdoeSwgbWF5IG9uZSBhc2sCgpST01FTwoKICAgIEkgZHJlYW0nZCBhIGRyZWFtIHRvLW5pZ2h0LgoKTUVSQ1VUSU8KCiAgICBBbmQgc28gZGlkIEkuCgpST01FTwoKICAgIFdlbGwsIHdoYXQgd2FzIHlvdXJzPwoKTUVSQ1VUSU8KCiAgICBUaGF0IGRyZWFtZXJzIG9mdGVuIGxpZS4KClJPTUVPCgogICAgSW4gYmVkIGFzbGVlcCwgd2hpbGUgdGhleSBkbyBkcmVhbSB0aGluZ3MgdHJ1ZS4KCk1FUkNVVElPCgogICAgTywgdGhlbiwgSSBzZWUgUXVlZW4gTWFiIGhhdGggYmVlbiB3aXRoIHlvdS4KICAgIFNoZSBpcyB0aGUgZmFpcmllcycgbWlkd2lmZSwgYW5kIHNoZSBjb21lcwogICAgSW4gc2hhcGUgbm8gYmlnZ2VyIHRoYW4gYW4gYWdhdGUtc3RvbmUKICAgIE9uIHRoZSBmb3JlLWZpbmdlciBvZiBhbiBhbGRlcm1hbiwKICAgIERyYXduIHdpdGggYSB0ZWFtIG9mIGxpdHRsZSBhdG9taWVzCiAgICBBdGh3YXJ0IG1lbidzIG5vc2VzIGFzIHRoZXkgbGllIGFzbGVlcDsKICAgIEhlciB3YWdvbi1zcG9rZXMgbWFkZSBvZiBsb25nIHNwaWRlcnMnIGxlZ3MsCiAgICBUaGUgY292ZXIgb2YgdGhlIHdpbmdzIG9mIGdyYXNzaG9wcGVycywKICAgIFRoZSB0cmFjZXMgb2YgdGhlIHNtYWxsZXN0IHNwaWRlcidzIHdlYiwKICAgIFRoZSBjb2xsYXJzIG9mIHRoZSBtb29uc2hpbmUncyB3YXRlcnkgYmVhbXMsCiAgICBIZXIgd2hpcCBvZiBjcmlja2V0J3MgYm9uZSwgdGhlIGxhc2ggb2YgZmlsbSwKICAgIEhlciB3YWdvbmVyIGEgc21hbGwgZ3JleS1jb2F0ZWQgZ25hdCwKICAgIE5vdCBzbyBiaWcgYXMgYSByb3VuZCBsaXR0bGUgd29ybQogICAgUHJpY2snZCBmcm9tIHRoZSBsYXp5IGZpbmdlciBvZiBhIG1haWQ7CiAgICBIZXIgY2hhcmlvdCBpcyBhbiBlbXB0eSBoYXplbC1udXQKICAgIE1hZGUgYnkgdGhlIGpvaW5lciBzcXVpcnJlbCBvciBvbGQgZ3J1YiwKICAgIFRpbWUgb3V0IG8nIG1pbmQgdGhlIGZhaXJpZXMnIGNvYWNobWFrZXJzLgogICAgQW5kIGluIHRoaXMgc3RhdGUgc2hlIGdhbGxvcHMgbmlnaHQgYnkgbmlnaHQKICAgIFRocm91Z2ggbG92ZXJzJyBicmFpbnMsIGFuZCB0aGVuIHRoZXkgZHJlYW0gb2YgbG92ZTsKICAgIE8nZXIgY291cnRpZXJzJyBrbmVlcywgdGhhdCBkcmVhbSBvbiBjb3VydCdzaWVzIHN0cmFpZ2h0LAogICAgTydlciBsYXd5ZXJzJyBmaW5nZXJzLCB3aG8gc3RyYWlnaHQgZHJlYW0gb24gZmVlcywKICAgIE8nZXIgbGFkaWVzICcgbGlwcywgd2hvIHN0cmFpZ2h0IG9uIGtpc3NlcyBkcmVhbSwKICAgIFdoaWNoIG9mdCB0aGUgYW5ncnkgTWFiIHdpdGggYmxpc3RlcnMgcGxhZ3VlcywKICAgIEJlY2F1c2UgdGhlaXIgYnJlYXRocyB3aXRoIHN3ZWV0bWVhdHMgdGFpbnRlZCBhcmU6CiAgICBTb21ldGltZSBzaGUgZ2FsbG9wcyBvJ2VyIGEgY291cnRpZXIncyBub3NlLAogICAgQW5kIHRoZW4gZHJlYW1zIGhlIG9mIHNtZWxsaW5nIG91dCBhIHN1aXQ7CiAgICBBbmQgc29tZXRpbWUgY29tZXMgc2hlIHdpdGggYSB0aXRoZS1waWcncyB0YWlsCiAgICBUaWNrbGluZyBhIHBhcnNvbidzIG5vc2UgYXMgYScgbGllcyBhc2xlZXAsCiAgICBUaGVuIGRyZWFtcywgaGUgb2YgYW5vdGhlciBiZW5lZmljZToKICAgIFNvbWV0aW1lIHNoZSBkcml2ZXRoIG8nZXIgYSBzb2xkaWVyJ3MgbmVjaywKICAgIEFuZCB0aGVuIGRyZWFtcyBoZSBvZiBjdXR0aW5nIGZvcmVpZ24gdGhyb2F0cywKICAgIE9mIGJyZWFjaGVzLCBhbWJ1c2NhZG9lcywgU3BhbmlzaCBibGFkZXMsCiAgICBPZiBoZWFsdGhzIGZpdmUtZmF0aG9tIGRlZXA7IGFuZCB0aGVuIGFub24KICAgIERydW1zIGluIGhpcyBlYXIsIGF0IHdoaWNoIGhlIHN0YXJ0cyBhbmQgd2FrZXMsCiAgICBBbmQgYmVpbmcgdGh1cyBmcmlnaHRlZCBzd2VhcnMgYSBwcmF5ZXIgb3IgdHdvCiAgICBBbmQgc2xlZXBzIGFnYWluLiBUaGlzIGlzIHRoYXQgdmVyeSBNYWIKICAgIFRoYXQgcGxhdHMgdGhlIG1hbmVzIG9mIGhvcnNlcyBpbiB0aGUgbmlnaHQsCiAgICBBbmQgYmFrZXMgdGhlIGVsZmxvY2tzIGluIGZvdWwgc2x1dHRpc2ggaGFpcnMsCiAgICBXaGljaCBvbmNlIHVudGFuZ2xlZCwgbXVjaCBtaXNmb3J0dW5lIGJvZGVzOgogICAgVGhpcyBpcyB0aGUgaGFnLCB3aGVuIG1haWRzIGxpZSBvbiB0aGVpciBiYWNrcywKICAgIFRoYXQgcHJlc3NlcyB0aGVtIGFuZCBsZWFybnMgdGhlbSBmaXJzdCB0byBiZWFyLAogICAgTWFraW5nIHRoZW0gd29tZW4gb2YgZ29vZCBjYXJyaWFnZToKICAgIFRoaXMgaXMgc2hlLS0KClJPTUVPCgogICAgUGVhY2UsIHBlYWNlLCBNZXJjdXRpbywgcGVhY2UhCiAgICBUaG91IHRhbGsnc3Qgb2Ygbm90aGluZy4KCk1FUkNVVElPCgogICAgVHJ1ZSwgSSB0YWxrIG9mIGRyZWFtcywKICAgIFdoaWNoIGFyZSB0aGUgY2hpbGRyZW4gb2YgYW4gaWRsZSBicmFpbiwKICAgIEJlZ290IG9mIG5vdGhpbmcgYnV0IHZhaW4gZmFudGFzeSwKICAgIFdoaWNoIGlzIGFzIHRoaW4gb2Ygc3Vic3RhbmNlIGFzIHRoZSBhaXIKICAgIEFuZCBtb3JlIGluY29uc3RhbnQgdGhhbiB0aGUgd2luZCwgd2hvIHdvb2VzCiAgICBFdmVuIG5vdyB0aGUgZnJvemVuIGJvc29tIG9mIHRoZSBub3J0aCwKICAgIEFuZCwgYmVpbmcgYW5nZXInZCwgcHVmZnMgYXdheSBmcm9tIHRoZW5jZSwKICAgIFR1cm5pbmcgaGlzIGZhY2UgdG8gdGhlIGRldy1kcm9wcGluZyBzb3V0aC4KCkJFTlZPTElPCgogICAgVGhpcyB3aW5kLCB5b3UgdGFsayBvZiwgYmxvd3MgdXMgZnJvbSBvdXJzZWx2ZXM7CiAgICBTdXBwZXIgaXMgZG9uZSwgYW5kIHdlIHNoYWxsIGNvbWUgdG9vIGxhdGUuCgpST01FTwoKICAgIEkgZmVhciwgdG9vIGVhcmx5OiBmb3IgbXkgbWluZCBtaXNnaXZlcwogICAgU29tZSBjb25zZXF1ZW5jZSB5ZXQgaGFuZ2luZyBpbiB0aGUgc3RhcnMKICAgIFNoYWxsIGJpdHRlcmx5IGJlZ2luIGhpcyBmZWFyZnVsIGRhdGUKICAgIFdpdGggdGhpcyBuaWdodCdzIHJldmVscyBhbmQgZXhwaXJlIHRoZSB0ZXJtCiAgICBPZiBhIGRlc3Bpc2VkIGxpZmUgY2xvc2VkIGluIG15IGJyZWFzdAogICAgQnkgc29tZSB2aWxlIGZvcmZlaXQgb2YgdW50aW1lbHkgZGVhdGguCiAgICBCdXQgSGUsIHRoYXQgaGF0aCB0aGUgc3RlZXJhZ2Ugb2YgbXkgY291cnNlLAogICAgRGlyZWN0IG15IHNhaWwhIE9uLCBsdXN0eSBnZW50bGVtZW4uCgpCRU5WT0xJTwoKICAgIFN0cmlrZSwgZHJ1bS4KCiAgICBFeGV1bnQKClNDRU5FIFYuIEEgaGFsbCBpbiBDYXB1bGV0J3MgaG91c2UuCgogICAgTXVzaWNpYW5zIHdhaXRpbmcuIEVudGVyIFNlcnZpbmdtZW4gd2l0aCBuYXBraW5zIAoKRmlyc3QgU2VydmFudAoKICAgIFdoZXJlJ3MgUG90cGFuLCB0aGF0IGhlIGhlbHBzIG5vdCB0byB0YWtlIGF3YXkIEhlCiAgICBzaGlmdCBhIHRyZW5jaGVyPyBoZSBzY3JhcGUgYSB0cmVuY2hlciEKClNlY29uZCBTZXJ2YW50CgogICAgV2hlbiBnb29kIG1hbm5lcnMgc2hhbGwgbGllIGFsbCBpbiBvbmUgb3IgdHdvIG1lbidzCiAgICBoYW5kcyBhbmQgdGhleSB1bndhc2hlZCB0b28sICd0aXMgYSBmb3VsIHRoaW5nLgoKRmlyc3QgU2VydmFudAoKICAgIEF3YXkgd2l0aCB0aGUgam9pbnQtc3Rvb2xzLCByZW1vdmUgdGhlCiAgICBjb3VydC1jdXBib2FyZCwgbG9vayB0byB0aGUgcGxhdGUuIEdvb2QgdGhvdSwgc2F2ZQogICAgbWUgYSBwaWVjZSBvZiBtYXJjaHBhbmU7IGFuZCwgYXMgdGhvdSBsb3Zlc3QgbWUsIGxldAogICAgdGhlIHBvcnRlciBsZXQgaW4gU3VzYW4gR3JpbmRzdG9uZSBhbmQgTmVsbC4KICAgIEFudG9ueSwgYW5kIFBvdHBhbiEKClNlY29uZCBTZXJ2YW50CgogICAgQXksIGJveSwgcmVhZHkuCgpGaXJzdCBTZXJ2YW50CgogICAgWW91IGFyZSBsb29rZWQgZm9yIGFuZCBjYWxsZWQgZm9yLCBhc2tlZCBmb3IgYW5kCiAgICBzb3VnaHQgZm9yLCBpbiB0aGUgZ3JlYXQgY2hhbWJlci4KClNlY29uZCBTZXJ2YW50CgogICAgV2UgY2Fubm90IGJlIGhlcmUgYW5kIHRoZXJlIHRvby4gQ2hlZXJseSwgYm95czsgYmUKICAgIGJyaXNrIGF3aGlsZSwgYW5kIHRoZSBsb25nZXIgbGl2ZXIgdGFrZSBhbGwuCgogICAgRW50ZXIgQ0FQVUxFVCwgd2l0aCBKVUxJRVQgYW5kIG90aGVycyBvZiBoaXMgaG91c2UsIG1lZXRpbmcgdGhlIEd1ZXN0cyBhbmQgTWFza2VycwoKQ0FQVUxFVAoKICAgIFdlbGNvbWUsIGdlbnRsZW1lbiEgbGFkaWVzIHRoYXQgaGF2ZSB0aGVpciB0b2VzCiAgICBVbnBsYWd1ZWQgd2l0aCBjb3JucyB3aWxsIGhhdmUgYSBib3V0IHdpdGggeW91LgogICAgQWggaGEsIG15IG1pc3RyZXNzZXMhIHdoaWNoIG9mIHlvdSBhbGwKICAgIFdpbGwgbm93IGRlbnkgdG8gZGFuY2UIHNoZSB0aGF0IG1ha2VzIGRhaW50eSwKICAgIFNoZSwgSSdsbCBzd2VhciwgaGF0aCBjb3JuczsgYW0gSSBjb21lIG5lYXIgeWUgbm93PwogICAgV2VsY29tZSwgZ2VudGxlbWVuISBJIGhhdmUgc2VlbiB0aGUgZGF5CiAgICBUaGF0IEkgaGF2ZSB3b3JuIGEgdmlzb3IgYW5kIGNvdWxkIHRlbGwKICAgIEEgd2hpc3BlcmluZyB0YWxlIGluIGEgZmFpciBsYWR5J3MgZWFyLAogICAgU3VjaCBhcyB3b3VsZCBwbGVhc2U6ICd0aXMgZ29uZSwgJ3RpcyBnb25lLCAndGlzIGdvbmU6CiAgICBZb3UgYXJlIHdlbGNvbWUsIGdlbnRsZW1lbiEgY29tZSwgbXVzaWNpYW5zLCBwbGF5LgogICAgQSBoYWxsLCBhIGhhbGwhIGdpdmUgcm9vbSEgYW5kIGZvb3QgaXQsIGdpcmxzLgoKICAgIE11c2ljIHBsYXlzLCBhbmQgdGhleSBkYW5jZQogICAgTW9yZSBsaWdodCwgeW91IGtuYXZlczsgYW5kIHR1cm4gdGhlIHRhYmxlcyB1cCwKICAgIEFuZCBxdWVuY2ggdGhlIGZpcmUsIHRoZSByb29tIGlzIGdyb3duIHRvbyBob3QuCiAgICBBaCwgc2lycmFoLCB0aGlzIHVubG9vaydkLWZvciBzcG9ydCBjb21lcyB3ZWxsLgogICAgTmF5LCBzaXQsIG5heSwgc2l0LCBnb29kIGNvdXNpbiBDYXB1bGV0OwogICAgRm9yIHlvdSBhbmQgSSBhcmUgcGFzdCBvdXIgZGFuY2luZyBkYXlzOgogICAgSG93IGxvbmcgaXMndCBub3cgc2luY2UgbGFzdCB5b3Vyc2VsZiBhbmQgSQogICAgV2VyZSBpbiBhIG1hc2sCgpTZWNvbmQgQ2FwdWxldAoKICAgIEJ5J3IgbGFkeSwgdGhpcnR5IHllYXJzLgoKQ0FQVUxFVAoKICAgIFdoYXQsIG1hbiEgJ3RpcyBub3Qgc28gbXVjaCwgJ3RpcyBub3Qgc28gbXVjaDoKICAgICdUaXMgc2luY2UgdGhlIG51cHRpYWxzIG9mIEx1Y2VudGlvLAogICAgQ29tZSBwZW50ZWNvc3QgYXMgcXVpY2tseSBhcyBpdCB3aWxsLAogICAgU29tZSBmaXZlIGFuZCB0d2VudHkgeWVhcnM7IGFuZCB0aGVuIHdlIG1hc2snZC4KClNlY29uZCBDYXB1bGV0CgogICAgJ1RpcyBtb3JlLCAndGlzIG1vcmUsIGhpcyBzb24gaXMgZWxkZXIsIHNpcjsKICAgIEhpcyBzb24gaXMgdGhpcnR5LgoKQ0FQVUxFVAoKICAgIFdpbGwgeW91IHRlbGwgbWUgdGhhdD8KICAgIEhpcyBzb24gd2FzIGJ1dCBhIHdhcmQgdHdvIHllYXJzIGFnby4KClJPTUVPCgogICAgW1RvIGEgU2VydmluZ21hbl0gV2hhdCBsYWR5IGlzIHRoYXQsIHdoaWNoIGRvdGgKICAgIGVucmljaCB0aGUgaGFuZAogICAgT2YgeW9uZGVyIGtuaWdodD8KClNlcnZhbnQKCiAgICBJIGtub3cgbm90LCBzaXIuCgpST01FTwoKICAgIE8sIHNoZSBkb3RoIHRlYWNoIHRoZSB0b3JjaGVzIHRvIGJ1cm4gYnJpZ2h0IQogICAgSXQgc2VlbXMgc2hlIGhhbmdzIHVwb24gdGhlIGNoZWVrIG9mIG5pZ2h0CiAgICBMaWtlIGEgcmljaCBqZXdlbCBpbiBhbiBFdGhpb3BlJ3MgZWFyOwogICAgQmVhdXR5IHRvbyByaWNoIGZvciB1c2UsIGZvciBlYXJ0aCB0b28gZGVhciEKICAgIFNvIHNob3dzIGEgc25vd3kgZG92ZSB0cm9vcGluZyB3aXRoIGNyb3dzLAogICAgQXMgeW9uZGVyIGxhZHkgbydlciBoZXIgZmVsbG93cyBzaG93cy4KICAgIFRoZSBtZWFzdXJlIGRvbmUsIEknbGwgd2F0Y2ggaGVyIHBsYWNlIG9mIHN0YW5kLAogICAgQW5kLCB0b3VjaGluZyBoZXJzLCBtYWtlIGJsZXNzZWQgbXkgcnVkZSBoYW5kLgogICAgRGlkIG15IGhlYXJ0IGxvdmUgdGlsbCBub3cIGZvcnN3ZWFyIGl0LCBzaWdodCEKICAgIEZvciBJIG5lJ2VyIHNhdyB0cnVlIGJlYXV0eSB0aWxsIHRoaXMgbmlnaHQuCgpUWUJBTFQKCiAgICBUaGlzLCBieSBoaXMgdm9pY2UsIHNob3VsZCBiZSBhIE1vbnRhZ3VlLgogICAgRmV0Y2ggbWUgbXkgcmFwaWVyLCBib3kuIFdoYXQgZGFyZXMgdGhlIHNsYXZlCiAgICBDb21lIGhpdGhlciwgY292ZXInZCB3aXRoIGFuIGFudGljIGZhY2UsCiAgICBUbyBmbGVlciBhbmQgc2Nvcm4gYXQgb3VyIHNvbGVtbml0eT8KICAgIE5vdywgYnkgdGhlIHN0b2NrIGFuZCBob25vdXIgb2YgbXkga2luLAogICAgVG8gc3RyaWtlIGhpbSBkZWFkLCBJIGhvbGQgaXQgbm90IGEgc2luLgoKQ0FQVUxFVAoKICAgIFdoeSwgaG93IG5vdywga2luc21hbiEgd2hlcmVmb3JlIHN0b3JtIHlvdSBzbz8KClRZQkFMVAoKICAgIFVuY2xlLCB0aGlzIGlzIGEgTW9udGFndWUsIG91ciBmb2UsCiAgICBBIHZpbGxhaW4gdGhhdCBpcyBoaXRoZXIgY29tZSBpbiBzcGl0ZSwKICAgIFRvIHNjb3JuIGF0IG91ciBzb2xlbW5pdHkgdGhpcyBuaWdodC4KCkNBUFVMRVQKCiAgICBZb3VuZyBSb21lbyBpcyBpdD8KClRZQkFMVAoKICAgICdUaXMgaGUsIHRoYXQgdmlsbGFpbiBSb21lby4KCkNBUFVMRVQKCiAgICBDb250ZW50IHRoZWUsIGdlbnRsZSBjb3osIGxldCBoaW0gYWxvbmU7CiAgICBIZSBiZWFycyBoaW0gbGlrZSBhIHBvcnRseSBnZW50bGVtYW47CiAgICBBbmQsIHRvIHNheSB0cnV0aCwgVmVyb25hIGJyYWdzIG9mIGhpbQogICAgVG8gYmUgYSB2aXJ0dW91cyBhbmQgd2VsbC1nb3Zlcm4nZCB5b3V0aDoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd2VhbHRoIG9mIGFsbCB0aGUgdG93bgogICAgSGVyZSBpbiBteSBob3VzZSBkbyBoaW0gZGlzcGFyYWdlbWVudDoKICAgIFRoZXJlZm9yZSBiZSBwYXRpZW50LCB0YWtlIG5vIG5vdGUgb2YgaGltOgogICAgSXQgaXMgbXkgd2lsbCwgdGhlIHdoaWNoIGlmIHRob3UgcmVzcGVjdCwKICAgIFNob3cgYSBmYWlyIHByZXNlbmNlIGFuZCBwdXQgb2ZmIHRoZXNlIGZyb3ducywKICAgIEFuZCBpbGwtYmVzZWVtaW5nIHNlbWJsYW5jZSBmb3IgYSBmZWFzdC4KClRZQkFMVAoKICAgIEl0IGZpdHMsIHdoZW4gc3VjaCBhIHZpbGxhaW4gaXMgYSBndWVzdDoKICAgIEknbGwgbm90IGVuZHVyZSBoaW0uCgpDQVBVTEVUCgogICAgSGUgc2hhbGwgYmUgZW5kdXJlZDoKICAgIFdoYXQsIGdvb2RtYW4gYm95ISBJIHNheSwgaGUgc2hhbGw6IGdvIHRvOwogICAgQW0gSSB0aGUgbWFzdGVyIGhlcmUsIG9yIHlvdT8gZ28gdG8uCiAgICBZb3UnbGwgbm90IGVuZHVyZSBoaW0hIEdvZCBzaGFsbCBtZW5kIG15IHNvdWwhCiAgICBZb3UnbGwgbWFrZSBhIG11dGlueSBhbW9uZyBteSBndWVzdHMhCiAgICBZb3Ugd2lsbCBzZXQgY29jay1hLWhvb3AhIHlvdSdsbCBiZSB0aGUgbWFuIQoKVFlCQUxUCgogICAgV2h5LCB1bmNsZSwgJ3RpcyBhIHNoYW1lLgoKQ0FQVUxFVAoKICAgIEdvIHRvLCBnbyB0bzsKICAgIFlvdSBhcmUgYSBzYXVjeSBib3k6IGlzJ3Qgc28sIGluZGVlZD8KICAgIFRoaXMgdHJpY2sgbWF5IGNoYW5jZSB0byBzY2F0aGUgeW91LCBJIGtub3cgd2hhdDoKICAgIFlvdSBtdXN0IGNvbnRyYXJ5IG1lISBtYXJyeSwgJ3RpcyB0aW1lLgogICAgV2VsbCBzYWlkLCBteSBoZWFydHMhIFlvdSBhcmUgYSBwcmluY294OyBnbzoKICAgIEJlIHF1aWV0LCBvci0tTW9yZSBsaWdodCwgbW9yZSBsaWdodCEgRm9yIHNoYW1lIQogICAgSSdsbCBtYWtlIHlvdSBxdWlldC4gV2hhdCwgY2hlZXJseSwgbXkgaGVhcnRzIQoKVFlCQUxUCgogICAgUGF0aWVuY2UgcGVyZm9yY2Ugd2l0aCB3aWxmdWwgY2hvbGVyIG1lZXRpbmcKICAgIE1ha2VzIG15IGZsZXNoIHRyZW1ibGUgaW4gdGhlaXIgZGlmZmVyZW50IGdyZWV0aW5nLgogICAgSSB3aWxsIHdpdGhkcmF3OiBidXQgdGhpcyBpbnRydXNpb24gc2hhbGwKICAgIE5vdyBzZWVtaW5nIHN3ZWV0IGNvbnZlcnQgdG8gYml0dGVyIGdhbGwuCgogICAgRXhpdAoKUk9NRU8KCiAgICBbVG8gSlVMSUVUXSBJZiBJIHByb2ZhbmUgd2l0aCBteSB1bndvcnRoaWVzdCBoYW5kCiAgICBUaGlzIGhvbHkgc2hyaW5lLCB0aGUgZ2VudGxlIGZpbmUgaXMgdGhpczoKICAgIE15IGxpcHMsIHR3byBibHVzaGluZyBwaWxncmltcywgcmVhZHkgc3RhbmQKICAgIFRvIHNtb290aCB0aGF0IHJvdWdoIHRvdWNoIHdpdGggYSB0ZW5kZXIga2lzcy4KCkpVTElFVAoKICAgIEdvb2QgcGlsZ3JpbSwgeW91IGRvIHdyb25nIHlvdXIgaGFuZCB0b28gbXVjaCwKICAgIFdoaWNoIG1hbm5lcmx5IGRldm90aW9uIHNob3dzIGluIHRoaXM7CiAgICBGb3Igc2FpbnRzIGhhdmUgaGFuZHMgdGhhdCBwaWxncmltcycgaGFuZHMgZG8gdG91Y2gsCiAgICBBbmQgcGF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lIGJlIG1hcnJpZWQuCiAgICBNeSBncmF2ZSBpcyBsaWtlIHRvIGJlIG15IHdlZGRpbmcgYmVkLgoKTnVyc2UKCiAgICBIaXMgbmFtZSBpcyBSb21lbywgYW5kIGEgTW9udGFndWU7CiAgICBUaGUgb25seSBzb24gb2YgeW91ciBncmVhdCBlbmVteS4KCkpVTElFVAoKICAgIE15IG9ubHkgbG92ZSBzcHJ1bmcgZnJvbSBteSBvbmx5IGhhdGUhCiAgICBUb28gZWFybHkgc2VlbiB1bmtub3duLCBhbmQga25vd24gdG9vIGxhdGUhCiAgICBQcm9kaWdpb3VzIGJpcnRoIG9mIGxvdmUgaXQgaXMgdG8gbWUsCiAgICBUaGF0IEkgbXVzdCBsb3ZlIGEgbG9hdGhlZCBlbmVteS4KCk51cnNlCgogICAgV2hhdCdzIHRoaXMIHdoYXQncyB0aGlzPwoKSlVMSUVUCgogICAgQSByaHltZSBJIGxlYXJuJ2QgZXZlbiBub3cKICAgIE9mIG9uZSBJIGRhbmNlZCB3aXRoYWwuCgogICAgT25lIGNhbGxzIHdpdGhpbiAnSnVsaWV0LicKCk51cnNlCgogICAgQW5vbiwgYW5vbiEKICAgIENvbWUsIGxldCdzIGF3YXk7IHRoZSBzdHJhbmdlcnMgYWxsIGFyZSBnb25lLgoKICAgIEV4ZXVudAoKQUNUIElJClBST0xPR1VFCgogICAgRW50ZXIgQ2hvcnVzIAoKQ2hvcnVzCgogICAgTm93IG9sZCBkZXNpcmUgZG90aCBpbiBoaXMgZGVhdGgtYmVkIGxpZSwKICAgIEFuZCB5b3VuZyBhZmZlY3Rpb24gZ2FwZXMgdG8gYmUgaGlzIGhlaXI7CiAgICBUaGF0IGZhaXIgZm9yIHdoaWNoIGxvdmUgZ3JvYW4nZCBmb3IgYW5kIHdvdWxkIGRpZSwKICAgIFdpdGggdGVuZGVyIEp1bGlldCBtYXRjaCdkLCBpcyBub3cgbm90IGZhaXIuCiAgICBOb3cgUm9tZW8gaXMgYmVsb3ZlZCBhbmQgbG92ZXMgYWdhaW4sCiAgICBBbGlrZSBiZXR3aXRjaGVkIGJ5IHRoZSBjaGFybSBvZiBsb29rcywKICAgIEJ1dCB0byBoaXMgZm9lIHN1cHBvc2VkIGhlIG11c3QgY29tcGxhaW4sCiAgICBBbmQgc2hlIHN0ZWFsIGxvdmUncyBzd2VldCBiYWl0IGZyb20gZmVhcmZ1bCBob29rczoKICAgIEJlaW5nIGhlbGQgYSBmb2UsIGhlIG1heSBub3QgaGF2ZSBhY2Nlc3MKICAgIFRvIGJyZWF0aGUgc3VjaCB2b3dzIGFzIGxvdmVycyB1c2UgdG8gc3dlYXI7CiAgICBBbmQgc2hlIGFzIG11Y2ggaW4gbG92ZSwgaGVyIG1lYW5zIG11Y2ggbGVzcwogICAgVG8gbWVldCBoZXIgbmV3LWJlbG92ZWQgYW55IHdoZXJlOgogICAgQnV0IHBhc3Npb24gbGVuZHMgdGhlbSBwb3dlciwgdGltZSBtZWFucywgdG8gbWVldAogICAgVGVtcGVyaW5nIGV4dHJlbWl0aWVzIHdpdGggZXh0cmVtZSBzd2VldC4KCiAgICBFeGl0CgpTQ0VORSBJLiBBIGxhbmUgYnkgdGhlIHdhbGwgb2YgQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gCgpST01FTwoKICAgIENhbiBJIGdvIGZvcndhcmQgd2hlbiBteSBoZWFydCBpcyBoZXJlPwogICAgVHVybiBiYWNrLCBkdWxsIGVhcnRoLCBhbmQgZmluZCB0aHkgY2VudHJlIG91dC4KCiAgICBIZSBjbGltYnMgdGhlIHdhbGwsIGFuZCBsZWFwcyBkb3duIHdpdGhpbiBpdAoKICAgIEVudGVyIEJFTlZPTElPIGFuZCBNRVJDVVRJTwoKQkVOVk9MSU8KCiAgICBSb21lbyEgbXkgY291c2luIFJvbWVvIQoKTUVSQ1VUSU8KCiAgICBIZSBpcyB3aXNlOwogICAgQW5kLCBvbiBteSBsaWUsIGhhdGggc3RvbCduIGhpbSBob21lIHRvIGJlZC4KCkJFTlZPTElPCgogICAgSGUgcmFuIHRoaXMgd2F5LCBhbmQgbGVhcCdkIHRoaXMgb3JjaGFyZCB3YWxsOgogICAgQ2FsbCwgZ29vZCBNZXJjdXRpby4KCk1FUkNVVElPCgogICAgTmF5LCBJJ2xsIGNvbmp1cmUgdG9vLgogICAgUm9tZW8hIGh1bW91cnMhIG1hZG1hbiEgcGFzc2lvbiEgbG92ZXIhCiAgICBBcHBlYXIgdGhvdSBpbiB0aGUgbGlrZW5lc3Mgb2YgYSBzaWdoOgogICAgU3BlYWsgYnV0IG9uZSByaHltZSwgYW5kIEkgYW0gc2F0aXNmaWVkOwogICAgQ3J5IGJ1dCAnQXkgbWUhJyBwcm9ub3VuY2UgYnV0ICdsb3ZlJyBhbmQgJ2RvdmU7JwogICAgU3BlYWsgdG8gbXkgZ29zc2lwIFZlbnVzIG9uZSBmYWlyIHdvcmQsCiAgICBPbmUgbmljay1uYW1lIGZvciBoZXIgcHVyYmxpbmQgc29uIGFuZCBoZWlyLAogICAgWW91bmcgQWRhbSBDdXBpZCwgaGUgdGhhdCBzaG90IHNvIHRyaW0sCiAgICBXaGVuIEtpbmcgQ29waGV0dWEgbG92ZWQgdGhlIGJlZ2dhci1tYWlkIQogICAgSGUgaGVhcmV0aCBub3QsIGhlIHN0aXJyZXRoIG5vdCwgaGUgbW92ZXRoIG5vdDsKICAgIFRoZSBhcGUgaXMgZGVhZCwgYW5kIEkgbXVzdCBjb25qdXJlIGhpbS4KICAgIEkgY29uanVyZSB0aGVlIGJ5IFJvc2FsaW5lJ3MgYnJpZ2h0IGV5ZXMsCiAgICBCeSBoZXIgaGlnaCBmb3JlaGVhZCBhbmQgaGVyIHNjYXJsZXQgbGlwLAogICAgQnkgaGVyIGZpbmUgZm9vdCwgc3RyYWlnaHQgbGVnIGFuZCBxdWl2ZXJpbmcgdGhpZ2gKICAgIEFuZCB0aGUgZGVtZXNuZXMgdGhhdCB0aGVyZSBhZGphY2VudCBsaWUsCiAgICBUaGF0IGluIHRoeSBsaWtlbmVzcyB0aG91IGFwcGVhciB0byB1cyEKCkJFTlZPTElPCgogICAgQW5kIGlmIGhlIGhlYXIgdGhlZSwgdGhvdSB3aWx0IGFuZ2VyIGhpbS4KCk1FUkNVVElPCgogICAgVGhpcyBjYW5ub3QgYW5nZXIgaGltOiAndHdvdWxkIGFuZ2VyIGhpbQogICAgVG8gcmFpc2UgYSBzcGlyaXQgaW4gaGlzIG1pc3RyZXNzJyBjaXJjbGUKICAgIE9mIHNvbWUgc3RyYW5nZSBuYXR1cmUsIGxldHRpbmcgaXQgdGhlcmUgc3RhbmQKICAgIFRpbGwgc2hlIGhhZCBsYWlkIGl0IGFuZCBjb25qdXJlZCBpdCBkb3duOwogICAgVGhhdCB3ZXJlIHNvbWUgc3BpdGU6IG15IGludm9jYXRpb24KICAgIElzIGZhaXIgYW5kIGhvbmVzdCwgYW5kIGluIGhpcyBtaXN0cmVzIHMnIG5hbWUKICAgIEkgY29uanVyZSBvbmx5IGJ1dCB0byByYWlzZSB1cCBoaW0uCgpCRU5WT0xJTwoKICAgIENvbWUsIGhlIGhhdGggaGlkIGhpbXNlbGYgYW1vbmcgdGhlc2UgdHJlZXMsCiAgICBUbyBiZSBjb25zb3J0ZWQgd2l0aCB0aGUgaHVtb3JvdXMgbmlnaHQ6CiAgICBCbGluZCBpcyBoaXMgbG92ZSBhbmQgYmVzdCBiZWZpdHMgdGhlIGRhcmsuCgpNRVJDVVRJTwoKICAgIElmIGxvdmUgYmUgYmxpbmQsIGxvdmUgY2Fubm90IGhpdCB0aGUgbWFyay4KICAgIE5vdyB3aWxsIGhlIHNpdCB1bmRlciBhIG1lZGxhciB0cmVlLAogICAgQW5kIHdpc2ggaGlzIG1pc3RyZXNzIHdlcmUgdGhhdCBraW5kIG9mIGZydWl0CiAgICBBcyBtYWlkcyBjYWxsIG1lZGxhcnMsIHdoZW4gdGhleSBsYXVnaCBhbG9uZS4KICAgIFJvbWVvLCB0aGF0IHNoZSB3ZXJlLCBPLCB0aGF0IHNoZSB3ZXJlCiAgICBBbiBvcGVuIGV0IGNhZXRlcmEsIHRob3UgYSBwb3BlcmluIHBlYXIhCiAgICBSb21lbywgZ29vZCBuaWdodDogSSdsbCB0byBteSB0cnVja2xlLWJlZDsKICAgIFRoaXMgZmllbGQtYmVkIGlzIHRvbyBjb2xkIGZvciBtZSB0byBzbGVlcDoKICAgIENvbWUsIHNoYWxsIHdlIGdvPwoKQkVOVk9MSU8KCiAgICBHbywgdGhlbjsgZm9yICd0aXMgaW4gdmFpbgogICAgVG8gc2VlayBoaW0gaGVyZSB0aGF0IG1lYW5zIG5vdCB0byBiZSBmb3VuZC4KCiAgICBFeGV1bnQKClNDRU5FIElJLiBDYXB1bGV0J3Mgb3JjaGFyZC4KCiAgICBFbnRlciBST01FTyAKClJPTUVPCgogICAgSGUgamVzdHMgYXQgc2NhcnMgdGhhdCBuZXZlciBmZWx0IGEgd291bmQuCgogICAgSlVMSUVUIGFwcGVhcnMgYWJvdmUgYXQgYSB3aW5kb3cKICAgIEJ1dCwgc29mdCEgd2hhdCBsaWdodCB0aHJvdWdoIHlvbmRlciB3aW5kb3cgYnJlYWtzPwogICAgSXQgaXMgdGhlIGVhc3QsIGFuZCBKdWxpZXQgaXMgdGhlIHN1bi4KICAgIEFyaXNlLCBmYWlyIHN1biwgYW5kIGtpbGwgdGhlIGVudmlvdXMgbW9vbiwKICAgIFdobyBpcyBhbHJlYWR5IHNpY2sgYW5kIHBhbGUgd2l0aCBncmllZiwKICAgIFRoYXQgdGhvdSBoZXIgbWFpZCBhcnQgZmFyIG1vcmUgZmFpciB0aGFuIHNoZToKICAgIEJlIG5vdCBoZXIgbWFpZCwgc2luY2Ugc2hlIGlzIGVudmlvdXM7CiAgICBIZXIgdmVzdGFsIGxpdmVyeSBpcyBidXQgc2ljayBhbmQgZ3JlZW4KICAgIEFuZCBub25lIGJ1dCBmb29scyBkbyB3ZWFyIGl0OyBjYXN0IGl0IG9mZi4KICAgIEl0IGlzIG15IGxhZHksIE8sIGl0IGlzIG15IGxvdmUhCiAgICBPLCB0aGF0IHNoZSBrbmV3IHNoZSB3ZXJlIQogICAgU2hlIHNwZWFrcyB5ZXQgc2hlIHNheXMgbm90aGluZzogd2hhdCBvZiB0aGF0PwogICAgSGVyIGV5ZSBkaXNjb3Vyc2VzOyBJIHdpbGwgYW5zd2VyIGl0LgogICAgSSBhbSB0b28gYm9sZCwgJ3RpcyBub3QgdG8gbWUgc2hlIHNwZWFrczoKICAgIFR3byBvZiB0aGUgZmFpcmVzdCBzdGFycyBpbiBhbGwgdGhlIGhlYXZlbiwKICAgIEhhdmluZyBzb21lIGJ1c2luZXNzLCBkbyBlbnRyZWF0IGhlciBleWVzCiAgICBUbyB0d2lua2xlIGluIHRoZWlyIHNwaGVyZXMgdGlsbCB0aGV5IHJldHVybi4KICAgIFdoYXQgaWYgaGVyIGV5ZXMgd2VyZSB0aGVyZSwgdGhleSBpbiBoZXIgaGVhZD8KICAgIFRoZSBicmlnaHRuZXNzIG9mIGhlciBjaGVlayB3b3VsZCBzaGFtZSB0aG9zZSBzdGFycywKICAgIEFzIGRheWxpZ2h0IGRvdGggYSBsYW1wOyBoZXIgZXllcyBpbiBoZWF2ZW4KICAgIFdvdWxkIHRocm91Z2ggdGhlIGFpcnkgcmVnaW9uIHN0cmVhbSBzbyBicmlnaHQKICAgIFRoYXQgYmlyZHMgd291bGQgc2luZyBhbmQgdGhpbmsgaXQgd2VyZSBub3QgbmlnaHQuCiAgICBTZWUsIGhvdyBzaGUgbGVhbnMgaGVyIGNoZWVrIHVwb24gaGVyIGhhbmQhCiAgICBPLCB0aGF0IEkgd2VyZSBhIGdsb3ZlIHVwb24gdGhhdCBoYW5kLAogICAgVGhhdCBJIG1pZ2h0IHRvdWNoIHRoYXQgY2hlZWshCgpKVUxJRVQKCiAgICBBeSBtZSEKClJPTUVPCgogICAgU2hlIHNwZWFrczoKICAgIE8sIHNwZWFrIGFnYWluLCBicmlnaHQgYW5nZWwhIGZvciB0aG91IGFydAogICAgQXMgZ2xvcmlvdXMgdG8gdGhpcyBuaWdodCwgYmVpbmcgbydlciBteSBoZWFkCiAgICBBcyBpcyBhIHdpbmdlZCBtZXNzZW5nZXIgb2YgaGVhdmVuCiAgICBVbnRvIHRoZSB3aGl0ZS11cHR1cm5lZCB3b25kZXJpbmcgZXllcwogICAgT2YgbW9ydGFscyB0aGF0IGZhbGwgYmFjayB0byBnYXplIG9uIGhpbQogICAgV2hlbiBoZSBiZXN0cmlkZXMgdGhlIGxhenktcGFjaW5nIGNsb3VkcwogICAgQW5kIHNhaWxzIHVwb24gdGhlIGJvc29tIG9mIHRoZSBhaXIuCgpKVUxJRVQKCiAgICBPIFJvbWVvLCBSb21lbyEgd2hlcmVmb3JlIGFydCB0aG91IFJvbWVvPwogICAgRGVueSB0aHkgZmF0aGVyIGFuZCByZWZ1c2UgdGh5IG5hbWU7CiAgICBPciwgaWYgdGhvdSB3aWx0IG5vdCwgYmUgYnV0IHN3b3JuIG15IGxvdmUsCiAgICBBbmQgSSdsbCBubyBsb25nZXIgYmUgYSBDYXB1bGV0LgoKUk9NRU8KCiAgICBbQXNpZGVdIFNoYWxsIEkgaGVhciBtb3JlLCBvciBzaGFsbCBJIHNwZWFrIGF0IHRoaXMCgpKVUxJRVQKCiAgICAnVGlzIGJ1dCB0aHkgbmFtZSB0aGF0IGlzIG15IGVuZW15OwogICAgVGhvdSBhcnQgdGh5c2VsZiwgdGhvdWdoIG5vdCBhIE1vbnRhZ3VlLgogICAgV2hhdCdzIE1vbnRhZ3VlPyBpdCBpcyBub3IgaGFuZCwgbm9yIGZvb3QsCiAgICBOb3IgYXJtLCBub3IgZmFjZSwgbm9yIGFueSBvdGhlciBwYXJ0CiAgICBCZWxvbmdpbmcgdG8gYSBtYW4uIE8sIGJlIHNvbWUgb3RoZXIgbmFtZSEKICAgIFdoYXQncyBpbiBhIG5hbWUIHRoYXQgd2hpY2ggd2UgY2FsbCBhIHJvc2UKICAgIEJ5IGFueSBvdGhlciBuYW1lIHdvdWxkIHNtZWxsIGFzIHN3ZWV0OwogICAgU28gUm9tZW8gd291bGQsIHdlcmUgaGUgbm90IFJvbWVvIGNhbGwnZCwKICAgIFJldGFpbiB0aGF0IGRlYXIgcGVyZmVjdGlvbiB3aGljaCBoZSBvd2VzCiAgICBXaXRob3V0IHRoYXQgdGl0bGUuIFJvbWVvLCBkb2ZmIHRoeSBuYW1lLAogICAgQW5kIGZvciB0aGF0IG5hbWUgd2hpY2ggaXMgbm8gcGFydCBvZiB0aGVlCiAgICBUYWtlIGFsbCBteXNlbGYuCgpST01FTwoKICAgIEkgdGFrZSB0aGVlIGF0IHRoeSB3b3JkOgogICAgQ2FsbCBtZSBidXQgbG92ZSwgYW5kIEknbGwgYmUgbmV3IGJhcHRpemVkOwogICAgSGVuY2Vmb3J0aCBJIG5ldmVyIHdpbGwgYmUgUm9tZW8uCgpKVUxJRVQKCiAgICBXaGF0IG1hbiBhcnQgdGhvdSB0aGF0IHRodXMgYmVzY3JlZW4nZCBpbiBuaWdodAogICAgU28gc3R1bWJsZXN0IG9uIG15IGNvdW5zZWwCgpST01FTwoKICAgIEJ5IGEgbmFtZQogICAgSSBrbm93IG5vdCBob3cgdG8gdGVsbCB0aGVlIHdobyBJIGFtOgogICAgTXkgbmFtZSwgZGVhciBzYWludCwgaXMgaGF0ZWZ1bCB0byBteXNlbGYsCiAgICBCZWNhdXNlIGl0IGlzIGFuIGVuZW15IHRvIHRoZWU7CiAgICBIYWQgSSBpdCB3cml0dGVuLCBJIHdvdWxkIHRlYXIgdGhlIHdvcmQuCgpKVUxJRVQKCiAgICBNeSBlYXJzIGhhdmUgbm90IHlldCBkcnVuayBhIGh1bmRyZWQgd29yZHMKICAgIE9mIHRoYXQgdG9uZ3VlJ3MgdXR0ZXJhbmNlLCB5ZXQgSSBrbm93IHRoZSBzb3VuZDoKICAgIEFydCB0aG91IG5vdCBSb21lbyBhbmQgYSBNb250YWd1ZT8KClJPTUVPCgogICAgTmVpdGhlciwgZmFpciBzYWludCwgaWYgZWl0aGVyIHRoZWUgZGlzbGlrZS4KCkpVTElFVAoKICAgIEhvdyBjYW1lc3QgdGhvdSBoaXRoZXIsIHRlbGwgbWUsIGFuZCB3aGVyZWZvcmUCiAgICBUaGUgb3JjaGFyZCB3YWxscyBhcmUgaGlnaCBhbmQgaGFyZCB0byBjbGltYiwKICAgIEFuZCB0aGUgcGxhY2UgZGVhdGgsIGNvbnNpZGVyaW5nIHdobyB0aG91IGFydCwKICAgIElmIGFueSBvZiBteSBraW5zbWVuIGZpbmQgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBXaXRoIGxvdmUncyBsaWdodCB3aW5ncyBkaWQgSSBvJ2VyLXBlcmNoIHRoZXNlIHdhbGxzOwogICAgRm9yIHN0b255IGxpbWl0cyBjYW5ub3QgaG9sZCBsb3ZlIG91dCwKICAgIEFuZCB3aGF0IGxvdmUgY2FuIGRvIHRoYXQgZGFyZXMgbG92ZSBhdHRlbXB0OwogICAgVGhlcmVmb3JlIHRoeSBraW5zbWVuIGFyZSBubyBsZXQgdG8gbWUuCgpKVUxJRVQKCiAgICBJZiB0aGV5IGRvIHNlZSB0aGVlLCB0aGV5IHdpbGwgbXVyZGVyIHRoZWUuCgpST01FTwoKICAgIEFsYWNrLCB0aGVyZSBsaWVzIG1vcmUgcGVyaWwgaW4gdGhpbmUgZXllCiAgICBUaGFuIHR3ZW50eSBvZiB0aGVpciBzd29yZHM6IGxvb2sgdGhvdSBidXQgc3dlZXQsCiAgICBBbmQgSSBhbSBwcm9vZiBhZ2FpbnN0IHRoZWlyIGVubWl0eS4KCkpVTElFVAoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd29ybGQgdGhleSBzYXcgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBJIGhhdmUgbmlnaHQncyBjbG9hayB0byBoaWRlIG1lIGZyb20gdGhlaXIgc2lnaHQ7CiAgICBBbmQgYnV0IHRob3UgbG92ZSBtZSwgbGV0IHRoZW0gZmluZCBtZSBoZXJlOgogICAgTXkgbGlmZSB3ZXJlIGJldHRlciBlbmRlZCBieSB0aGVpciBoYXRlLAogICAgVGhhbiBkZWF0aCBwcm9yb2d1ZWQsIHdhbnRpbmcgb2YgdGh5IGxvdmUuCgpKVUxJRVQKCiAgICBCeSB3aG9zZSBkaXJlY3Rpb24gZm91bmQnc3QgdGhvdSBvdXQgdGhpcyBwbGFjZT8KClJPTUVPCgogICAgQnkgbG92ZSwgd2hvIGZpcnN0IGRpZCBwcm9tcHQgbWUgdG8gaW5xdWlyZTsKICAgIEhlIGxlbnQgbWUgY291bnNlbCBhbmQgSSBsZW50IGhpbSBleWVzLgogICAgSSBhbSBubyBwaWxvdDsgeWV0LCB3ZXJ0IHRob3UgYXMgZmFyCiAgICBBcyB0aGF0IHZhc3Qgc2hvcmUgd2FzaCdkIHdpdGggdGhlIGZhcnRoZXN0IHNlYSwKICAgIEkgd291bGQgYWR2ZW50dXJlIGZvciBzdWNoIG1lcmNoYW5kaXNlLgoKSlVMSUVUCgogICAgVGhvdSBrbm93J3N0IHRoZSBtYXNrIG9mIG5pZ2h0IGlzIG9uIG15IGZhY2UsCiAgICBFbHNlIHdvdWxkIGEgbWFpZGVuIGJsdXNoIGJlcGFpbnQgbXkgY2hlZWsKICAgIEZvciB0aGF0IHdoaWNoIHRob3UgaGFzdCBoZWFyZCBtZSBzcGVhayB0by1uaWdodAogICAgRmFpbiB3b3VsZCBJIGR3ZWxsIG9uIGZvcm0sIGZhaW4sIGZhaW4gZGVueQogICAgV2hhdCBJIGhhdmUgc3Bva2U6IGJ1dCBmYXJld2VsbCBjb21wbGltZW50IQogICAgRG9zdCB0aG91IGxvdmUgbWUIEkga25vdyB0aG91IHdpbHQgc2F5ICdBeSwnCiAgICBBbmQgSSB3aWxsIHRha2UgdGh5IHdvcmQ6IHlldCBpZiB0aG91IHN3ZWFyJ3N0LAogICAgVGhvdSBtYXlzdCBwcm92ZSBmYWxzZTsgYXQgbG92ZXJzJyBwZXJqdXJpZXMKICAgIFRoZW4gc2F5LCBKb3ZlIGxhdWdocy4gTyBnZW50bGUgUm9tZW8sCiAgICBJZiB0aG91IGRvc3QgbG92ZSwgcHJvbm91bmNlIGl0IGZhaXRoZnVsbHk6CiAgICBPciBpZiB0aG91IHRoaW5rJ3N0IEkgYW0gdG9vIHF1aWNrbHkgd29uLAogICAgSSdsbCBmcm93biBhbmQgYmUgcGVydmVyc2UgYW4gc2F5IHRoZWUgbmF5LAogICAgU28gdGhvdSB3aWx0IHdvbzsgYnV0IGVsc2UsIG5vdCBmb3IgdGhlIHdvcmxkLgogICAgSW4gdHJ1dGgsIGZhaXIgTW9udGFndWUsIEkgYW0gdG9vIGZvbmQsCiAgICBBbmQgdGhlcmVmb3JlIHRob3UgbWF5c3QgdGhpbmsgbXkgJ2hhdmlvciBsaWdodDoKICAgIEJ1dCB0cnVzdCBtZSwgZ2VudGxlbWFuLCBJJ2xsIHByb3ZlIG1vcmUgdHJ1ZQogICAgVGhhbiB0aG9zZSB0aGF0IGhhdmUgbW9yZSBjdW5uaW5nIHRvIGJlIHN0cmFuZ2UuCiAgICBJIHNob3VsZCBoYXZlIGJlZW4gbW9yZSBzdHJhbmdlLCBJIG11c3QgY29uZmVzcywKICAgIEJ1dCB0aGF0IHRob3Ugb3ZlcmhlYXJkJ3N0LCBlcmUgSSB3YXMgd2FyZSwKICAgIE15IHRydWUgbG92ZSdzIHBhc3Npb246IHRoZXJlZm9yZSBwYXJkb24gbWUsCiAgICBBbmQgbm90IGltcHV0ZSB0aGlzIHlpZWxkaW5nIHRvIGxpZ2h0IGxvdmUsCiAgICBXaGljaCB0aGUgZGFyayBuaWdodCBoYXRoIHNvIGRpc2NvdmVyZWQuCgpST01FTwoKICAgIExhZHksIGJ5IHlvbmRlciBibGVzc2VkIG1vb24gSSBzd2VhcgogICAgVGhhdCB0aXBzIHdpdGggc2lsdmVyIGFsbCB0aGVzZSBmcnVpdC10cmVlIHRvcHMtLQoKSlVMSUVUCgogICAgTywgc3dlYXIgbm90IGJ5IHRoZSBtb29uLCB0aGUgaW5jb25zdGFudCBtb29uLAogICAgVGhhdCBtb250aGx5IGNoYW5nZXMgaW4gaGVyIGNpcmNsZWQgb3JiLAogICAgTGVzdCB0aGF0IHRoeSBsb3ZlIHByb3ZlIGxpa2V3aXNlIHZhcmlhYmxlLgoKUk9NRU8KCiAgICBXaGF0IHNoYWxsIEkgc3dlYXIgYnkCgpKVUxJRVQKCiAgICBEbyBub3Qgc3dlYXIgYXQgYWxsOwogICAgT3IsIGlmIHRob3Ugd2lsdCwgc3dlYXIgYnkgdGh5IGdyYWNpb3VzIHNlbGYsCiAgICBXaGljaCBpcyB0aGUgZ29kIG9mIG15IGlkb2xhdHJ5LAogICAgQW5kIEknbGwgYmVsaWV2ZSB0aGVlLgoKUk9NRU8KCiAgICBJZiBteSBoZWFydCdzIGRlYXIgbG92ZS0tCgpKVUxJRVQKCiAgICBXZWxsLCBkbyBub3Qgc3dlYXI6IGFsdGhvdWdoIEkgam95IGluIHRoZWUsCiAgICBJIGhhdmUgbm8gam95IG9mIHRoaXMgY29udHJhY3QgdG8tbmlnaHQ6CiAgICBJdCBpcyB0b28gcmFzaCwgdG9vIHVuYWR2aXNlZCwgdG9vIHN1ZGRlbjsKICAgIFRvbyBsaWtlIHRoZSBsaWdodG5pbmcsIHdoaWNoIGRvdGggY2Vhc2UgdG8gYmUKICAgIEVyZSBvbmUgY2FuIHNheSAnSXQgbGlnaHRlbnMuJyBTd2VldCwgZ29vZCBuaWdodCEKICAgIFRoaXMgYnVkIG9mIGxvdmUsIGJ5IHN1bW1lcidzIHJpcGVuaW5nIGJyZWF0aCwKICAgIE1heSBwcm92ZSBhIGJlYXV0ZW91cyBmbG93ZXIgd2hlbiBuZXh0IHdlIG1lZXQuCiAgICBHb29kIG5pZ2h0LCBnb29kIG5pZ2h0ISBhcyBzd2VldCByZXBvc2UgYW5kIHJlc3QKICAgIENvbWUgdG8gdGh5IGhlYXJ0IGFzIHRoYXQgd2l0aGluIG15IGJyZWFzdCEKClJPTUVPCgogICAgTywgd2lsdCB0aG91IGxlYXZlIG1lIHNvIHVuc2F0aXNmaWVkPwoKSlVMSUVUCgogICAgV2hhdCBzYXRpc2ZhY3Rpb24gY2Fuc3QgdGhvdSBoYXZlIHRvLW5pZ2h0PwoKUk9NRU8KCiAgICBUaGUgZXhjaGFuZ2Ugb2YgdGh5IGxvdmUncyBmYWl0aGZ1bCB2b3cgZm9yIG1pbmUuCgpKVUxJRVQKCiAgICBJIGdhdmUgdGhlZSBtaW5lIGJlZm9yZSB0aG91IGRpZHN0IHJlcXVlc3QgaXQ6CiAgICBBbmQgeWV0IEkgd291bGQgaXQgd2VyZSB0byBnaXZlIGFnYWluLgoKUk9NRU8KCiAgICBXb3VsZHN0IHRob3Ugd2l0aGRyYXcgaXQIGZvciB3aGF0IHB1cnBvc2UsIGxvdmUCgpKVUxJRVQKCiAgICBCdXQgdG8gYmUgZnJhbmssIGFuZCBnaXZlIGl0IHRoZWUgYWdhaW4uCiAgICBBbmQgeWV0IEkgd2lzaCBidXQgZm9yIHRoZSB0aGluZyBJIGhhdmU6CiAgICBNeSBib3VudHkgaXMgYXMgYm91bmRsZXNzIGFzIHRoZSBzZWEsCiAgICBNeSBsb3ZlIGFzIGRlZXA7IHRoZSBtb3JlIEkgZ2l2ZSB0byB0aGVlLAogICAgVGhlIG1vcmUgSSBoYXZlLCBmb3IgYm90aCBhcmUgaW5maW5pdGUuCgogICAgTnVyc2UgY2FsbHMgd2l0aGluCiAgICBJIGhlYXIgc29tZSBub2lzZSB3aXRoaW47IGRlYXIgbG92ZSwgYWRpZXUhCiAgICBBbm9uLCBnb29kIG51cnNlISBTd2VldCBNb250YWd1ZSwgYmUgdHJ1ZS4KICAgIFN0YXkgYnV0IGEgbGl0dGxlLCBJIHdpbGwgY29tZSBhZ2Fpbi4KCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBPIGJsZXNzZWQsIGJsZXNzZWQgbmlnaHQhIEkgYW0gYWZlYXJkLgogICAgQmVpbmcgaW4gbmlnaHQsIGFsbCB0aGlzIGlzIGJ1dCBhIGRyZWFtLAogICAgVG9vIGZsYXR0ZXJpbmctc3dlZXQgdG8gYmUgc3Vic3RhbnRpYWwuCgogICAgUmUtZW50ZXIgSlVMSUVULCBhYm92ZQoKSlVMSUVUCgogICAgVGhyZWUgd29yZHMsIGRlYXIgUm9tZW8sIGFuZCBnb29kIG5pZ2h0IGluZGVlZC4KICAgIElmIHRoYXQgdGh5IGJlbnQgb2YgbG92ZSBiZSBob25vdXJhYmxlLAogICAgVGh5IHB1cnBvc2UgbWFycmlhZ2UsIHNlbmQgbWUgd29yZCB0by1tb3Jyb3csCiAgICBCeSBvbmUgdGhhdCBJJ2xsIHByb2N1cmUgdG8gY29tZSB0byB0aGVlLAogICAgV2hlcmUgYW5kIHdoYXQgdGltZSB0aG91IHdpbHQgcGVyZm9ybSB0aGUgcml0ZTsKICAgIEFuZCBhbGwgbXkgZm9ydHVuZXMgYXQgdGh5IGZvb3QgSSdsbCBsYXkKICAgIEFuZCBmb2xsb3cgdGhlZSBteSBsb3JkIHRocm91Z2hvdXQgdGhlIHdvcmxkLgoKTnVyc2UKCiAgICBbV2l0aGluXSBNYWRhbSEKCkpVTElFVAoKICAgIEkgY29tZSwgYW5vbi4tLUJ1dCBpZiB0aG91IG1lYW4nc3Qgbm90IHdlbGwsCiAgICBJIGRvIGJlc2VlY2ggdGhlZS0tCgpOdXJzZQoKICAgIFtXaXRoaW5dIE1hZGFtIQoKSlVMSUVUCgogICAgQnkgYW5kIGJ5LCBJIGNvbWU6LS0KICAgIFRvIGNlYXNlIHRoeSBzdWl0LCBhbmQgbGVhdmUgbWUgdG8gbXkgZ3JpZWY6CiAgICBUby1tb3Jyb3cgd2lsbCBJIHNlbmQuCgpST01FTwoKICAgIFNvIHRocml2ZSBteSBzb3VsLS0KCkpVTElFVAoKICAgIEEgdGhvdXNhbmQgdGltZXMgZ29vZCBuaWdodCEKCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBBIHRob3VzYW5kIHRpbWVzIHRoZSB3b3JzZSwgdG8gd2FudCB0aHkgbGlnaHQuCiAgICBMb3ZlIGdvZXMgdG93YXJkIGxvdmUsIGFzIHNjaG9vbGJveXMgZnJvbQogICAgdGhlaXIgYm9va3MsCiAgICBCdXQgbG92ZSBmcm9tIGxvdmUsIHRvd2FyZCBzY2hvb2wgd2l0aCBoZWF2eSBsb29rcy4KCiAgICBSZXRpcmluZwoKICAgIFJlLWVudGVyIEpVTElFVCwgYWJvdmUKCkpVTElFVAoKICAgIEhpc3QhIFJvbWVvLCBoaXN0ISBPLCBmb3IgYSBmYWxjb25lcidzIHZvaWNlLAogICAgVG8gbHVyZSB0aGlzIHRhc3NlbC1nZW50bGUgYmFjayBhZ2FpbiEKICAgIEJvbmRhZ2UgaXMgaG9hcnNlLCBhbmQgbWF5IG5vdCBzcGVhayBhbG91ZDsKICAgIEVsc2Ugd291bGQgSSB0ZWFyIHRoZSBjYXZlIHdoZXJlIEVjaG8gbGllcywKICAgIEFuZCBtYWtlIGhlciBhaXJ5IHRvbmd1ZSBtb3JlIGhvYXJzZSB0aGFuIG1pbmUsCiAgICBXaXRoIHJlcGV0aXRpb24gb2YgbXkgUm9tZW8ncyBuYW1lLgoKUk9NRU8KCiAgICBJdCBpcyBteSBzb3VsIHRoYXQgY2FsbHMgdXBvbiBteSBuYW1lOgogICAgSG93IHNpbHZlci1zd2VldCBzb3VuZCBsb3ZlcnMnIHRvbmd1ZXMgYnkgbmlnaHQsCiAgICBMaWtlIHNvZnRlc3QgbXVzaWMgdG8gYXR0ZW5kaW5nIGVhcnMhCgpKVUxJRVQKCiAgICBSb21lbyEKClJPTUVPCgogICAgTXkgZGVhcj8KCkpVTElFVAoKICAgIEF0IHdoYXQgbydjbG9jayB0by1tb3Jyb3cKICAgIFNoYWxsIEkgc2VuZCB0byB0aGVlPwoKUk9NRU8KCiAgICBBdCB0aGUgaG91ciBvZiBuaW5lLgoKSlVMSUVUCgogICAgSSB3aWxsIG5vdCBmYWlsOiAndGlzIHR3ZW50eSB5ZWFycyB0aWxsIHRoZW4uCiAgICBJIGhhdmUgZm9yZ290IHdoeSBJIGRpZCBjYWxsIHRoZWUgYmFjay4KClJPTUVPCgogICAgTGV0IG1lIHN0YW5kIGhlcmUgdGlsbCB0aG91IHJlbWVtYmVyIGl0LgoKSlVMSUVUCgogICAgSSBzaGFsbCBmb3JnZXQsIHRvIGhhdmUgdGhlZSBzdGlsbCBzdGFuZCB0aGVyZSwKICAgIFJlbWVtYmVyaW5nIGhvdyBJIGxvdmUgdGh5IGNvbXBhbnkuCgpST01FTwoKICAgIEFuZCBJJ2xsIHN0aWxsIHN0YXksIHRvIGhhdmUgdGhlZSBzdGlsbCBmb3JnZXQsCiAgICBGb3JnZXR0aW5nIGFueSBvdGhlciBob21lIGJ1dCB0aGlzLgoKSlVMSUVUCgogICAgJ1RpcyBhbG1vc3QgbW9ybmluZzsgSSB3b3VsZCBoYXZlIHRoZWUgZ29uZToKICAgIEFuZCB5ZXQgbm8gZnVydGhlciB0aGFuIGEgd2FudG9uJ3MgYmlyZDsKICAgIFdobyBsZXRzIGl0IGhvcCBhIGxpdHRsZSBmcm9tIGhlciBoYW5kLAogICAgTGlrZSBhIHBvb3IgcHJpc29uZXIgaW4gaGlzIHR3aXN0ZWQgZ3l2ZXMsCiAgICBBbmQgd2l0aCBhIHNpbGsgdGhyZWFkIHBsdWNrcyBpdCBiYWNrIGFnYWluLAogICAgU28gbG92aW5nLWplYWxvdXMgb2YgaGlzIGxpYmVydHkuCgpST01FTwoKICAgIEkgd291bGQgSSB3ZXJlIHRoeSBiaXJkLgoKSlVMSUVUCgogICAgU3dlZXQsIHNvIHdvdWxkIEk6CiAgICBZZXQgSSBzaG91bGQga2lsbCB0aGVlIHdpdGggbXVjaCBjaGVyaXNoaW5nLgogICAgR29vZCBuaWdodCwgZ29vZCBuaWdodCEgcGFydGluZyBpcyBzdWNoCiAgICBzd2VldCBzb3Jyb3csCiAgICBUaGF0IEkgc2hhbGwgc2F5IGdvb2QgbmlnaHQgdGlsbCBpdCBiZSBtb3Jyb3cuCgogICAgRXhpdCBhYm92ZQoKUk9NRU8KCiAgICBTbGVlcCBkd2VsbCB1cG9uIHRoaW5lIGV5ZXMsIHBlYWNlIGluIHRoeSBicmVhc3QhCiAgICBXb3VsZCBJIHdlcmUgc2xlZXAgYW5kIHBlYWNlLCBzbyBzd2VldCB0byByZXN0IQogICAgSGVuY2Ugd2lsbCBJIHRvIG15IGdob3N0bHkgZmF0aGVyJ3MgY2VsbCwKICAgIEhpcyBoZWxwIHRvIGNyYXZlLCBhbmQgbXkgZGVhciBoYXAgdG8gdGVsbC4KCiAgICBFeGl0CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSwgd2l0aCBhIGJhc2tldCAKCkZSSUFSIExBVVJFTkNFCgogICAgVGhlIGdyZXktZXllZCBtb3JuIHNtaWxlcyBvbiB0aGUgZnJvd25pbmcgbmlnaHQsCiAgICBDaGVxdWVyaW5nIHRoZSBlYXN0ZXJuIGNsb3VkcyB3aXRoIHN0cmVha3Mgb2YgbGlnaHQsCiAgICBBbmQgZmxlY2tlZCBkYXJrbmVzcyBsaWtlIGEgZHJ1bmthcmQgcmVlbHMKICAgIEZyb20gZm9ydGggZGF5J3MgcGF0aCBhbmQgVGl0YW4ncyBmaWVyeSB3aGVlbHM6CiAgICBOb3csIGVyZSB0aGUgc3VuIGFkdmFuY2UgaGlzIGJ1cm5pbmcgZXllLAogICAgVGhlIGRheSB0byBjaGVlciBhbmQgbmlnaHQncyBkYW5rIGRldyB0byBkcnksCiAgICBJIG11c3QgdXAtZmlsbCB0aGlzIG9zaWVyIGNhZ2Ugb2Ygb3VycwogICAgV2l0aCBiYWxlZnVsIHdlZWRzIGFuZCBwcmVjaW91cy1qdWljZWQgZmxvd2Vycy4KICAgIFRoZSBlYXJ0aCB0aGF0J3MgbmF0dXJlJ3MgbW90aGVyIGlzIGhlciB0b21iOwogICAgV2hhdCBpcyBoZXIgYnVyeWluZyBncmF2ZSB0aGF0IGlzIGhlciB3b21iLAogICAgQW5kIGZyb20gaGVyIHdvbWIgY2hpbGRyZW4gb2YgZGl2ZXJzIGtpbmQKICAgIFdlIHN1Y2tpbmcgb24gaGVyIG5hdHVyYWwgYm9zb20gZmluZCwKICAgIE1hbnkgZm9yIG1hbnkgdmlydHVlcyBleGNlbGxlbnQsCiAgICBOb25lIGJ1dCBmb3Igc29tZSBhbmQgeWV0IGFsbCBkaWZmZXJlbnQuCiAgICBPLCBtaWNrbGUgaXMgdGhlIHBvd2VyZnVsIGdyYWNlIHRoYXQgbGllcwogICAgSW4gaGVyYnMsIHBsYW50cywgc3RvbmVzLCBhbmQgdGhlaXIgdHJ1ZSBxdWFsaXRpZXM6CiAgICBGb3Igbm91Z2h0IHNvIHZpbGUgdGhhdCBvbiB0aGUgZWFydGggZG90aCBsaXZlCiAgICBCdXQgdG8gdGhlIGVhcnRoIHNvbWUgc3BlY2lhbCBnb29kIGRvdGggZ2l2ZSwKICAgIE5vciBhdWdodCBzbyBnb29kIGJ1dCBzdHJhaW4nZCBmcm9tIHRoYXQgZmFpciB1c2UKICAgIFJldm9sdHMgZnJvbSB0cnVlIGJpcnRoLCBzdHVtYmxpbmcgb24gYWJ1c2U6CiAgICBWaXJ0dWUgaXRzZWxmIHR1cm5zIHZpY2UsIGJlaW5nIG1pc2FwcGxpZWQ7CiAgICBBbmQgdmljZSBzb21ldGltZXMgYnkgYWN0aW9uIGRpZ25pZmllZC4KICAgIFdpdGhpbiB0aGUgaW5mYW50IHJpbmQgb2YgdGhpcyBzbWFsbCBmbG93ZXIKICAgIFBvaXNvbiBoYXRoIHJlc2lkZW5jZSBhbmQgbWVkaWNpbmUgcG93ZXI6CiAgICBGb3IgdGhpcywgYmVpbmcgc21lbHQsIHdpdGggdGhhdCBwYXJ0IGNoZWVycyBlYWNoIHBhcnQ7CiAgICBCZWluZyB0YXN0ZWQsIHNsYXlzIGFsbCBzZW5zZXMgd2l0aCB0aGUgaGVhcnQuCiAgICBUd28gc3VjaCBvcHBvc2VkIGtpbmdzIGVuY2FtcCB0aGVtIHN0aWxsCiAgICBJbiBtYW4gYXMgd2VsbCBhcyBoZXJicywgZ3JhY2UgYW5kIHJ1ZGUgd2lsbDsKICAgIEFuZCB3aGVyZSB0aGUgd29yc2VyIGlzIHByZWRvbWluYW50LAogICAgRnVsbCBzb29uIHRoZSBjYW5rZXIgZGVhdGggZWF0cyB1cCB0aGF0IHBsYW50LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEdvb2QgbW9ycm93LCBmYXRoZXIuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlbmVkaWNpdGUhCiAgICBXaGF0IGVhcmx5IHRvbmd1ZSBzbyBzd2VldCBzYWx1dGV0aCBtZT8KICAgIFlvdW5nIHNvbiwgaXQgYXJndWVzIGEgZGlzdGVtcGVyJ2QgaGVhZAogICAgU28gc29vbiB0byBiaWQgZ29vZCBtb3Jyb3cgdG8gdGh5IGJlZDoKICAgIENhcmUga2VlcHMgaGlzIHdhdGNoIGluIGV2ZXJ5IG9sZCBtYW4ncyBleWUsCiAgICBBbmQgd2hlcmUgY2FyZSBsb2RnZXMsIHNsZWVwIHdpbGwgbmV2ZXIgbGllOwogICAgQnV0IHdoZXJlIHVuYnJ1aXNlZCB5b3V0aCB3aXRoIHVuc3R1ZmYnZCBicmFpbgogICAgRG90aCBjb3VjaCBoaXMgbGltYnMsIHRoZXJlIGdvbGRlbiBzbGVlcCBkb3RoIHJlaWduOgogICAgVGhlcmVmb3JlIHRoeSBlYXJsaW5lc3MgZG90aCBtZSBhc3N1cmUKICAgIFRob3UgYXJ0IHVwLXJvdXNlZCBieSBzb21lIGRpc3RlbXBlcmF0dXJlOwogICAgT3IgaWYgbm90IHNvLCB0aGVuIGhlcmUgSSBoaXQgaXQgcmlnaHQsCiAgICBPdXIgUm9tZW8gaGF0aCBub3QgYmVlbiBpbiBiZWQgdG8tbmlnaHQuCgpST01FTwoKICAgIFRoYXQgbGFzdCBpcyB0cnVlOyB0aGUgc3dlZXRlciByZXN0IHdhcyBtaW5lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHb2QgcGFyZG9uIHNpbiEgd2FzdCB0aG91IHdpdGggUm9zYWxpbmUCgpST01FTwoKICAgIFdpdGggUm9zYWxpbmUsIG15IGdob3N0bHkgZmF0aGVyPyBubzsKICAgIEkgaGF2ZSBmb3Jnb3QgdGhhdCBuYW1lLCBhbmQgdGhhdCBuYW1lJ3Mgd29lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGF0J3MgbXkgZ29vZCBzb246IGJ1dCB3aGVyZSBoYXN0IHRob3UgYmVlbiwgdGhlbj8KClJPTUVPCgogICAgSSdsbCB0ZWxsIHRoZWUsIGVyZSB0aG91IGFzayBpdCBtZSBhZ2Fpbi4KICAgIEkgaGF2ZSBiZWVuIGZlYXN0aW5nIHdpdGggbWluZSBlbmVteSwKICAgIFdoZXJlIG9uIGEgc3VkZGVuIG9uZSBoYXRoIHdvdW5kZWQgbWUsCiAgICBUaGF0J3MgYnkgbWUgd291bmRlZDogYm90aCBvdXIgcmVtZWRpZXMKICAgIFdpdGhpbiB0aHkgaGVscCBhbmQgaG9seSBwaHlzaWMgbGllczoKICAgIEkgYmVhciBubyBoYXRyZWQsIGJsZXNzZWQgbWFuLCBmb3IsIGxvLAogICAgTXkgaW50ZXJjZXNzaW9uIGxpa2V3aXNlIHN0ZWFkcyBteSBmb2UuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlIHBsYWluLCBnb29kIHNvbiwgYW5kIGhvbWVseSBpbiB0aHkgZHJpZnQ7CiAgICBSaWRkbGluZyBjb25mZXNzaW9uIGZpbmRzIGJ1dCByaWRkbGluZyBzaHJpZnQuCgpST01FTwoKICAgIFRoZW4gcGxhaW5seSBrbm93IG15IGhlYXJ0J3MgZGVhciBsb3ZlIGlzIHNldAogICAgT24gdGhlIGZhaXIgZGF1Z2h0ZXIgb2YgcmljaCBDYXB1bGV0OgogICAgQXMgbWluZSBvbiBoZXJzLCBzbyBoZXJzIGlzIHNldCBvbiBtaW5lOwogICAgQW5kIGFsbCBjb21iaW5lZCwgc2F2ZSB3aGF0IHRob3UgbXVzdCBjb21iaW5lCiAgICBCeSBob2x5IG1hcnJpYWdlOiB3aGVuIGFuZCB3aGVyZSBhbmQgaG93CiAgICBXZSBtZXQsIHdlIHdvbydkIGFuZCBtYWRlIGV4Y2hhbmdlIG9mIHZvdywKICAgIEknbGwgdGVsbCB0aGVlIGFzIHdlIHBhc3M7IGJ1dCB0aGlzIEkgcHJheSwKICAgIFRoYXQgdGhvdSBjb25zZW50IHRvIG1hcnJ5IHVzIHRvLWRheS4KCkZSSUFSIExBVVJFTkNFCgogICAgSG9seSBTYWludCBGcmFuY2lzLCB3aGF0IGEgY2hhbmdlIGlzIGhlcmUhCiAgICBJcyBSb3NhbGluZSwgd2hvbSB0aG91IGRpZHN0IGxvdmUgc28gZGVhciwKICAgIFNvIHNvb24gZm9yc2FrZW4IHlvdW5nIG1lbidzIGxvdmUgdGhlbiBsaWVzCiAgICBOb3QgdHJ1bHkgaW4gdGhlaXIgaGVhcnRzLCBidXQgaW4gdGhlaXIgZXllcy4KICAgIEplc3UgTWFyaWEsIHdoYXQgYSBkZWFsIG9mIGJyaW5lCiAgICBIYXRoIHdhc2gnZCB0aHkgc2FsbG93IGNoZWVrcyBmb3IgUm9zYWxpbmUhCiAgICBIb3cgbXVjaCBzYWx0IHdhdGVyIHRocm93biBhd2F5IGluIHdhc3RlLAogICAgVG8gc2Vhc29uIGxvdmUsIHRoYXQgb2YgaXQgZG90aCBub3QgdGFzdGUhCiAgICBUaGUgc3VuIG5vdCB5ZXQgdGh5IHNpZ2hzIGZyb20gaGVhdmVuIGNsZWFycywKICAgIFRoeSBvbGQgZ3JvYW5zIHJpbmcgeWV0IGluIG15IGFuY2llbnQgZWFyczsKICAgIExvLCBoZXJlIHVwb24gdGh5IGNoZWVrIHRoZSBzdGFpbiBkb3RoIHNpdAogICAgT2YgYW4gb2xkIHRlYXIgdGhhdCBpcyBub3Qgd2FzaCdkIG9mZiB5ZXQ6CiAgICBJZiBlJ2VyIHRob3Ugd2FzdCB0aHlzZWxmIGFuZCB0aGVzZSB3b2VzIHRoaW5lLAogICAgVGhvdSBhbmQgdGhlc2Ugd29lcyB3ZXJlIGFsbCBmb3IgUm9zYWxpbmU6CiAgICBBbmQgYXJ0IHRob3UgY2hhbmdlZD8gcHJvbm91bmNlIHRoaXMgc2VudGVuY2UgdGhlbiwKICAgIFdvbWVuIG1heSBmYWxsLCB3aGVuIHRoZXJlJ3Mgbm8gc3RyZW5ndGggaW4gbWVuLgoKUk9NRU8KCiAgICBUaG91IGNoaWQnc3QgbWUgb2Z0IGZvciBsb3ZpbmcgUm9zYWxpbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIEZvciBkb3RpbmcsIG5vdCBmb3IgbG92aW5nLCBwdXBpbCBtaW5lLgoKUk9NRU8KCiAgICBBbmQgYmFkJ3N0IG1lIGJ1cnkgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTm90IGluIGEgZ3JhdmUsCiAgICBUbyBsYXkgb25lIGluLCBhbm90aGVyIG91dCB0byBoYXZlLgoKUk9NRU8KCiAgICBJIHByYXkgdGhlZSwgY2hpZGUgbm90OyBzaGUgd2hvbSBJIGxvdmUgbm93CiAgICBEb3RoIGdyYWNlIGZvciBncmFjZSBhbmQgbG92ZSBmb3IgbG92ZSBhbGxvdzsKICAgIFRoZSBvdGhlciBkaWQgbm90IHNvLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBPLCBzaGUga25ldyB3ZWxsCiAgICBUaHkgbG92ZSBkaWQgcmVhZCBieSByb3RlIGFuZCBjb3VsZCBub3Qgc3BlbGwuCiAgICBCdXQgY29tZSwgeW91bmcgd2F2ZXJlciwgY29tZSwgZ28gd2l0aCBtZSwKICAgIEluIG9uZSByZXNwZWN0IEknbGwgdGh5IGFzc2lzdGFudCBiZTsKICAgIEZvciB0aGlzIGFsbGlhbmNlIG1heSBzbyBoYXBweSBwcm92ZSwKICAgIFRvIHR1cm4geW91ciBob3VzZWhvbGRzJyByYW5jb3VyIHRvIHB1cmUgbG92ZS4KClJPTUVPCgogICAgTywgbGV0IHVzIGhlbmNlOyBJIHN0YW5kIG9uIHN1ZGRlbiBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2lzZWx5IGFuZCBzbG93OyB0aGV5IHN0dW1ibGUgdGhhdCBydW4gZmFzdC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBCRU5WT0xJTyBhbmQgTUVSQ1VUSU8gCgpNRVJDVVRJTwoKICAgIFdoZXJlIHRoZSBkZXZpbCBzaG91bGQgdGhpcyBSb21lbyBiZT8KICAgIENhbWUgaGUgbm90IGhvbWUgdG8tbmlnaHQCgpCRU5WT0xJTwoKICAgIE5vdCB0byBoaXMgZmF0aGVyJ3M7IEkgc3Bva2Ugd2l0aCBoaXMgbWFuLgoKTUVSQ1VUSU8KCiAgICBBaCwgdGhhdCBzYW1lIHBhbGUgaGFyZC1oZWFydGVkIHdlbmNoLCB0aGF0IFJvc2FsaW5lLgogICAgVG9ybWVudHMgaGltIHNvLCB0aGF0IGhlIHdpbGwgc3VyZSBydW4gbWFkLgoKQkVOVk9MSU8KCiAgICBUeWJhbHQsIHRoZSBraW5zbWFuIG9mIG9sZCBDYXB1bGV0LAogICAgSGF0aCBzZW50IGEgbGV0dGVyIHRvIGhpcyBmYXRoZXIncyBob3VzZS4KCk1FUkNVVElPCgogICAgQSBjaGFsbGVuZ2UsIG9uIG15IGxpZmUuCgpCRU5WT0xJTwoKICAgIFJvbWVvIHdpbGwgYW5zd2VyIGl0LgoKTUVSQ1VUSU8KCiAgICBBbnkgbWFuIHRoYXQgY2FuIHdyaXRlIG1heSBhbnN3ZXIgYSBsZXR0ZXIuCgpCRU5WT0xJTwoKICAgIE5heSwgaGUgd2lsbCBhbnN3ZXIgdGhlIGxldHRlcidzIG1hc3RlciwgaG93IGhlCiAgICBkYXJlcywgYmVpbmcgZGFyZWQuCgpNRVJDVVRJTwoKICAgIEFsYXMgcG9vciBSb21lbyEgaGUgaXMgYWxyZWFkeSBkZWFkOyBzdGFiYmVkIHdpdGggYQogICAgd2hpdGUgd2VuY2gncyBibGFjayBleWU7IHNob3QgdGhyb3VnaCB0aGUgZWFyIHdpdGggYQogICAgbG92ZS1zb25nOyB0aGUgdmVyeSBwaW4gb2YgaGlzIGhlYXJ0IGNsZWZ0IHdpdGggdGhlCiAgICBibGluZCBib3ctYm95J3MgYnV0dC1zaGFmdDogYW5kIGlzIGhlIGEgbWFuIHRvCiAgICBlbmNvdW50ZXIgVHliYWx0PwoKQkVOVk9MSU8KCiAgICBXaHksIHdoYXQgaXMgVHliYWx0PwoKTUVSQ1VUSU8KCiAgICBNb3JlIHRoYW4gcHJpbmNlIG9mIGNhdHMsIEkgY2FuIHRlbGwgeW91LiBPLCBoZSBpcwogICAgdGhlIGNvdXJhZ2VvdXMgY2FwdGFpbiBvZiBjb21wbGltZW50cy4gSGUgZmlnaHRzIGFzCiAgICB5b3Ugc2luZyBwcmljay1zb25nLCBrZWVwcyB0aW1lLCBkaXN0YW5jZSwgYW5kCiAgICBwcm9wb3J0aW9uOyByZXN0cyBtZSBoaXMgbWluaW0gcmVzdCwgb25lLCB0d28sIGFuZAogICAgdGhlIHRoaXJkIGluIHlvdXIgYm9zb206IHRoZSB2ZXJ5IGJ1dGNoZXIgb2YgYSBzaWxrCiAgICBidXR0b24sIGEgZHVlbGxpc3QsIGEgZHVlbGxpc3Q7IGEgZ2VudGxlbWFuIG9mIHRoZQogICAgdmVyeSBmaXJzdCBob3VzZSwgb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2F1c2U6CiAgICBhaCwgdGhlIGltbW9ydGFsIHBhc3NhZG8hIHRoZSBwdW50byByZXZlcnNvISB0aGUKICAgIGhhaSEKCkJFTlZPTElPCgogICAgVGhlIHdoYXQCgpNRVJDVVRJTwoKICAgIFRoZSBwb3ggb2Ygc3VjaCBhbnRpYywgbGlzcGluZywgYWZmZWN0aW5nCiAgICBmYW50YXN0aWNvZXM7IHRoZXNlIG5ldyB0dW5lcnMgb2YgYWNjZW50cyEgJ0J5IEplc3UsCiAgICBhIHZlcnkgZ29vZCBibGFkZSEgYSB2ZXJ5IHRhbGwgbWFuISBhIHZlcnkgZ29vZAogICAgd2hvcmUhJyBXaHksIGlzIG5vdCB0aGlzIGEgbGFtZW50YWJsZSB0aGluZywKICAgIGdyYW5kc2lyZSwgdGhhdCB3ZSBzaG91bGQgYmUgdGh1cyBhZmZsaWN0ZWQgd2l0aAogICAgdGhlc2Ugc3RyYW5nZSBmbGllcywgdGhlc2UgZmFzaGlvbi1tb25nZXJzLCB0aGVzZQogICAgcGVyZG9uYS1taSdzLCB3aG8gc3RhbmQgc28gbXVjaCBvbiB0aGUgbmV3IGZvcm0sCiAgICB0aGF0IHRoZXkgY2Fubm90IGF0IGVhc2Ugb24gdGhlIG9sZCBiZW5jaD8gTywgdGhlaXIKICAgIGJvbmVzLCB0aGVpciBib25lcyEKCiAgICBFbnRlciBST01FTwoKQkVOVk9MSU8KCiAgICBIZXJlIGNvbWVzIFJvbWVvLCBoZXJlIGNvbWVzIFJvbWVvLgoKTUVSQ1VUSU8KCiAgICBXaXRob3V0IGhpcyByb2UsIGxpa2UgYSBkcmllZCBoZXJyaW5nOiBmbGVzaCwgZmxlc2gsCiAgICBob3cgYXJ0IHRob3UgZmlzaGlmaWVkISBOb3cgaXMgaGUgZm9yIHRoZSBudW1iZXJzCiAgICB0aGF0IFBldHJhcmNoIGZsb3dlZCBpbjogTGF1cmEgdG8gaGlzIGxhZHkgd2FzIGJ1dCBhCiAgICBraXRjaGVuLXdlbmNoOyBtYXJyeSwgc2hlIGhhZCBhIGJldHRlciBsb3ZlIHRvCiAgICBiZS1yaHltZSBoZXI7IERpZG8gYSBkb3dkeTsgQ2xlb3BhdHJhIGEgZ2lwc3k7CiAgICBIZWxlbiBhbmQgSGVybyBoaWxkaW5ncyBhbmQgaGFybG90czsgVGhpc2JlIGEgZ3JleQogICAgZXllIG9yIHNvLCBidXQgbm90IHRvIHRoZSBwdXJwb3NlLiBTaWduaW9yCiAgICBSb21lbywgYm9uIGpvdXIhIHRoZXJlJ3MgYSBGcmVuY2ggc2FsdXRhdGlvbgogICAgdG8geW91ciBGcmVuY2ggc2xvcC4gWW91IGdhdmUgdXMgdGhlIGNvdW50ZXJmZWl0CiAgICBmYWlybHkgbGFzdCBuaWdodC4KClJPTUVPCgogICAgR29vZCBtb3Jyb3cgdG8geW91IGJvdGguIFdoYXQgY291bnRlcmZlaXQgZGlkIEkgZ2l2ZSB5b3UCgpNRVJDVVRJTwoKICAgIFRoZSBzaGlwLCBzaXIsIHRoZSBzbGlwOyBjYW4geW91IG5vdCBjb25jZWl2ZT8KClJPTUVPCgogICAgUGFyZG9uLCBnb29kIE1lcmN1dGlvLCBteSBidXNpbmVzcyB3YXMgZ3JlYXQ7IGFuZCBpbgogICAgc3VjaCBhIGNhc2UgYXMgbWluZSBhIG1hbiBtYXkgc3RyYWluIGNvdXJ0ZXN5LgoKTUVSQ1VUSU8KCiAgICBUaGF0J3MgYXMgbXVjaCBhcyB0byBzYXksIHN1Y2ggYSBjYXNlIGFzIHlvdXJzCiAgICBjb25zdHJhaW5zIGEgbWFuIHRvIGJvdyBpbiB0aGUgaGFtcy4KClJPTUVPCgogICAgTWVhbmluZywgdG8gY291cnQnc3kuCgpNRVJDVVRJTwoKICAgIFRob3UgaGFzdCBtb3N0IGtpbmRseSBoaXQgaXQuCgpST01FTwoKICAgIEEgbW9zdCBjb3VydGVvdXMgZXhwb3NpdGlvbi4KCk1FUkNVVElPCgogICAgTmF5LCBJIGFtIHRoZSB2ZXJ5IHBpbmsgb2YgY291cnRlc3kuCgpST01FTwoKICAgIFBpbmsgZm9yIGZsb3dlci4KCk1FUkNVVElPCgogICAgUmlnaHQuCgpST01FTwoKICAgIFdoeSwgdGhlbiBpcyBteSBwdW1wIHdlbGwgZmxvd2VyZWQuCgpNRVJDVVRJTwoKICAgIFdlbGwgc2FpZDogZm9sbG93IG1lIHRoaXMgamVzdCBub3cgdGlsbCB0aG91IGhhc3QKICAgIHdvcm4gb3V0IHRoeSBwdW1wLCB0aGF0IHdoZW4gdGhlIHNpbmdsZSBzb2xlIG9mIGl0CiAgICBpcyB3b3JuLCB0aGUgamVzdCBtYXkgcmVtYWluIGFmdGVyIHRoZSB3ZWFyaW5nIHNvbGUgc2luZ3VsYXIuCgpST01FTwoKICAgIE8gc2luZ2xlLXNvbGVkIGplc3QsIHNvbGVseSBzaW5ndWxhciBmb3IgdGhlCiAgICBzaW5nbGVuZXNzLgoKTUVSQ1VUSU8KCiAgICBDb21lIGJldHdlZW4gdXMsIGdvb2QgQmVudm9saW87IG15IHdpdHMgZmFpbnQuCgpST01FTwoKICAgIFN3aXRjaCBhbmQgc3B1cnMsIHN3aXRjaCBhbmQgc3B1cnM7IG9yIEknbGwgY3J5IGEgbWF0Y2guCgpNRVJDVVRJTwoKICAgIE5heSwgaWYgdGh5IHdpdHMgcnVuIHRoZSB3aWxkLWdvb3NlIGNoYXNlLCBJIGhhdmUKICAgIGRvbmUsIGZvciB0aG91IGhhc3QgbW9yZSBvZiB0aGUgd2lsZC1nb29zZSBpbiBvbmUgb2YKICAgIHRoeSB3aXRzIHRoYW4sIEkgYW0gc3VyZSwgSSBoYXZlIGluIG15IHdob2xlIGZpdmU6CiAgICB3YXMgSSB3aXRoIHlvdSB0aGVyZSBmb3IgdGhlIGdvb3NlPwoKUk9NRU8KCiAgICBUaG91IHdhc3QgbmV2ZXIgd2l0aCBtZSBmb3IgYW55IHRoaW5nIHdoZW4gdGhvdSB3YXN0CiAgICBub3QgdGhlcmUgZm9yIHRoZSBnb29zZS4KCk1FUkNVVElPCgogICAgSSB3aWxsIGJpdGUgdGhlZSBieSB0aGUgZWFyIGZvciB0aGF0IGplc3QuCgpST01FTwoKICAgIE5heSwgZ29vZCBnb29zZSwgYml0ZSBub3QuCgpNRVJDVVRJTwoKICAgIFRoeSB3aXQgaXMgYSB2ZXJ5IGJpdHRlciBzd2VldGluZzsgaXQgaXMgYSBtb3N0CiAgICBzaGFycCBzYXVjZS4KClJPTUVPCgogICAgQW5kIGlzIGl0IG5vdCB3ZWxsIHNlcnZlZCBpbiB0byBhIHN3ZWV0IGdvb3NlPwoKTUVSQ1VUSU8KCiAgICBPIGhlcmUncyBhIHdpdCBvZiBjaGV2ZXJpbCwgdGhhdCBzdHJldGNoZXMgZnJvbSBhbgogICAgaW5jaCBuYXJyb3cgdG8gYW4gZWxsIGJyb2FkIQoKUk9NRU8KCiAgICBJIHN0cmV0Y2ggaXQgb3V0IGZvciB0aGF0IHdvcmQgJ2Jyb2FkOycgd2hpY2ggYWRkZWQKICAgIHRvIHRoZSBnb29zZSwgcHJvdmVzIHRoZWUgZmFyIGFuZCB3aWRlIGEgYnJvYWQgZ29vc2UuCgpNRVJDVVRJTwoKICAgIFdoeSwgaXMgbm90IHRoaXMgYmV0dGVyIG5vdyB0aGFuIGdyb2FuaW5nIGZvciBsb3ZlPwogICAgbm93IGFydCB0aG91IHNvY2lhYmxlLCBub3cgYXJ0IHRob3UgUm9tZW87IG5vdyBhcnQKICAgIHRob3Ugd2hhdCB0aG91IGFydCwgYnkgYXJ0IGFzIHdlbGwgYXMgYnkgbmF0dXJlOgogICAgZm9yIHRoaXMgZHJpdmVsbGluZyBsb3ZlIGlzIGxpa2UgYSBncmVhdCBuYXR1cmFsLAogICAgdGhhdCBydW5zIGxvbGxpbmcgdXAgYW5kIGRvd24gdG8gaGlkZSBoaXMgYmF1YmxlIGluIGEgaG9sZS4KCkJFTlZPTElPCgogICAgU3RvcCB0aGVyZSwgc3RvcCB0aGVyZS4KCk1FUkNVVElPCgogICAgVGhvdSBkZXNpcmVzdCBtZSB0byBzdG9wIGluIG15IHRhbGUgYWdhaW5zdCB0aGUgaGFpci4KCkJFTlZPTElPCgogICAgVGhvdSB3b3VsZHN0IGVsc2UgaGF2ZSBtYWRlIHRoeSB0YWxlIGxhcmdlLgoKTUVSQ1VUSU8KCiAgICBPLCB0aG91IGFydCBkZWNlaXZlZDsgSSB3b3VsZCBoYXZlIG1hZGUgaXQgc2hvcnQ6CiAgICBmb3IgSSB3YXMgY29tZSB0byB0aGUgd2hvbGUgZGVwdGggb2YgbXkgdGFsZTsgYW5kCiAgICBtZWFudCwgaW5kZWVkLCB0byBvY2N1cHkgdGhlIGFyZ3VtZW50IG5vIGxvbmdlci4KClJPTUVPCgogICAgSGVyZSdzIGdvb2RseSBnZWFyIQoKICAgIEVudGVyIE51cnNlIGFuZCBQRVRFUgoKTUVSQ1VUSU8KCiAgICBBIHNhaWwsIGEgc2FpbCEKCkJFTlZPTElPCgogICAgVHdvLCB0d287IGEgc2hpcnQgYW5kIGEgc21vY2suCgpOdXJzZQoKICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBNeSBmYW4sIFBldGVyLgoKTUVSQ1VUSU8KCiAgICBHb29kIFBldGVyLCB0byBoaWRlIGhlciBmYWNlOyBmb3IgaGVyIGZhbidzIHRoZQogICAgZmFpcmVyIGZhY2UuCgpOdXJzZQoKICAgIEdvZCB5ZSBnb29kIG1vcnJvdywgZ2VudGxlbWVuLgoKTUVSQ1VUSU8KCiAgICBHb2QgeWUgZ29vZCBkZW4sIGZhaXIgZ2VudGxld29tYW4uCgpOdXJzZQoKICAgIElzIGl0IGdvb2QgZGVuPwoKTUVSQ1VUSU8KCiAgICAnVGlzIG5vIGxlc3MsIEkgdGVsbCB5b3UsIGZvciB0aGUgYmF3ZHkgaGFuZCBvZiB0aGUKICAgIGRpYWwgaXMgbm93IHVwb24gdGhlIHByaWNrIG9mIG5vb24uCgpOdXJzZQoKICAgIE91dCB1cG9uIHlvdSEgd2hhdCBhIG1hbiBhcmUgeW91IQoKUk9NRU8KCiAgICBPbmUsIGdlbnRsZXdvbWFuLCB0aGF0IEdvZCBoYXRoIG1hZGUgZm9yIGhpbXNlbGYgdG8KICAgIG1hci4KCk51cnNlCgogICAgQnkgbXkgdHJvdGgsIGl0IGlzIHdlbGwgc2FpZDsgJ2ZvciBoaW1zZWxmIHRvIG1hciwnCiAgICBxdW90aCBhJz8gR2VudGxlbWVuLCBjYW4gYW55IG9mIHlvdSB0ZWxsIG1lIHdoZXJlIEkKICAgIG1heSBmaW5kIHRoZSB5b3VuZyBSb21lbz8KClJPTUVPCgogICAgSSBjYW4gdGVsbCB5b3U7IGJ1dCB5b3VuZyBSb21lbyB3aWxsIGJlIG9sZGVyIHdoZW4KICAgIHlvdSBoYXZlIGZvdW5kIGhpbSB0aGFuIGhlIHdhcyB3aGVuIHlvdSBzb3VnaHQgaGltOgogICAgSSBhbSB0aGUgeW91bmdlc3Qgb2YgdGhhdCBuYW1lLCBmb3IgZmF1bHQgb2YgYSB3b3JzZS4KCk51cnNlCgogICAgWW91IHNheSB3ZWxsLgoKTUVSQ1VUSU8KCiAgICBZZWEsIGlzIHRoZSB3b3JzdCB3ZWxsPyB2ZXJ5IHdlbGwgdG9vaywgaScgZmFpdGg7CiAgICB3aXNlbHksIHdpc2VseS4KCk51cnNlCgogICAgaWYgeW91IGJlIGhlLCBzaXIsIEkgZGVzaXJlIHNvbWUgY29uZmlkZW5jZSB3aXRoCiAgICB5b3UuCgpCRU5WT0xJTwoKICAgIFNoZSB3aWxsIGluZGl0ZSBoaW0gdG8gc29tZSBzdXBwZXIuCgpNRVJDVVRJTwoKICAgIEEgYmF3ZCwgYSBiYXdkLCBhIGJhd2QhIHNvIGhvIQoKUk9NRU8KCiAgICBXaGF0IGhhc3QgdGhvdSBmb3VuZD8KCk1FUkNVVElPCgogICAgTm8gaGFyZSwgc2lyOyB1bmxlc3MgYSBoYXJlLCBzaXIsIGluIGEgbGVudGVuIHBpZSwKICAgIHRoYXQgaXMgc29tZXRoaW5nIHN0YWxlIGFuZCBob2FyIGVyZSBpdCBiZSBzcGVudC4KCiAgICBTaW5ncwogICAgQW4gb2xkIGhhcmUgaG9hciwKICAgIEFuZCBhbiBvbGQgaGFyZSBob2FyLAogICAgSXMgdmVyeSBnb29kIG1lYXQgaW4gbGVudAogICAgQnV0IGEgaGFyZSB0aGF0IGlzIGhvYXIKICAgIElzIHRvbyBtdWNoIGZvciBhIHNjb3JlLAogICAgV2hlbiBpdCBob2FycyBlcmUgaXQgYmUgc3BlbnQuCiAgICBSb21lbywgd2lsbCB5b3UgY29tZSB0byB5b3VyIGZhdGhlcidzPyB3ZSdsbAogICAgdG8gZGlubmVyLCB0aGl0aGVyLgoKUk9NRU8KCiAgICBJIHdpbGwgZm9sbG93IHlvdS4KCk1FUkNVVElPCgogICAgRmFyZXdlbGwsIGFuY2llbnQgbGFkeTsgZmFyZXdlbGwsCgogICAgU2luZ2luZwogICAgJ2xhZHksIGxhZHksIGxhZHkuJwoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KCk51cnNlCgogICAgTWFycnksIGZhcmV3ZWxsISBJIHByYXkgeW91LCBzaXIsIHdoYXQgc2F1Y3kKICAgIG1lcmNoYW50IHdhcyB0aGlzLCB0aGF0IHdhcyBzbyBmdWxsIG9mIGhpcyByb3BlcnkCgpST01FTwoKICAgIEEgZ2VudGxlbWFuLCBudXJzZSwgdGhhdCBsb3ZlcyB0byBoZWFyIGhpbXNlbGYgdGFsaywKICAgIGFuZCB3aWxsIHNwZWFrIG1vcmUgaW4gYSBtaW51dGUgdGhhbiBoZSB3aWxsIHN0YW5kCiAgICB0byBpbiBhIG1vbnRoLgoKTnVyc2UKCiAgICBBbiBhJyBzcGVhayBhbnkgdGhpbmcgYWdhaW5zdCBtZSwgSSdsbCB0YWtlIGhpbQogICAgZG93biwgYW4gYScgd2VyZSBsdXN0aWVyIHRoYW4gaGUgaXMsIGFuZCB0d2VudHkgc3VjaAogICAgSmFja3M7IGFuZCBpZiBJIGNhbm5vdCwgSSdsbCBmaW5kIHRob3NlIHRoYXQgc2hhbGwuCiAgICBTY3Vydnkga25hdmUhIEkgYW0gbm9uZSBvZiBoaXMgZmxpcnQtZ2lsbHM7IEkgYW0KICAgIG5vbmUgb2YgaGlzIHNrYWlucy1tYXRlcy4gQW5kIHRob3UgbXVzdCBzdGFuZCBieQogICAgdG9vLCBhbmQgc3VmZmVyIGV2ZXJ5IGtuYXZlIHRvIHVzZSBtZSBhdCBoaXMgcGxlYXN1cmUCgpQRVRFUgoKICAgIEkgc2F3IG5vIG1hbiB1c2UgeW91IGEgcGxlYXN1cmU7IGlmIEkgaGFkLCBteSB3ZWFwb24KICAgIHNob3VsZCBxdWlja2x5IGhhdmUgYmVlbiBvdXQsIEkgd2FycmFudCB5b3U6IEkgZGFyZQogICAgZHJhdyBhcyBzb29uIGFzIGFub3RoZXIgbWFuLCBpZiBJIHNlZSBvY2Nhc2lvbiBpbiBhCiAgICBnb29kIHF1YXJyZWwsIGFuZCB0aGUgbGF3IG9uIG15IHNpZGUuCgpOdXJzZQoKICAgIE5vdywgYWZvcmUgR29kLCBJIGFtIHNvIHZleGVkLCB0aGF0IGV2ZXJ5IHBhcnQgYWJvdXQKICAgIG1lIHF1aXZlcnMuIFNjdXJ2eSBrbmF2ZSEgUHJheSB5b3UsIHNpciwgYSB3b3JkOgogICAgYW5kIGFzIEkgdG9sZCB5b3UsIG15IHlvdW5nIGxhZHkgYmFkZSBtZSBpbnF1aXJlIHlvdQogICAgb3V0OyB3aGF0IHNoZSBiYWRlIG1lIHNheSwgSSB3aWxsIGtlZXAgdG8gbXlzZWxmOgogICAgYnV0IGZpcnN0IGxldCBtZSB0ZWxsIHllLCBpZiB5ZSBzaG91bGQgbGVhZCBoZXIgaW50bwogICAgYSBmb29sJ3MgcGFyYWRpc2UsIGFzIHRoZXkgc2F5LCBpdCB3ZXJlIGEgdmVyeSBncm9zcwogICAga2luZCBvZiBiZWhhdmlvciwgYXMgdGhleSBzYXk6IGZvciB0aGUgZ2VudGxld29tYW4KICAgIGlzIHlvdW5nOyBhbmQsIHRoZXJlZm9yZSwgaWYgeW91IHNob3VsZCBkZWFsIGRvdWJsZQogICAgd2l0aCBoZXIsIHRydWx5IGl0IHdlcmUgYW4gaWxsIHRoaW5nIHRvIGJlIG9mZmVyZWQKICAgIHRvIGFueSBnZW50bGV3b21hbiwgYW5kIHZlcnkgd2VhayBkZWFsaW5nLgoKUk9NRU8KCiAgICBOdXJzZSwgY29tbWVuZCBtZSB0byB0aHkgbGFkeSBhbmQgbWlzdHJlc3MuIEkKICAgIHByb3Rlc3QgdW50byB0aGVlLS0KCk51cnNlCgogICAgR29vZCBoZWFydCwgYW5kLCBpJyBmYWl0aCwgSSB3aWxsIHRlbGwgaGVyIGFzIG11Y2g6CiAgICBMb3JkLCBMb3JkLCBzaGUgd2lsbCBiZSBhIGpveWZ1bCB3b21hbi4KClJPTUVPCgogICAgV2hhdCB3aWx0IHRob3UgdGVsbCBoZXIsIG51cnNlPyB0aG91IGRvc3Qgbm90IG1hcmsgbWUuCgpOdXJzZQoKICAgIEkgd2lsbCB0ZWxsIGhlciwgc2lyLCB0aGF0IHlvdSBkbyBwcm90ZXN0OyB3aGljaCwgYXMKICAgIEkgdGFrZSBpdCwgaXMgYSBnZW50bGVtYW5saWtlIG9mZmVyLgoKUk9NRU8KCiAgICBCaWQgaGVyIGRldmlzZQogICAgU29tZSBtZWFucyB0byBjb21lIHRvIHNocmlmdCB0aGlzIGFmdGVybm9vbjsKICAgIEFuZCB0aGVyZSBzaGUgc2hhbGwgYXQgRnJpYXIgTGF1cmVuY2UnIGNlbGwKICAgIEJlIHNocml2ZWQgYW5kIG1hcnJpZWQuIEhlcmUgaXMgZm9yIHRoeSBwYWlucy4KCk51cnNlCgogICAgTm8gdHJ1bHkgc2lyOyBub3QgYSBwZW5ueS4KClJPTUVPCgogICAgR28gdG87IEkgc2F5IHlvdSBzaGFsbC4KCk51cnNlCgogICAgVGhpcyBhZnRlcm5vb24sIHNpcj8gd2VsbCwgc2hlIHNoYWxsIGJlIHRoZXJlLgoKUk9NRU8KCiAgICBBbmQgc3RheSwgZ29vZCBudXJzZSwgYmVoaW5kIHRoZSBhYmJleSB3YWxsOgogICAgV2l0aGluIHRoaXMgaG91ciBteSBtYW4gc2hhbGwgYmUgd2l0aCB0aGVlCiAgICBBbmQgYnJpbmcgdGhlZSBjb3JkcyBtYWRlIGxpa2UgYSB0YWNrbGVkIHN0YWlyOwogICAgV2hpY2ggdG8gdGhlIGhpZ2ggdG9wLWdhbGxhbnQgb2YgbXkgam95CiAgICBNdXN0IGJlIG15IGNvbnZveSBpbiB0aGUgc2VjcmV0IG5pZ2h0LgogICAgRmFyZXdlbGw7IGJlIHRydXN0eSwgYW5kIEknbGwgcXVpdCB0aHkgcGFpbnM6CiAgICBGYXJld2VsbDsgY29tbWVuZCBtZSB0byB0aHkgbWlzdHJlc3MuCgpOdXJzZQoKICAgIE5vdyBHb2QgaW4gaGVhdmVuIGJsZXNzIHRoZWUhIEhhcmsgeW91LCBzaXIuCgpST01FTwoKICAgIFdoYXQgc2F5J3N0IHRob3UsIG15IGRlYXIgbnVyc2UCgpOdXJzZQoKICAgIElzIHlvdXIgbWFuIHNlY3JldD8gRGlkIHlvdSBuZSdlciBoZWFyIHNheSwKICAgIFR3byBtYXkga2VlcCBjb3Vuc2VsLCBwdXR0aW5nIG9uZSBhd2F5PwoKUk9NRU8KCiAgICBJIHdhcnJhbnQgdGhlZSwgbXkgbWFuJ3MgYXMgdHJ1ZSBhcyBzdGVlbC4KCk5VUlNFCgogICAgV2VsbCwgc2lyOyBteSBtaXN0cmVzcyBpcyB0aGUgc3dlZXRlc3QgbGFkeS0tTG9yZCwKICAgIExvcmQhIHdoZW4gJ3R3YXMgYSBsaXR0bGUgcHJhdGluZyB0aGluZzotLU8sIHRoZXJlCiAgICBpcyBhIG5vYmxlbWFuIGluIHRvd24sIG9uZSBQYXJpcywgdGhhdCB3b3VsZCBmYWluCiAgICBsYXkga25pZmUgYWJvYXJkOyBidXQgc2hlLCBnb29kIHNvdWwsIGhhZCBhcyBsaWVmCiAgICBzZWUgYSB0b2FkLCBhIHZlcnkgdG9hZCwgYXMgc2VlIGhpbS4gSSBhbmdlciBoZXIKICAgIHNvbWV0aW1lcyBhbmQgdGVsbCBoZXIgdGhhdCBQYXJpcyBpcyB0aGUgcHJvcGVyZXIKICAgIG1hbjsgYnV0LCBJJ2xsIHdhcnJhbnQgeW91LCB3aGVuIEkgc2F5IHNvLCBzaGUgbG9va3MKICAgIGFzIHBhbGUgYXMgYW55IGNsb3V0IGluIHRoZSB2ZXJzYWwgd29ybGQuIERvdGggbm90CiAgICByb3NlbWFyeSBhbmQgUm9tZW8gYmVnaW4gYm90aCB3aXRoIGEgbGV0dGVyPwoKUk9NRU8KCiAgICBBeSwgbnVyc2U7IHdoYXQgb2YgdGhhdD8gYm90aCB3aXRoIGFuIFIuCgpOdXJzZQoKICAgIEFoLiBtb2NrZXIhIHRoYXQncyB0aGUgZG9nJ3MgbmFtZTsgUiBpcyBmb3IKICAgIHRoZS0tTm87IEkga25vdyBpdCBiZWdpbnMgd2l0aCBzb21lIG90aGVyCiAgICBsZXR0ZXI6LS1hbmQgc2hlIGhhdGggdGhlIHByZXR0aWVzdCBzZW50ZW50aW91cyBvZgogICAgaXQsIG9mIHlvdSBhbmQgcm9zZW1hcnksIHRoYXQgaXQgd291bGQgZG8geW91IGdvb2QKICAgIHRvIGhlYXIgaXQuCgpST01FTwoKICAgIENvbW1lbmQgbWUgdG8gdGh5IGxhZHkuCgpOdXJzZQoKICAgIEF5LCBhIHRob3VzYW5kIHRpbWVzLgoKICAgIEV4aXQgUm9tZW8KICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBQZXRlciwgdGFrZSBteSBmYW4sIGFuZCBnbyBiZWZvcmUgYW5kIGFwYWNlLgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgSlVMSUVUIAoKSlVMSUVUCgogICAgVGhlIGNsb2NrIHN0cnVjayBuaW5lIHdoZW4gSSBkaWQgc2VuZCB0aGUgbnVyc2U7CiAgICBJbiBoYWxmIGFuIGhvdXIgc2hlIHByb21pc2VkIHRvIHJldHVybi4KICAgIFBlcmNoYW5jZSBzaGUgY2Fubm90IG1lZXQgaGltOiB0aGF0J3Mgbm90IHNvLgogICAgTywgc2hlIGlzIGxhbWUhIGxvdmUncyBoZXJhbGRzIHNob3VsZCBiZSB0aG91Z2h0cywKICAgIFdoaWNoIHRlbiB0aW1lcyBmYXN0ZXIgZ2xpZGUgdGhhbiB0aGUgc3VuJ3MgYmVhbXMsCiAgICBEcml2aW5nIGJhY2sgc2hhZG93cyBvdmVyIGxvdXJpbmcgaGlsbHM6CiAgICBUaGVyZWZvcmUgZG8gbmltYmxlLXBpbmlvbidkIGRvdmVzIGRyYXcgbG92ZSwKICAgIEFuZCB0aGVyZWZvcmUgaGF0aCB0aGUgd2luZC1zd2lmdCBDdXBpZCB3aW5ncy4KICAgIE5vdyBpcyB0aGUgc3VuIHVwb24gdGhlIGhpZ2htb3N0IGhpbGwKICAgIE9mIHRoaXMgZGF5J3Mgam91cm5leSwgYW5kIGZyb20gbmluZSB0aWxsIHR3ZWx2ZQogICAgSXMgdGhyZWUgbG9uZyBob3VycywgeWV0IHNoZSBpcyBub3QgY29tZS4KICAgIEhhZCBzaGUgYWZmZWN0aW9ucyBhbmQgd2FybSB5b3V0aGZ1bCBibG9vZCwKICAgIFNoZSB3b3VsZCBiZSBhcyBzd2lmdCBpbiBtb3Rpb24gYXMgYSBiYWxsOwogICAgTXkgd29yZHMgd291bGQgYmFuZHkgaGVyIHRvIG15IHN3ZWV0IGxvdmUsCiAgICBBbmQgaGlzIHRvIG1lOgogICAgQnV0IG9sZCBmb2xrcywgbWFueSBmZWlnbiBhcyB0aGV5IHdlcmUgZGVhZDsKICAgIFVud2llbGR5LCBzbG93LCBoZWF2eSBhbmQgcGFsZSBhcyBsZWFkLgogICAgTyBHb2QsIHNoZSBjb21lcyEKCiAgICBFbnRlciBOdXJzZSBhbmQgUEVURVIKICAgIE8gaG9uZXkgbnVyc2UsIHdoYXQgbmV3cz8KICAgIEhhc3QgdGhvdSBtZXQgd2l0aCBoaW0IFNlbmQgdGh5IG1hbiBhd2F5LgoKTnVyc2UKCiAgICBQZXRlciwgc3RheSBhdCB0aGUgZ2F0ZS4KCiAgICBFeGl0IFBFVEVSCgpKVUxJRVQKCiAgICBOb3csIGdvb2Qgc3dlZXQgbnVyc2UsLS1PIExvcmQsIHdoeSBsb29rJ3N0IHRob3Ugc2FkPwogICAgVGhvdWdoIG5ld3MgYmUgc2FkLCB5ZXQgdGVsbCB0aGVtIG1lcnJpbHk7CiAgICBJZiBnb29kLCB0aG91IHNoYW1lc3QgdGhlIG11c2ljIG9mIHN3ZWV0IG5ld3MKICAgIEJ5IHBsYXlpbmcgaXQgdG8gbWUgd2l0aCBzbyBzb3VyIGEgZmFjZS4KCk51cnNlCgogICAgSSBhbSBhLXdlYXJ5LCBnaXZlIG1lIGxlYXZlIGF3aGlsZToKICAgIEZpZSwgaG93IG15IGJvbmVzIGFjaGUhIHdoYXQgYSBqYXVudCBoYXZlIEkgaGFkIQoKSlVMSUVUCgogICAgSSB3b3VsZCB0aG91IGhhZHN0IG15IGJvbmVzLCBhbmQgSSB0aHkgbmV3czoKICAgIE5heSwgY29tZSwgSSBwcmF5IHRoZWUsIHNwZWFrOyBnb29kLCBnb29kIG51cnNlLCBzcGVhay4KCk51cnNlCgogICAgSmVzdSwgd2hhdCBoYXN0ZT8gY2FuIHlvdSBub3Qgc3RheSBhd2hpbGUCiAgICBEbyB5b3Ugbm90IHNlZSB0aGF0IEkgYW0gb3V0IG9mIGJyZWF0aD8KCkpVTElFVAoKICAgIEhvdyBhcnQgdGhvdSBvdXQgb2YgYnJlYXRoLCB3aGVuIHRob3UgaGFzdCBicmVhdGgKICAgIFRvIHNheSB0byBtZSB0aGF0IHRob3UgYXJ0IG91dCBvZiBicmVhdGgCiAgICBUaGUgZXhjdXNlIHRoYXQgdGhvdSBkb3N0IG1ha2UgaW4gdGhpcyBkZWxheQogICAgSXMgbG9uZ2VyIHRoYW4gdGhlIHRhbGUgdGhvdSBkb3N0IGV4Y3VzZS4KICAgIElzIHRoeSBuZXdzIGdvb2QsIG9yIGJhZD8gYW5zd2VyIHRvIHRoYXQ7CiAgICBTYXkgZWl0aGVyLCBhbmQgSSdsbCBzdGF5IHRoZSBjaXJjdW1zdGFuY2U6CiAgICBMZXQgbWUgYmUgc2F0aXNmaWVkLCBpcyd0IGdvb2Qgb3IgYmFkPwoKTnVyc2UKCiAgICBXZWxsLCB5b3UgaGF2ZSBtYWRlIGEgc2ltcGxlIGNob2ljZTsgeW91IGtub3cgbm90CiAgICBob3cgdG8gY2hvb3NlIGEgbWFuOiBSb21lbyEgbm8sIG5vdCBoZTsgdGhvdWdoIGhpcwogICAgZmFjZSBiZSBiZXR0ZXIgdGhhbiBhbnkgbWFuJ3MsIHlldCBoaXMgbGVnIGV4Y2VscwogICAgYWxsIG1lbidzOyBhbmQgZm9yIGEgaGFuZCwgYW5kIGEgZm9vdCwgYW5kIGEgYm9keSwKICAgIHRob3VnaCB0aGV5IGJlIG5vdCB0byBiZSB0YWxrZWQgb24sIHlldCB0aGV5IGFyZQogICAgcGFzdCBjb21wYXJlOiBoZSBpcyBub3QgdGhlIGZsb3dlciBvZiBjb3VydGVzeSwKICAgIGJ1dCwgSSdsbCB3YXJyYW50IGhpbSwgYXMgZ2VudGxlIGFzIGEgbGFtYi4gR28gdGh5CiAgICB3YXlzLCB3ZW5jaDsgc2VydmUgR29kLiBXaGF0LCBoYXZlIHlvdSBkaW5lZCBhdCBob21lPwoKSlVMSUVUCgogICAgTm8sIG5vOiBidXQgYWxsIHRoaXMgZGlkIEkga25vdyBiZWZvcmUuCiAgICBXaGF0IHNheXMgaGUgb2Ygb3VyIG1hcnJpYWdlPyB3aGF0IG9mIHRoYXQCgpOdXJzZQoKICAgIExvcmQsIGhvdyBteSBoZWFkIGFjaGVzISB3aGF0IGEgaGVhZCBoYXZlIEkhCiAgICBJdCBiZWF0cyBhcyBpdCB3b3VsZCBmYWxsIGluIHR3ZW50eSBwaWVjZXMuCiAgICBNeSBiYWNrIG8nIHQnIG90aGVyIHNpZGUsLS1PLCBteSBiYWNrLCBteSBiYWNrIQogICAgQmVzaHJldyB5b3VyIGhlYXJ0IGZvciBzZW5kaW5nIG1lIGFib3V0LAogICAgVG8gY2F0Y2ggbXkgZGVhdGggd2l0aCBqYXVudGluZyB1cCBhbmQgZG93biEKCkpVTElFVAoKICAgIEknIGZhaXRoLCBJIGFtIHNvcnJ5IHRoYXQgdGhvdSBhcnQgbm90IHdlbGwuCiAgICBTd2VldCwgc3dlZXQsIHN3ZWV0IG51cnNlLCB0ZWxsIG1lLCB3aGF0IHNheXMgbXkgbG92ZT8KCk51cnNlCgogICAgWW91ciBsb3ZlIHNheXMsIGxpa2UgYW4gaG9uZXN0IGdlbnRsZW1hbiwgYW5kIGEKICAgIGNvdXJ0ZW91cywgYW5kIGEga2luZCwgYW5kIGEgaGFuZHNvbWUsIGFuZCwgSQogICAgd2FycmFudCwgYSB2aXJ0dW91cywtLVdoZXJlIGlzIHlvdXIgbW90aGVyPwoKSlVMSUVUCgogICAgV2hlcmUgaXMgbXkgbW90aGVyISB3aHksIHNoZSBpcyB3aXRoaW47CiAgICBXaGVyZSBzaG91bGQgc2hlIGJlPyBIb3cgb2RkbHkgdGhvdSByZXBsaWVzdCEKICAgICdZb3VyIGxvdmUgc2F5cywgbGlrZSBhbiBob25lc3QgZ2VudGxlbWFuLAogICAgV2hlcmUgaXMgeW91ciBtb3RoZXIJwoKTnVyc2UKCiAgICBPIEdvZCdzIGxhZHkgZGVhciEKICAgIEFyZSB5b3Ugc28gaG90PyBtYXJyeSwgY29tZSB1cCwgSSB0cm93OwogICAgSXMgdGhpcyB0aGUgcG91bHRpY2UgZm9yIG15IGFjaGluZyBib25lcz8KICAgIEhlbmNlZm9yd2FyZCBkbyB5b3VyIG1lc3NhZ2VzIHlvdXJzZWxmLgoKSlVMSUVUCgogICAgSGVyZSdzIHN1Y2ggYSBjb2lsISBjb21lLCB3aGF0IHNheXMgUm9tZW8CgpOdXJzZQoKICAgIEhhdmUgeW91IGdvdCBsZWF2ZSB0byBnbyB0byBzaHJpZnQgdG8tZGF5PwoKSlVMSUVUCgogICAgSSBoYXZlLgoKTnVyc2UKCiAgICBUaGVuIGhpZSB5b3UgaGVuY2UgdG8gRnJpYXIgTGF1cmVuY2UnIGNlbGw7CiAgICBUaGVyZSBzdGF5cyBhIGh1c2JhbmQgdG8gbWFrZSB5b3UgYSB3aWZlOgogICAgTm93IGNvbWVzIHRoZSB3YW50b24gYmxvb2QgdXAgaW4geW91ciBjaGVla3MsCiAgICBUaGV5J2xsIGJlIGluIHNjYXJsZXQgc3RyYWlnaHQgYXQgYW55IG5ld3MuCiAgICBIaWUgeW91IHRvIGNodXJjaDsgSSBtdXN0IGFub3RoZXIgd2F5LAogICAgVG8gZmV0Y2ggYSBsYWRkZXIsIGJ5IHRoZSB3aGljaCB5b3VyIGxvdmUKICAgIE11c3QgY2xpbWIgYSBiaXJkJ3MgbmVzdCBzb29uIHdoZW4gaXQgaXMgZGFyazoKICAgIEkgYW0gdGhlIGRydWRnZSBhbmQgdG9pbCBpbiB5b3VyIGRlbGlnaHQsCiAgICBCdXQgeW91IHNoYWxsIGJlYXIgdGhlIGJ1cmRlbiBzb29uIGF0IG5pZ2h0LgogICAgR287IEknbGwgdG8gZGlubmVyOiBoaWUgeW91IHRvIHRoZSBjZWxsLgoKSlVMSUVUCgogICAgSGllIHRvIGhpZ2ggZm9ydHVuZSEgSG9uZXN0IG51cnNlLCBmYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIFZJLiBGcmlhciBMYXVyZW5jZSdzIGNlbGwuCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UgYW5kIFJPTUVPIAoKRlJJQVIgTEFVUkVOQ0UKCiAgICBTbyBzbWlsZSB0aGUgaGVhdmVucyB1cG9uIHRoaXMgaG9seSBhY3QsCiAgICBUaGF0IGFmdGVyIGhvdXJzIHdpdGggc29ycm93IGNoaWRlIHVzIG5vdCEKClJPTUVPCgogICAgQW1lbiwgYW1lbiEgYnV0IGNvbWUgd2hhdCBzb3Jyb3cgY2FuLAogICAgSXQgY2Fubm90IGNvdW50ZXJ2YWlsIHRoZSBleGNoYW5nZSBvZiBqb3kKICAgIFRoYXQgb25lIHNob3J0IG1pbnV0ZSBnaXZlcyBtZSBpbiBoZXIgc2lnaHQ6CiAgICBEbyB0aG91IGJ1dCBjbG9zZSBvdXIgaGFuZHMgd2l0aCBob2x5IHdvcmRzLAogICAgVGhlbiBsb3ZlLWRldm91cmluZyBkZWF0aCBkbyB3aGF0IGhlIGRhcmU7CiAgICBJdCBpcyBlbm91Z2ggSSBtYXkgYnV0IGNhbGwgaGVyIG1pbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFRoZXNlIHZpb2xlbnQgZGVsaWdodHMgaGF2ZSB2aW9sZW50IGVuZHMKICAgIEFuZCBpbiB0aGVpciB0cml1bXBoIGRpZSwgbGlrZSBmaXJlIGFuZCBwb3dkZXIsCiAgICBXaGljaCBhcyB0aGV5IGtpc3MgY29uc3VtZTogdGhlIHN3ZWV0ZXN0IGhvbmV5CiAgICBJcyBsb2F0aHNvbWUgaW4gaGlzIG93biBkZWxpY2lvdXNuZXNzCiAgICBBbmQgaW4gdGhlIHRhc3RlIGNvbmZvdW5kcyB0aGUgYXBwZXRpdGU6CiAgICBUaGVyZWZvcmUgbG92ZSBtb2RlcmF0ZWx5OyBsb25nIGxvdmUgZG90aCBzbzsKICAgIFRvbyBzd2lmdCBhcnJpdmVzIGFzIHRhcmR5IGFzIHRvbyBzbG93LgoKICAgIEVudGVyIEpVTElFVAogICAgSGVyZSBjb21lcyB0aGUgbGFkeTogTywgc28gbGlnaHQgYSBmb290CiAgICBXaWxsIG5lJ2VyIHdlYXIgb3V0IHRoZSBldmVybGFzdGluZyBmbGludDoKICAgIEEgbG92ZXIgbWF5IGJlc3RyaWRlIHRoZSBnb3NzYW1lcgogICAgVGhhdCBpZGxlcyBpbiB0aGUgd2FudG9uIHN1bW1lciBhaXIsCiAgICBBbmQgeWV0IG5vdCBmYWxsOyBzbyBsaWdodCBpcyB2YW5pdHkuCgpKVUxJRVQKCiAgICBHb29kIGV2ZW4gdG8gbXkgZ2hvc3RseSBjb25mZXNzb3IuCgpGUklBUiBMQVVSRU5DRQoKICAgIFJvbWVvIHNoYWxsIHRoYW5rIHRoZWUsIGRhdWdodGVyLCBmb3IgdXMgYm90aC4KCkpVTElFVAoKICAgIEFzIG11Y2ggdG8gaGltLCBlbHNlIGlzIGhpcyB0aGFua3MgdG9vIG11Y2guCgpST01FTwoKICAgIEFoLCBKdWxpZXQsIGlmIHRoZSBtZWFzdXJlIG9mIHRoeSBqb3kKICAgIEJlIGhlYXAnZCBsaWtlIG1pbmUgYW5kIHRoYXQgdGh5IHNraWxsIGJlIG1vcmUKICAgIFRvIGJsYXpvbiBpdCwgdGhlbiBzd2VldGVuIHdpdGggdGh5IGJyZWF0aAogICAgVGhpcyBuZWlnaGJvdXIgYWlyLCBhbmQgbGV0IHJpY2ggbXVzaWMncyB0b25ndWUKICAgIFVuZm9sZCB0aGUgaW1hZ2luZWQgaGFwcGluZXNzIHRoYXQgYm90aAogICAgUmVjZWl2ZSBpbiBlaXRoZXIgYnkgdGhpcyBkZWFyIGVuY291bnRlci4KCkpVTElFVAoKICAgIENvbmNlaXQsIG1vcmUgcmljaCBpbiBtYXR0ZXIgdGhhbiBpbiB3b3JkcywKICAgIEJyYWdzIG9mIGhpcyBzdWJzdGFuY2UsIG5vdCBvZiBvcm5hbWVudDoKICAgIFRoZXkgYXJlIGJ1dCBiZWdnYXJzIHRoYXQgY2FuIGNvdW50IHRoZWlyIHdvcnRoOwogICAgQnV0IG15IHRydWUgbG92ZSBpcyBncm93biB0byBzdWNoIGV4Y2VzcwogICAgSSBjYW5ub3Qgc3VtIHVwIHN1bSBvZiBoYWxmIG15IHdlYWx0aC4KCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgY29tZSB3aXRoIG1lLCBhbmQgd2Ugd2lsbCBtYWtlIHNob3J0IHdvcms7CiAgICBGb3IsIGJ5IHlvdXIgbGVhdmVzLCB5b3Ugc2hhbGwgbm90IHN0YXkgYWxvbmUKICAgIFRpbGwgaG9seSBjaHVyY2ggaW5jb3Jwb3JhdGUgdHdvIGluIG9uZS4KCiAgICBFeGV1bnQKCkFDVCBJSUkKU0NFTkUgSS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgTUVSQ1VUSU8sIEJFTlZPTElPLCBQYWdlLCBhbmQgU2VydmFudHMgCgpCRU5WT0xJTwoKICAgIEkgcHJheSB0aGVlLCBnb29kIE1lcmN1dGlvLCBsZXQncyByZXRpcmU6CiAgICBUaGUgZGF5IGlzIGhvdCwgdGhlIENhcHVsZXRzIGFicm9hZCwKICAgIEFuZCwgaWYgd2UgbWVldCwgd2Ugc2hhbGwgbm90IHNjYXBlIGEgYnJhd2w7CiAgICBGb3Igbm93LCB0aGVzZSBob3QgZGF5cywgaXMgdGhlIG1hZCBibG9vZCBzdGlycmluZy4KCk1FUkNVVElPCgogICAgVGhvdSBhcnQgbGlrZSBvbmUgb2YgdGhvc2UgZmVsbG93cyB0aGF0IHdoZW4gaGUKICAgIGVudGVycyB0aGUgY29uZmluZXMgb2YgYSB0YXZlcm4gY2xhcHMgbWUgaGlzIHN3b3JkCiAgICB1cG9uIHRoZSB0YWJsZSBhbmQgc2F5cyAnR29kIHNlbmQgbWUgbm8gbmVlZCBvZgogICAgdGhlZSEnIGFuZCBieSB0aGUgb3BlcmF0aW9uIG9mIHRoZSBzZWNvbmQgY3VwIGRyYXdzCiAgICBpdCBvbiB0aGUgZHJhd2VyLCB3aGVuIGluZGVlZCB0aGVyZSBpcyBubyBuZWVkLgoKQkVOVk9MSU8KCiAgICBBbSBJIGxpa2Ugc3VjaCBhIGZlbGxvdz8KCk1FUkNVVElPCgogICAgQ29tZSwgY29tZSwgdGhvdSBhcnQgYXMgaG90IGEgSmFjayBpbiB0aHkgbW9vZCBhcwogICAgYW55IGluIEl0YWx5LCBhbmQgYXMgc29vbiBtb3ZlZCB0byBiZSBtb29keSwgYW5kIGFzCiAgICBzb29uIG1vb2R5IHRvIGJlIG1vdmVkLgoKQkVOVk9MSU8KCiAgICBBbmQgd2hhdCB0bz8KCk1FUkNVVElPCgogICAgTmF5LCBhbiB0aGVyZSB3ZXJlIHR3byBzdWNoLCB3ZSBzaG91bGQgaGF2ZSBub25lCiAgICBzaG9ydGx5LCBmb3Igb25lIHdvdWxkIGtpbGwgdGhlIG90aGVyLiBUaG91ISB3aHksCiAgICB0aG91IHdpbHQgcXVhcnJlbCB3aXRoIGEgbWFuIHRoYXQgaGF0aCBhIGhhaXIgbW9yZSwKICAgIG9yIGEgaGFpciBsZXNzLCBpbiBoaXMgYmVhcmQsIHRoYW4gdGhvdSBoYXN0OiB0aG91CiAgICB3aWx0IHF1YXJyZWwgd2l0aCBhIG1hbiBmb3IgY3JhY2tpbmcgbnV0cywgaGF2aW5nIG5vCiAgICBvdGhlciByZWFzb24gYnV0IGJlY2F1c2UgdGhvdSBoYXN0IGhhemVsIGV5ZXM6IHdoYXQKICAgIGV5ZSBidXQgc3VjaCBhbiBleWUgd291bGQgc3B5IG91dCBzdWNoIGEgcXVhcnJlbD8KICAgIFRoeSBoZWFkIGlzIGFzIGZ1biBvZiBxdWFycmVscyBhcyBhbiBlZ2cgaXMgZnVsbCBvZgogICAgbWVhdCwgYW5kIHlldCB0aHkgaGVhZCBoYXRoIGJlZW4gYmVhdGVuIGFzIGFkZGxlIGFzCiAgICBhbiBlZ2cgZm9yIHF1YXJyZWxsaW5nOiB0aG91IGhhc3QgcXVhcnJlbGxlZCB3aXRoIGEKICAgIG1hbiBmb3IgY291Z2hpbmcgaW4gdGhlIHN0cmVldCwgYmVjYXVzZSBoZSBoYXRoCiAgICB3YWtlbmVkIHRoeSBkb2cgdGhhdCBoYXRoIGxhaW4gYXNsZWVwIGluIHRoZSBzdW46CiAgICBkaWRzdCB0aG91IG5vdCBmYWxsIG91dCB3aXRoIGEgdGFpbG9yIGZvciB3ZWFyaW5nCiAgICBoaXMgbmV3IGRvdWJsZXQgYmVmb3JlIEVhc3Rlcj8gd2l0aCBhbm90aGVyLCBmb3IKICAgIHR5aW5nIGhpcyBuZXcgc2hvZXMgd2l0aCBvbGQgcmliYW5kPyBhbmQgeWV0IHRob3UKICAgIHdpbHQgdHV0b3IgbWUgZnJvbSBxdWFycmVsbGluZyEKCkJFTlZPTElPCgogICAgQW4gSSB3ZXJlIHNvIGFwdCB0byBxdWFycmVsIGFzIHRob3UgYXJ0LCBhbnkgbWFuCiAgICBzaG91bGQgYnV5IHRoZSBmZWUtc2ltcGxlIG9mIG15IGxpZmUgZm9yIGFuIGhvdXIgYW5kIGEgcXVhcnRlci4KCk1FUkNVVElPCgogICAgVGhlIGZlZS1zaW1wbGUhIE8gc2ltcGxlIQoKQkVOVk9MSU8KCiAgICBCeSBteSBoZWFkLCBoZXJlIGNvbWUgdGhlIENhcHVsZXRzLgoKTUVSQ1VUSU8KCiAgICBCeSBteSBoZWVsLCBJIGNhcmUgbm90LgoKICAgIEVudGVyIFRZQkFMVCBhbmQgb3RoZXJzCgpUWUJBTFQKCiAgICBGb2xsb3cgbWUgY2xvc2UsIGZvciBJIHdpbGwgc3BlYWsgdG8gdGhlbS4KICAgIEdlbnRsZW1lbiwgZ29vZCBkZW46IGEgd29yZCB3aXRoIG9uZSBvZiB5b3UuCgpNRVJDVVRJTwoKICAgIEFuZCBidXQgb25lIHdvcmQgd2l0aCBvbmUgb2YgdXMIGNvdXBsZSBpdCB3aXRoCiAgICBzb21ldGhpbmc7IG1ha2UgaXQgYSB3b3JkIGFuZCBhIGJsb3cuCgpUWUJBTFQKCiAgICBZb3Ugc2hhbGwgZmluZCBtZSBhcHQgZW5vdWdoIHRvIHRoYXQsIHNpciwgYW4geW91CiAgICB3aWxsIGdpdmUgbWUgb2NjYXNpb24uCgpNRVJDVVRJTwoKICAgIENvdWxkIHlvdSBub3QgdGFrZSBzb21lIG9jY2FzaW9uIHdpdGhvdXQgZ2l2aW5nPwoKVFlCQUxUCgogICAgTWVyY3V0aW8sIHRob3UgY29uc29ydCdzdCB3aXRoIFJvbWVvLC0tCgpNRVJDVVRJTwoKICAgIENvbnNvcnQhIHdoYXQsIGRvc3QgdGhvdSBtYWtlIHVzIG1pbnN0cmVscz8gYW4KICAgIHRob3UgbWFrZSBtaW5zdHJlbHMgb2YgdXMsIGxvb2sgdG8gaGVhciBub3RoaW5nIGJ1dAogICAgZGlzY29yZHM6IGhlcmUncyBteSBmaWRkbGVzdGljazsgaGVyZSdzIHRoYXQgc2hhbGwKICAgIG1ha2UgeW91IGRhbmNlLiAnWm91bmRzLCBjb25zb3J0IQoKQkVOVk9MSU8KCiAgICBXZSB0YWxrIGhlcmUgaW4gdGhlIHB1YmxpYyBoYXVudCBvZiBtZW46CiAgICBFaXRoZXIgd2l0aGRyYXcgdW50byBzb21lIHByaXZhdGUgcGxhY2UsCiAgICBBbmQgcmVhc29uIGNvbGRseSBvZiB5b3VyIGdyaWV2YW5jZXMsCiAgICBPciBlbHNlIGRlcGFydDsgaGVyZSBhbGwgZXllcyBnYXplIG9uIHVzLgoKTUVSQ1VUSU8KCiAgICBNZW4ncyBleWVzIHdlcmUgbWFkZSB0byBsb29rLCBhbmQgbGV0IHRoZW0gZ2F6ZTsKICAgIEkgd2lsbCBub3QgYnVkZ2UgZm9yIG5vIG1hbidzIHBsZWFzdXJlLCBJLgoKICAgIEVudGVyIFJPTUVPCgpUWUJBTFQKCiAgICBXZWxsLCBwZWFjZSBiZSB3aXRoIHlvdSwgc2lyOiBoZXJlIGNvbWVzIG15IG1hbi4KCk1FUkNVVElPCgogICAgQnV0IEknbGwgYmUgaGFuZ2VkLCBzaXIsIGlmIGhlIHdlYXIgeW91ciBsaXZlcnk6CiAgICBNYXJyeSwgZ28gYmVmb3JlIHRvIGZpZWxkLCBoZSdsbCBiZSB5b3VyIGZvbGxvd2VyOwogICAgWW91ciB3b3JzaGlwIGluIHRoYXQgc2Vuc2UgbWF5IGNhbGwgaGltICdtYW4uJwoKVFlCQUxUCgogICAgUm9tZW8sIHRoZSBoYXRlIEkgYmVhciB0aGVlIGNhbiBhZmZvcmQKICAgIE5vIGJldHRlciB0ZXJtIHRoYW4gdGhpcywtLXRob3UgYXJ0IGEgdmlsbGFpbi4KClJPTUVPCgogICAgVHliYWx0LCB0aGUgcmVhc29uIHRoYXQgSSBoYXZlIHRvIGxvdmUgdGhlZQogICAgRG90aCBtdWNoIGV4Y3VzZSB0aGUgYXBwZXJ0YWluaW5nIHJhZ2UKICAgIFRvIHN1Y2ggYSBncmVldGluZzogdmlsbGFpbiBhbSBJIG5vbmU7CiAgICBUaGVyZWZvcmUgZmFyZXdlbGw7IEkgc2VlIHRob3Uga25vdydzdCBtZSBub3QuCgpUWUJBTFQKCiAgICBCb3ksIHRoaXMgc2hhbGwgbm90IGV4Y3VzZSB0aGUgaW5qdXJpZXMKICAgIFRoYXQgdGhvdSBoYXN0IGRvbmUgbWU7IHRoZXJlZm9yZSB0dXJuIGFuZCBkcmF3LgoKUk9NRU8KCiAgICBJIGRvIHByb3Rlc3QsIEkgbmV2ZXIgaW5qdXJlZCB0aGVlLAogICAgQnV0IGxvdmUgdGhlZSBiZXR0ZXIgdGhhbiB0aG91IGNhbnN0IGRldmlzZSwKICAgIFRpbGwgdGhvdSBzaGFsdCBrbm93IHRoZSByZWFzb24gb2YgbXkgbG92ZToKICAgIEFuZCBzbywgZ29vZCBDYXB1bGV0LC0td2hpY2ggbmFtZSBJIHRlbmRlcgogICAgQXMgZGVhcmx5IGFzIG15IG93biwtLWJlIHNhdGlzZmllZC4KCk1FUkNVVElPCgogICAgTyBjYWxtLCBkaXNob25vdXJhYmxlLCB2aWxlIHN1Ym1pc3Npb24hCiAgICBBbGxhIHN0b2NjYXRhIGNhcnJpZXMgaXQgYXdheS4KCiAgICBEcmF3cwogICAgVHliYWx0LCB5b3UgcmF0LWNhdGNoZXIsIHdpbGwgeW91IHdhbGsCgpUWUJBTFQKCiAgICBXaGF0IHdvdWxkc3QgdGhvdSBoYXZlIHdpdGggbWUCgpNRVJDVVRJTwoKICAgIEdvb2Qga2luZyBvZiBjYXRzLCBub3RoaW5nIGJ1dCBvbmUgb2YgeW91ciBuaW5lCiAgICBsaXZlczsgdGhhdCBJIG1lYW4gdG8gbWFrZSBib2xkIHdpdGhhbCwgYW5kIGFzIHlvdQogICAgc2hhbGwgdXNlIG1lIGhlcmVhZnRlciwgZHJ5YmVhdCB0aGUgcmVzdCBvZiB0aGUKICAgIGVpZ2h0LiBXaWxsIHlvdSBwbHVjayB5b3VyIHN3b3JkIG91dCBvZiBoaXMgcGl0Y2hlcgogICAgYnkgdGhlIGVhcnMIG1ha2UgaGFzdGUsIGxlc3QgbWluZSBiZSBhYm91dCB5b3VyCiAgICBlYXJzIGVyZSBpdCBiZSBvdXQuCgpUWUJBTFQKCiAgICBJIGFtIGZvciB5b3UuCgogICAgRHJhd2luZwoKUk9NRU8KCiAgICBHZW50bGUgTWVyY3V0aW8sIHB1dCB0aHkgcmFwaWVyIHVwLgoKTUVSQ1VUSU8KCiAgICBDb21lLCBzaXIsIHlvdXIgcGFzc2Fkby4KCiAgICBUaGV5IGZpZ2h0CgpST01FTwoKICAgIERyYXcsIEJlbnZvbGlvOyBiZWF0IGRvd24gdGhlaXIgd2VhcG9ucy4KICAgIEdlbnRsZW1lbiwgZm9yIHNoYW1lLCBmb3JiZWFyIHRoaXMgb3V0cmFnZSEKICAgIFR5YmFsdCwgTWVyY3V0aW8sIHRoZSBwcmluY2UgZXhwcmVzc2x5IGhhdGgKICAgIEZvcmJpZGRlbiBiYW5keWluZyBpbiBWZXJvbmEgc3RyZWV0czoKICAgIEhvbGQsIFR5YmFsdCEgZ29vZCBNZXJjdXRpbyEKCiAgICBUWUJBTFQgdW5kZXIgUk9NRU8ncyBhcm0gc3RhYnMgTUVSQ1VUSU8sIGFuZCBmbGllcyB3aXRoIGhpcyBmb2xsb3dlcnMKCk1FUkNVVElPCgogICAgSSBhbSBodXJ0LgogICAgQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEgSSBhbSBzcGVkLgogICAgSXMgaGUgZ29uZSwgYW5kIGhhdGggbm90aGluZz8KCkJFTlZPTElPCgogICAgV2hhdCwgYXJ0IHRob3UgaHVydD8KCk1FUkNVVElPCgogICAgQXksIGF5LCBhIHNjcmF0Y2gsIGEgc2NyYXRjaDsgbWFycnksICd0aXMgZW5vdWdoLgogICAgV2hlcmUgaXMgbXkgcGFnZT8gR28sIHZpbGxhaW4sIGZldGNoIGEgc3VyZ2Vvbi4KCiAgICBFeGl0IFBhZ2UKClJPTUVPCgogICAgQ291cmFnZSwgbWFuOyB0aGUgaHVydCBjYW5ub3QgYmUgbXVjaC4KCk1FUkNVVElPCgogICAgTm8sICd0aXMgbm90IHNvIGRlZXAgYXMgYSB3ZWxsLCBub3Igc28gd2lkZSBhcyBhCiAgICBjaHVyY2gtZG9vcjsgYnV0ICd0aXMgZW5vdWdoLCd0d2lsbCBzZXJ2ZTogYXNrIGZvcgogICAgbWUgdG8tbW9ycm93LCBhbmQgeW91IHNoYWxsIGZpbmQgbWUgYSBncmF2ZSBtYW4uIEkKICAgIGFtIHBlcHBlcmVkLCBJIHdhcnJhbnQsIGZvciB0aGlzIHdvcmxkLiBBIHBsYWd1ZSBvJwogICAgYm90aCB5b3VyIGhvdXNlcyEgJ1pvdW5kcywgYSBkb2csIGEgcmF0LCBhIG1vdXNlLCBhCiAgICBjYXQsIHRvIHNjcmF0Y2ggYSBtYW4gdG8gZGVhdGghIGEgYnJhZ2dhcnQsIGEKICAgIHJvZ3VlLCBhIHZpbGxhaW4sIHRoYXQgZmlnaHRzIGJ5IHRoZSBib29rIG9mCiAgICBhcml0aG1ldGljISBXaHkgdGhlIGRldmlsIGNhbWUgeW91IGJldHdlZW4gdXMIEkKICAgIHdhcyBodXJ0IHVuZGVyIHlvdXIgYXJtLgoKUk9NRU8KCiAgICBJIHRob3VnaHQgYWxsIGZvciB0aGUgYmVzdC4KCk1FUkNVVElPCgogICAgSGVscCBtZSBpbnRvIHNvbWUgaG91c2UsIEJlbnZvbGlvLAogICAgT3IgSSBzaGFsbCBmYWludC4gQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEKICAgIFRoZXkgaGF2ZSBtYWRlIHdvcm1zJyBtZWF0IG9mIG1lOiBJIGhhdmUgaXQsCiAgICBBbmQgc291bmRseSB0b286IHlvdXIgaG91c2VzIQoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KClJPTUVPCgogICAgVGhpcyBnZW50bGVtYW4sIHRoZSBwcmluY2UncyBuZWFyIGFsbHksCiAgICBNeSB2ZXJ5IGZyaWVuZCwgaGF0aCBnb3QgaGlzIG1vcnRhbCBodXJ0CiAgICBJbiBteSBiZWhhbGY7IG15IHJlcHV0YXRpb24gc3RhaW4nZAogICAgV2l0aCBUeWJhbHQncyBzbGFuZGVyLC0tVHliYWx0LCB0aGF0IGFuIGhvdXIKICAgIEhhdGggYmVlbiBteSBraW5zbWFuISBPIHN3ZWV0IEp1bGlldCwKICAgIFRoeSBiZWF1dHkgaGF0aCBtYWRlIG1lIGVmZmVtaW5hdGUKICAgIEFuZCBpbiBteSB0ZW1wZXIgc29mdGVuJ2QgdmFsb3VyJ3Mgc3RlZWwhCgogICAgUmUtZW50ZXIgQkVOVk9MSU8KCkJFTlZPTElPCgogICAgTyBSb21lbywgUm9tZW8sIGJyYXZlIE1lcmN1dGlvJ3MgZGVhZCEKICAgIFRoYXQgZ2FsbGFudCBzcGlyaXQgaGF0aCBhc3BpcmVkIHRoZSBjbG91ZHMsCiAgICBXaGljaCB0b28gdW50aW1lbHkgaGVyZSBkaWQgc2Nvcm4gdGhlIGVhcnRoLgoKUk9NRU8KCiAgICBUaGlzIGRheSdzIGJsYWNrIGZhdGUgb24gbW9yZSBkYXlzIGRvdGggZGVwZW5kOwogICAgVGhpcyBidXQgYmVnaW5zIHRoZSB3b2UsIG90aGVycyBtdXN0IGVuZC4KCkJFTlZPTElPCgogICAgSGVyZSBjb21lcyB0aGUgZnVyaW91cyBUeWJhbHQgYmFjayBhZ2Fpbi4KClJPTUVPCgogICAgQWxpdmUsIGluIHRyaXVtcGghIGFuZCBNZXJjdXRpbyBzbGFpbiEKICAgIEF3YXkgdG8gaGVhdmVuLCByZXNwZWN0aXZlIGxlbml0eSwKICAgIEFuZCBmaXJlLWV5ZWQgZnVyeSBiZSBteSBjb25kdWN0IG5vdyEKCiAgICBSZS1lbnRlciBUWUJBTFQKICAgIE5vdywgVHliYWx0LCB0YWtlIHRoZSB2aWxsYWluIGJhY2sgYWdhaW4sCiAgICBUaGF0IGxhdGUgdGhvdSBnYXZlc3QgbWU7IGZvciBNZXJjdXRpbydzIHNvdWwKICAgIElzIGJ1dCBhIGxpdHRsZSB3YXkgYWJvdmUgb3VyIGhlYWRzLAogICAgU3RheWluZyBmb3IgdGhpbmUgdG8ga2VlcCBoaW0gY29tcGFueToKICAgIEVpdGhlciB0aG91LCBvciBJLCBvciBib3RoLCBtdXN0IGdvIHdpdGggaGltLgoKVFlCQUxUCgogICAgVGhvdSwgd3JldGNoZWQgYm95LCB0aGF0IGRpZHN0IGNvbnNvcnQgaGltIGhlcmUsCiAgICBTaGFsdCB3aXRoIGhpbSBoZW5jZS4KClJPTUVPCgogICAgVGhpcyBzaGFsbCBkZXRlcm1pbmUgdGhhdC4KCiAgICBUaGV5IGZpZ2h0OyBUWUJBTFQgZmFsbHMKCkJFTlZPTElPCgogICAgUm9tZW8sIGF3YXksIGJlIGdvbmUhCiAgICBUaGUgY2l0aXplbnMgYXJlIHVwLCBhbmQgVHliYWx0IHNsYWluLgogICAgU3RhbmQgbm90IGFtYXplZDogdGhlIHByaW5jZSB3aWxsIGRvb20gdGhlZSBkZWF0aCwKICAgIElmIHRob3UgYXJ0IHRha2VuOiBoZW5jZSwgYmUgZ29uZSwgYXdheSEKClJPTUVPCgogICAgTywgSSBhbSBmb3J0dW5lJ3MgZm9vbCEKCkJFTlZPTElPCgogICAgV2h5IGRvc3QgdGhvdSBzdGF5PwoKICAgIEV4aXQgUk9NRU8KCiAgICBFbnRlciBDaXRpemVucywgJiBjCgpGaXJzdCBDaXRpemVuCgogICAgV2hpY2ggd2F5IHJhbiBoZSB0aGF0IGtpbGwnZCBNZXJjdXRpbz8KICAgIFR5YmFsdCwgdGhhdCBtdXJkZXJlciwgd2hpY2ggd2F5IHJhbiBoZT8KCkJFTlZPTElPCgogICAgVGhlcmUgbGllcyB0aGF0IFR5YmFsdC4KCkZpcnN0IENpdGl6ZW4KCiAgICBVcCwgc2lyLCBnbyB3aXRoIG1lOwogICAgSSBjaGFyZ2UgdGhlZSBpbiB0aGUgcHJpbmNlcyBuYW1lLCBvYmV5LgoKICAgIEVudGVyIFByaW5jZSwgYXR0ZW5kZWQ7IE1PTlRBR1VFLCBDQVBVTEVULCB0aGVpciBXaXZlcywgYW5kIG90aGVycwoKUFJJTkNFCgogICAgV2hlcmUgYXJlIHRoZSB2aWxlIGJlZ2lubmVycyBvZiB0aGlzIGZyYXkCgpCRU5WT0xJTwoKICAgIE8gbm9ibGUgcHJpbmNlLCBJIGNhbiBkaXNjb3ZlciBhbGwKICAgIFRoZSB1bmx1Y2t5IG1hbmFnZSBvZiB0aGlzIGZhdGFsIGJyYXdsOgogICAgVGhlcmUgbGllcyB0aGUgbWFuLCBzbGFpbiBieSB5b3VuZyBSb21lbywKICAgIFRoYXQgc2xldyB0aHkga2luc21hbiwgYnJhdmUgTWVyY3V0aW8uCgpMQURZIENBUFVMRVQKCiAgICBUeWJhbHQsIG15IGNvdXNpbiEgTyBteSBicm90aGVyJ3MgY2hpbGQhCiAgICBPIHByaW5jZSEgTyBjb3VzaW4hIGh1c2JhbmQhIE8sIHRoZSBibG9vZCBpcyBzcGlsdAogICAgTyBteSBkZWFyIGtpbnNtYW4hIFByaW5jZSwgYXMgdGhvdSBhcnQgdHJ1ZSwKICAgIEZvciBibG9vZCBvZiBvdXJzLCBzaGVkIGJsb29kIG9mIE1vbnRhZ3VlLgogICAgTyBjb3VzaW4sIGNvdXNpbiEKClBSSU5DRQoKICAgIEJlbnZvbGlvLCB3aG8gYmVnYW4gdGhpcyBibG9vZHkgZnJheT8KCkJFTlZPTElPCgogICAgVHliYWx0LCBoZXJlIHNsYWluLCB3aG9tIFJvbWVvJ3MgaGFuZCBkaWQgc2xheTsKICAgIFJvbWVvIHRoYXQgc3Bva2UgaGltIGZhaXIsIGJhZGUgaGltIGJldGhpbmsKICAgIEhvdyBuaWNlIHRoZSBxdWFycmVsIHdhcywgYW5kIHVyZ2VkIHdpdGhhbAogICAgWW91ciBoaWdoIGRpc3BsZWFzdXJlOiBhbGwgdGhpcyB1dHRlcmVkCiAgICBXaXRoIGdlbnRsZSBicmVhdGgsIGNhbG0gbG9vaywga25lZXMgaHVtYmx5IGJvdydkLAogICAgQ291bGQgbm90IHRha2UgdHJ1Y2Ugd2l0aCB0aGUgdW5ydWx5IHNwbGVlbgogICAgT2YgVHliYWx0IGRlYWYgdG8gcGVhY2UsIGJ1dCB0aGF0IGhlIHRpbHRzCiAgICBXaXRoIHBpZXJjaW5nIHN0ZWVsIGF0IGJvbGQgTWVyY3V0aW8ncyBicmVhc3QsCiAgICBXaG8gYWxsIGFzIGhvdCwgdHVybnMgZGVhZGx5IHBvaW50IHRvIHBvaW50LAogICAgQW5kLCB3aXRoIGEgbWFydGlhbCBzY29ybiwgd2l0aCBvbmUgaGFuZCBiZWF0cwogICAgQ29sZCBkZWF0aCBhc2lkZSwgYW5kIHdpdGggdGhlIG90aGVyIHNlbmRzCiAgICBJdCBiYWNrIHRvIFR5YmFsdCwgd2hvc2UgZGV4dGVyaXR5LAogICAgUmV0b3J0cyBpdDogUm9tZW8gaGUgY3JpZXMgYWxvdWQsCiAgICAnSG9sZCwgZnJpZW5kcyEgZnJpZW5kcywgcGFydCEnIGFuZCwgc3dpZnRlciB0aGFuCiAgICBoaXMgdG9uZ3VlLAogICAgSGlzIGFnaWxlIGFybSBiZWF0cyBkb3duIHRoZWlyIGZhdGFsIHBvaW50cywKICAgIEFuZCAndHdpeHQgdGhlbSBydXNoZXM7IHVuZGVybmVhdGggd2hvc2UgYXJtCiAgICBBbiBlbnZpb3VzIHRocnVzdCBmcm9tIFR5YmFsdCBoaXQgdGhlIGxpZmUKICAgIE9mIHN0b3V0IE1lcmN1dGlvLCBhbmQgdGhlbiBUeWJhbHQgZmxlZDsKICAgIEJ1dCBieSBhbmQgYnkgY29tZXMgYmFjayB0byBSb21lbywKICAgIFdobyBoYWQgYnV0IG5ld2x5IGVudGVydGFpbidkIHJldmVuZ2UsCiAgICBBbmQgdG8gJ3QgdGhleSBnbyBsaWtlIGxpZ2h0bmluZywgZm9yLCBlcmUgSQogICAgQ291bGQgZHJhdyB0byBwYXJ0IHRoZW0sIHdhcyBzdG91dCBUeWJhbHQgc2xhaW4uCiAgICBBbmQsIGFzIGhlIGZlbGwsIGRpZCBSb21lbyB0dXJuIGFuZCBmbHkuCiAgICBUaGlzIGlzIHRoZSB0cnV0aCwgb3IgbGV0IEJlbnZvbGlvIGRpZS4KCkxBRFkgQ0FQVUxFVAoKICAgIEhlIGlzIGEga2luc21hbiB0byB0aGUgTW9udGFndWU7CiAgICBBZmZlY3Rpb24gbWFrZXMgaGltIGZhbHNlOyBoZSBzcGVha3Mgbm90IHRydWU6CiAgICBTb21lIHR3ZW50eSBvZiB0aGVtIGZvdWdodCBpbiB0aGlzIGJsYWNrIHN0cmlmZSwKICAgIEFuZCBhbGwgdGhvc2UgdHdlbnR5IGNvdWxkIGJ1dCBraWxsIG9uZSBsaWZlLgogICAgSSBiZWcgZm9yIGp1c3RpY2UsIHdoaWNoIHRob3UsIHByaW5jZSwgbXVzdCBnaXZlOwogICAgUm9tZW8gc2xldyBUeWJhbHQsIFJvbWVvIG11c3Qgbm90IGxpdmUuCgpQUklOQ0UKCiAgICBSb21lbyBzbGV3IGhpbSwgaGUgc2xldyBNZXJjdXRpbzsKICAgIFdobyBub3cgdGhlIHByaWNlIG9mIGhpcyBkZWFyIGJsb29kIGRvdGggb3dlPwoKTU9OVEFHVUUKCiAgICBOb3QgUm9tZW8sIHByaW5jZSwgaGUgd2FzIE1lcmN1dGlvJ3MgZnJpZW5kOwogICAgSGlzIGZhdWx0IGNvbmNsdWRlcyBidXQgd2hhdCB0aGUgbGF3IHNob3VsZCBlbmQsCiAgICBUaGUgbGlmZSBvZiBUeWJhbHQuCgpQUklOQ0UKCiAgICBBbmQgZm9yIHRoYXQgb2ZmZW5jZQogICAgSW1tZWRpYXRlbHkgd2UgZG8gZXhpbGUgaGltIGhlbmNlOgogICAgSSBoYXZlIGFuIGludGVyZXN0IGluIHlvdXIgaGF0ZSdzIHByb2NlZWRpbmcsCiAgICBNeSBibG9vZCBmb3IgeW91ciBydWRlIGJyYXdscyBkb3RoIGxpZSBhLWJsZWVkaW5nOwogICAgQnV0IEknbGwgYW1lcmNlIHlvdSB3aXRoIHNvIHN0cm9uZyBhIGZpbmUKICAgIFRoYXQgeW91IHNoYWxsIGFsbCByZXBlbnQgdGhlIGxvc3Mgb2YgbWluZToKICAgIEkgd2lsbCBiZSBkZWFmIHRvIHBsZWFkaW5nIGFuZCBleGN1c2VzOwogICAgTm9yIHRlYXJzIG5vciBwcmF5ZXJzIHNoYWxsIHB1cmNoYXNlIG91dCBhYnVzZXM6CiAgICBUaGVyZWZvcmUgdXNlIG5vbmU6IGxldCBSb21lbyBoZW5jZSBpbiBoYXN0ZSwKICAgIEVsc2UsIHdoZW4gaGUncyBmb3VuZCwgdGhhdCBob3VyIGlzIGhpcyBsYXN0LgogICAgQmVhciBoZW5jZSB0aGlzIGJvZHkgYW5kIGF0dGVuZCBvdXIgd2lsbDoKICAgIE1lcmN5IGJ1dCBtdXJkZXJzLCBwYXJkb25pbmcgdGhvc2UgdGhhdCBraWxsLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIENhcHVsZXQncyBvcmNoYXJkLgoKICAgIEVudGVyIEpVTElFVCAKCkpVTElFVAoKICAgIEdhbGxvcCBhcGFjZSwgeW91IGZpZXJ5LWZvb3RlZCBzdGVlZHMsCiAgICBUb3dhcmRzIFBob2VidXMnIGxvZGdpbmc6IHN1Y2ggYSB3YWdvbmVyCiAgICBBcyBQaGFldGhvbiB3b3VsZCB3aGlwIHlvdSB0byB0aGUgd2VzdCwKICAgIEFuZCBicmluZyBpbiBjbG91ZHkgbmlnaHQgaW1tZWRpYXRlbHkuCiAgICBTcHJlYWQgdGh5IGNsb3NlIGN1cnRhaW4sIGxvdmUtcGVyZm9ybWluZyBuaWdodCwKICAgIFRoYXQgcnVuYXdheSdzIGV5ZXMgbWF5IHdpbmsgYW5kIFJvbWVvCiAgICBMZWFwIHRvIHRoZXNlIGFybXMsIHVudGFsaydkIG9mIGFuZCB1bnNlZW4uCiAgICBMb3ZlcnMgY2FuIHNlZSB0byBkbyB0aGVpciBhbW9yb3VzIHJpdGVzCiAgICBCeSB0aGVpciBvd24gYmVhdXRpZXM7IG9yLCBpZiBsb3ZlIGJlIGJsaW5kLAogICAgSXQgYmVzdCBhZ3JlZXMgd2l0aCBuaWdodC4gQ29tZSwgY2l2aWwgbmlnaHQsCiAgICBUaG91IHNvYmVyLXN1aXRlZCBtYXRyb24sIGFsbCBpbiBibGFjaywKICAgIEFuZCBsZWFybiBtZSBob3cgdG8gbG9zZSBhIHdpbm5pbmcgbWF0Y2gsCiAgICBQbGF5J2QgZm9yIGEgcGFpciBvZiBzdGFpbmxlc3MgbWFpZGVuaG9vZHM6CiAgICBIb29kIG15IHVubWFubidkIGJsb29kLCBiYXRpbmcgaW4gbXkgY2hlZWtzLAogICAgV2l0aCB0aHkgYmxhY2sgbWFudGxlOyB0aWxsIHN0cmFuZ2UgbG92ZSwgZ3Jvd24gYm9sZCwKICAgIFRoaW5rIHRydWUgbG92ZSBhY3RlZCBzaW1wbGUgbW9kZXN0eS4KICAgIENvbWUsIG5pZ2h0OyBjb21lLCBSb21lbzsgY29tZSwgdGhvdSBkYXkgaW4gbmlnaHQ7CiAgICBGb3IgdGhvdSB3aWx0IGxpZSB1cG9uIHRoZSB3aW5ncyBvZiBuaWdodAogICAgV2hpdGVyIHRoYW4gbmV3IHNub3cgb24gYSByYXZlbidzIGJhY2suCiAgICBDb21lLCBnZW50bGUgbmlnaHQsIGNvbWUsIGxvdmluZywgYmxhY2stYnJvdydkIG5pZ2h0LAogICAgR2l2ZSBtZSBteSBSb21lbzsgYW5kLCB3aGVuIGhlIHNoYWxsIGRpZSwKICAgIFRha2UgaGltIGFuZCBjdXQgaGltIG91dCBpbiBsaXR0bGUgc3RhcnMsCiAgICBBbmQgaGUgd2lsbCBtYWtlIHRoZSBmYWNlIG9mIGhlYXZlbiBzbyBmaW5lCiAgICBUaGF0IGFsbCB0aGUgd29ybGQgd2lsbCBiZSBpbiBsb3ZlIHdpdGggbmlnaHQKICAgIEFuZCBwYXkgbm8gd29yc2hpcCB0byB0aGUgZ2FyaXNoIHN1bi4KICAgIE8sIEkgaGF2ZSBib3VnaHQgdGhlIG1hbnNpb24gb2YgYSBsb3ZlLAogICAgQnV0IG5vdCBwb3NzZXNzJ2QgaXQsIGFuZCwgdGhvdWdoIEkgYW0gc29sZCwKICAgIE5vdCB5ZXQgZW5qb3knZDogc28gdGVkaW91cyBpcyB0aGlzIGRheQogICAgQXMgaXMgdGhlIG5pZ2h0IGJlZm9yZSBzb21lIGZlc3RpdmFsCiAgICBUbyBhbiBpbXBhdGllbnQgY2hpbGQgdGhhdCBoYXRoIG5ldyByb2JlcwogICAgQW5kIG1heSBub3Qgd2VhciB0aGVtLiBPLCBoZXJlIGNvbWVzIG15IG51cnNlLAogICAgQW5kIHNoZSBicmluZ3MgbmV3czsgYW5kIGV2ZXJ5IHRvbmd1ZSB0aGF0IHNwZWFrcwogICAgQnV0IFJvbWVvJ3MgbmFtZSBzcGVha3MgaGVhdmVubHkgZWxvcXVlbmNlLgoKICAgIEVudGVyIE51cnNlLCB3aXRoIGNvcmRzCiAgICBOb3csIG51cnNlLCB3aGF0IG5ld3MIFdoYXQgaGFzdCB0aG91IHRoZXJlPyB0aGUgY29yZHMKICAgIFRoYXQgUm9tZW8gYmlkIHRoZWUgZmV0Y2gCgpOdXJzZQoKICAgIEF5LCBheSwgdGhlIGNvcmRzLgoKICAgIFRocm93cyB0aGVtIGRvd24KCkpVTElFVAoKICAgIEF5IG1lISB3aGF0IG5ld3MIHdoeSBkb3N0IHRob3Ugd3JpbmcgdGh5IGhhbmRzPwoKTnVyc2UKCiAgICBBaCwgd2VsbC1hLWRheSEgaGUncyBkZWFkLCBoZSdzIGRlYWQsIGhlJ3MgZGVhZCEKICAgIFdlIGFyZSB1bmRvbmUsIGxhZHksIHdlIGFyZSB1bmRvbmUhCiAgICBBbGFjayB0aGUgZGF5ISBoZSdzIGdvbmUsIGhlJ3Mga2lsbCdkLCBoZSdzIGRlYWQhCgpKVUxJRVQKCiAgICBDYW4gaGVhdmVuIGJlIHNvIGVudmlvdXMCgpOdXJzZQoKICAgIFJvbWVvIGNhbiwKICAgIFRob3VnaCBoZWF2ZW4gY2Fubm90OiBPIFJvbWVvLCBSb21lbyEKICAgIFdobyBldmVyIHdvdWxkIGhhdmUgdGhvdWdodCBpdD8gUm9tZW8hCgpKVUxJRVQKCiAgICBXaGF0IGRldmlsIGFydCB0aG91LCB0aGF0IGRvc3QgdG9ybWVudCBtZSB0aHVzPwogICAgVGhpcyB0b3J0dXJlIHNob3VsZCBiZSByb2FyJ2QgaW4gZGlzbWFsIGhlbGwuCiAgICBIYXRoIFJvbWVvIHNsYWluIGhpbXNlbGYIHNheSB0aG91IGJ1dCAnSSwnCiAgICBBbmQgdGhhdCBiYXJlIHZvd2VsICdJJyBzaGFsbCBwb2lzb24gbW9yZQogICAgVGhhbiB0aGUgZGVhdGgtZGFydGluZyBleWUgb2YgY29ja2F0cmljZToKICAgIEkgYW0gbm90IEksIGlmIHRoZXJlIGJlIHN1Y2ggYW4gSTsKICAgIE9yIHRob3NlIGV5ZXMgc2h1dCwgdGhhdCBtYWtlIHRoZWUgYW5zd2VyICdJLicKICAgIElmIGhlIGJlIHNsYWluLCBzYXkgJ0knOyBvciBpZiBub3QsIG5vOgogICAgQnJpZWYgc291bmRzIGRldGVybWluZSBvZiBteSB3ZWFsIG9yIHdvZS4KCk51cnNlCgogICAgSSBzYXcgdGhlIHdvdW5kLCBJIHNhdyBpdCB3aXRoIG1pbmUgZXllcywtLQogICAgR29kIHNhdmUgdGhlIG1hcmshLS1oZXJlIG9uIGhpcyBtYW5seSBicmVhc3Q6CiAgICBBIHBpdGVvdXMgY29yc2UsIGEgYmxvb2R5IHBpdGVvdXMgY29yc2U7CiAgICBQYWxlLCBwYWxlIGFzIGFzaGVzLCBhbGwgYmVkYXViJ2QgaW4gYmxvb2QsCiAgICBBbGwgaW4gZ29yZS1ibG9vZDsgSSBzd291bmRlZCBhdCB0aGUgc2lnaHQuCgpKVUxJRVQKCiAgICBPLCBicmVhaywgbXkgaGVhcnQhIHBvb3IgYmFua3J1cHQsIGJyZWFrIGF0IG9uY2UhCiAgICBUbyBwcmlzb24sIGV5ZXMsIG5lJ2VyIGxvb2sgb24gbGliZXJ0eSEKICAgIFZpbGUgZWFydGgsIHRvIGVhcnRoIHJlc2lnbjsgZW5kIG1vdGlvbiBoZXJlOwogICAgQW5kIHRob3UgYW5kIFJvbWVvIHByZXNzIG9uZSBoZWF2eSBiaWVyIQoKTnVyc2UKCiAgICBPIFR5YmFsdCwgVHliYWx0LCB0aGUgYmVzdCBmcmllbmQgSSBoYWQhCiAgICBPIGNvdXJ0ZW91cyBUeWJhbHQhIGhvbmVzdCBnZW50bGVtYW4hCiAgICBUaGF0IGV2ZXIgSSBzaG91bGQgbGl2ZSB0byBzZWUgdGhlZSBkZWFkIQoKSlVMSUVUCgogICAgV2hhdCBzdG9ybSBpcyB0aGlzIHRoYXQgYmxvd3Mgc28gY29udHJhcnkCiAgICBJcyBSb21lbyBzbGF1Z2h0ZXInZCwgYW5kIGlzIFR5YmFsdCBkZWFkPwogICAgTXkgZGVhci1sb3ZlZCBjb3VzaW4sIGFuZCBteSBkZWFyZXIgbG9yZD8KICAgIFRoZW4sIGRyZWFkZnVsIHRydW1wZXQsIHNvdW5kIHRoZSBnZW5lcmFsIGRvb20hCiAgICBGb3Igd2hvIGlzIGxpdmluZywgaWYgdGhvc2UgdHdvIGFyZSBnb25lPwoKTnVyc2UKCiAgICBUeWJhbHQgaXMgZ29uZSwgYW5kIFJvbWVvIGJhbmlzaGVkOwogICAgUm9tZW8gdGhhdCBraWxsJ2QgaGltLCBoZSBpcyBiYW5pc2hlZC4KCkpVTElFVAoKICAgIE8gR29kISBkaWQgUm9tZW8ncyBoYW5kIHNoZWQgVHliYWx0J3MgYmxvb2QCgpOdXJzZQoKICAgIEl0IGRpZCwgaXQgZGlkOyBhbGFzIHRoZSBkYXksIGl0IGRpZCEKCkpVTElFVAoKICAgIE8gc2VycGVudCBoZWFydCwgaGlkIHdpdGggYSBmbG93ZXJpbmcgZmFjZSEKICAgIERpZCBldmVyIGRyYWdvbiBrZWVwIHNvIGZhaXIgYSBjYXZlPwogICAgQmVhdXRpZnVsIHR5cmFudCEgZmllbmQgYW5nZWxpY2FsIQogICAgRG92ZS1mZWF0aGVyJ2QgcmF2ZW4hIHdvbHZpc2gtcmF2ZW5pbmcgbGFtYiEKICAgIERlc3Bpc2VkIHN1YnN0YW5jZSBvZiBkaXZpbmVzdCBzaG93IQogICAgSnVzdCBvcHBvc2l0ZSB0byB3aGF0IHRob3UganVzdGx5IHNlZW0nc3QsCiAgICBBIGRhbW5lZCBzYWludCwgYW4gaG9ub3VyYWJsZSB2aWxsYWluIQogICAgTyBuYXR1cmUsIHdoYXQgaGFkc3QgdGhvdSB0byBkbyBpbiBoZWxsLAogICAgV2hlbiB0aG91IGRpZHN0IGJvd2VyIHRoZSBzcGlyaXQgb2YgYSBmaWVuZAogICAgSW4gbW9yYWwgcGFyYWRpc2Ugb2Ygc3VjaCBzd2VldCBmbGVzaD8KICAgIFdhcyBldmVyIGJvb2sgY29udGFpbmluZyBzdWNoIHZpbGUgbWF0dGVyCiAgICBTbyBmYWlybHkgYm91bmQIE8gdGhhdCBkZWNlaXQgc2hvdWxkIGR3ZWxsCiAgICBJbiBzdWNoIGEgZ29yZ2VvdXMgcGFsYWNlIQoKTnVyc2UKCiAgICBUaGVyZSdzIG5vIHRydXN0LAogICAgTm8gZmFpdGgsIG5vIGhvbmVzdHkgaW4gbWVuOyBhbGwgcGVyanVyZWQsCiAgICBBbGwgZm9yc3dvcm4sIGFsbCBuYXVnaHQsIGFsbCBkaXNzZW1ibGVycy4KICAgIEFoLCB3aGVyZSdzIG15IG1hbj8gZ2l2ZSBtZSBzb21lIGFxdWEgdml0YWU6CiAgICBUaGVzZSBncmllZnMsIHRoZXNlIHdvZXMsIHRoZXNlIHNvcnJvd3MgbWFrZSBtZSBvbGQuCiAgICBTaGFtZSBjb21lIHRvIFJvbWVvIQoKSlVMSUVUCgogICAgQmxpc3RlcidkIGJlIHRoeSB0b25ndWUKICAgIEZvciBzdWNoIGEgd2lzaCEgaGUgd2FzIG5vdCBib3JuIHRvIHNoYW1lOgogICAgVXBvbiBoaXMgYnJvdyBzaGFtZSBpcyBhc2hhbWVkIHRvIHNpdDsKICAgIEZvciAndGlzIGEgdGhyb25lIHdoZXJlIGhvbm91ciBtYXkgYmUgY3Jvd24nZAogICAgU29sZSBtb25hcmNoIG9mIHRoZSB1bml2ZXJzYWwgZWFydGguCiAgICBPLCB3aGF0IGEgYmVhc3Qgd2FzIEkgdG8gY2hpZGUgYXQgaGltIQoKTnVyc2UKCiAgICBXaWxsIHlvdSBzcGVhayB3ZWxsIG9mIGhpbSB0aGF0IGtpbGwnZCB5b3VyIGNvdXNpbj8KCkpVTElFVAoKICAgIFNoYWxsIEkgc3BlYWsgaWxsIG9mIGhpbSB0aGF0IGlzIG15IGh1c2JhbmQCiAgICBBaCwgcG9vciBteSBsb3JkLCB3aGF0IHRvbmd1ZSBzaGFsbCBzbW9vdGggdGh5IG5hbWUsCiAgICBXaGVuIEksIHRoeSB0aHJlZS1ob3VycyB3aWZlLCBoYXZlIG1hbmdsZWQgaXQCiAgICBCdXQsIHdoZXJlZm9yZSwgdmlsbGFpbiwgZGlkc3QgdGhvdSBraWxsIG15IGNvdXNpbj8KICAgIFRoYXQgdmlsbGFpbiBjb3VzaW4gd291bGQgaGF2ZSBraWxsJ2QgbXkgaHVzYmFuZDoKICAgIEJhY2ssIGZvb2xpc2ggdGVhcnMsIGJhY2sgdG8geW91ciBuYXRpdmUgc3ByaW5nOwogICAgWW91ciB0cmlidXRhcnkgZHJvcHMgYmVsb25nIHRvIHdvZSwKICAgIFdoaWNoIHlvdSwgbWlzdGFraW5nLCBvZmZlciB1cCB0byBqb3kuCiAgICBNeSBodXNiYW5kIGxpdmVzLCB0aGF0IFR5YmFsdCB3b3VsZCBoYXZlIHNsYWluOwogICAgQW5kIFR5YmFsdCdzIGRlYWQsIHRoYXQgd291bGQgaGF2ZSBzbGFpbiBteSBodXNiYW5kOgogICAgQWxsIHRoaXMgaXMgY29tZm9ydDsgd2hlcmVmb3JlIHdlZXAgSSB0aGVuPwogICAgU29tZSB3b3JkIHRoZXJlIHdhcywgd29yc2VyIHRoYW4gVHliYWx0J3MgZGVhdGgsCiAgICBUaGF0IG11cmRlcidkIG1lOiBJIHdvdWxkIGZvcmdldCBpdCBmYWluOwogICAgQnV0LCBPLCBpdCBwcmVzc2VzIHRvIG15IG1lbW9yeSwKICAgIExpa2UgZGFtbmVkIGd1aWx0eSBkZWVkcyB0byBzaW5uZXJzJyBtaW5kczoKICAgICdUeWJhbHQgaXMgZGVhZCwgYW5kIFJvbWVvLS1iYW5pc2hlZDsnCiAgICBUaGF0ICdiYW5pc2hlZCwnIHRoYXQgb25lIHdvcmQgJ2JhbmlzaGVkLCcKICAgIEhhdGggc2xhaW4gdGVuIHRob3VzYW5kIFR5YmFsdHMuIFR5YmFsdCdzIGRlYXRoCiAgICBXYXMgd29lIGVub3VnaCwgaWYgaXQgaGFkIGVuZGVkIHRoZXJlOgogICAgT3IsIGlmIHNvdXIgd29lIGRlbGlnaHRzIGluIGZlbGxvd3NoaXAKICAgIEFuZCBuZWVkbHkgd2lsbCBiZSByYW5rJ2Qgd2l0aCBvdGhlciBncmllZnMsCiAgICBXaHkgZm9sbG93J2Qgbm90LCB3aGVuIHNoZSBzYWlkICdUeWJhbHQncyBkZWFkLCcKICAgIFRoeSBmYXRoZXIsIG9yIHRoeSBtb3RoZXIsIG5heSwgb3IgYm90aCwKICAgIFdoaWNoIG1vZGVybiBsYW1lbnRhdGlvbnMgbWlnaHQgaGF2ZSBtb3ZlZD8KICAgIEJ1dCB3aXRoIGEgcmVhci13YXJkIGZvbGxvd2luZyBUeWJhbHQncyBkZWF0aCwKICAgICdSb21lbyBpcyBiYW5pc2hlZCwnIHRvIHNwZWFrIHRoYXQgd29yZCwKICAgIElzIGZhdGhlciwgbW90aGVyLCBUeWJhbHQsIFJvbWVvLCBKdWxpZXQsCiAgICBBbGwgc2xhaW4sIGFsbCBkZWFkLiAnUm9tZW8gaXMgYmFuaXNoZWQhJwogICAgVGhlcmUgaXMgbm8gZW5kLCBubyBsaW1pdCwgbWVhc3VyZSwgYm91bmQsCiAgICBJbiB0aGF0IHdvcmQncyBkZWF0aDsgbm8gd29yZHMgY2FuIHRoYXQgd29lIHNvdW5kLgogICAgV2hlcmUgaXMgbXkgZmF0aGVyLCBhbmQgbXkgbW90aGVyLCBudXJzZT8KCk51cnNlCgogICAgV2VlcGluZyBhbmQgd2FpbGluZyBvdmVyIFR5YmFsdCdzIGNvcnNlOgogICAgV2lsbCB5b3UgZ28gdG8gdGhlbT8gSSB3aWxsIGJyaW5nIHlvdSB0aGl0aGVyLgoKSlVMSUVUCgogICAgV2FzaCB0aGV5IGhpcyB3b3VuZHMgd2l0aCB0ZWFyczogbWluZSBzaGFsbCBiZSBzcGVudCwKICAgIFdoZW4gdGhlaXJzIGFyZSBkcnksIGZvciBSb21lbydzIGJhbmlzaG1lbnQuCiAgICBUYWtlIHVwIHRob3NlIGNvcmRzOiBwb29yIHJvcGVzLCB5b3UgYXJlIGJlZ3VpbGVkLAogICAgQm90aCB5b3UgYW5kIEk7IGZvciBSb21lbyBpcyBleGlsZWQ6CiAgICBIZSBtYWRlIHlvdSBmb3IgYSBoaWdod2F5IHRvIG15IGJlZDsKICAgIEJ1dCBJLCBhIG1haWQsIGRpZSBtYWlkZW4td2lkb3dlZC4KICAgIENvbWUsIGNvcmRzLCBjb21lLCBudXJzZTsgSSdsbCB0byBteSB3ZWRkaW5nLWJlZDsKICAgIEFuZCBkZWF0aCwgbm90IFJvbWVvLCB0YWtlIG15IG1haWRlbmhlYWQhCgpOdXJzZQoKICAgIEhpZSB0byB5b3VyIGNoYW1iZXI6IEknbGwgZmluZCBSb21lbwogICAgVG8gY29tZm9ydCB5b3U6IEkgd290IHdlbGwgd2hlcmUgaGUgaXMuCiAgICBIYXJrIHllLCB5b3VyIFJvbWVvIHdpbGwgYmUgaGVyZSBhdCBuaWdodDoKICAgIEknbGwgdG8gaGltOyBoZSBpcyBoaWQgYXQgTGF1cmVuY2UnIGNlbGwuCgpKVUxJRVQKCiAgICBPLCBmaW5kIGhpbSEgZ2l2ZSB0aGlzIHJpbmcgdG8gbXkgdHJ1ZSBrbmlnaHQsCiAgICBBbmQgYmlkIGhpbSBjb21lIHRvIHRha2UgaGlzIGxhc3QgZmFyZXdlbGwuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSAKCkZSSUFSIExBVVJFTkNFCgogICAgUm9tZW8sIGNvbWUgZm9ydGg7IGNvbWUgZm9ydGgsIHRob3UgZmVhcmZ1bCBtYW46CiAgICBBZmZsaWN0aW9uIGlzIGVuYW1vdXInZCBvZiB0aHkgcGFydHMsCiAgICBBbmQgdGhvdSBhcnQgd2VkZGVkIHRvIGNhbGFtaXR5LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEZhdGhlciwgd2hhdCBuZXdzPyB3aGF0IGlzIHRoZSBwcmluY2UncyBkb29tPwogICAgV2hhdCBzb3Jyb3cgY3JhdmVzIGFjcXVhaW50YW5jZSBhdCBteSBoYW5kLAogICAgVGhhdCBJIHlldCBrbm93IG5vdD8KCkZSSUFSIExBVVJFTkNFCgogICAgVG9vIGZhbWlsaWFyCiAgICBJcyBteSBkZWFyIHNvbiB3aXRoIHN1Y2ggc291ciBjb21wYW55OgogICAgSSBicmluZyB0aGVlIHRpZGluZ3Mgb2YgdGhlIHByaW5jZSdzIGRvb20uCgpST01FTwoKICAgIFdoYXQgbGVzcyB0aGFuIGRvb21zLWRheSBpcyB0aGUgcHJpbmNlJ3MgZG9vbT8KCkZSSUFSIExBVVJFTkNFCgogICAgQSBnZW50bGVyIGp1ZGdtZW50IHZhbmlzaCdkIGZyb20gaGlzIGxpcHMsCiAgICBOb3QgYm9keSdzIGRlYXRoLCBidXQgYm9keSdzIGJhbmlzaG1lbnQuCgpST01FTwoKICAgIEhhLCBiYW5pc2htZW50ISBiZSBtZXJjaWZ1bCwgc2F5ICdkZWF0aDsnCiAgICBGb3IgZXhpbGUgaGF0aCBtb3JlIHRlcnJvciBpbiBoaXMgbG9vaywKICAgIE11Y2ggbW9yZSB0aGFuIGRlYXRoOiBkbyBub3Qgc2F5ICdiYW5pc2htZW50LicKCkZSSUFSIExBVVJFTkNFCgogICAgSGVuY2UgZnJvbSBWZXJvbmEgYXJ0IHRob3UgYmFuaXNoZWQ6CiAgICBCZSBwYXRpZW50LCBmb3IgdGhlIHdvcmxkIGlzIGJyb2FkIGFuZCB3aWRlLgoKUk9NRU8KCiAgICBUaGVyZSBpcyBubyB3b3JsZCB3aXRob3V0IFZlcm9uYSB3YWxscywKICAgIEJ1dCBwdXJnYXRvcnksIHRvcnR1cmUsIGhlbGwgaXRzZWxmLgogICAgSGVuY2UtYmFuaXNoZWQgaXMgYmFuaXNoJ2QgZnJvbSB0aGUgd29ybGQsCiAgICBBbmQgd29ybGQncyBleGlsZSBpcyBkZWF0aDogdGhlbiBiYW5pc2hlZCwKICAgIElzIGRlYXRoIG1pcy10ZXJtJ2Q6IGNhbGxpbmcgZGVhdGggYmFuaXNobWVudCwKICAgIFRob3UgY3V0dCdzdCBteSBoZWFkIG9mZiB3aXRoIGEgZ29sZGVuIGF4ZSwKICAgIEFuZCBzbWlsZXN0IHVwb24gdGhlIHN0cm9rZSB0aGF0IG11cmRlcnMgbWUuCgpGUklBUiBMQVVSRU5DRQoKICAgIE8gZGVhZGx5IHNpbiEgTyBydWRlIHVudGhhbmtmdWxuZXNzIQogICAgVGh5IGZhdWx0IG91ciBsYXcgY2FsbHMgZGVhdGg7IGJ1dCB0aGUga2luZCBwcmluY2UsCiAgICBUYWtpbmcgdGh5IHBhcnQsIGhhdGggcnVzaCdkIGFzaWRlIHRoZSBsYXcsCiAgICBBbmQgdHVybidkIHRoYXQgYmxhY2sgd29yZCBkZWF0aCB0byBiYW5pc2htZW50OgogICAgVGhpcyBpcyBkZWFyIG1lcmN5LCBhbmQgdGhvdSBzZWVzdCBpdCBub3QuCgpST01FTwoKICAgICdUaXMgdG9ydHVyZSwgYW5kIG5vdCBtZXJjeTogaGVhdmVuIGlzIGhlcmUsCiAgICBXaGVyZSBKdWxpZXQgbGl2ZXM7IGFuZCBldmVyeSBjYXQgYW5kIGRvZwogICAgQW5kIGxpdHRsZSBtb3VzZSwgZXZlcnkgdW53b3J0aHkgdGhpbmcsCiAgICBMaXZlIGhlcmUgaW4gaGVhdmVuIGFuZCBtYXkgbG9vayBvbiBoZXI7CiAgICBCdXQgUm9tZW8gbWF5IG5vdDogbW9yZSB2YWxpZGl0eSwKICAgIE1vcmUgaG9ub3VyYWJsZSBzdGF0ZSwgbW9yZSBjb3VydHNoaXAgbGl2ZXMKICAgIEluIGNhcnJpb24tZmxpZXMgdGhhbiBSb21lbzogdGhleSBteSBzZWl6ZQogICAgT24gdGhlIHdoaXRlIHdvbmRlciBvZiBkZWFyIEp1bGlldCdzIGhhbmQKICAgIEFuZCBzdGVhbCBpbW1vcnRhbCBibGVzc2luZyBmcm9tIGhlciBsaXBzLAogICAgV2hvIGV2ZW4gaW4gcHVyZSBhbmQgdmVzdGFsIG1vZGVzdHksCiAgICBTdGlsbCBibHVzaCwgYXMgdGhpbmtpbmcgdGhlaXIgb3duIGtpc3NlcyBzaW47CiAgICBCdXQgUm9tZW8gbWF5IG5vdDsgaGUgaXMgYmFuaXNoZWQ6CiAgICBGbGllcyBtYXkgZG8gdGhpcywgYnV0IEkgZnJvbSB0aGlzIG11c3QgZmx5OgogICAgVGhleSBhcmUgZnJlZSBtZW4sIGJ1dCBJIGFtIGJhbmlzaGVkLgogICAgQW5kIHNheSdzdCB0aG91IHlldCB0aGF0IGV4aWxlIGlzIG5vdCBkZWF0aD8KICAgIEhhZHN0IHRob3Ugbm8gcG9pc29uIG1peCdkLCBubyBzaGFycC1ncm91bmQga25pZmUsCiAgICBObyBzdWRkZW4gbWVhbiBvZiBkZWF0aCwgdGhvdWdoIG5lJ2VyIHNvIG1lYW4sCiAgICBCdXQgJ2JhbmlzaGVkJyB0byBraWxsIG1lPy0tJ2JhbmlzaGVkJz8KICAgIE8gZnJpYXIsIHRoZSBkYW1uZWQgdXNlIHRoYXQgd29yZCBpbiBoZWxsOwogICAgSG93bGluZ3MgYXR0ZW5kIGl0OiBob3cgaGFzdCB0aG91IHRoZSBoZWFydCwKICAgIEJlaW5nIGEgZGl2aW5lLCBhIGdob3N0bHkgY29uZmVzc29yLAogICAgQSBzaW4tYWJzb2x2ZXIsIGFuZCBteSBmcmllbmQgcHJvZmVzcydkLAogICAgVG8gbWFuZ2xlIG1lIHdpdGggdGhhdCB3b3JkICdiYW5pc2hlZCcCgpGUklBUiBMQVVSRU5DRQoKICAgIFRob3UgZm9uZCBtYWQgbWFuLCBoZWFyIG1lIGJ1dCBzcGVhayBhIHdvcmQuCgpST01FTwoKICAgIE8sIHRob3Ugd2lsdCBzcGVhayBhZ2FpbiBvZiBiYW5pc2htZW50LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJJ2xsIGdpdmUgdGhlZSBhcm1vdXIgdG8ga2VlcCBvZmYgdGhhdCB3b3JkOgogICAgQWR2ZXJzaXR5J3Mgc3dlZXQgbWlsaywgcGhpbG9zb3BoeSwKICAgIFRvIGNvbWZvcnQgdGhlZSwgdGhvdWdoIHRob3UgYXJ0IGJhbmlzaGVkLgoKUk9NRU8KCiAgICBZZXQgJ2JhbmlzaGVkJz8gSGFuZyB1cCBwaGlsb3NvcGh5IQogICAgVW5sZXNzIHBoaWxvc29waHkgY2FuIG1ha2UgYSBKdWxpZXQsCiAgICBEaXNwbGFudCBhIHRvd24sIHJldmVyc2UgYSBwcmluY2UncyBkb29tLAogICAgSXQgaGVscHMgbm90LCBpdCBwcmV2YWlscyBub3Q6IHRhbGsgbm8gbW9yZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTywgdGhlbiBJIHNlZSB0aGF0IG1hZG1lbiBoYXZlIG5vIGVhcnMuCgpST01FTwoKICAgIEhvdyBzaG91bGQgdGhleSwgd2hlbiB0aGF0IHdpc2UgbWVuIGhhdmUgbm8gZXllcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTGV0IG1lIGRpc3B1dGUgd2l0aCB0aGVlIG9mIHRoeSBlc3RhdGUuCgpST01FTwoKICAgIFRob3UgY2Fuc3Qgbm90IHNwZWFrIG9mIHRoYXQgdGhvdSBkb3N0IG5vdCBmZWVsOgogICAgV2VydCB0aG91IGFzIHlvdW5nIGFzIEksIEp1bGlldCB0aHkgbG92ZSwKICAgIEFuIGhvdXIgYnV0IG1hcnJpZWQsIFR5YmFsdCBtdXJkZXJlZCwKICAgIERvdGluZyBsaWtlIG1lIGFuZCBsaWtlIG1lIGJhbmlzaGVkLAogICAgVGhlbiBtaWdodHN0IHRob3Ugc3BlYWssIHRoZW4gbWlnaHRzdCB0aG91IHRlYXIgdGh5IGhhaXIsCiAgICBBbmQgZmFsbCB1cG9uIHRoZSBncm91bmQsIGFzIEkgZG8gbm93LAogICAgVGFraW5nIHRoZSBtZWFzdXJlIG9mIGFuIHVubWFkZSBncmF2ZS4KCiAgICBLbm9ja2luZyB3aXRoaW4KCkZSSUFSIExBVVJFTkNFCgogICAgQXJpc2U7IG9uZSBrbm9ja3M7IGdvb2QgUm9tZW8sIGhpZGUgdGh5c2VsZi4KClJPTUVPCgogICAgTm90IEk7IHVubGVzcyB0aGUgYnJlYXRoIG9mIGhlYXJ0c2ljayBncm9hbnMsCiAgICBNaXN0LWxpa2UsIGluZm9sZCBtZSBmcm9tIHRoZSBzZWFyY2ggb2YgZXllcy4KCiAgICBLbm9ja2luZwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIYXJrLCBob3cgdGhleSBrbm9jayEgV2hvJ3MgdGhlcmUIFJvbWVvLCBhcmlzZTsKICAgIFRob3Ugd2lsdCBiZSB0YWtlbi4gU3RheSBhd2hpbGUhIFN0YW5kIHVwOwoKICAgIEtub2NraW5nCiAgICBSdW4gdG8gbXkgc3R1ZHkuIEJ5IGFuZCBieSEgR29kJ3Mgd2lsbCwKICAgIFdoYXQgc2ltcGxlbmVzcyBpcyB0aGlzISBJIGNvbWUsIEkgY29tZSEKCiAgICBLbm9ja2luZwogICAgV2hvIGtub2NrcyBzbyBoYXJkPyB3aGVuY2UgY29tZSB5b3UIHdoYXQncyB5b3VyIHdpbGwCgpOdXJzZQoKICAgIFtXaXRoaW5dIExldCBtZSBjb21lIGluLCBhbmQgeW91IHNoYWxsIGtub3cKICAgIG15IGVycmFuZDsKICAgIEkgY29tZSBmcm9tIExhZHkgSnVsaWV0LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXZWxjb21lLCB0aGVuLgoKICAgIEVudGVyIE51cnNlCgpOdXJzZQoKICAgIE8gaG9seSBmcmlhciwgTywgdGVsbCBtZSwgaG9seSBmcmlhciwKICAgIFdoZXJlIGlzIG15IGxhZHkncyBsb3JkLCB3aGVyZSdzIFJvbWVvPwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGVyZSBvbiB0aGUgZ3JvdW5kLCB3aXRoIGhpcyBvd24gdGVhcnMgbWFkZSBkcnVuay4KCk51cnNlCgogICAgTywgaGUgaXMgZXZlbiBpbiBteSBtaXN0cmVzcycgY2FzZSwKICAgIEp1c3QgaW4gaGVyIGNhc2UhIE8gd29mdWwgc3ltcGF0aHkhCiAgICBQaXRlb3VzIHByZWRpY2FtZW50ISBFdmVuIHNvIGxpZXMgc2hlLAogICAgQmx1YmJlcmluZyBhbmQgd2VlcGluZywgd2VlcGluZyBhbmQgYmx1YmJlcmluZy4KICAgIFN0YW5kIHVwLCBzdGFuZCB1cDsgc3RhbmQsIGFuZCB5b3UgYmUgYSBtYW46CiAgICBGb3IgSnVsaWV0J3Mgc2FrZSwgZm9yIGhlciBzYWtlLCByaXNlIGFuZCBzdGFuZDsKICAgIFdoeSBzaG91bGQgeW91IGZhbGwgaW50byBzbyBkZWVwIGFuIE8CgpST01FTwoKICAgIE51cnNlIQoKTnVyc2UKCiAgICBBaCBzaXIhIGFoIHNpciEgV2VsbCwgZGVhdGgncyB0aGUgZW5kIG9mIGFsbC4KClJPTUVPCgogICAgU3Bha2VzdCB0aG91IG9mIEp1bGlldD8gaG93IGlzIGl0IHdpdGggaGVyPwogICAgRG90aCBzaGUgbm90IHRoaW5rIG1lIGFuIG9sZCBtdXJkZXJlciwKICAgIE5vdyBJIGhhdmUgc3RhaW4nZCB0aGUgY2hpbGRob29kIG9mIG91ciBqb3kKICAgIFdpdGggYmxvb2QgcmVtb3ZlZCBidXQgbGl0dGxlIGZyb20gaGVyIG93bj8KICAgIFdoZXJlIGlzIHNoZT8gYW5kIGhvdyBkb3RoIHNoZT8gYW5kIHdoYXQgc2F5cwogICAgTXkgY29uY2VhbCdkIGxhZHkgdG8gb3VyIGNhbmNlbGwnZCBsb3ZlPwoKTnVyc2UKCiAgICBPLCBzaGUgc2F5cyBub3RoaW5nLCBzaXIsIGJ1dCB3ZWVwcyBhbmQgd2VlcHM7CiAgICBBbmQgbm93IGZhbGxzIG9uIGhlciBiZWQ7IGFuZCB0aGVuIHN0YXJ0cyB1cCwKICAgIEFuZCBUeWJhbHQgY2FsbHM7IGFuZCB0aGVuIG9uIFJvbWVvIGNyaWVzLAogICAgQW5kIHRoZW4gZG93biBmYWxscyBhZ2Fpbi4KClJPTUVPCgogICAgQXMgaWYgdGhhdCBuYW1lLAogICAgU2hvdCBmcm9tIHRoZSBkZWFkbHkgbGV2ZWwgb2YgYSBndW4sCiAgICBEaWQgbXVyZGVyIGhlcjsgYXMgdGhhdCBuYW1lJ3MgY3Vyc2VkIGhhbmQKICAgIE11cmRlcidkIGhlciBraW5zbWFuLiBPLCB0ZWxsIG1lLCBmcmlhciwgdGVsbCBtZSwKICAgIEluIHdoYXQgdmlsZSBwYXJ0IG9mIHRoaXMgYW5hdG9teQogICAgRG90aCBteSBuYW1lIGxvZGdlPyB0ZWxsIG1lLCB0aGF0IEkgbWF5IHNhY2sKICAgIFRoZSBoYXRlZnVsIG1hbnNpb24uCgogICAgRHJhd2luZyBoaXMgc3dvcmQKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZCB0aHkgZGVzcGVyYXRlIGhhbmQ6CiAgICBBcnQgdGhvdSBhIG1hbj8gdGh5IGZvcm0gY3JpZXMgb3V0IHRob3UgYXJ0OgogICAgVGh5IHRlYXJzIGFyZSB3b21hbmlzaDsgdGh5IHdpbGQgYWN0cyBkZW5vdGUKICAgIFRoZSB1bnJlYXNvbmFibGUgZnVyeSBvZiBhIGJlYXN0OgogICAgVW5zZWVtbHkgd29tYW4gaW4gYSBzZWVtaW5nIG1hbiEKICAgIE9yIGlsbC1iZXNlZW1pbmcgYmVhc3QgaW4gc2VlbWluZyBib3RoIQogICAgVGhvdSBoYXN0IGFtYXplZCBtZTogYnkgbXkgaG9seSBvcmRlciwKICAgIEkgdGhvdWdodCB0aHkgZGlzcG9zaXRpb24gYmV0dGVyIHRlbXBlcidkLgogICAgSGFzdCB0aG91IHNsYWluIFR5YmFsdD8gd2lsdCB0aG91IHNsYXkgdGh5c2VsZj8KICAgIEFuZCBzdGF5IHRoeSBsYWR5IHRvbyB0aGF0IGxpdmVzIGluIHRoZWUsCiAgICBCeSBkb2luZyBkYW1uZWQgaGF0ZSB1cG9uIHRoeXNlbGYCiAgICBXaHkgcmFpbCdzdCB0aG91IG9uIHRoeSBiaXJ0aCwgdGhlIGhlYXZlbiwgYW5kIGVhcnRoPwogICAgU2luY2UgYmlydGgsIGFuZCBoZWF2ZW4sIGFuZCBlYXJ0aCwgYWxsIHRocmVlIGRvIG1lZXQKICAgIEluIHRoZWUgYXQgb25jZTsgd2hpY2ggdGhvdSBhdCBvbmNlIHdvdWxkc3QgbG9zZS4KICAgIEZpZSwgZmllLCB0aG91IHNoYW1lc3QgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDsKICAgIFdoaWNoLCBsaWtlIGEgdXN1cmVyLCBhYm91bmQnc3QgaW4gYWxsLAogICAgQW5kIHVzZXN0IG5vbmUgaW4gdGhhdCB0cnVlIHVzZSBpbmRlZWQKICAgIFdoaWNoIHNob3VsZCBiZWRlY2sgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDoKICAgIFRoeSBub2JsZSBzaGFwZSBpcyBidXQgYSBmb3JtIG9mIHdheCwKICAgIERpZ3Jlc3NpbmcgZnJvbSB0aGUgdmFsb3VyIG9mIGEgbWFuOwogICAgVGh5IGRlYXIgbG92ZSBzd29ybiBidXQgaG9sbG93IHBlcmp1cnksCiAgICBLaWxsaW5nIHRoYXQgbG92ZSB3aGljaCB0aG91IGhhc3Qgdm93J2QgdG8gY2hlcmlzaDsKICAgIFRoeSB3aXQsIHRoYXQgb3JuYW1lbnQgdG8gc2hhcGUgYW5kIGxvdmUsCiAgICBNaXNzaGFwZW4gaW4gdGhlIGNvbmR1Y3Qgb2YgdGhlbSBib3RoLAogICAgTGlrZSBwb3dkZXIgaW4gYSBza2l0bGVzcyBzb2xkaWVyJ3MgZmxhc2ssCiAgICBJcyBzZXQgYWZpcmUgYnkgdGhpbmUgb3duIGlnbm9yYW5jZSwKICAgIEFuZCB0aG91IGRpc21lbWJlcidkIHdpdGggdGhpbmUgb3duIGRlZmVuY2UuCiAgICBXaGF0LCByb3VzZSB0aGVlLCBtYW4hIHRoeSBKdWxpZXQgaXMgYWxpdmUsCiAgICBGb3Igd2hvc2UgZGVhciBzYWtlIHRob3Ugd2FzdCBidXQgbGF0ZWx5IGRlYWQ7CiAgICBUaGVyZSBhcnQgdGhvdSBoYXBweTogVHliYWx0IHdvdWxkIGtpbGwgdGhlZSwKICAgIEJ1dCB0aG91IHNsZXcnc3QgVHliYWx0OyB0aGVyZSBhcmUgdGhvdSBoYXBweSB0b286CiAgICBUaGUgbGF3IHRoYXQgdGhyZWF0ZW4nZCBkZWF0aCBiZWNvbWVzIHRoeSBmcmllbmQKICAgIEFuZCB0dXJucyBpdCB0byBleGlsZTsgdGhlcmUgYXJ0IHRob3UgaGFwcHk6CiAgICBBIHBhY2sgb2YgYmxlc3NpbmdzIGxpZ2h0cyB1cCB1cG9uIHRoeSBiYWNrOwogICAgSGFwcGluZXNzIGNvdXJ0cyB0aGVlIGluIGhlciBiZXN0IGFycmF5OwogICAgQnV0LCBsaWtlIGEgbWlzYmVoYXZlZCBhbmQgc3VsbGVuIHdlbmNoLAogICAgVGhvdSBwb3V0J3N0IHVwb24gdGh5IGZvcnR1bmUgYW5kIHRoeSBsb3ZlOgogICAgVGFrZSBoZWVkLCB0YWtlIGhlZWQsIGZvciBzdWNoIGRpZSBtaXNlcmFibGUuCiAgICBHbywgZ2V0IHRoZWUgdG8gdGh5IGxvdmUsIGFzIHdhcyBkZWNyZWVkLAogICAgQXNjZW5kIGhlciBjaGFtYmVyLCBoZW5jZSBhbmQgY29tZm9ydCBoZXI6CiAgICBCdXQgbG9vayB0aG91IHN0YXkgbm90IHRpbGwgdGhlIHdhdGNoIGJlIHNldCwKICAgIEZvciB0aGVuIHRob3UgY2Fuc3Qgbm90IHBhc3MgdG8gTWFudHVhOwogICAgV2hlcmUgdGhvdSBzaGFsdCBsaXZlLCB0aWxsIHdlIGNhbiBmaW5kIGEgdGltZQogICAgVG8gYmxhemUgeW91ciBtYXJyaWFnZSwgcmVjb25jaWxlIHlvdXIgZnJpZW5kcywKICAgIEJlZyBwYXJkb24gb2YgdGhlIHByaW5jZSwgYW5kIGNhbGwgdGhlZSBiYWNrCiAgICBXaXRoIHR3ZW50eSBodW5kcmVkIHRob3VzYW5kIHRpbWVzIG1vcmUgam95CiAgICBUaGFuIHRob3Ugd2VudCdzdCBmb3J0aCBpbiBsYW1lbnRhdGlvbi4KICAgIEdvIGJlZm9yZSwgbnVyc2U6IGNvbW1lbmQgbWUgdG8gdGh5IGxhZHk7CiAgICBBbmQgYmlkIGhlciBoYXN0ZW4gYWxsIHRoZSBob3VzZSB0byBiZWQsCiAgICBXaGljaCBoZWF2eSBzb3Jyb3cgbWFrZXMgdGhlbSBhcHQgdW50bzoKICAgIFJvbWVvIGlzIGNvbWluZy4KCk51cnNlCgogICAgTyBMb3JkLCBJIGNvdWxkIGhhdmUgc3RheSdkIGhlcmUgYWxsIHRoZSBuaWdodAogICAgVG8gaGVhciBnb29kIGNvdW5zZWw6IE8sIHdoYXQgbGVhcm5pbmcgaXMhCiAgICBNeSBsb3JkLCBJJ2xsIHRlbGwgbXkgbGFkeSB5b3Ugd2lsbCBjb21lLgoKUk9NRU8KCiAgICBEbyBzbywgYW5kIGJpZCBteSBzd2VldCBwcmVwYXJlIHRvIGNoaWRlLgoKTnVyc2UKCiAgICBIZXJlLCBzaXIsIGEgcmluZyBzaGUgYmlkIG1lIGdpdmUgeW91LCBzaXI6CiAgICBIaWUgeW91LCBtYWtlIGhhc3RlLCBmb3IgaXQgZ3Jvd3MgdmVyeSBsYXRlLgoKICAgIEV4aXQKClJPTUVPCgogICAgSG93IHdlbGwgbXkgY29tZm9ydCBpcyByZXZpdmVkIGJ5IHRoaXMhCgpGUklBUiBMQVVSRU5DRQoKICAgIEdvIGhlbmNlOyBnb29kIG5pZ2h0OyBhbmQgaGVyZSBzdGFuZHMgYWxsIHlvdXIgc3RhdGU6CiAgICBFaXRoZXIgYmUgZ29uZSBiZWZvcmUgdGhlIHdhdGNoIGJlIHNldCwKICAgIE9yIGJ5IHRoZSBicmVhayBvZiBkYXkgZGlzZ3Vpc2VkIGZyb20gaGVuY2U6CiAgICBTb2pvdXJuIGluIE1hbnR1YTsgSSdsbCBmaW5kIG91dCB5b3VyIG1hbiwKICAgIEFuZCBoZSBzaGFsbCBzaWduaWZ5IGZyb20gdGltZSB0byB0aW1lCiAgICBFdmVyeSBnb29kIGhhcCB0byB5b3UgdGhhdCBjaGFuY2VzIGhlcmU6CiAgICBHaXZlIG1lIHRoeSBoYW5kOyAndGlzIGxhdGU6IGZhcmV3ZWxsOyBnb29kIG5pZ2h0LgoKUk9NRU8KCiAgICBCdXQgdGhhdCBhIGpveSBwYXN0IGpveSBjYWxscyBvdXQgb24gbWUsCiAgICBJdCB3ZXJlIGEgZ3JpZWYsIHNvIGJyaWVmIHRvIHBhcnQgd2l0aCB0aGVlOiBGYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHJvb20gaW4gQ2FwdWxldCdzIGhvdXNlLgoKICAgIEVudGVyIENBUFVMRVQsIExBRFkgQ0FQVUxFVCwgYW5kIFBBUklTIAoKQ0FQVUxFVAoKICAgIFRoaW5ncyBoYXZlIGZhbGwnbiBvdXQsIHNpciwgc28gdW5sdWNraWx5LAogICAgVGhhdCB3ZSBoYXZlIGhhZCBubyB0aW1lIHRvIG1vdmUgb3VyIGRhdWdodGVyOgogICAgTG9vayB5b3UsIHNoZSBsb3ZlZCBoZXIga2luc21hbiBUeWJhbHQgZGVhcmx5LAogICAgQW5kIHNvIGRpZCBJOi0tV2VsbCwgd2Ugd2VyZSBib3JuIHRvIGRpZS4KICAgICdUaXMgdmVyeSBsYXRlLCBzaGUnbGwgbm90IGNvbWUgZG93biB0by1uaWdodDoKICAgIEkgcHJvbWlzZSB5b3UsIGJ1dCBmb3IgeW91ciBjb21wYW55LAogICAgSSB3b3VsZCBoYXZlIGJlZW4gYS1iZWQgYW4gaG91ciBhZ28uCgpQQVJJUwoKICAgIFRoZXNlIHRpbWVzIG9mIHdvZSBhZmZvcmQgbm8gdGltZSB0byB3b28uCiAgICBNYWRhbSwgZ29vZCBuaWdodDogY29tbWVuZCBtZSB0byB5b3VyIGRhdWdodGVyLgoKTEFEWSBDQVBVTEVUCgogICAgSSB3aWxsLCBhbmQga25vdyBoZXIgbWluZCBlYXJseSB0by1tb3Jyb3c7CiAgICBUby1uaWdodCBzaGUgaXMgbWV3J2QgdXAgdG8gaGVyIGhlYXZpbmVzcy4KCkNBUFVMRVQKCiAgICBTaXIgUGFyaXMsIEkgd2lsbCBtYWtlIGEgZGVzcGVyYXRlIHRlbmRlcgogICAgT2YgbXkgY2hpbGQncyBsb3ZlOiBJIHRoaW5rIHNoZSB3aWxsIGJlIHJ1bGVkCiAgICBJbiBhbGwgcmVzcGVjdHMgYnkgbWU7IG5heSwgbW9yZSwgSSBkb3VidCBpdCBub3QuCiAgICBXaWZlLCBnbyB5b3UgdG8gaGVyIGVyZSB5b3UgZ28gdG8gYmVkOwogICAgQWNxdWFpbnQgaGVyIGhlcmUgb2YgbXkgc29uIFBhcmlzJyBsb3ZlOwogICAgQW5kIGJpZCBoZXIsIG1hcmsgeW91IG1lLCBvbiBXZWRuZXNkYXkgbmV4dC0tCiAgICBCdXQsIHNvZnQhIHdoYXQgZGF5IGlzIHRoaXMCgpQQVJJUwoKICAgIE1vbmRheSwgbXkgbG9yZCwKCkNBUFVMRVQKCiAgICBNb25kYXkhIGhhLCBoYSEgV2VsbCwgV2VkbmVzZGF5IGlzIHRvbyBzb29uLAogICAgTycgVGh1cnNkYXkgbGV0IGl0IGJlOiBvJyBUaHVyc2RheSwgdGVsbCBoZXIsCiAgICBTaGUgc2hhbGwgYmUgbWFycmllZCB0byB0aGlzIG5vYmxlIGVhcmwuCiAgICBXaWxsIHlvdSBiZSByZWFkeT8gZG8geW91IGxpa2UgdGhpcyBoYXN0ZT8KICAgIFdlJ2xsIGtlZXAgbm8gZ3JlYXQgYWRvLC0tYSBmcmllbmQgb3IgdHdvOwogICAgRm9yLCBoYXJrIHlvdSwgVHliYWx0IGJlaW5nIHNsYWluIHNvIGxhdGUsCiAgICBJdCBtYXkgYmUgdGhvdWdodCB3ZSBoZWxkIGhpbSBjYXJlbGVzc2x5LAogICAgQmVpbmcgb3VyIGtpbnNtYW4sIGlmIHdlIHJldmVsIG11Y2g6CiAgICBUaGVyZWZvcmUgd2UnbGwgaGF2ZSBzb21lIGhhbGYgYSBkb3plbiBmcmllbmRzLAogICAgQW5kIHRoZXJlIGFuIGVuZC4gQnV0IHdoYXQgc2F5IHlvdSB0byBUaHVyc2RheT8KClBBUklTCgogICAgTXkgbG9yZCwgSSB3b3VsZCB0aGF0IFRodXJzZGF5IHdlcmUgdG8tbW9ycm93LgoKQ0FQVUxFVAoKICAgIFdlbGwgZ2V0IHlvdSBnb25lOiBvJyBUaHVyc2RheSBiZSBpdCwgdGhlbi4KICAgIEdvIHlvdSB0byBKdWxpZXQgZXJlIHlvdSBnbyB0byBiZWQsCiAgICBQcmVwYXJlIGhlciwgd2lmZSwgYWdhaW5zdCB0aGlzIHdlZGRpbmctZGF5LgogICAgRmFyZXdlbGwsIG15IGxvcmQuIExpZ2h0IHRvIG15IGNoYW1iZXIsIGhvIQogICAgQWZvcmUgbWUhIGl0IGlzIHNvIHZlcnkgdmVyeSBsYXRlLAogICAgVGhhdCB3ZSBtYXkgY2FsbCBpdCBlYXJseSBieSBhbmQgYnkuCiAgICBHb29kIG5pZ2h0LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gYW5kIEpVTElFVCBhYm92ZSwgYXQgdGhlIHdpbmRvdyAKCkpVTElFVAoKICAgIFdpbHQgdGhvdSBiZSBnb25lPyBpdCBpcyBub3QgeWV0IG5lYXIgZGF5OgogICAgSXQgd2FzIHRoZSBuaWdodGluZ2FsZSwgYW5kIG5vdCB0aGUgbGFyaywKICAgIFRoYXQgcGllcmNlZCB0aGUgZmVhcmZ1bCBob2xsb3cgb2YgdGhpbmUgZWFyOwogICAgTmlnaHRseSBzaGUgc2luZ3Mgb24geW9uIHBvbWVncmFuYXRlLXRyZWU6CiAgICBCZWxpZXZlIG1lLCBsb3ZlLCBpdCB3YXMgdGhlIG5pZ2h0aW5nYWxlLgoKUk9NRU8KCiAgICBJdCB3YXMgdGhlIGxhcmssIHRoZSBoZXJhbGQgb2YgdGhlIG1vcm4sCiAgICBObyBuaWdodGluZ2FsZTogbG9vaywgbG92ZSwgd2hhdCBlbnZpb3VzIHN0cmVha3MKICAgIERvIGxhY2UgdGhlIHNldmVyaW5nIGNsb3VkcyBpbiB5b25kZXIgZWFzdDoKICAgIE5pZ2h0J3MgY2FuZGxlcyBhcmUgYnVybnQgb3V0LCBhbmQgam9jdW5kIGRheQogICAgU3RhbmRzIHRpcHRvZSBvbiB0aGUgbWlzdHkgbW91bnRhaW4gdG9wcy4KICAgIEkgbXVzdCBiZSBnb25lIGFuZCBsaXZlLCBvciBzdGF5IGFuZCBkaWUuCgpKVUxJRVQKCiAgICBZb24gbGlnaHQgaXMgbm90IGRheS1saWdodCwgSSBrbm93IGl0LCBJOgogICAgSXQgaXMgc29tZSBtZXRlb3IgdGhhdCB0aGUgc3VuIGV4aGFsZXMsCiAgICBUbyBiZSB0byB0aGVlIHRoaXMgbmlnaHQgYSB0b3JjaC1iZWFyZXIsCiAgICBBbmQgbGlnaHQgdGhlZSBvbiB0aHkgd2F5IHRvIE1hbnR1YToKICAgIFRoZXJlZm9yZSBzdGF5IHlldDsgdGhvdSBuZWVkJ3N0IG5vdCB0byBiZSBnb25lLgoKUk9NRU8KCiAgICBMZXQgbWUgYmUgdGEnZW4sIGxldCBtZSBiZSBwdXQgdG8gZGVhdGg7CiAgICBJIGFtIGNvbnRlbnQsIHNvIHRob3Ugd2lsdCBoYXZlIGl0IHNvLgogICAgSSdsbCBzYXkgeW9uIGdyZXkgaXMgbm90IHRoZSBtb3JuaW5nJ3MgZXllLAogICAgJ1RpcyBidXQgdGhlIHBhbGUgcmVmbGV4IG9mIEN5bnRoaWEncyBicm93OwogICAgTm9yIHRoYXQgaXMgbm90IHRoZSBsYXJrLCB3aG9zZSBub3RlcyBkbyBiZWF0CiAgICBUaGUgdmF1bHR5IGhlYXZlbiBzbyBoaWdoIGFib3ZlIG91ciBoZWFkczoKICAgIEkgaGF2ZSBtb3JlIGNhcmUgdG8gc3RheSB0aGFuIHdpbGwgdG8gZ286CiAgICBDb21lLCBkZWF0aCwgYW5kIHdlbGNvbWUhIEp1bGlldCB3aWxscyBpdCBzby4KICAgIEhvdyBpcyd0LCBteSBzb3VsPyBsZXQncyB0YWxrOyBpdCBpcyBub3QgZGF5LgoKSlVMSUVUCgogICAgSXQgaXMsIGl0IGlzOiBoaWUgaGVuY2UsIGJlIGdvbmUsIGF3YXkhCiAgICBJdCBpcyB0aGUgbGFyayB0aGF0IHNpbmdzIHNvIG91dCBvZiB0dW5lLAogICAgU3RyYWluaW5nIGhhcnNoIGRpc2NvcmRzIGFuZCB1bnBsZWFzaW5nIHNoYXJwcy4KICAgIFNvbWUgc2F5IHRoZSBsYXJrIG1ha2VzIHN3ZWV0IGRpdmlzaW9uOwogICAgVGhpcyBkb3RoIG5vdCBzbywgZm9yIHNoZSBkaXZpZGV0aCB1czoKICAgIFNvbWUgc2F5IHRoZSBsYXJrIGFuZCBsb2F0aGVkIHRvYWQgY2hhbmdlIGV5ZXMsCiAgICBPLCBub3cgSSB3b3VsZCB0aGV5IGhhZCBjaGFuZ2VkIHZvaWNlcyB0b28hCiAgICBTaW5jZSBhcm0gZnJvbSBhcm0gdGhhdCB2b2ljZSBkb3RoIHVzIGFmZnJheSwKICAgIEh1bnRpbmcgdGhlZSBoZW5jZSB3aXRoIGh1bnQnc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cmUgd2VlcGluZyBmb3IgeW91ciBjb3VzaW4ncyBkZWF0aD8KICAgIFdoYXQsIHdpbHQgdGhvdSB3YXNoIGhpbSBmcm9tIGhpcyBncmF2ZSB3aXRoIHRlYXJzPwogICAgQW4gaWYgdGhvdSBjb3VsZHN0LCB0aG91IGNvdWxkc3Qgbm90IG1ha2UgaGltIGxpdmU7CiAgICBUaGVyZWZvcmUsIGhhdmUgZG9uZTogc29tZSBncmllZiBzaG93cyBtdWNoIG9mIGxvdmU7CiAgICBCdXQgbXVjaCBvZiBncmllZiBzaG93cyBzdGlsbCBzb21lIHdhbnQgb2Ygd2l0LgoKSlVMSUVUCgogICAgWWV0IGxldCBtZSB3ZWVwIGZvciBzdWNoIGEgZmVlbGluZyBsb3NzLgoKTEFEWSBDQVBVTEVUCgogICAgU28gc2hhbGwgeW91IGZlZWwgdGhlIGxvc3MsIGJ1dCBub3QgdGhlIGZyaWVuZAogICAgV2hpY2ggeW91IHdlZXAgZm9yLgoKSlVMSUVUCgogICAgRmVlbGluZyBzbyB0aGUgbG9zcywKICAgIENhbm5vdCBjaG9vc2UgYnV0IGV2ZXIgd2VlcCB0aGUgZnJpZW5kLgoKTEFEWSBDQVBVTEVUCgogICAgV2VsbCwgZ2lybCwgdGhvdSB3ZWVwJ3N0IG5vdCBzbyBtdWNoIGZvciBoaXMgZGVhdGgsCiAgICBBcyB0aGF0IHRoZSB2aWxsYWluIGxpdmVzIHdoaWNoIHNsYXVnaHRlcidkIGhpbS4KCkpVTElFVAoKICAgIFdoYXQgdmlsbGFpbiBtYWRhbT8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoYXQgc2FtZSB2aWxsYWluLCBSb21lby4KCkpVTElFVAoKICAgIFtBc2lkZV0gVmlsbGFpbiBhbmQgaGUgYmUgbWFueSBtaWxlcyBhc3VuZGVyLi0tCiAgICBHb2QgUGFyZG9uIGhpbSEgSSBkbywgd2l0aCBhbGwgbXkgaGVhcnQ7CiAgICBBbmQgeWV0IG5vIG1hbiBsaWtlIGhlIGRvdGggZ3JpZXZlIG15IGhlYXJ0LgoKTEFEWSBDQVBVTEVUCgogICAgVGhhdCBpcywgYmVjYXVzZSB0aGUgdHJhaXRvciBtdXJkZXJlciBsaXZlcy4KCkpVTElFVAoKICAgIEF5LCBtYWRhbSwgZnJvbSB0aGUgcmVhY2ggb2YgdGhlc2UgbXkgaGFuZHM6CiAgICBXb3VsZCBub25lIGJ1dCBJIG1pZ2h0IHZlbmdlIG15IGNvdXNpbidzIGRlYXRoIQoKTEFEWSBDQVBVTEVUCgogICAgV2Ugd2lsbCBoYXZlIHZlbmdlYW5jZSBmb3IgaXQsIGZlYXIgdGhvdSBub3Q6CiAgICBUaGVuIHdlZXAgbm8gbW9yZS4gSSdsbCBzZW5kIHRvIG9uZSBpbiBNYW50dWEsCiAgICBXaGVyZSB0aGF0IHNhbWUgYmFuaXNoJ2QgcnVuYWdhdGUgZG90aCBsaXZlLAogICAgU2hhbGwgZ2l2ZSBoaW0gc3VjaCBhbiB1bmFjY3VzdG9tJ2QgZHJhbSwKICAgIFRoYXQgaGUgc2hhbGwgc29vbiBrZWVwIFR5YmFsdCBjb21wYW55OgogICAgQW5kIHRoZW4sIEkgaG9wZSwgdGhvdSB3aWx0IGJlIHNhdGlzZmllZC4KCkpVTElFVAoKICAgIEluZGVlZCwgSSBuZXZlciBzaGFsbCBiZSBzYXRpc2ZpZWQKICAgIFdpdGggUm9tZW8sIHRpbGwgSSBiZWhvbGQgaGltLS1kZWFkLS0KICAgIElzIG15IHBvb3IgaGVhcnQgZm9yIGEga2luc21hbiB2ZXgnZC4KICAgIE1hZGFtLCBpZiB5b3UgY291bGQgZmluZCBvdXQgYnV0IGEgbWFuCiAgICBUbyBiZWFyIGEgcG9pc29uLCBJIHdvdWxkIHRlbXBlciBpdDsKICAgIFRoYXQgUm9tZW8gc2hvdWxkLCB1cG9uIHJlY2VpcHQgdGhlcmVvZiwKICAgIFNvb24gc2xlZXAgaW4gcXVpZXQuIE8sIGhvdyBteSBoZWFydCBhYmhvcnMKICAgIFRvIGhlYXIgaGltIG5hbWVkLCBhbmQgY2Fubm90IGNvbWUgdG8gaGltLgogICAgVG8gd3JlYWsgdGhlIGxvdmUgSSBib3JlIG15IGNvdXNpbgogICAgVXBvbiBoaXMgYm9keSB0aGF0IHNsYXVnaHRlcidkIGhpbSEKCkxBRFkgQ0FQVUxFVAoKICAgIEZpbmQgdGhvdSB0aGUgbWVhbnMsIGFuZCBJJ2xsIGZpbmQgc3VjaCBhIG1hbi4KICAgIEJ1dCBub3cgSSdsbCB0ZWxsIHRoZWUgam95ZnVsIHRpZGluZ3MsIGdpcmwuCgpKVUxJRVQKCiAgICBBbmQgam95IGNvbWVzIHdlbGwgaW4gc3VjaCBhIG5lZWR5IHRpbWU6CiAgICBXaGF0IGFyZSB0aGV5LCBJIGJlc2VlY2ggeW91ciBsYWR5c2hpcD8KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHdlbGwsIHRob3UgaGFzdCBhIGNhcmVmdWwgZmF0aGVyLCBjaGlsZDsKICAgIE9uZSB3aG8sIHRvIHB1dCB0aGVlIGZyb20gdGh5IGhlYXZpbmVzcywKICAgIEhhdGggc29ydGVkIG91dCBhIHN1ZGRlbiBkYXkgb2Ygam95LAogICAgVGhhdCB0aG91IGV4cGVjdCdzdCBub3Qgbm9yIEkgbG9vaydkIG5vdCBmb3IuCgpKVUxJRVQKCiAgICBNYWRhbSwgaW4gaGFwcHkgdGltZSwgd2hhdCBkYXkgaXMgdGhhdD8KCkxBRFkgQ0FQVUxFVAoKICAgIE1hcnJ5LCBteSBjaGlsZCwgZWFybHkgbmV4dCBUaHVyc2RheSBtb3JuLAogICAgVGhlIGdhbGxhbnQsIHlvdW5nIGFuZCBub2JsZSBnZW50bGVtYW4sCiAgICBUaGUgQ291bnR5IFBhcmlzLCBhdCBTYWludCBQZXRlcidzIENodXJjaCwKICAgIFNoYWxsIGhhcHBpbHkgbWFrZSB0aGVlIHRoZXJlIGEgam95ZnVsIGJyaWRlLgoKSlVMSUVUCgogICAgTm93LCBieSBTYWludCBQZXRlcidzIENodXJjaCBhbmQgUGV0ZXIgdG9vLAogICAgSGUgc2hhbGwgbm90IG1ha2UgbWUgdGhlcmUgYSBqb3lmdWwgYnJpZGUuCiAgICBJIHdvbmRlciBhdCB0aGlzIGhhc3RlOyB0aGF0IEkgbXVzdCB3ZWQKICAgIEVyZSBoZSwgdGhhdCBzaG91bGQgYmUgaHVzYmFuZCwgY29tZXMgdG8gd29vLgogICAgSSBwcmF5IHlvdSwgdGVsbCBteSBsb3JkIGFuZCBmYXRoZXIsIG1hZGFtLAogICAgSSB3aWxsIG5vdCBtYXJyeSB5ZXQ7IGFuZCwgd2hlbiBJIGRvLCBJIHN3ZWFyLAogICAgSXQgc2hhbGwgYmUgUm9tZW8sIHdob20geW91IGtub3cgSSBoYXRlLAogICAgUmF0aGVyIHRoYW4gUGFyaXMuIFRoZXNlIGFyZSBuZXdzIGluZGVlZCEKCkxBRFkgQ0FQVUxFVAoKICAgIEhlcmUgY29tZXMgeW91ciBmYXRoZXI7IHRlbGwgaGltIHNvIHlvdXJzZWxmLAogICAgQW5kIHNlZSBob3cgaGUgd2lsbCB0YWtlIGl0IGF0IHlvdXIgaGFuZHMuCgogICAgRW50ZXIgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBXaGVuIHRoZSBzdW4gc2V0cywgdGhlIGFpciBkb3RoIGRyaXp6bGUgZGV3OwogICAgQnV0IGZvciB0aGUgc3Vuc2V0IG9mIG15IGJyb3RoZXIncyBzb24KICAgIEl0IHJhaW5zIGRvd25yaWdodC4KICAgIEhvdyBub3chIGEgY29uZHVpdCwgZ2lybD8gd2hhdCwgc3RpbGwgaW4gdGVhcnMCiAgICBFdmVybW9yZSBzaG93ZXJpbmcIEluIG9uZSBsaXR0bGUgYm9keQogICAgVGhvdSBjb3VudGVyZmVpdCdzdCBhIGJhcmssIGEgc2VhLCBhIHdpbmQ7CiAgICBGb3Igc3RpbGwgdGh5IGV5ZXMsIHdoaWNoIEkgbWF5IGNhbGwgdGhlIHNlYSwKICAgIERvIGViYiBhbmQgZmxvdyB3aXRoIHRlYXJzOyB0aGUgYmFyayB0aHkgYm9keSBpcywKICAgIFNhaWxpbmcgaW4gdGhpcyBzYWx0IGZsb29kOyB0aGUgd2luZHMsIHRoeSBzaWdoczsKICAgIFdobywgcmFnaW5nIHdpdGggdGh5IHRlYXJzLCBhbmQgdGhleSB3aXRoIHRoZW0sCiAgICBXaXRob3V0IGEgc3VkZGVuIGNhbG0sIHdpbGwgb3ZlcnNldAogICAgVGh5IHRlbXBlc3QtdG9zc2VkIGJvZHkuIEhvdyBub3csIHdpZmUhCiAgICBIYXZlIHlvdSBkZWxpdmVyJ2QgdG8gaGVyIG91ciBkZWNyZWUCgpMQURZIENBUFVMRVQKCiAgICBBeSwgc2lyOyBidXQgc2hlIHdpbGwgbm9uZSwgc2hlIGdpdmVzIHlvdSB0aGFua3MuCiAgICBJIHdvdWxkIHRoZSBmb29sIHdlcmUgbWFycmllZCB0byBoZXIgZ3JhdmUhCgpDQVBVTEVUCgogICAgU29mdCEgdGFrZSBtZSB3aXRoIHlvdSwgdGFrZSBtZSB3aXRoIHlvdSwgd2lmZS4KICAgIEhvdyEgd2lsbCBzaGUgbm9uZT8gZG90aCBzaGUgbm90IGdpdmUgdXMgdGhhbmtzPwogICAgSXMgc2hlIG5vdCBwcm91ZD8gZG90aCBzaGUgbm90IGNvdW50IGhlciBibGVzdCwKICAgIFVud29ydGh5IGFzIHNoZSBpcywgdGhhdCB3ZSBoYXZlIHdyb3VnaHQKICAgIFNvIHdvcnRoeSBhIGdlbnRsZW1hbiB0byBiZSBoZXIgYnJpZGVncm9vbT8KCkpVTElFVAoKICAgIE5vdCBwcm91ZCwgeW91IGhhdmU7IGJ1dCB0aGFua2Z1bCwgdGhhdCB5b3UgaGF2ZToKICAgIFByb3VkIGNhbiBJIG5ldmVyIGJlIG9mIHdoYXQgSSBoYXRlOwogICAgQnV0IHRoYW5rZnVsIGV2ZW4gZm9yIGhhdGUsIHRoYXQgaXMgbWVhbnQgbG92ZS4KCkNBUFVMRVQKCiAgICBIb3cgbm93LCBob3cgbm93LCBjaG9wLWxvZ2ljISBXaGF0IGlzIHRoaXMCiAgICAnUHJvdWQsJyBhbmQgJ0kgdGhhbmsgeW91LCcgYW5kICdJIHRoYW5rIHlvdSBub3Q7JwogICAgQW5kIHlldCAnbm90IHByb3VkLCcgbWlzdHJlc3MgbWluaW9uLCB5b3UsCiAgICBUaGFuayBtZSBubyB0aGFua2luZ3MsIG5vciwgcHJvdWQgbWUgbm8gcHJvdWRzLAogICAgQnV0IGZldHRsZSB5b3VyIGZpbmUgam9pbnRzICdnYWluc3QgVGh1cnNkYXkgbmV4dCwKICAgIFRvIGdvIHdpdGggUGFyaXMgdG8gU2FpbnQgUGV0ZXIncyBDaHVyY2gsCiAgICBPciBJIHdpbGwgZHJhZyB0aGVlIG9uIGEgaHVyZGxlIHRoaXRoZXIuCiAgICBPdXQsIHlvdSBncmVlbi1zaWNrbmVzcyBjYXJyaW9uISBvdXQsIHlvdSBiYWdnYWdlIQogICAgWW91IHRhbGxvdy1mYWNlIQoKTEFEWSBDQVBVTEVUCgogICAgRmllLCBmaWUhIHdoYXQsIGFyZSB5b3UgbWFkPwoKSlVMSUVUCgogICAgR29vZCBmYXRoZXIsIEkgYmVzZWVjaCB5b3Ugb24gbXkga25lZXMsCiAgICBIZWFyIG1lIHdpdGggcGF0aWVuY2UgYnV0IHRvIHNwZWFrIGEgd29yZC4KCkNBUFVMRVQKCiAgICBIYW5nIHRoZWUsIHlvdW5nIGJhZ2dhZ2UhIGRpc29iZWRpZW50IHdyZXRjaCEKICAgIEkgdGVsbCB0aGVlIHdoYXQ6IGdldCB0aGVlIHRvIGNodXJjaCBvJyBUaHVyc2RheSwKICAgIE9yIG5ldmVyIGFmdGVyIGxvb2sgbWUgaW4gdGhlIGZhY2U6CiAgICBTcGVhayBub3QsIHJlcGx5IG5vdCwgZG8gbm90IGFuc3dlciBtZTsKICAgIE15IGZpbmdlcnMgaXRjaC4gV2lmZSwgd2Ugc2NhcmNlIHRob3VnaHQgdXMgYmxlc3QKICAgIFRoYXQgR29kIGhhZCBsZW50IHVzIGJ1dCB0aGlzIG9ubHkgY2hpbGQ7CiAgICBCdXQgbm93IEkgc2VlIHRoaXMgb25lIGlzIG9uZSB0b28gbXVjaCwKICAgIEFuZCB0aGF0IHdlIGhhdmUgYSBjdXJzZSBpbiBoYXZpbmcgaGVyOgogICAgT3V0IG9uIGhlciwgaGlsZGluZyEKCk51cnNlCgogICAgR29kIGluIGhlYXZlbiBibGVzcyBoZXIhCiAgICBZb3UgYXJlIHRvIGJsYW1lLCBteSBsb3JkLCB0byByYXRlIGhlciBzby4KCkNBUFVMRVQKCiAgICBBbmQgd2h5LCBteSBsYWR5IHdpc2RvbT8gaG9sZCB5b3VyIHRvbmd1ZSwKICAgIEdvb2QgcHJ1ZGVuY2U7IHNtYXR0ZXIgd2l0aCB5b3VyIGdvc3NpcHMsIGdvLgoKTnVyc2UKCiAgICBJIHNwZWFrIG5vIHRyZWFzb24uCgpDQVBVTEVUCgogICAgTywgR29kIHllIGdvZC1kZW4uCgpOdXJzZQoKICAgIE1heSBub3Qgb25lIHNwZWFrPwoKQ0FQVUxFVAoKICAgIFBlYWNlLCB5b3UgbXVtYmxpbmcgZm9vbCEKICAgIFV0dGVyIHlvdXIgZ3Jhdml0eSBvJ2VyIGEgZ29zc2lwJ3MgYm93bDsKICAgIEZvciBoZXJlIHdlIG5lZWQgaXQgbm90LgoKTEFEWSBDQVBVTEVUCgogICAgWW91IGFyZSB0b28gaG90LgoKQ0FQVUxFVAoKICAgIEdvZCdzIGJyZWFkISBpdCBtYWtlcyBtZSBtYWQ6CiAgICBEYXksIG5pZ2h0LCBob3VyLCB0aWRlLCB0aW1lLCB3b3JrLCBwbGF5LAogICAgQWxvbmUsIGluIGNvbXBhbnksIHN0aWxsIG15IGNhcmUgaGF0aCBiZWVuCiAgICBUbyBoYXZlIGhlciBtYXRjaCdkOiBhbmQgaGF2aW5nIG5vdyBwcm92aWRlZAogICAgQSBnZW50bGVtYW4gb2Ygbm9ibGUgcGFyZW50YWdlLAogICAgT2YgZmFpciBkZW1lc25lcywgeW91dGhmdWwsIGFuZCBub2JseSB0cmFpbidkLAogICAgU3R1ZmYnZCwgYXMgdGhleSBzYXksIHdpdGggaG9ub3VyYWJsZSBwYXJ0cywKICAgIFByb3BvcnRpb24nZCBhcyBvbmUncyB0aG91Z2h0IHdvdWxkIHdpc2ggYSBtYW47CiAgICBBbmQgdGhlbiB0byBoYXZlIGEgd3JldGNoZWQgcHVsaW5nIGZvb2wsCiAgICBBIHdoaW5pbmcgbWFtbWV0LCBpbiBoZXIgZm9ydHVuZSdzIHRlbmRlciwKICAgIFRvIGFuc3dlciAnSSdsbCBub3Qgd2VkOyBJIGNhbm5vdCBsb3ZlLAogICAgSSBhbSB0b28geW91bmc7IEkgcHJheSB5b3UsIHBhcmRvbiBtZS4nCiAgICBCdXQsIGFzIHlvdSB3aWxsIG5vdCB3ZWQsIEknbGwgcGFyZG9uIHlvdToKICAgIEdyYXplIHdoZXJlIHlvdSB3aWxsIHlvdSBzaGFsbCBub3QgaG91c2Ugd2l0aCBtZToKICAgIExvb2sgdG8ndCwgdGhpbmsgb24ndCwgSSBkbyBub3QgdXNlIHRvIGplc3QuCiAgICBUaHVyc2RheSBpcyBuZWFyOyBsYXkgaGFuZCBvbiBoZWFydCwgYWR2aXNlOgogICAgQW4geW91IGJlIG1pbmUsIEknbGwgZ2l2ZSB5b3UgdG8gbXkgZnJpZW5kOwogICAgQW5kIHlvdSBiZSBub3QsIGhhbmcsIGJlZywgc3RhcnZlLCBkaWUgaW4KICAgIHRoZSBzdHJlZXRzLAogICAgRm9yLCBieSBteSBzb3VsLCBJJ2xsIG5lJ2VyIGFja25vd2xlZGdlIHRoZWUsCiAgICBOb3Igd2hhdCBpcyBtaW5lIHNoYWxsIG5ldmVyIGRvIHRoZWUgZ29vZDoKICAgIFRydXN0IHRvJ3QsIGJldGhpbmsgeW91OyBJJ2xsIG5vdCBiZSBmb3Jzd29ybi4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBJcyB0aGVyZSBubyBwaXR5IHNpdHRpbmcgaW4gdGhlIGNsb3VkcywKICAgIFRoYXQgc2VlcyBpbnRvIHRoZSBib3R0b20gb2YgbXkgZ3JpZWYCiAgICBPLCBzd2VldCBteSBtb3RoZXIsIGNhc3QgbWUgbm90IGF3YXkhCiAgICBEZWxheSB0aGlzIG1hcnJpYWdlIGZvciBhIG1vbnRoLCBhIHdlZWs7CiAgICBPciwgaWYgeW91IGRvIG5vdCwgbWFrZSB0aGUgYnJpZGFsIGJlZAogICAgSW4gdGhhdCBkaW0gbW9udW1lbnQgd2hlcmUgVHliYWx0IGxpZXMuCgpMQURZIENBUFVMRVQKCiAgICBUYWxrIG5vdCB0byBtZSwgZm9yIEknbGwgbm90IHNwZWFrIGEgd29yZDoKICAgIERvIGFzIHRob3Ugd2lsdCwgZm9yIEkgaGF2ZSBkb25lIHdpdGggdGhlZS4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIEdvZCEtLU8gbnVyc2UsIGhvdyBzaGFsbCB0aGlzIGJlIHByZXZlbnRlZD8KICAgIE15IGh1c2JhbmQgaXMgb24gZWFydGgsIG15IGZhaXRoIGluIGhlYXZlbjsKICAgIEhvdyBzaGFsbCB0aGF0IGZhaXRoIHJldHVybiBhZ2FpbiB0byBlYXJ0aCwKICAgIFVubGVzcyB0aGF0IGh1c2JhbmQgc2VuZCBpdCBtZSBmcm9tIGhlYXZlbgogICAgQnkgbGVhdmluZyBlYXJ0aD8gY29tZm9ydCBtZSwgY291bnNlbCBtZS4KICAgIEFsYWNrLCBhbGFjaywgdGhhdCBoZWF2ZW4gc2hvdWxkIHByYWN0aXNlIHN0cmF0YWdlbXMKICAgIFVwb24gc28gc29mdCBhIHN1YmplY3QgYXMgbXlzZWxmIQogICAgV2hhdCBzYXknc3QgdGhvdT8gaGFzdCB0aG91IG5vdCBhIHdvcmQgb2Ygam95PwogICAgU29tZSBjb21mb3J0LCBudXJzZS4KCk51cnNlCgogICAgRmFpdGgsIGhlcmUgaXQgaXMuCiAgICBSb21lbyBpcyBiYW5pc2gnZDsgYW5kIGFsbCB0aGUgd29ybGQgdG8gbm90aGluZywKICAgIFRoYXQgaGUgZGFyZXMgbmUnZXIgY29tZSBiYWNrIHRvIGNoYWxsZW5nZSB5b3U7CiAgICBPciwgaWYgaGUgZG8sIGl0IG5lZWRzIG11c3QgYmUgYnkgc3RlYWx0aC4KICAgIFRoZW4sIHNpbmNlIHRoZSBjYXNlIHNvIHN0YW5kcyBhcyBub3cgaXQgZG90aCwKICAgIEkgdGhpbmsgaXQgYmVzdCB5b3UgbWFycmllZCB3aXRoIHRoZSBjb3VudHkuCiAgICBPLCBoZSdzIGEgbG92ZWx5IGdlbnRsZW1hbiEKICAgIFJvbWVvJ3MgYSBkaXNoY2xvdXQgdG8gaGltOiBhbiBlYWdsZSwgbWFkYW0sCiAgICBIYXRoIG5vdCBzbyBncmVlbiwgc28gcXVpY2ssIHNvIGZhaXIgYW4gZXllCiAgICBBcyBQYXJpcyBoYXRoLiBCZXNocmV3IG15IHZlcnkgaGVhcnQsCiAgICBJIHRoaW5rIHlvdSBhcmUgaGFwcHkgaW4gdGhpcyBzZWNvbmQgbWF0Y2gsCiAgICBGb3IgaXQgZXhjZWxzIHlvdXIgZmlyc3Q6IG9yIGlmIGl0IGRpZCBub3QsCiAgICBZb3VyIGZpcnN0IGlzIGRlYWQ7IG9yICd0d2VyZSBhcyBnb29kIGhlIHdlcmUsCiAgICBBcyBsaXZpbmcgaGVyZSBhbmQgeW91IG5vIHVzZSBvZiBoaW0uCgpKVUxJRVQKCiAgICBTcGVha2VzdCB0aG91IGZyb20gdGh5IGhlYXJ0PwoKTnVyc2UKCiAgICBBbmQgZnJvbSBteSBzb3VsIHRvbzsKICAgIE9yIGVsc2UgYmVzaHJldyB0aGVtIGJvdGguCgpKVUxJRVQKCiAgICBBbWVuIQoKTnVyc2UKCiAgICBXaGF0PwoKSlVMSUVUCgogICAgV2VsbCwgdGhvdSBoYXN0IGNvbWZvcnRlZCBtZSBtYXJ2ZWxsb3VzIG11Y2guCiAgICBHbyBpbjogYW5kIHRlbGwgbXkgbGFkeSBJIGFtIGdvbmUsCiAgICBIYXZpbmcgZGlzcGxlYXNlZCBteSBmYXRoZXIsIHRvIExhdXJlbmNlJyBjZWxsLAogICAgVG8gbWFrZSBjb25mZXNzaW9uIGFuZCB0byBiZSBhYnNvbHZlZC4KCk51cnNlCgogICAgTWFycnksIEkgd2lsbDsgYW5kIHRoaXMgaXMgd2lzZWx5IGRvbmUuCgogICAgRXhpdAoKSlVMSUVUCgogICAgQW5jaWVudCBkYW1uYXRpb24hIE8gbW9zdCB3aWNrZWQgZmllbmQhCiAgICBJcyBpdCBtb3JlIHNpbiB0byB3aXNoIG1lIHRodXMgZm9yc3dvcm4sCiAgICBPciB0byBkaXNwcmFpc2UgbXkgbG9yZCB3aXRoIHRoYXQgc2FtZSB0b25ndWUKICAgIFdoaWNoIHNoZSBoYXRoIHByYWlzZWQgaGltIHdpdGggYWJvdmUgY29tcGFyZQogICAgU28gbWFueSB0aG91c2FuZCB0aW1lcz8gR28sIGNvdW5zZWxsb3I7CiAgICBUaG91IGFuZCBteSBib3NvbSBoZW5jZWZvcnRoIHNoYWxsIGJlIHR3YWluLgogICAgSSdsbCB0byB0aGUgZnJpYXIsIHRvIGtub3cgaGlzIHJlbWVkeToKICAgIElmIGFsbCBlbHNlIGZhaWwsIG15c2VsZiBoYXZlIHBvd2VyIHRvIGRpZS4KCiAgICBFeGl0CgpBQ1QgSVYKU0NFTkUgSS4gRnJpYXIgTGF1cmVuY2UncyBjZWxsLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUyAKCkZSSUFSIExBVVJFTkNFCgogICAgT24gVGh1cnNkYXksIHNpcj8gdGhlIHRpbWUgaXMgdmVyeSBzaG9ydC4KClBBUklTCgogICAgTXkgZmF0aGVyIENhcHVsZXQgd2lsbCBoYXZlIGl0IHNvOwogICAgQW5kIEkgYW0gbm90aGluZyBzbG93IHRvIHNsYWNrIGhpcyBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgWW91IHNheSB5b3UgZG8gbm90IGtub3cgdGhlIGxhZHkncyBtaW5kOgogICAgVW5ldmVuIGlzIHRoZSBjb3Vyc2UsIEkgbGlrZSBpdCBub3QuCgpQQVJJUwoKICAgIEltbW9kZXJhdGVseSBzaGUgd2VlcHMgZm9yIFR5YmFsdCdzIGRlYXRoLAogICAgQW5kIHRoZXJlZm9yZSBoYXZlIEkgbGl0dGxlIHRhbGsnZCBvZiBsb3ZlOwogICAgRm9yIFZlbnVzIHNtaWxlcyBub3QgaW4gYSBob3VzZSBvZiB0ZWFycy4KICAgIE5vdywgc2lyLCBoZXIgZmF0aGVyIGNvdW50cyBpdCBkYW5nZXJvdXMKICAgIFRoYXQgc2hlIGRvdGggZ2l2ZSBoZXIgc29ycm93IHNvIG11Y2ggc3dheSwKICAgIEFuZCBpbiBoaXMgd2lzZG9tIGhhc3RlcyBvdXIgbWFycmlhZ2UsCiAgICBUbyBzdG9wIHRoZSBpbnVuZGF0aW9uIG9mIGhlciB0ZWFyczsKICAgIFdoaWNoLCB0b28gbXVjaCBtaW5kZWQgYnkgaGVyc2VsZiBhbG9uZSwKICAgIE1heSBiZSBwdXQgZnJvbSBoZXIgYnkgc29jaWV0eToKICAgIE5vdyBkbyB5b3Uga25vdyB0aGUgcmVhc29uIG9mIHRoaXMgaGFzdGUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFtBc2lkZV0gSSB3b3VsZCBJIGtuZXcgbm90IHdoeSBpdCBzaG91bGQgYmUgc2xvdydkLgogICAgTG9vaywgc2lyLCBoZXJlIGNvbWVzIHRoZSBsYWR5IHRvd2FyZHMgbXkgY2VsbC4KCiAgICBFbnRlciBKVUxJRVQKClBBUklTCgogICAgSGFwcGlseSBtZXQsIG15IGxhZHkgYW5kIG15IHdpZmUhCgpKVUxJRVQKCiAgICBUaGF0IG1heSBiZSwgc2lyLCB3aGVuIEkgbWF5IGJlIGEgd2lmZS4KClBBUklTCgogICAgVGhhdCBtYXkgYmUgbXVzdCBiZSwgbG92ZSwgb24gVGh1cnNkYXkgbmV4dC4KCkpVTElFVAoKICAgIFdoYXQgbXVzdCBiZSBzaGFsbCBiZS4KCkZSSUFSIExBVVJFTkNFCgogICAgVGhhdCdzIGEgY2VydGFpbiB0ZXh0LgoKUEFSSVMKCiAgICBDb21lIHlvdSB0byBtYWtlIGNvbmZlc3Npb24gdG8gdGhpcyBmYXRoZXICgpKVUxJRVQKCiAgICBUbyBhbnN3ZXIgdGhhdCwgSSBzaG91bGQgY29uZmVzcyB0byB5b3UuCgpQQVJJUwoKICAgIERvIG5vdCBkZW55IHRvIGhpbSB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSSB3aWxsIGNvbmZlc3MgdG8geW91IHRoYXQgSSBsb3ZlIGhpbS4KClBBUklTCgogICAgU28gd2lsbCB5ZSwgSSBhbSBzdXJlLCB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSWYgSSBkbyBzbywgaXQgd2lsbCBiZSBvZiBtb3JlIHByaWNlLAogICAgQmVpbmcgc3Bva2UgYmVoaW5kIHlvdXIgYmFjaywgdGhhbiB0byB5b3VyIGZhY2UuCgpQQVJJUwoKICAgIFBvb3Igc291bCwgdGh5IGZhY2UgaXMgbXVjaCBhYnVzZWQgd2l0aCB0ZWFycy4KCkpVTElFVAoKICAgIFRoZSB0ZWFycyBoYXZlIGdvdCBzbWFsbCB2aWN0b3J5IGJ5IHRoYXQ7CiAgICBGb3IgaXQgd2FzIGJhZCBlbm91Z2ggYmVmb3JlIHRoZWlyIHNwaXRlLgoKUEFSSVMKCiAgICBUaG91IHdyb25nJ3N0IGl0LCBtb3JlIHRoYW4gdGVhcnMsIHdpdGggdGhhdCByZXBvcnQuCgpKVUxJRVQKCiAgICBUaGF0IGlzIG5vIHNsYW5kZXIsIHNpciwgd2hpY2ggaXMgYSB0cnV0aDsKICAgIEFuZCB3aGF0IEkgc3Bha2UsIEkgc3Bha2UgaXQgdG8gbXkgZmFjZS4KClBBUklTCgogICAgVGh5IGZhY2UgaXMgbWluZSwgYW5kIHRob3UgaGFzdCBzbGFuZGVyJ2QgaXQuCgpKVUxJRVQKCiAgICBJdCBtYXkgYmUgc28sIGZvciBpdCBpcyBub3QgbWluZSBvd24uCiAgICBBcmUgeW91IGF0IGxlaXN1cmUsIGhvbHkgZmF0aGVyLCBub3c7CiAgICBPciBzaGFsbCBJIGNvbWUgdG8geW91IGF0IGV2ZW5pbmcgbWFzcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTXkgbGVpc3VyZSBzZXJ2ZXMgbWUsIHBlbnNpdmUgZGF1Z2h0ZXIsIG5vdy4KICAgIE15IGxvcmQsIHdlIG11c3QgZW50cmVhdCB0aGUgdGltZSBhbG9uZS4KClBBUklTCgogICAgR29kIHNoaWVsZCBJIHNob3VsZCBkaXN0dXJiIGRldm90aW9uIQogICAgSnVsaWV0LCBvbiBUaHVyc2RheSBlYXJseSB3aWxsIEkgcm91c2UgeWU6CiAgICBUaWxsIHRoZW4sIGFkaWV1OyBhbmQga2VlcCB0aGlzIGhvbHkga2lzcy4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIHNodXQgdGhlIGRvb3IhIGFuZCB3aGVuIHRob3UgaGFzdCBkb25lIHNvLAogICAgQ29tZSB3ZWVwIHdpdGggbWU7IHBhc3QgaG9wZSwgcGFzdCBjdXJlLCBwYXN0IGhlbHAhCgpGUklBUiBMQVVSRU5DRQoKICAgIEFoLCBKdWxpZXQsIEkgYWxyZWFkeSBrbm93IHRoeSBncmllZjsKICAgIEl0IHN0cmFpbnMgbWUgcGFzdCB0aGUgY29tcGFzcyBvZiBteSB3aXRzOgogICAgSSBoZWFyIHRob3UgbXVzdCwgYW5kIG5vdGhpbmcgbWF5IHByb3JvZ3VlIGl0LAogICAgT24gVGh1cnNkYXkgbmV4dCBiZSBtYXJyaWVkIHRvIHRoaXMgY291bnR5LgoKSlVMSUVUCgogICAgVGVsbCBtZSBub3QsIGZyaWFyLCB0aGF0IHRob3UgaGVhcidzdCBvZiB0aGlzLAogICAgVW5sZXNzIHRob3UgdGVsbCBtZSBob3cgSSBtYXkgcHJldmVudCBpdDoKICAgIElmLCBpbiB0aHkgd2lzZG9tLCB0aG91IGNhbnN0IGdpdmUgbm8gaGVscCwKICAgIERvIHRob3UgYnV0IGNhbGwgbXkgcmVzb2x1dGlvbiB3aXNlLAogICAgQW5kIHdpdGggdGhpcyBrbmlmZSBJJ2xsIGhlbHAgaXQgcHJlc2VudGx5LgogICAgR29kIGpvaW4nZCBteSBoZWFydCBhbmQgUm9tZW8ncywgdGhvdSBvdXIgaGFuZHM7CiAgICBBbmQgZXJlIHRoaXMgaGFuZCwgYnkgdGhlZSB0byBSb21lbyBzZWFsJ2QsCiAgICBTaGFsbCBiZSB0aGUgbGFiZWwgdG8gYW5vdGhlciBkZWVkLAogICAgT3IgbXkgdHJ1ZSBoZWFydCB3aXRoIHRyZWFjaGVyb3VzIHJldm9sdAogICAgVHVybiB0byBhbm90aGVyLCB0aGlzIHNoYWxsIHNsYXkgdGhlbSBib3RoOgogICAgVGhlcmVmb3JlLCBvdXQgb2YgdGh5IGxvbmctZXhwZXJpZW5jZWQgdGltZSwKICAgIEdpdmUgbWUgc29tZSBwcmVzZW50IGNvdW5zZWwsIG9yLCBiZWhvbGQsCiAgICAnVHdpeHQgbXkgZXh0cmVtZXMgYW5kIG1lIHRoaXMgYmxvb2R5IGtuaWZlCiAgICBTaGFsbCBwbGF5IHRoZSB1bXBpcmUsIGFyYml0cmF0aW5nIHRoYXQKICAgIFdoaWNoIHRoZSBjb21taXNzaW9uIG9mIHRoeSB5ZWFycyBhbmQgYXJ0CiAgICBDb3VsZCB0byBubyBpc3N1ZSBvZiB0cnVlIGhvbm91ciBicmluZy4KICAgIEJlIG5vdCBzbyBsb25nIHRvIHNwZWFrOyBJIGxvbmcgdG8gZGllLAogICAgSWYgd2hhdCB0aG91IHNwZWFrJ3N0IHNwZWFrIG5vdCBvZiByZW1lZHkuCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvbGQsIGRhdWdodGVyOiBJIGRvIHNweSBhIGtpbmQgb2YgaG9wZSwKICAgIFdoaWNoIGNyYXZlcyBhcyBkZXNwZXJhdGUgYW4gZXhlY3V0aW9uLgogICAgQXMgdGhhdCBpcyBkZXNwZXJhdGUgd2hpY2ggd2Ugd291bGQgcHJldmVudC4KICAgIElmLCByYXRoZXIgdGhhbiB0byBtYXJyeSBDb3VudHkgUGFyaXMsCiAgICBUaG91IGhhc3QgdGhlIHN0cmVuZ3RoIG9mIHdpbGwgdG8gc2xheSB0aHlzZWxmLAogICAgVGhlbiBpcyBpdCBsaWtlbHkgdGhvdSB3aWx0IHVuZGVydGFrZQogICAgQSB0aGluZyBsaWtlIGRlYXRoIHRvIGNoaWRlIGF3YXkgdGhpcyBzaGFtZSwKICAgIFRoYXQgY29wZXN0IHdpdGggZGVhdGggaGltc2VsZiB0byBzY2FwZSBmcm9tIGl0OgogICAgQW5kLCBpZiB0aG91IGRhcmVzdCwgSSdsbCBnaXZlIHRoZWUgcmVtZWR5LgoKSlVMSUVUCgogICAgTywgYmlkIG1lIGxlYXAsIHJhdGhlciB0aGFuIG1hcnJ5IFBhcmlzLAogICAgRnJvbSBvZmYgdGhlIGJhdHRsZW1lbnRzIG9mIHlvbmRlciB0b3dlcjsKICAgIE9yIHdhbGsgaW4gdGhpZXZpc2ggd2F5czsgb3IgYmlkIG1lIGx1cmsKICAgIFdoZXJlIHNlcnBlbnRzIGFyZTsgY2hhaW4gbWUgd2l0aCByb2FyaW5nIGJlYXJzOwogICAgT3Igc2h1dCBtZSBuaWdodGx5IGluIGEgY2hhcm5lbC1ob3VzZSwKICAgIE8nZXItY292ZXInZCBxdWl0ZSB3aXRoIGRlYWQgbWVuJ3MgcmF0dGxpbmcgYm9uZXMsCiAgICBXaXRoIHJlZWt5IHNoYW5rcyBhbmQgeWVsbG93IGNoYXBsZXNzIHNrdWxsczsKICAgIE9yIGJpZCBtZSBnbyBpbnRvIGEgbmV3LW1hZGUgZ3JhdmUKICAgIEFuZCBoaWRlIG1lIHdpdGggYSBkZWFkIG1hbiBpbiBoaXMgc2hyb3VkOwogICAgVGhpbmdzIHRoYXQsIHRvIGhlYXIgdGhlbSB0b2xkLCBoYXZlIG1hZGUgbWUgdHJlbWJsZTsKICAgIEFuZCBJIHdpbGwgZG8gaXQgd2l0aG91dCBmZWFyIG9yIGRvdWJ0LAogICAgVG8gbGl2ZSBhbiB1bnN0YWluJ2Qgd2lmZSB0byBteSBzd2VldCBsb3ZlLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIb2xkLCB0aGVuOyBnbyBob21lLCBiZSBtZXJyeSwgZ2l2ZSBjb25zZW50CiAgICBUbyBtYXJyeSBQYXJpczogV2VkbmVzZGF5IGlzIHRvLW1vcnJvdzoKICAgIFRvLW1vcnJvdyBuaWdodCBsb29rIHRoYXQgdGhvdSBsaWUgYWxvbmU7CiAgICBMZXQgbm90IHRoeSBudXJzZSBsaWUgd2l0aCB0aGVlIGluIHRoeSBjaGFtYmVyOgogICAgVGFrZSB0aG91IHRoaXMgdmlhbCwgYmVpbmcgdGhlbiBpbiBiZWQsCiAgICBBbmQgdGhpcyBkaXN0aWxsZWQgbGlxdW9yIGRyaW5rIHRob3Ugb2ZmOwogICAgV2hlbiBwcmVzZW50bHkgdGhyb3VnaCBhbGwgdGh5IHZlaW5zIHNoYWxsIHJ1bgogICAgQSBjb2xkIGFuZCBkcm93c3kgaHVtb3VyLCBmb3Igbm8gcHVsc2UKICAgIFNoYWxsIGtlZXAgaGlzIG5hdGl2ZSBwcm9ncmVzcywgYnV0IHN1cmNlYXNlOgogICAgTm8gd2FybXRoLCBubyBicmVhdGgsIHNoYWxsIHRlc3RpZnkgdGhvdSBsaXZlc3Q7CiAgICBUaGUgcm9zZXMgaW4gdGh5IGxpcHMgYW5kIGNoZWVrcyBzaGFsbCBmYWRlCiAgICBUbyBwYWx5IGFzaGVzLCB0aHkgZXllcycgd2luZG93cyBmYWxsLAogICAgTGlrZSBkZWF0aCwgd2hlbiBoZSBzaHV0cyB1cCB0aGUgZGF5IG9mIGxpZmU7CiAgICBFYWNoIHBhcnQsIGRlcHJpdmVkIG9mIHN1cHBsZSBnb3Zlcm5tZW50LAogICAgU2hhbGwsIHN0aWZmIGFuZCBzdGFyayBhbmQgY29sZCwgYXBwZWFyIGxpa2UgZGVhdGg6CiAgICBBbmQgaW4gdGhpcyBib3Jyb3cnZCBsaWtlbmVzcyBvZiBzaHJ1bmsgZGVhdGgKICAgIFRob3Ugc2hhbHQgY29udGludWUgdHdvIGFuZCBmb3J0eSBob3VycywKICAgIEFuZCB0aGVuIGF3YWtlIGFzIGZyb20gYSBwbGVhc2FudCBzbGVlcC4KICAgIE5vdywgd2hlbiB0aGUgYnJpZGVncm9vbSBpbiB0aGUgbW9ybmluZyBjb21lcwogICAgVG8gcm91c2UgdGhlZSBmcm9tIHRoeSBiZWQsIHRoZXJlIGFydCB0aG91IGRlYWQ6CiAgICBUaGVuLCBhcyB0aGUgbWFubmVyIG9mIG91ciBjb3VudHJ5IGlzLAogICAgSW4gdGh5IGJlc3Qgcm9iZXMgdW5jb3ZlcidkIG9uIHRoZSBiaWVyCiAgICBUaG91IHNoYWx0IGJlIGJvcm5lIHRvIHRoYXQgc2FtZSBhbmNpZW50IHZhdWx0CiAgICBXaGVyZSBhbGwgdGhlIGtpbmRyZWQgb2YgdGhlIENhcHVsZXRzIGxpZS4KICAgIEluIHRoZSBtZWFuIHRpbWUsIGFnYWluc3QgdGhvdSBzaGFsdCBhd2FrZSwKICAgIFNoYWxsIFJvbWVvIGJ5IG15IGxldHRlcnMga25vdyBvdXIgZHJpZnQsCiAgICBBbmQgaGl0aGVyIHNoYWxsIGhlIGNvbWU6IGFuZCBoZSBhbmQgSQogICAgV2lsbCB3YXRjaCB0aHkgd2FraW5nLCBhbmQgdGhhdCB2ZXJ5IG5pZ2h0CiAgICBTaGFsbCBSb21lbyBiZWFyIHRoZWUgaGVuY2UgdG8gTWFudHVhLgogICAgQW5kIHRoaXMgc2hhbGwgZnJlZSB0aGVlIGZyb20gdGhpcyBwcmVzZW50IHNoYW1lOwogICAgSWYgbm8gaW5jb25zdGFudCB0b3ksIG5vciB3b21hbmlzaCBmZWFyLAogICAgQWJhdGUgdGh5IHZhbG91ciBpbiB0aGUgYWN0aW5nIGl0LgoKSlVMSUVUCgogICAgR2l2ZSBtZSwgZ2l2ZSBtZSEgTywgdGVsbCBub3QgbWUgb2YgZmVhciEKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZDsgZ2V0IHlvdSBnb25lLCBiZSBzdHJvbmcgYW5kIHByb3NwZXJvdXMKICAgIEluIHRoaXMgcmVzb2x2ZTogSSdsbCBzZW5kIGEgZnJpYXIgd2l0aCBzcGVlZAogICAgVG8gTWFudHVhLCB3aXRoIG15IGxldHRlcnMgdG8gdGh5IGxvcmQuCgpKVUxJRVQKCiAgICBMb3ZlIGdpdmUgbWUgc3RyZW5ndGghIGFuZCBzdHJlbmd0aCBzaGFsbCBoZWxwIGFmZm9yZC4KICAgIEZhcmV3ZWxsLCBkZWFyIGZhdGhlciEKCiAgICBFeGV1bnQKClNDRU5FIElJLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIE51cnNlLCBhbmQgdHdvIFNlcnZpbmdtZW4gCgpDQVBVTEVUCgogICAgU28gbWFueSBndWVzdHMgaW52aXRlIGFzIGhlcmUgYXJlIHdyaXQuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGdvIGhpcmUgbWUgdHdlbnR5IGN1bm5pbmcgY29va3MuCgpTZWNvbmQgU2VydmFudAoKICAgIFlvdSBzaGFsbCBoYXZlIG5vbmUgaWxsLCBzaXI7IGZvciBJJ2xsIHRyeSBpZiB0aGV5CiAgICBjYW4gbGljayB0aGVpciBmaW5nZXJzLgoKQ0FQVUxFVAoKICAgIEhvdyBjYW5zdCB0aG91IHRyeSB0aGVtIHNvPwoKU2Vjb25kIFNlcnZhbnQKCiAgICBNYXJyeSwgc2lyLCAndGlzIGFuIGlsbCBjb29rIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBvd24gZmluZ2VyczogdGhlcmVmb3JlIGhlIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBmaW5nZXJzIGdvZXMgbm90IHdpdGggbWUuCgpDQVBVTEVUCgogICAgR28sIGJlIGdvbmUuCgogICAgRXhpdCBTZWNvbmQgU2VydmFudAogICAgV2Ugc2hhbGwgYmUgbXVjaCB1bmZ1cm5pc2hlZCBmb3IgdGhpcyB0aW1lLgogICAgV2hhdCwgaXMgbXkgZGF1Z2h0ZXIgZ29uZSB0byBGcmlhciBMYXVyZW5jZT8KCk51cnNlCgogICAgQXksIGZvcnNvb3RoLgoKQ0FQVUxFVAoKICAgIFdlbGwsIGhlIG1heSBjaGFuY2UgdG8gZG8gc29tZSBnb29kIG9uIGhlcjoKICAgIEEgcGVldmlzaCBzZWxmLXdpbGwnZCBoYXJsb3RyeSBpdCBpcy4KCk51cnNlCgogICAgU2VlIHdoZXJlIHNoZSBjb21lcyBmcm9tIHNocmlmdCB3aXRoIG1lcnJ5IGxvb2suCgogICAgRW50ZXIgSlVMSUVUCgpDQVBVTEVUCgogICAgSG93IG5vdywgbXkgaGVhZHN0cm9uZyEgd2hlcmUgaGF2ZSB5b3UgYmVlbiBnYWRkaW5nPwoKSlVMSUVUCgogICAgV2hlcmUgSSBoYXZlIGxlYXJuJ2QgbWUgdG8gcmVwZW50IHRoZSBzaW4KICAgIE9mIGRpc29iZWRpZW50IG9wcG9zaXRpb24KICAgIFRvIHlvdSBhbmQgeW91ciBiZWhlc3RzLCBhbmQgYW0gZW5qb2luJ2QKICAgIEJ5IGhvbHkgTGF1cmVuY2UgdG8gZmFsbCBwcm9zdHJhdGUgaGVyZSwKICAgIEFuZCBiZWcgeW91ciBwYXJkb246IHBhcmRvbiwgSSBiZXNlZWNoIHlvdSEKICAgIEhlbmNlZm9yd2FyZCBJIGFtIGV2ZXIgcnVsZWQgYnkgeW91LgoKQ0FQVUxFVAoKICAgIFNlbmQgZm9yIHRoZSBjb3VudHk7IGdvIHRlbGwgaGltIG9mIHRoaXM6CiAgICBJJ2xsIGhhdmUgdGhpcyBrbm90IGtuaXQgdXAgdG8tbW9ycm93IG1vcm5pbmcuCgpKVUxJRVQKCiAgICBJIG1ldCB0aGUgeW91dGhmdWwgbG9yZCBhdCBMYXVyZW5jZScgY2VsbDsKICAgIEFuZCBnYXZlIGhpbSB3aGF0IGJlY29tZWQgbG92ZSBJIG1pZ2h0LAogICAgTm90IHN0ZXAgbydlciB0aGUgYm91bmRzIG9mIG1vZGVzdHkuCgpDQVBVTEVUCgogICAgV2h5LCBJIGFtIGdsYWQgb24ndDsgdGhpcyBpcyB3ZWxsOiBzdGFuZCB1cDoKICAgIFRoaXMgaXMgYXMndCBzaG91bGQgYmUuIExldCBtZSBzZWUgdGhlIGNvdW50eTsKICAgIEF5LCBtYXJyeSwgZ28sIEkgc2F5LCBhbmQgZmV0Y2ggaGltIGhpdGhlci4KICAgIE5vdywgYWZvcmUgR29kISB0aGlzIHJldmVyZW5kIGhvbHkgZnJpYXIsCiAgICBPdXIgd2hvbGUgY2l0eSBpcyBtdWNoIGJvdW5kIHRvIGhpbS4KCkpVTElFVAoKICAgIE51cnNlLCB3aWxsIHlvdSBnbyB3aXRoIG1lIGludG8gbXkgY2xvc2V0LAogICAgVG8gaGVscCBtZSBzb3J0IHN1Y2ggbmVlZGZ1bCBvcm5hbWVudHMKICAgIEFzIHlvdSB0aGluayBmaXQgdG8gZnVybmlzaCBtZSB0by1tb3Jyb3cCgpMQURZIENBUFVMRVQKCiAgICBObywgbm90IHRpbGwgVGh1cnNkYXk7IHRoZXJlIGlzIHRpbWUgZW5vdWdoLgoKQ0FQVUxFVAoKICAgIEdvLCBudXJzZSwgZ28gd2l0aCBoZXI6IHdlJ2xsIHRvIGNodXJjaCB0by1tb3Jyb3cuCgogICAgRXhldW50IEpVTElFVCBhbmQgTnVyc2UKCkxBRFkgQ0FQVUxFVAoKICAgIFdlIHNoYWxsIGJlIHNob3J0IGluIG91ciBwcm92aXNpb246CiAgICAnVGlzIG5vdyBuZWFyIG5pZ2h0LgoKQ0FQVUxFVAoKICAgIFR1c2gsIEkgd2lsbCBzdGlyIGFib3V0LAogICAgQW5kIGFsbCB0aGluZ3Mgc2hhbGwgYmUgd2VsbCwgSSB3YXJyYW50IHRoZWUsIHdpZmU6CiAgICBHbyB0aG91IHRvIEp1bGlldCwgaGVscCB0byBkZWNrIHVwIGhlcjsKICAgIEknbGwgbm90IHRvIGJlZCB0by1uaWdodDsgbGV0IG1lIGFsb25lOwogICAgSSdsbCBwbGF5IHRoZSBob3VzZXdpZmUgZm9yIHRoaXMgb25jZS4gV2hhdCwgaG8hCiAgICBUaGV5IGFyZSBhbGwgZm9ydGguIFdlbGwsIEkgd2lsbCB3YWxrIG15c2VsZgogICAgVG8gQ291bnR5IFBhcmlzLCB0byBwcmVwYXJlIGhpbSB1cAogICAgQWdhaW5zdCB0by1tb3Jyb3c6IG15IGhlYXJ0IGlzIHdvbmRyb3VzIGxpZ2h0LAogICAgU2luY2UgdGhpcyBzYW1lIHdheXdhcmQgZ2lybCBpcyBzbyByZWNsYWltJ2QuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEp1bGlldCdzIGNoYW1iZXIuCgogICAgRW50ZXIgSlVMSUVUIGFuZCBOdXJzZSAKCkpVTElFVAoKICAgIEF5LCB0aG9zZSBhdHRpcmVzIGFyZSBiZXN0OiBidXQsIGdlbnRsZSBudXJzZSwKICAgIEkgcHJheSB0aGVlLCBsZWF2ZSBtZSB0byBteSBzZWxmIHRvLW5pZ2h0LAogICAgRm9yIEkgaGF2ZSBuZWVkIG9mIG1hbnkgb3Jpc29ucwogICAgVG8gbW92ZSB0aGUgaGVhdmVucyB0byBzbWlsZSB1cG9uIG15IHN0YXRlLAogICAgV2hpY2gsIHdlbGwgdGhvdSBrbm93J3N0LCBpcyBjcm9zcywgYW5kIGZ1bGwgb2Ygc2luLgoKICAgIEVudGVyIExBRFkgQ0FQVUxFVAoKTEFEWSBDQVBVTEVUCgogICAgV2hhdCwgYXJlIHlvdSBidXN5LCBobz8gbmVlZCB5b3UgbXkgaGVscD8KCkpVTElFVAoKICAgIE5vLCBtYWRhbTsgd2UgaGF2ZSBjdWxsJ2Qgc3VjaCBuZWNlc3NhcmllcwogICAgQXMgYXJlIGJlaG92ZWZ1bCBmb3Igb3VyIHN0YXRlIHRvLW1vcnJvdzoKICAgIFNvIHBsZWFzZSB5b3UsIGxldCBtZSBub3cgYmUgbGVmdCBhbG9uZSwKICAgIEFuZCBsZXQgdGhlIG51cnNlIHRoaXMgbmlnaHQgc2l0IHVwIHdpdGggeW91OwogICAgRm9yLCBJIGFtIHN1cmUsIHlvdSBoYXZlIHlvdXIgaGFuZHMgZnVsbCBhbGwsCiAgICBJbiB0aGlzIHNvIHN1ZGRlbiBidXNpbmVzcy4KCkxBRFkgQ0FQVUxFVAoKICAgIEdvb2QgbmlnaHQ6CiAgICBHZXQgdGhlZSB0byBiZWQsIGFuZCByZXN0OyBmb3IgdGhvdSBoYXN0IG5lZWQuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkpVTElFVAoKICAgIEZhcmV3ZWxsISBHb2Qga25vd3Mgd2hlbiB3ZSBzaGFsbCBtZWV0IGFnYWluLgogICAgSSBoYXZlIGEgZmFpbnQgY29sZCBmZWFyIHRocmlsbHMgdGhyb3VnaCBteSB2ZWlucywKICAgIFRoYXQgYWxtb3N0IGZyZWV6ZXMgdXAgdGhlIGhlYXQgb2YgbGlmZToKICAgIEknbGwgY2FsbCB0aGVtIGJhY2sgYWdhaW4gdG8gY29tZm9ydCBtZToKICAgIE51cnNlISBXaGF0IHNob3VsZCBzaGUgZG8gaGVyZT8KICAgIE15IGRpc21hbCBzY2VuZSBJIG5lZWRzIG11c3QgYWN0IGFsb25lLgogICAgQ29tZSwgdmlhbC4KICAgIFdoYXQgaWYgdGhpcyBtaXh0dXJlIGRvIG5vdCB3b3JrIGF0IGFsbD8KICAgIFNoYWxsIEkgYmUgbWFycmllZCB0aGVuIHRvLW1vcnJvdyBtb3JuaW5nPwogICAgTm8sIG5vOiB0aGlzIHNoYWxsIGZvcmJpZCBpdDogbGllIHRob3UgdGhlcmUuCgogICAgTGF5aW5nIGRvd24gaGVyIGRhZ2dlcgogICAgV2hhdCBpZiBpdCBiZSBhIHBvaXNvbiwgd2hpY2ggdGhlIGZyaWFyCiAgICBTdWJ0bHkgaGF0aCBtaW5pc3RlcidkIHRvIGhhdmUgbWUgZGVhZCwKICAgIExlc3QgaW4gdGhpcyBtYXJyaWFnZSBoZSBzaG91bGQgYmUgZGlzaG9ub3VyJ2QsCiAgICBCZWNhdXNlIGhlIG1hcnJpZWQgbWUgYmVmb3JlIHRvIFJvbWVvPwogICAgSSBmZWFyIGl0IGlzOiBhbmQgeWV0LCBtZXRoaW5rcywgaXQgc2hvdWxkIG5vdCwKICAgIEZvciBoZSBoYXRoIHN0aWxsIGJlZW4gdHJpZWQgYSBob2x5IG1hbi4KICAgIEhvdyBpZiwgd2hlbiBJIGFtIGxhaWQgaW50byB0aGUgdG9tYiwKICAgIEkgd2FrZSBiZWZvcmUgdGhlIHRpbWUgdGhhdCBSb21lbwogICAgQ29tZSB0byByZWRlZW0gbWUIHRoZXJlJ3MgYSBmZWFyZnVsIHBvaW50IQogICAgU2hhbGwgSSBub3QsIHRoZW4sIGJlIHN0aWZsZWQgaW4gdGhlIHZhdWx0LAogICAgVG8gd2hvc2UgZm91bCBtb3V0aCBubyBoZWFsdGhzb21lIGFpciBicmVhdGhlcyBpbiwKICAgIEFuZCB0aGVyZSBkaWUgc3RyYW5nbGVkIGVyZSBteSBSb21lbyBjb21lcz8KICAgIE9yLCBpZiBJIGxpdmUsIGlzIGl0IG5vdCB2ZXJ5IGxpa2UsCiAgICBUaGUgaG9ycmlibGUgY29uY2VpdCBvZiBkZWF0aCBhbmQgbmlnaHQsCiAgICBUb2dldGhlciB3aXRoIHRoZSB0ZXJyb3Igb2YgdGhlIHBsYWNlLC0tCiAgICBBcyBpbiBhIHZhdWx0LCBhbiBhbmNpZW50IHJlY2VwdGFjbGUsCiAgICBXaGVyZSwgZm9yIHRoZXNlIG1hbnkgaHVuZHJlZCB5ZWFycywgdGhlIGJvbmVzCiAgICBPZiBhbGwgbXkgYnVyaWVkIGFuY2VzdG9ycyBhcmUgcGFja2VkOgogICAgV2hlcmUgYmxvb2R5IFR5YmFsdCwgeWV0IGJ1dCBncmVlbiBpbiBlYXJ0aCwKICAgIExpZXMgZmVzdGVyaW5nIGluIGhpcyBzaHJvdWQ7IHdoZXJlLCBhcyB0aGV5IHNheSwKICAgIEF0IHNvbWUgaG91cnMgaW4gdGhlIG5pZ2h0IHNwaXJpdHMgcmVzb3J0Oy0tCiAgICBBbGFjaywgYWxhY2ssIGlzIGl0IG5vdCBsaWtlIHRoYXQgSSwKICAgIFNvIGVhcmx5IHdha2luZywgd2hhdCB3aXRoIGxvYXRoc29tZSBzbWVsbHMsCiAgICBBbmQgc2hyaWVrcyBsaWtlIG1hbmRyYWtlcycgdG9ybiBvdXQgb2YgdGhlIGVhcnRoLAogICAgVGhhdCBsaXZpbmcgbW9ydGFscywgaGVhcmluZyB0aGVtLCBydW4gbWFkOi0tCiAgICBPLCBpZiBJIHdha2UsIHNoYWxsIEkgbm90IGJlIGRpc3RyYXVnaHQsCiAgICBFbnZpcm9uZWQgd2l0aCBhbGwgdGhlc2UgaGlkZW91cyBmZWFycz8KICAgIEFuZCBtYWRseSBwbGF5IHdpdGggbXkgZm9yZWZhdGhlcidzIGpvaW50cz8KICAgIEFuZCBwbHVjayB0aGUgbWFuZ2xlZCBUeWJhbHQgZnJvbSBoaXMgc2hyb3VkPwogICAgQW5kLCBpbiB0aGlzIHJhZ2UsIHdpdGggc29tZSBncmVhdCBraW5zbWFuJ3MgYm9uZSwKICAgIEFzIHdpdGggYSBjbHViLCBkYXNoIG91dCBteSBkZXNwZXJhdGUgYnJhaW5zPwogICAgTywgbG9vayEgbWV0aGlua3MgSSBzZWUgbXkgY291c2luJ3MgZ2hvc3QKICAgIFNlZWtpbmcgb3V0IFJvbWVvLCB0aGF0IGRpZCBzcGl0IGhpcyBib2R5CiAgICBVcG9uIGEgcmFwaWVyJ3MgcG9pbnQ6IHN0YXksIFR5YmFsdCwgc3RheSEKICAgIFJvbWVvLCBJIGNvbWUhIHRoaXMgZG8gSSBkcmluayB0byB0aGVlLgoKICAgIFNoZSBmYWxscyB1cG9uIGhlciBiZWQsIHdpdGhpbiB0aGUgY3VydGFpbnMKClNDRU5FIElWLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgSG9sZCwgdGFrZSB0aGVzZSBrZXlzLCBhbmQgZmV0Y2ggbW9yZSBzcGljZXMsIG51cnNlLgoKTnVyc2UKCiAgICBUaGV5IGNhbGwgZm9yIGRhdGVzIGFuZCBxdWluY2VzIGluIHRoZSBwYXN0cnkuCgogICAgRW50ZXIgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIENvbWUsIHN0aXIsIHN0aXIsIHN0aXIhIHRoZSBzZWNvbmQgY29jayBoYXRoIGNyb3cnZCwKICAgIFRoZSBjdXJmZXctYmVsbCBoYXRoIHJ1bmcsICd0aXMgdGhyZWUgbydjbG9jazoKICAgIExvb2sgdG8gdGhlIGJha2VkIG1lYXRzLCBnb29kIEFuZ2VsaWNhOgogICAgU3BhcmUgbm90IGZvciB0aGUgY29zdC4KCk51cnNlCgogICAgR28sIHlvdSBjb3QtcXVlYW4sIGdvLAogICAgR2V0IHlvdSB0byBiZWQ7IGZhaXRoLCBZb3UnbGwgYmUgc2ljayB0by1tb3Jyb3cKICAgIEZvciB0aGlzIG5pZ2h0J3Mgd2F0Y2hpbmcuCgpDQVBVTEVUCgogICAgTm8sIG5vdCBhIHdoaXQ6IHdoYXQhIEkgaGF2ZSB3YXRjaCdkIGVyZSBub3cKICAgIEFsbCBuaWdodCBmb3IgbGVzc2VyIGNhdXNlLCBhbmQgbmUnZXIgYmVlbiBzaWNrLgoKTEFEWSBDQVBVTEVUCgogICAgQXksIHlvdSBoYXZlIGJlZW4gYSBtb3VzZS1odW50IGluIHlvdXIgdGltZTsKICAgIEJ1dCBJIHdpbGwgd2F0Y2ggeW91IGZyb20gc3VjaCB3YXRjaGluZyBub3cuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBBIGplYWxvdXMgaG9vZCwgYSBqZWFsb3VzIGhvb2QhCgogICAgRW50ZXIgdGhyZWUgb3IgZm91ciBTZXJ2aW5nbWVuLCB3aXRoIHNwaXRzLCBsb2dzLCBhbmQgYmFza2V0cwogICAgTm93LCBmZWxsb3csCiAgICBXaGF0J3MgdGhlcmUCgpGaXJzdCBTZXJ2YW50CgogICAgVGhpbmdzIGZvciB0aGUgY29vaywgc2lyOyBidXQgSSBrbm93IG5vdCB3aGF0LgoKQ0FQVUxFVAoKICAgIE1ha2UgaGFzdGUsIG1ha2UgaGFzdGUuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGZldGNoIGRyaWVyIGxvZ3M6CiAgICBDYWxsIFBldGVyLCBoZSB3aWxsIHNob3cgdGhlZSB3aGVyZSB0aGV5IGFyZS4KClNlY29uZCBTZXJ2YW50CgogICAgSSBoYXZlIGEgaGVhZCwgc2lyLCB0aGF0IHdpbGwgZmluZCBvdXQgbG9ncywKICAgIEFuZCBuZXZlciB0cm91YmxlIFBldGVyIGZvciB0aGUgbWF0dGVyLgoKICAgIEV4aXQKCkNBUFVMRVQKCiAgICBNYXNzLCBhbmQgd2VsbCBzYWlkOyBhIG1lcnJ5IHdob3Jlc29uLCBoYSEKICAgIFRob3Ugc2hhbHQgYmUgbG9nZ2VyLWhlYWQuIEdvb2QgZmFpdGgsICd0aXMgZGF5OgogICAgVGhlIGNvdW50eSB3aWxsIGJlIGhlcmUgd2l0aCBtdXNpYyBzdHJhaWdodCwKICAgIEZvciBzbyBoZSBzYWlkIGhlIHdvdWxkOiBJIGhlYXIgaGltIG5lYXIuCgogICAgTXVzaWMgd2l0aGluCiAgICBOdXJzZSEgV2lmZSEgV2hhdCwgaG8hIFdoYXQsIG51cnNlLCBJIHNheSEKCiAgICBSZS1lbnRlciBOdXJzZQogICAgR28gd2FrZW4gSnVsaWV0LCBnbyBhbmQgdHJpbSBoZXIgdXA7CiAgICBJJ2xsIGdvIGFuZCBjaGF0IHdpdGggUGFyaXM6IGhpZSwgbWFrZSBoYXN0ZSwKICAgIE1ha2UgaGFzdGU7IHRoZSBicmlkZWdyb29tIGhlIGlzIGNvbWUgYWxyZWFkeToKICAgIE1ha2UgaGFzdGUsIEkgc2F5LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gSnVsaWV0J3MgY2hhbWJlci4KCiAgICBFbnRlciBOdXJzZSAKCk51cnNlCgogICAgTWlzdHJlc3MhIHdoYXQsIG1pc3RyZXNzISBKdWxpZXQhIGZhc3QsIEkgd2FycmFudCBoZXIsIHNoZToKICAgIFdoeSwgbGFtYiEgd2h5LCBsYWR5ISBmaWUsIHlvdSBzbHVnLWEtYmVkIQogICAgV2h5LCBsb3ZlLCBJIHNheSEgbWFkYW0hIHN3ZWV0LWhlYXJ0ISB3aHksIGJyaWRlIQogICAgV2hhdCwgbm90IGEgd29yZD8geW91IHRha2UgeW91ciBwZW5ueXdvcnRocyBub3c7CiAgICBTbGVlcCBmb3IgYSB3ZWVrOyBmb3IgdGhlIG5leHQgbmlnaHQsIEkgd2FycmFudCwKICAgIFRoZSBDb3VudHkgUGFyaXMgaGF0aCBzZXQgdXAgaGlzIHJlc3QsCiAgICBUaGF0IHlvdSBzaGFsbCByZXN0IGJ1dCBsaXR0bGUuIEdvZCBmb3JnaXZlIG1lLAogICAgTWFycnksIGFuZCBhbWVuLCBob3cgc291bmQgaXMgc2hlIGFzbGVlcCEKICAgIEkgbXVzdCBuZWVkcyB3YWtlIGhlci4gTWFkYW0sIG1hZGFtLCBtYWRhbSEKICAgIEF5LCBsZXQgdGhlIGNvdW50eSB0YWtlIHlvdSBpbiB5b3VyIGJlZDsKICAgIEhlJ2xsIGZyaWdodCB5b3UgdXAsIGknIGZhaXRoLiBXaWxsIGl0IG5vdCBiZT8KCiAgICBVbmRyYXdzIHRoZSBjdXJ0YWlucwogICAgV2hhdCwgZHJlc3MnZCEgYW5kIGluIHlvdXIgY2xvdGhlcyEgYW5kIGRvd24gYWdhaW4hCiAgICBJIG11c3QgbmVlZHMgd2FrZSB5b3U7IExhZHkhIGxhZHkhIGxhZHkhCiAgICBBbGFzLCBhbGFzISBIZWxwLCBoZWxwISBteSBsYWR5J3MgZGVhZCEKICAgIE8sIHdlbGwtYS1kYXksIHRoYXQgZXZlciBJIHdhcyBib3JuIQogICAgU29tZSBhcXVhIHZpdGFlLCBobyEgTXkgbG9yZCEgbXkgbGFkeSEKCiAgICBFbnRlciBMQURZIENBUFVMRVQKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgaGVyZT8KCk51cnNlCgogICAgTyBsYW1lbnRhYmxlIGRheSEKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgaXMgdGhlIG1hdHRlcj8KCk51cnNlCgogICAgTG9vaywgbG9vayEgTyBoZWF2eSBkYXkhCgpMQURZIENBUFVMRVQKCiAgICBPIG1lLCBPIG1lISBNeSBjaGlsZCwgbXkgb25seSBsaWZlLAogICAgUmV2aXZlLCBsb29rIHVwLCBvciBJIHdpbGwgZGllIHdpdGggdGhlZSEKICAgIEhlbHAsIGhlbHAhIENhbGwgaGVscC4KCiAgICBFbnRlciBDQVBVTEVUCgpDQVBVTEVUCgogICAgRm9yIHNoYW1lLCBicmluZyBKdWxpZXQgZm9ydGg7IGhlciBsb3JkIGlzIGNvbWUuCgpOdXJzZQoKICAgIFNoZSdzIGRlYWQsIGRlY2Vhc2VkLCBzaGUncyBkZWFkOyBhbGFjayB0aGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgQWxhY2sgdGhlIGRheSwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCEKCkNBUFVMRVQKCiAgICBIYSEgbGV0IG1lIHNlZSBoZXI6IG91dCwgYWxhcyEgc2hlJ3MgY29sZDoKICAgIEhlciBibG9vZCBpcyBzZXR0bGVkLCBhbmQgaGVyIGpvaW50cyBhcmUgc3RpZmY7CiAgICBMaWZlIGFuZCB0aGVzZSBsaXBzIGhhdmUgbG9uZyBiZWVuIHNlcGFyYXRlZDoKICAgIERlYXRoIGxpZXMgb24gaGVyIGxpa2UgYW4gdW50aW1lbHkgZnJvc3QKICAgIFVwb24gdGhlIHN3ZWV0ZXN0IGZsb3dlciBvZiBhbGwgdGhlIGZpZWxkLgoKTnVyc2UKCiAgICBPIGxhbWVudGFibGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgTyB3b2Z1bCB0aW1lIQoKQ0FQVUxFVAoKICAgIERlYXRoLCB0aGF0IGhhdGggdGEnZW4gaGVyIGhlbmNlIHRvIG1ha2UgbWUgd2FpbCwKICAgIFRpZXMgdXAgbXkgdG9uZ3VlLCBhbmQgd2lsbCBub3QgbGV0IG1lIHNwZWFrLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUywgd2l0aCBNdXNpY2lhbnMKCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgaXMgdGhlIGJyaWRlIHJlYWR5IHRvIGdvIHRvIGNodXJjaD8KCkNBUFVMRVQKCiAgICBSZWFkeSB0byBnbywgYnV0IG5ldmVyIHRvIHJldHVybi4KICAgIE8gc29uISB0aGUgbmlnaHQgYmVmb3JlIHRoeSB3ZWRkaW5nLWRheQogICAgSGF0aCBEZWF0aCBsYWluIHdpdGggdGh5IHdpZmUuIFRoZXJlIHNoZSBsaWVzLAogICAgRmxvd2VyIGFzIHNoZSB3YXMsIGRlZmxvd2VyZWQgYnkgaGltLgogICAgRGVhdGggaXMgbXkgc29uLWluLWxhdywgRGVhdGggaXMgbXkgaGVpcjsKICAgIE15IGRhdWdodGVyIGhlIGhhdGggd2VkZGVkOiBJIHdpbGwgZGllLAogICAgQW5kIGxlYXZlIGhpbSBhbGw7IGxpZmUsIGxpdmluZywgYWxsIGlzIERlYXRoJ3MuCgpQQVJJUwoKICAgIEhhdmUgSSB0aG91Z2h0IGxvbmcgdG8gc2VlIHRoaXMgbW9ybmluZydzIGZhY2UsCiAgICBBbmQgZG90aCBpdCBnaXZlIG1lIHN1Y2ggYSBzaWdodCBhcyB0aGlzPwoKTEFEWSBDQVBVTEVUCgogICAgQWNjdXJzZWQsIHVuaGFwcHksIHdyZXRjaGVkLCBoYXRlZnVsIGRheSEKICAgIE1vc3QgbWlzZXJhYmxlIGhvdXIgdGhhdCBlJ2VyIHRpbWUgc2F3CiAgICBJbiBsYXN0aW5nIGxhYm91ciBvZiBoaXMgcGlsZ3JpbWFnZSEKICAgIEJ1dCBvbmUsIHBvb3Igb25lLCBvbmUgcG9vciBhbmQgbG92aW5nIGNoaWxkLAogICAgQnV0IG9uZSB0aGluZyB0byByZWpvaWNlIGFuZCBzb2xhY2UgaW4sCiAgICBBbmQgY3J1ZWwgZGVhdGggaGF0aCBjYXRjaCdkIGl0IGZyb20gbXkgc2lnaHQhCgpOdXJzZQoKICAgIE8gd29lISBPIHdvZnVsLCB3b2Z1bCwgd29mdWwgZGF5IQogICAgTW9zdCBsYW1lbnRhYmxlIGRheSwgbW9zdCB3b2Z1bCBkYXksCiAgICBUaGF0IGV2ZXIsIGV2ZXIsIEkgZGlkIHlldCBiZWhvbGQhCiAgICBPIGRheSEgTyBkYXkhIE8gZGF5ISBPIGhhdGVmdWwgZGF5IQogICAgTmV2ZXIgd2FzIHNlZW4gc28gYmxhY2sgYSBkYXkgYXMgdGhpczoKICAgIE8gd29mdWwgZGF5LCBPIHdvZnVsIGRheSEKClBBUklTCgogICAgQmVndWlsZWQsIGRpdm9yY2VkLCB3cm9uZ2VkLCBzcGl0ZWQsIHNsYWluIQogICAgTW9zdCBkZXRlc3RhYmxlIGRlYXRoLCBieSB0aGVlIGJlZ3VpbCdkLAogICAgQnkgY3J1ZWwgY3J1ZWwgdGhlZSBxdWl0ZSBvdmVydGhyb3duIQogICAgTyBsb3ZlISBPIGxpZmUhIG5vdCBsaWZlLCBidXQgbG92ZSBpbiBkZWF0aCEKCkNBUFVMRVQKCiAgICBEZXNwaXNlZCwgZGlzdHJlc3NlZCwgaGF0ZWQsIG1hcnR5cidkLCBraWxsJ2QhCiAgICBVbmNvbWZvcnRhYmxlIHRpbWUsIHdoeSBjYW1lc3QgdGhvdSBub3cKICAgIFRvIG11cmRlciwgbXVyZGVyIG91ciBzb2xlbW5pdHkCiAgICBPIGNoaWxkISBPIGNoaWxkISBteSBzb3VsLCBhbmQgbm90IG15IGNoaWxkIQogICAgRGVhZCBhcnQgdGhvdSEgQWxhY2shIG15IGNoaWxkIGlzIGRlYWQ7CiAgICBBbmQgd2l0aCBteSBjaGlsZCBteSBqb3lzIGFyZSBidXJpZWQuCgpGUklBUiBMQVVSRU5DRQoKICAgIFBlYWNlLCBobywgZm9yIHNoYW1lISBjb25mdXNpb24ncyBjdXJlIGxpdmVzIG5vdAogICAgSW4gdGhlc2UgY29uZnVzaW9ucy4gSGVhdmVuIGFuZCB5b3Vyc2VsZgogICAgSGFkIHBhcnQgaW4gdGhpcyBmYWlyIG1haWQ7IG5vdyBoZWF2ZW4gaGF0aCBhbGwsCiAgICBBbmQgYWxsIHRoZSBiZXR0ZXIgaXMgaXQgZm9yIHRoZSBtYWlkOgogICAgWW91ciBwYXJ0IGluIGhlciB5b3UgY291bGQgbm90IGtlZXAgZnJvbSBkZWF0aCwKICAgIEJ1dCBoZWF2ZW4ga2VlcHMgaGlzIHBhcnQgaW4gZXRlcm5hbCBsaWZlLgogICAgVGhlIG1vc3QgeW91IHNvdWdodCB3YXMgaGVyIHByb21vdGlvbjsKICAgIEZvciAndHdhcyB5b3VyIGhlYXZlbiBzaGUgc2hvdWxkIGJlIGFkdmFuY2VkOgogICAgQW5kIHdlZXAgeWUgbm93LCBzZWVpbmcgc2hlIGlzIGFkdmFuY2VkCiAgICBBYm92ZSB0aGUgY2xvdWRzLCBhcyBoaWdoIGFzIGhlYXZlbiBpdHNlbGYCiAgICBPLCBpbiB0aGlzIGxvdmUsIHlvdSBsb3ZlIHlvdXIgY2hpbGQgc28gaWxsLAogICAgVGhhdCB5b3UgcnVuIG1hZCwgc2VlaW5nIHRoYXQgc2hlIGlzIHdlbGw6CiAgICBTaGUncyBub3Qgd2VsbCBtYXJyaWVkIHRoYXQgbGl2ZXMgbWFycmllZCBsb25nOwogICAgQnV0IHNoZSdzIGJlc3QgbWFycmllZCB0aGF0IGRpZXMgbWFycmllZCB5b3VuZy4KICAgIERyeSB1cCB5b3VyIHRlYXJzLCBhbmQgc3RpY2sgeW91ciByb3NlbWFyeQogICAgT24gdGhpcyBmYWlyIGNvcnNlOyBhbmQsIGFzIHRoZSBjdXN0b20gaXMsCiAgICBJbiBhbGwgaGVyIGJlc3QgYXJyYXkgYmVhciBoZXIgdG8gY2h1cmNoOgogICAgRm9yIHRob3VnaCBmb25kIG5hdHVyZSBiaWRzIHVzIGFuIGxhbWVudCwKICAgIFlldCBuYXR1cmUncyB0ZWFycyBhcmUgcmVhc29uJ3MgbWVycmltZW50LgoKQ0FQVUxFVAoKICAgIEFsbCB0aGluZ3MgdGhhdCB3ZSBvcmRhaW5lZCBmZXN0aXZhbCwKICAgIFR1cm4gZnJvbSB0aGVpciBvZmZpY2UgdG8gYmxhY2sgZnVuZXJhbDsKICAgIE91ciBpbnN0cnVtZW50cyB0byBtZWxhbmNob2x5IGJlbGxzLAogICAgT3VyIHdlZGRpbmcgY2hlZXIgdG8gYSBzYWQgYnVyaWFsIGZlYXN0LAogICAgT3VyIHNvbGVtbiBoeW1ucyB0byBzdWxsZW4gZGlyZ2VzIGNoYW5nZSwKICAgIE91ciBicmlkYWwgZmxvd2VycyBzZXJ2ZSBmb3IgYSBidXJpZWQgY29yc2UsCiAgICBBbmQgYWxsIHRoaW5ncyBjaGFuZ2UgdGhlbSB0byB0aGUgY29udHJhcnkuCgpGUklBUiBMQVVSRU5DRQoKICAgIFNpciwgZ28geW91IGluOyBhbmQsIG1hZGFtLCBnbyB3aXRoIGhpbTsKICAgIEFuZCBnbywgU2lyIFBhcmlzOyBldmVyeSBvbmUgcHJlcGFyZQogICAgVG8gZm9sbG93IHRoaXMgZmFpciBjb3JzZSB1bnRvIGhlciBncmF2ZToKICAgIFRoZSBoZWF2ZW5zIGRvIGxvdXIgdXBvbiB5b3UgZm9yIHNvbWUgaWxsOwogICAgTW92ZSB0aGVtIG5vIG1vcmUgYnkgY3Jvc3NpbmcgdGhlaXIgaGlnaCB3aWxsLgoKICAgIEV4ZXVudCBDQVBVTEVULCBMQURZIENBUFVMRVQsIFBBUklTLCBhbmQgRlJJQVIgTEFVUkVOQ0UKCkZpcnN0IE11c2ljaWFuCgogICAgRmFpdGgsIHdlIG1heSBwdXQgdXAgb3VyIHBpcGVzLCBhbmQgYmUgZ29uZS4KCk51cnNlCgogICAgSG9uZXN0IGdvb2RmZWxsb3dzLCBhaCwgcHV0IHVwLCBwdXQgdXA7CiAgICBGb3IsIHdlbGwgeW91IGtub3csIHRoaXMgaXMgYSBwaXRpZnVsIGNhc2UuCgogICAgRXhpdAoKRmlyc3QgTXVzaWNpYW4KCiAgICBBeSwgYnkgbXkgdHJvdGgsIHRoZSBjYXNlIG1heSBiZSBhbWVuZGVkLgoKICAgIEVudGVyIFBFVEVSCgpQRVRFUgoKICAgIE11c2ljaWFucywgTywgbXVzaWNpYW5zLCAnSGVhcnQncyBlYXNlLCBIZWFydCdzCiAgICBlYXNlOicgTywgYW4geW91IHdpbGwgaGF2ZSBtZSBsaXZlLCBwbGF5ICdIZWFydCdzIGVhc2UuJwoKRmlyc3QgTXVzaWNpYW4KCiAgICBXaHkgJ0hlYXJ0J3MgZWFzZT8nCgpQRVRFUgoKICAgIE8sIG11c2ljaWFucywgYmVjYXVzZSBteSBoZWFydCBpdHNlbGYgcGxheXMgJ015CiAgICBoZWFydCBpcyBmdWxsIG9mIHdvZTonIE8sIHBsYXkgbWUgc29tZSBtZXJyeSBkdW1wLAogICAgdG8gY29tZm9ydCBtZS4KCkZpcnN0IE11c2ljaWFuCgogICAgTm90IGEgZHVtcCB3ZTsgJ3RpcyBubyB0aW1lIHRvIHBsYXkgbm93LgoKUEVURVIKCiAgICBZb3Ugd2lsbCBub3QsIHRoZW4CgpGaXJzdCBNdXNp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Rocm9uZTsKICAgIEFuZCBhbGwgdGhpcyBkYXkgYW4gdW5hY2N1c3RvbSdkIHNwaXJpdAogICAgTGlmdHMgbWUgYWJvdmUgdGhlIGdyb3VuZCB3aXRoIGNoZWVyZnVsIHRob3VnaHRzLgogICAgSSBkcmVhbXQgbXkgbGFkeSBjYW1lIGFuZCBmb3VuZCBtZSBkZWFkLS0KICAgIFN0cmFuZ2UgZHJlYW0sIHRoYXQgZ2l2ZXMgYSBkZWFkIG1hbiBsZWF2ZQogICAgdG8gdGhpbmshLS0KICAgIEFuZCBicmVhdGhlZCBzdWNoIGxpZmUgd2l0aCBraXNzZXMgaW4gbXkgbGlwcywKICAgIFRoYXQgSSByZXZpdmVkLCBhbmQgd2FzIGFuIGVtcGVyb3IuCiAgICBBaCBtZSEgaG93IHN3ZWV0IGlzIGxvdmUgaXRzZWxmIHBvc3Nlc3MnZCwKICAgIFdoZW4gYnV0IGxvdmUncyBzaGFkb3dzIGFyZSBzbyByaWNoIGluIGpveSEKCiAgICBFbnRlciBCQUxUSEFTQVIsIGJvb3RlZAogICAgTmV3cyBmcm9tIFZlcm9uYSEtLUhvdyBub3csIEJhbHRoYXNhciEKICAgIERvc3QgdGhvdSBub3QgYnJpbmcgbWUgbGV0dGVycyBmcm9tIHRoZSBmcmlhcj8KICAgIEhvdyBkb3RoIG15IGxhZHkIElzIG15IGZhdGhlciB3ZWxsPwogICAgSG93IGZhcmVzIG15IEp1bGlldD8gdGhhdCBJIGFzayBhZ2FpbjsKICAgIEZvciBub3RoaW5nIGNhbiBiZSBpbGwsIGlmIHNoZSBiZSB3ZWxsLgoKQkFMVEhBU0FSCgogICAgVGhlbiBzaGUgaXMgd2VsbCwgYW5kIG5vdGhpbmcgY2FuIGJlIGlsbDoKICAgIEhlciBib2R5IHNsZWVwcyBpbiBDYXBlbCdzIG1vbnVtZW50LAogICAgQW5kIGhlciBpbW1vcnRhbCBwYXJ0IHdpdGggYW5nZWxzIGxpdmVzLgogICAgSSBzYXcgaGVyIGxhaWQgbG93IGluIGhlciBraW5kcmVkJ3MgdmF1bHQsCiAgICBBbmQgcHJlc2VudGx5IHRvb2sgcG9zdCB0byB0ZWxsIGl0IHlvdToKICAgIE8sIHBhcmRvbiBtZSBmb3IgYnJpbmdpbmcgdGhlc2UgaWxsIG5ld3MsCiAgICBTaW5jZSB5b3UgZGlkIGxlYXZlIGl0IGZvciBteSBvZmZpY2UsIHNpci4KClJPTUVPCgogICAgSXMgaXQgZXZlbiBzbz8gdGhlbiBJIGRlZnkgeW91LCBzdGFycyEKICAgIFRob3Uga25vdydzdCBteSBsb2RnaW5nOiBnZXQgbWUgaW5rIGFuZCBwYXBlciwKICAgIEFuZCBoaXJlIHBvc3QtaG9yc2VzOyBJIHdpbGwgaGVuY2UgdG8tbmlnaHQuCgpCQUxUSEFTQVIKCiAgICBJIGRvIGJlc2VlY2ggeW91LCBzaXIsIGhhdmUgcGF0aWVuY2U6CiAgICBZb3VyIGxvb2tzIGFyZSBwYWxlIGFuZCB3aWxkLCBhbmQgZG8gaW1wb3J0CiAgICBTb21lIG1pc2FkdmVudHVyZS4KClJPTUVPCgogICAgVHVzaCwgdGhvdSBhcnQgZGVjZWl2ZWQ6CiAgICBMZWF2ZSBtZSwgYW5kIGRvIHRoZSB0aGluZyBJIGJpZCB0aGVlIGRvLgogICAgSGFzdCB0aG91IG5vIGxldHRlcnMgdG8gbWUgZnJvbSB0aGUgZnJpYXICgpCQUxUSEFTQVIKCiAgICBObywgbXkgZ29vZCBsb3JkLgoKUk9NRU8KCiAgICBObyBtYXR0ZXI6IGdldCB0aGVlIGdvbmUsCiAgICBBbmQgaGlyZSB0aG9zZSBob3JzZXM7IEknbGwgYmUgd2l0aCB0aGVlIHN0cmFpZ2h0LgoKICAgIEV4aXQgQkFMVEhBU0FSCiAgICBXZWxsLCBKdWxpZXQsIEkgd2lsbCBsaWUgd2l0aCB0aGVlIHRvLW5pZ2h0LgogICAgTGV0J3Mgc2VlIGZvciBtZWFuczogTyBtaXNjaGllZiwgdGhvdSBhcnQgc3dpZnQKICAgIFRvIGVudGVyIGluIHRoZSB0aG91Z2h0cyBvZiBkZXNwZXJhdGUgbWVuIQogICAgSSBkbyByZW1lbWJlciBhbiBhcG90aGVjYXJ5LC0tCiAgICBBbmQgaGVyZWFib3V0cyBoZSBkd2VsbHMsLS13aGljaCBsYXRlIEkgbm90ZWQKICAgIEluIHRhdHRlcidkIHdlZWRzLCB3aXRoIG92ZXJ3aGVsbWluZyBicm93cywKICAgIEN1bGxpbmcgb2Ygc2ltcGxlczsgbWVhZ3JlIHdlcmUgaGlzIGxvb2tzLAogICAgU2hhcnAgbWlzZXJ5IGhhZCB3b3JuIGhpbSB0byB0aGUgYm9uZXM6CiAgICBBbmQgaW4gaGlzIG5lZWR5IHNob3AgYSB0b3J0b2lzZSBodW5nLAogICAgQW4gYWxsaWdhdG9yIHN0dWZmJ2QsIGFuZCBvdGhlciBza2lucwogICAgT2YgaWxsLXNoYXBlZCBmaXNoZXM7IGFuZCBhYm91dCBoaXMgc2hlbHZlcwogICAgQSBiZWdnYXJseSBhY2NvdW50IG9mIGVtcHR5IGJveGVzLAogICAgR3JlZW4gZWFydGhlbiBwb3RzLCBibGFkZGVycyBhbmQgbXVzdHkgc2VlZHMsCiAgICBSZW1uYW50cyBvZiBwYWNrdGhyZWFkIGFuZCBvbGQgY2FrZXMgb2Ygcm9zZXMsCiAgICBXZXJlIHRoaW5seSBzY2F0dGVyJ2QsIHRvIG1ha2UgdXAgYSBzaG93LgogICAgTm90aW5nIHRoaXMgcGVudXJ5LCB0byBteXNlbGYgSSBzYWlkCiAgICAnQW4gaWYgYSBtYW4gZGlkIG5lZWQgYSBwb2lzb24gbm93LAogICAgV2hvc2Ugc2FsZSBpcyBwcmVzZW50IGRlYXRoIGluIE1hbnR1YSwKICAgIEhlcmUgbGl2ZXMgYSBjYWl0aWZmIHdyZXRjaCB3b3VsZCBzZWxsIGl0IGhpbS4nCiAgICBPLCB0aGlzIHNhbWUgdGhvdWdodCBkaWQgYnV0IGZvcmVydW4gbXkgbmVlZDsKICAgIEFuZCB0aGlzIHNhbWUgbmVlZHkgbWFuIG11c3Qgc2VsbCBpdCBtZS4KICAgIEFzIEkgcmVtZW1iZXIsIHRoaXMgc2hvdWxkIGJlIHRoZSBob3VzZS4KICAgIEJlaW5nIGhvbGlkYXksIHRoZSBiZWdnYXIncyBzaG9wIGlzIHNodXQuCiAgICBXaGF0LCBobyEgYXBvdGhlY2FyeSEKCiAgICBFbnRlciBBcG90aGVjYXJ5CgpBcG90aGVjYXJ5CgogICAgV2hvIGNhbGxzIHNvIGxvdWQCgpST01FTwoKICAgIENvbWUgaGl0aGVyLCBtYW4uIEkgc2VlIHRoYXQgdGhvdSBhcnQgcG9vcjoKICAgIEhvbGQsIHRoZXJlIGlzIGZvcnR5IGR1Y2F0czogbGV0IG1lIGhhdmUKICAgIEEgZHJhbSBvZiBwb2lzb24sIHN1Y2ggc29vbi1zcGVlZGluZyBnZWFyCiAgICBBcyB3aWxsIGRpc3BlcnNlIGl0c2VsZiB0aHJvdWdoIGFsbCB0aGUgdmVpbnMKICAgIFRoYXQgdGhlIGxpZmUtd2VhcnkgdGFrZXIgbWF5IGZhbGwgZGVhZAogICAgQW5kIHRoYXQgdGhlIHRydW5rIG1heSBiZSBkaXNjaGFyZ2VkIG9mIGJyZWF0aAogICAgQXMgdmlvbGVudGx5IGFzIGhhc3R5IHBvd2RlciBmaXJlZAogICAgRG90aCBodXJyeSBmcm9tIHRoZSBmYXRhbCBjYW5ub24ncyB3b21iLgoKQXBvdGhlY2FyeQoKICAgIFN1Y2ggbW9ydGFsIGRydWdzIEkgaGF2ZTsgYnV0IE1hbnR1YSdzIGxhdwogICAgSXMgZGVhdGggdG8gYW55IGhlIHRoYXQgdXR0ZXJzIHRoZW0uCgpST01FTwoKICAgIEFydCB0aG91IHNvIGJhcmUgYW5kIGZ1bGwgb2Ygd3JldGNoZWRuZXNzLAogICAgQW5kIGZlYXInc3QgdG8gZGllPyBmYW1pbmUgaXMgaW4gdGh5IGNoZWVrcywKICAgIE5lZWQgYW5kIG9wcHJlc3Npb24gc3RhcnZldGggaW4gdGhpbmUgZXllcywKICAgIENvbnRlbXB0IGFuZCBiZWdnYXJ5IGhhbmdzIHVwb24gdGh5IGJhY2s7CiAgICBUaGUgd29ybGQgaXMgbm90IHRoeSBmcmllbmQgbm9yIHRoZSB3b3JsZCdzIGxhdzsKICAgIFRoZSB3b3JsZCBhZmZvcmRzIG5vIGxhdyB0byBtYWtlIHRoZWUgcmljaDsKICAgIFRoZW4gYmUgbm90IHBvb3IsIGJ1dCBicmVhayBpdCwgYW5kIHRha2UgdGhpcy4KCkFwb3RoZWNhcnkKCiAgICBNeSBwb3ZlcnR5LCBidXQgbm90IG15IHdpbGwsIGNvbnNlbnRzLgoKUk9NRU8KCiAgICBJIHBheSB0aHkgcG92ZXJ0eSwgYW5kIG5vdCB0aHkgd2lsbC4KCkFwb3RoZWNhcnkKCiAgICBQdXQgdGhpcyBpbiBhbnkgbGlxdWlkIHRoaW5nIHlvdSB3aWxsLAogICAgQW5kIGRyaW5rIGl0IG9mZjsgYW5kLCBpZiB5b3UgaGFkIHRoZSBzdHJlbmd0aAogICAgT2YgdHdlbnR5IG1lbiwgaXQgd291bGQgZGlzcGF0Y2ggeW91IHN0cmFpZ2h0LgoKUk9NRU8KCiAgICBUaGVyZSBpcyB0aHkgZ29sZCwgd29yc2UgcG9pc29uIHRvIG1lbidzIHNvdWxzLAogICAgRG9pbmcgbW9yZSBtdXJkZXJzIGluIHRoaXMgbG9hdGhzb21lIHdvcmxkLAogICAgVGhhbiB0aGVzZSBwb29yIGNvbXBvdW5kcyB0aGF0IHRob3UgbWF5c3Qgbm90IHNlbGwuCiAgICBJIHNlbGwgdGhlZSBwb2lzb247IHRob3UgaGFzdCBzb2xkIG1lIG5vbmUuCiAgICBGYXJld2VsbDogYnV5IGZvb2QsIGFuZCBnZXQgdGh5c2VsZiBpbiBmbGVzaC4KICAgIENvbWUsIGNvcmRpYWwgYW5kIG5vdCBwb2lzb24sIGdvIHdpdGggbWUKICAgIFRvIEp1bGlldCdzIGdyYXZlOyBmb3IgdGhlcmUgbXVzdCBJIHVzZSB0aGVlLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBKT0hOIAoKRlJJQVIgSk9ITgoKICAgIEhvbHkgRnJhbmNpc2NhbiBmcmlhciEgYnJvdGhlciwgaG8hCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UKCkZSSUFSIExBVVJFTkNFCgogICAgVGhpcyBzYW1lIHNob3VsZCBiZSB0aGUgdm9pY2Ugb2YgRnJpYXIgSm9obi4KICAgIFdlbGNvbWUgZnJvbSBNYW50dWE6IHdoYXQgc2F5cyBSb21lbz8KICAgIE9yLCBpZiBoaXMgbWluZCBiZSB3cml0LCBnaXZlIG1lIGhpcyBsZXR0ZXIuCgpGUklBUiBKT0hOCgogICAgR29pbmcgdG8gZmluZCBhIGJhcmUtZm9vdCBicm90aGVyIG91dAogICAgT25lIG9mIG91ciBvcmRlciwgdG8gYXNzb2NpYXRlIG1lLAogICAgSGVyZSBpbiB0aGlzIGNpdHkgdmlzaXRpbmcgdGhlIHNpY2ssCiAgICBBbmQgZmluZGluZyBoaW0sIHRoZSBzZWFyY2hlcnMgb2YgdGhlIHRvd24sCiAgICBTdXNwZWN0aW5nIHRoYXQgd2UgYm90aCB3ZXJlIGluIGEgaG91c2UKICAgIFdoZXJlIHRoZSBpbmZlY3Rpb3VzIHBlc3RpbGVuY2UgZGlkIHJlaWduLAogICAgU2VhbCdkIHVwIHRoZSBkb29ycywgYW5kIHdvdWxkIG5vdCBsZXQgdXMgZm9ydGg7CiAgICBTbyB0aGF0IG15IHNwZWVkIHRvIE1hbnR1YSB0aGVyZSB3YXMgc3RheSdkLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXaG8gYmFyZSBteSBsZXR0ZXIsIHRoZW4sIHRvIFJvbWVvPwoKRlJJQVIgSk9ITgoKICAgIEkgY291bGQgbm90IHNlbmQgaXQsLS1oZXJlIGl0IGlzIGFnYWluLC0tCiAgICBOb3IgZ2V0IGEgbWVzc2VuZ2VyIHRvIGJyaW5nIGl0IHRoZWUsCiAgICBTbyBmZWFyZnVsIHdlcmUgdGhleSBvZiBpbmZlY3Rpb24uCgpGUklBUiBMQVVSRU5DRQoKICAgIFVuaGFwcHkgZm9ydHVuZSEgYnkgbXkgYnJvdGhlcmhvb2QsCiAgICBUaGUgbGV0dGVyIHdhcyBub3QgbmljZSBidXQgZnVsbCBvZiBjaGFyZ2UKICAgIE9mIGRlYXIgaW1wb3J0LCBhbmQgdGhlIG5lZ2xlY3RpbmcgaXQKICAgIE1heSBkbyBtdWNoIGRhbmdlci4gRnJpYXIgSm9obiwgZ28gaGVuY2U7CiAgICBHZXQgbWUgYW4gaXJvbiBjcm93LCBhbmQgYnJpbmcgaXQgc3RyYWlnaHQKICAgIFVudG8gbXkgY2VsbC4KCkZSSUFSIEpPSE4KCiAgICBCcm90aGVyLCBJJ2xsIGdvIGFuZCBicmluZyBpdCB0aGVlLgoKICAgIEV4aXQKCkZSSUFSIExBVVJFTkNFCgogICAgTm93IG11c3QgSSB0byB0aGUgbW9udW1lbnQgYWxvbmU7CiAgICBXaXRoaW4gdGhyZWUgaG91cnMgd2lsbCBmYWlyIEp1bGlldCB3YWtlOgogICAgU2hlIHdpbGwgYmVzaHJldyBtZSBtdWNoIHRoYXQgUm9tZW8KICAgIEhhdGggaGFkIG5vIG5vdGljZSBvZiB0aGVzZSBhY2NpZGVudHM7CiAgICBCdXQgSSB3aWxsIHdyaXRlIGFnYWluIHRvIE1hbnR1YSwKICAgIEFuZCBrZWVwIGhlciBhdCBteSBjZWxsIHRpbGwgUm9tZW8gY29tZTsKICAgIFBvb3IgbGl2aW5nIGNvcnNlLCBjbG9zZWQgaW4gYSBkZWFkIG1hbidzIHRvbWIhCgogICAgRXhpdAoKU0NFTkUgSUlJLiBBIGNodXJjaHlhcmQ7IGluIGl0IGEgdG9tYiBiZWxvbmdpbmcgdG8gdGhlIENhcHVsZXRzLgoKICAgIEVudGVyIFBBUklTLCBhbmQgaGlzIFBhZ2UgYmVhcmluZyBmbG93ZXJzIGFuZCBhIHRvcmNoIAoKUEFSSVMKCiAgICBHaXZlIG1lIHRoeSB0b3JjaCwgYm95OiBoZW5jZSwgYW5kIHN0YW5kIGFsb29mOgogICAgWWV0IHB1dCBpdCBvdXQsIGZvciBJIHdvdWxkIG5vdCBiZSBzZWVuLgogICAgVW5kZXIgeW9uZCB5ZXctdHJlZXMgbGF5IHRoZWUgYWxsIGFsb25nLAogICAgSG9sZGluZyB0aGluZSBlYXIgY2xvc2UgdG8gdGhlIGhvbGxvdyBncm91bmQ7CiAgICBTbyBzaGFsbCBubyBmb290IHVwb24gdGhlIGNodXJjaHlhcmQgdHJlYWQsCiAgICBCZWluZyBsb29zZSwgdW5maXJtLCB3aXRoIGRpZ2dpbmcgdXAgb2YgZ3JhdmVzLAogICAgQnV0IHRob3Ugc2hhbHQgaGVhciBpdDogd2hpc3RsZSB0aGVuIHRvIG1lLAogICAgQXMgc2lnbmFsIHRoYXQgdGhvdSBoZWFyJ3N0IHNvbWV0aGluZyBhcHByb2FjaC4KICAgIEdpdmUgbWUgdGhvc2UgZmxvd2Vycy4gRG8gYXMgSSBiaWQgdGhlZSwgZ28uCgpQQUdFCgogICAgW0FzaWRlXSBJIGFtIGFsbW9zdCBhZnJhaWQgdG8gc3RhbmQgYWxvbmUKICAgIEhlcmUgaW4gdGhlIGNodXJjaHlhcmQ7IHlldCBJIHdpbGwgYWR2ZW50dXJlLgoKICAgIFJldGlyZXMKClBBUklTCgogICAgU3dlZXQgZmxvd2VyLCB3aXRoIGZsb3dlcnMgdGh5IGJyaWRhbCBiZWQgSSBzdHJldywtLQogICAgTyB3b2UhIHRoeSBjYW5vcHkgaXMgZHVzdCBhbmQgc3RvbmVzOy0tCiAgICBXaGljaCB3aXRoIHN3ZWV0IHdhdGVyIG5pZ2h0bHkgSSB3aWxsIGRldywKICAgIE9yLCB3YW50aW5nIHRoYXQsIHdpdGggdGVhcnMgZGlzdGlsbCdkIGJ5IG1vYW5zOgogICAgVGhlIG9ic2VxdWllcyB0aGF0IEkgZm9yIHRoZWUgd2lsbCBrZWVwCiAgICBOaWdodGx5IHNoYWxsIGJlIHRvIHN0cmV3IHRoeSBncmF2ZSBhbmQgd2VlcC4KCiAgICBUaGUgUGFnZSB3aGlzdGxlcwogICAgVGhlIGJveSBnaXZlcyB3YXJuaW5nIHNvbWV0aGluZyBkb3RoIGFwcHJvYWNoLgogICAgV2hhdCBjdXJzZWQgZm9vdCB3YW5kZXJzIHRoaXMgd2F5IHRvLW5pZ2h0LAogICAgVG8gY3Jvc3MgbXkgb2JzZXF1aWVzIGFuZCB0cnVlIGxvdmUncyByaXRlPwogICAgV2hhdCB3aXRoIGEgdG9yY2ghIG11ZmZsZSBtZSwgbmlnaHQsIGF3aGlsZS4KCiAgICBSZXRpcmVzCgogICAgRW50ZXIgUk9NRU8gYW5kIEJBTFRIQVNBUiwgd2l0aCBhIHRvcmNoLCBtYXR0b2NrLCAmIGMKClJPTUVPCgogICAgR2l2ZSBtZSB0aGF0IG1hdHRvY2sgYW5kIHRoZSB3cmVuY2hpbmcgaXJvbi4KICAgIEhvbGQsIHRha2UgdGhpcyBsZXR0ZXI7IGVhcmx5IGluIHRoZSBtb3JuaW5nCiAgICBTZWUgdGhvdSBkZWxpdmVyIGl0IHRvIG15IGxvcmQgYW5kIGZhdGhlci4KICAgIEdpdmUgbWUgdGhlIGxpZ2h0OiB1cG9uIHRoeSBsaWZlLCBJIGNoYXJnZSB0aGVlLAogICAgV2hhdGUnZXIgdGhvdSBoZWFyJ3N0IG9yIHNlZXN0LCBzdGFuZCBhbGwgYWxvb2YsCiAgICBBbmQgZG8gbm90IGludGVycnVwdCBtZSBpbiBteSBjb3Vyc2UuCiAgICBXaHkgSSBkZXNjZW5kIGludG8gdGhpcyBiZWQgb2YgZGVhdGgsCiAgICBJcyBwYXJ0bHkgdG8gYmVob2xkIG15IGxhZHkncyBmYWNlOwogICAgQnV0IGNoaWVmbHkgdG8gdGFrZSB0aGVuY2UgZnJvbSBoZXIgZGVhZCBmaW5nZXIKICAgIEEgcHJlY2lvdXMgcmluZywgYSByaW5nIHRoYXQgSSBtdXN0IHVzZQogICAgSW4gZGVhciBlbXBsb3ltZW50OiB0aGVyZWZvcmUgaGVuY2UsIGJlIGdvbmU6CiAgICBCdXQgaWYgdGhvdSwgamVhbG91cywgZG9zdCByZXR1cm4gdG8gcHJ5CiAgICBJbiB3aGF0IEkgZnVydGhlciBzaGFsbCBpbnRlbmQgdG8gZG8sCiAgICBCeSBoZWF2ZW4sIEkgd2lsbCB0ZWFyIHRoZWUgam9pbnQgYnkgam9pbnQKICAgIEFuZCBzdHJldyB0aGlzIGh1bmdyeSBjaHVyY2h5YXJkIHdpdGggdGh5IGxpbWJzOgogICAgVGhlIHRpbWUgYW5kIG15IGludGVudHMgYXJlIHNhdmFnZS13aWxkLAogICAgTW9yZSBmaWVyY2UgYW5kIG1vcmUgaW5leG9yYWJsZSBmYXIKICAgIFRoYW4gZW1wdHkgdGlnZXJzIG9yIHRoZSByb2FyaW5nIHNlYS4KCkJBTFRIQVNBUgoKICAgIEkgd2lsbCBiZSBnb25lLCBzaXIsIGFuZCBub3QgdHJvdWJsZSB5b3UuCgpST01FTwoKICAgIFNvIHNoYWx0IHRob3Ugc2hvdyBtZSBmcmllbmRzaGlwLiBUYWtlIHRob3UgdGhhdDoKICAgIExpdmUsIGFuZCBiZSBwcm9zcGVyb3VzOiBhbmQgZmFyZXdlbGwsIGdvb2QgZmVsbG93LgoKQkFMVEhBU0FSCgogICAgW0FzaWRlXSBGb3IgYWxsIHRoaXMgc2FtZSwgSSdsbCBoaWRlIG1lIGhlcmVhYm91dDoKICAgIEhpcyBsb29rcyBJIGZlYXIsIGFuZCBoaXMgaW50ZW50cyBJIGRvdWJ0LgoKICAgIFJldGlyZXMKClJPTUVPCgogICAgVGhvdSBkZXRlc3RhYmxlIG1hdywgdGhvdSB3b21iIG9mIGRlYXRoLAogICAgR29yZ2VkIHdpdGggdGhlIGRlYXJlc3QgbW9yc2VsIG9mIHRoZSBlYXJ0aCwKICAgIFRodXMgSSBlbmZvcmNlIHRoeSByb3R0ZW4gamF3cyB0byBvcGVuLAogICAgQW5kLCBpbiBkZXNwaXRlLCBJJ2xsIGNyYW0gdGhlZSB3aXRoIG1vcmUgZm9vZCEKCiAgICBPcGVucyB0aGUgdG9tYgoKUEFSSVMKCiAgICBUaGlzIGlzIHRoYXQgYmFuaXNoJ2QgaGF1Z2h0eSBNb250YWd1ZSwKICAgIFRoYXQgbXVyZGVyJ2QgbXkgbG92ZSdzIGNvdXNpbiwgd2l0aCB3aGljaCBncmllZiwKICAgIEl0IGlzIHN1cHBvc2VkLCB0aGUgZmFpciBjcmVhdHVyZSBkaWVkOwogICAgQW5kIGhlcmUgaXMgY29tZSB0byBkbyBzb21lIHZpbGxhbm91cyBzaGFtZQogICAgVG8gdGhlIGRlYWQgYm9kaWVzOiBJIHdpbGwgYXBwcmVoZW5kIGhpbS4KCiAgICBDb21lcyBmb3J3YXJkCiAgICBTdG9wIHRoeSB1bmhhbGxvdydkIHRvaWwsIHZpbGUgTW9udGFndWUhCiAgICBDYW4gdmVuZ2VhbmNlIGJlIHB1cnN1ZWQgZnVydGhlciB0aGFuIGRlYXRoPwogICAgQ29uZGVtbmVkIHZpbGxhaW4sIEkgZG8gYXBwcmVoZW5kIHRoZWU6CiAgICBPYmV5LCBhbmQgZ28gd2l0aCBtZTsgZm9yIHRob3UgbXVzdCBkaWUuCgpST01FTwoKICAgIEkgbXVzdCBpbmRlZWQ7IGFuZCB0aGVyZWZvcmUgY2FtZSBJIGhpdGhlci4KICAgIEdvb2QgZ2VudGxlIHlvdXRoLCB0ZW1wdCBub3QgYSBkZXNwZXJhdGUgbWFuOwogICAgRmx5IGhlbmNlLCBhbmQgbGVhdmUgbWU6IHRoaW5rIHVwb24gdGhlc2UgZ29uZTsKICAgIExldCB0aGVtIGFmZnJpZ2h0IHRoZWUuIEkgYmVzZWVjaCB0aGVlLCB5b3V0aCwKICAgIFB1dCBub3QgYW5vdGhlciBzaW4gdXBvbiBteSBoZWFkLAogICAgQnkgdXJnaW5nIG1lIHRvIGZ1cnk6IE8sIGJlIGdvbmUhCiAgICBCeSBoZWF2ZW4sIEkgbG92ZSB0aGVlIGJldHRlciB0aGFuIG15c2VsZjsKICAgIEZvciBJIGNvbWUgaGl0aGVyIGFybSdkIGFnYWluc3QgbXlzZWxmOgogICAgU3RheSBub3QsIGJlIGdvbmU7IGxpdmUsIGFuZCBoZXJlYWZ0ZXIgc2F5LAogICAgQSBtYWRtYW4ncyBtZXJjeSBiYWRlIHRoZWUgcnVuIGF3YXkuCgpQQVJJUwoKICAgIEkgZG8gZGVmeSB0aHkgY29uanVyYXRpb25zLAogICAgQW5kIGFwcHJlaGVuZCB0aGVlIGZvciBhIGZlbG9uIGhlcmUuCgpST01FTwoKICAgIFdpbHQgdGhvdSBwcm92b2tlIG1lPyB0aGVuIGhhdmUgYXQgdGhlZSwgYm95IQoKICAgIFRoZXkgZmlnaHQKClBBR0UKCiAgICBPIExvcmQsIHRoZXkgZmlnaHQhIEkgd2lsbCBnbyBjYWxsIHRoZSB3YXRjaC4KCiAgICBFeGl0CgpQQVJJUwoKICAgIE8sIEkgYW0gc2xhaW4hCgogICAgRmFsbHMKICAgIElmIHRob3UgYmUgbWVyY2lmdWwsCiAgICBPcGVuIHRoZSB0b21iLCBsYXkgbWUgd2l0aCBKdWxpZXQuCgogICAgRGllcwoKUk9NRU8KCiAgICBJbiBmYWl0aCwgSSB3aWxsLiBMZXQgbWUgcGVydXNlIHRoaXMgZmFjZS4KICAgIE1lcmN1dGlvJ3Mga2luc21hbiwgbm9ibGUgQ291bnR5IFBhcmlzIQogICAgV2hhdCBzYWlkIG15IG1hbiwgd2hlbiBteSBiZXRvc3NlZCBzb3VsCiAgICBEaWQgbm90IGF0dGVuZCBoaW0gYXMgd2Ugcm9kZT8gSSB0aGluawogICAgSGUgdG9sZCBtZSBQYXJpcyBzaG91bGQgaGF2ZSBtYXJyaWVkIEp1bGlldDoKICAgIFNhaWQgaGUgbm90IHNvPyBvciBkaWQgSSBkcmVhbSBpdCBzbz8KICAgIE9yIGFtIEkgbWFkLCBoZWFyaW5nIGhpbSB0YWxrIG9mIEp1bGlldCwKICAgIFRvIHRoaW5rIGl0IHdhcyBzbz8gTywgZ2l2ZSBtZSB0aHkgaGFuZCwKICAgIE9uZSB3cml0IHdpdGggbWUgaW4gc291ciBtaXNmb3J0dW5lJ3MgYm9vayEKICAgIEknbGwgYnVyeSB0aGVlIGluIGEgdHJpdW1waGFudCBncmF2ZTsKICAgIEEgZ3JhdmUIE8gbm8hIGEgbGFudGVybiwgc2xhdWdodGVyJ2QgeW91dGgsCiAgICBGb3IgaGVyZSBsaWVzIEp1bGlldCwgYW5kIGhlciBiZWF1dHkgbWFrZXMKICAgIFRoaXMgdmF1bHQgYSBmZWFzdGluZyBwcmVzZW5jZSBmdWxsIG9mIGxpZ2h0LgogICAgRGVhdGgsIGxpZSB0aG91IHRoZXJlLCBieSBhIGRlYWQgbWFuIGludGVycidkLgoKICAgIExheWluZyBQQVJJUyBpbiB0aGUgdG9tYgogICAgSG93IG9mdCB3aGVuIG1lbiBhcmUgYXQgdGhlIHBvaW50IG9mIGRlYXRoCiAgICBIYXZlIHRoZXkgYmVlbiBtZXJyeSEgd2hpY2ggdGhlaXIga2VlcGVycyBjYWxsCiAgICBBIGxpZ2h0bmluZyBiZWZvcmUgZGVhdGg6IE8sIGhvdyBtYXkgSQogICAgQ2FsbCB0aGlzIGEgbGlnaHRuaW5nPyBPIG15IGxvdmUhIG15IHdpZmUhCiAgICBEZWF0aCwgdGhhdCBoYXRoIHN1Y2snZCB0aGUgaG9uZXkgb2YgdGh5IGJyZWF0aCwKICAgIEhhdGggaGFkIG5vIHBvd2VyIHlldCB1cG9uIHRoeSBiZWF1dHk6CiAgICBUaG91IGFydCBub3QgY29ucXVlcidkOyBiZWF1dHkncyBlbnNpZ24geWV0CiAgICBJcyBjcmltc29uIGluIHRoeSBsaXBzIGFuZCBpbiB0aHkgY2hlZWtzLAogICAgQW5kIGRlYXRoJ3MgcGFsZSBmbGFnIGlzIG5vdCBhZHZhbmNlZCB0aGVyZS4KICAgIFR5YmFsdCwgbGllc3QgdGhvdSB0aGVyZSBpbiB0aHkgYmxvb2R5IHNoZWV0PwogICAgTywgd2hhdCBtb3JlIGZhdm91ciBjYW4gSSBkbyB0byB0aGVlLAogICAgVGhhbiB3aXRoIHRoYXQgaGFuZCB0aGF0IGN1dCB0aHkgeW91dGggaW4gdHdhaW4KICAgIFRvIHN1bmRlciBoaXMgdGhhdCB3YXMgdGhpbmUgZW5lbXkCiAgICBGb3JnaXZlIG1lLCBjb3VzaW4hIEFoLCBkZWFyIEp1bGlldCwKICAgIFdoeSBhcnQgdGhvdSB5ZXQgc28gZmFpcj8gc2hhbGwgSSBiZWxpZXZlCiAgICBUaGF0IHVuc3Vic3RhbnRpYWwgZGVhdGggaXMgYW1vcm91cywKICAgIEFuZCB0aGF0IHRoZSBsZWFuIGFiaG9ycmVkIG1vbnN0ZXIga2VlcHMKICAgIFRoZWUgaGVyZSBpbiBkYXJrIHRvIGJlIGhpcyBwYXJhbW91cj8KICAgIEZvciBmZWFyIG9mIHRoYXQsIEkgc3RpbGwgd2lsbCBzdGF5IHdpdGggdGhlZTsKICAgIEFuZCBuZXZlciBmcm9tIHRoaXMgcGFsYWNlIG9mIGRpbSBuaWdodAogICAgRGVwYXJ0IGFnYWluOiBoZXJlLCBoZXJlIHdpbGwgSSByZW1haW4KICAgIFdpdGggd29ybXMgdGhhdCBhcmUgdGh5IGNoYW1iZXItbWFpZHM7IE8sIGhlcmUKICAgIFdpbGwgSSBzZXQgdXAgbXkgZXZlcmxhc3RpbmcgcmVzdCwKICAgIEFuZCBzaGFrZSB0aGUgeW9rZSBvZiBpbmF1c3BpY2lvdXMgc3RhcnMKICAgIEZyb20gdGhpcyB3b3JsZC13ZWFyaWVkIGZsZXNoLiBFeWVzLCBsb29rIHlvdXIgbGFzdCEKICAgIEFybXMsIHRha2UgeW91ciBsYXN0IGVtYnJhY2UhIGFuZCwgbGlwcywgTyB5b3UKICAgIFRoZSBkb29ycyBvZiBicmVhdGgsIHNlYWwgd2l0aCBhIHJpZ2h0ZW91cyBraXNzCiAgICBBIGRhdGVsZXNzIGJhcmdhaW4gdG8gZW5ncm9zc2luZyBkZWF0aCEKICAgIENvbWUsIGJpdHRlciBjb25kdWN0LCBjb21lLCB1bnNhdm91cnkgZ3VpZGUhCiAgICBUaG91IGRlc3BlcmF0ZSBwaWxvdCwgbm93IGF0IG9uY2UgcnVuIG9uCiAgICBUaGUgZGFzaGluZyByb2NrcyB0aHkgc2VhLXNpY2sgd2VhcnkgYmFyayEKICAgIEhlcmUncyB0byBteSBsb3ZlIQoKICAgIERyaW5rcwogICAgTyB0cnVlIGFwb3RoZWNhcnkhCiAgICBUaHkgZHJ1Z3MgYXJlIHF1aWNrLiBUaHVzIHdpdGggYSBraXNzIEkgZGllLgoKICAgIERpZXMKCiAgICBFbnRlciwgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgY2h1cmNoeWFyZCwgRlJJQVIgTEFVUkVOQ0UsIHdpdGggYSBsYW50ZXJuLCBjcm93LCBhbmQgc3BhZGUKCkZSSUFSIExBVVJFTkNFCgogICAgU2FpbnQgRnJhbmNpcyBiZSBteSBzcGVlZCEgaG93IG9mdCB0by1uaWdodAogICAgSGF2ZSBteSBvbGQgZmVldCBzdHVtYmxlZCBhdCBncmF2ZXMhIFdobydzIHRoZXJlPwoKQkFMVEhBU0FSCgogICAgSGVyZSdzIG9uZSwgYSBmcmllbmQsIGFuZCBvbmUgdGhhdCBrbm93cyB5b3Ugd2VsbC4KCkZSSUFSIExBVVJFTkNFCgogICAgQmxpc3MgYmUgdXBvbiB5b3UhIFRlbGwgbWUsIGdvb2QgbXkgZnJpZW5kLAogICAgV2hhdCB0b3JjaCBpcyB5b25kLCB0aGF0IHZhaW5seSBsZW5kcyBoaXMgbGlnaHQKICAgIFRvIGdydWJzIGFuZCBleWVsZXNzIHNrdWxscz8gYXMgSSBkaXNjZXJuLAogICAgSXQgYnVybmV0aCBpbiB0aGUgQ2FwZWwncyBtb251bWVudC4KCkJBTFRIQVNBUgoKICAgIEl0IGRvdGggc28sIGhvbHkgc2lyOyBhbmQgdGhlcmUncyBteSBtYXN0ZXIsCiAgICBPbmUgdGhhdCB5b3UgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2hvIGlzIGl0PwoKQkFMVEhBU0FSCgogICAgUm9tZW8uCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvdyBsb25nIGhhdGggaGUgYmVlbiB0aGVyZT8KCkJBTFRIQVNBUgoKICAgIEZ1bGwgaGFsZiBhbiBob3VyLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHbyB3aXRoIG1lIHRvIHRoZSB2YXVsdC4KCkJBTFRIQVNBUgoKICAgIEkgZGFyZSBub3QsIHNpcgogICAgTXkgbWFzdGVyIGtub3dzIG5vdCBidXQgSSBhbSB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CwgYm95OiB3aGljaCB3YXkCgpKVUxJRVQKCiAgICBZZWEsIG5vaXNlPyB0aGVuIEknbGwgYmUgYnJpZWYuIE8gaGFwcHkgZGFnZ2VyIQoKICAgIFNuYXRjaGluZyBST01FTydzIGRhZ2dlcgogICAgVGhpcyBpcyB0aHkgc2hlYXRoOwoKICAgIFN0YWJzIGhlcnNlbGYKICAgIHRoZXJlIHJ1c3QsIGFuZCBsZXQgbWUgZGllLgoKICAgIEZhbGxzIG9uIFJPTUVPJ3MgYm9keSwgYW5kIGRpZXMKCiAgICBFbnRlciBXYXRjaCwgd2l0aCB0aGUgUGFnZSBvZiBQQVJJUwoKUEFHRQoKICAgIFRoaXMgaXMgdGhlIHBsYWNlOyB0aGVyZSwgd2hlcmUgdGhlIHRvcmNoIGRvdGggYnVybi4KCkZpcnN0IFdhdGNobWFuCgogICAgVGhlIGdyb3VuZCBpcyBibG9vZHk7IHNlYXJjaCBhYm91dCB0aGUgY2h1cmNoeWFyZDoKICAgIEdvLCBzb21lIG9mIHlvdSwgd2hvZSdlciB5b3UgZmluZCBhdHRhY2guCiAgICBQaXRpZnVsIHNpZ2h0ISBoZXJlIGxpZXMgdGhlIGNvdW50eSBzbGFpbiwKICAgIEFuZCBKdWxpZXQgYmxlZWRpbmcsIHdhcm0sIGFuZCBuZXdseSBkZWFkLAogICAgV2hvIGhlcmUgaGF0aCBsYWluIHRoZXNlIHR3byBkYXlzIGJ1cmllZC4KICAgIEdvLCB0ZWxsIHRoZSBwcmluY2U6IHJ1biB0byB0aGUgQ2FwdWxldHM6CiAgICBSYWlzZSB1cCB0aGUgTW9udGFndWVzOiBzb21lIG90aGVycyBzZWFyY2g6CiAgICBXZSBzZWUgdGhlIGdyb3VuZCB3aGVyZW9uIHRoZXNlIHdvZXMgZG8gbGllOwogICAgQnV0IHRoZSB0cnVlIGdyb3VuZCBvZiBhbGwgdGhlc2UgcGl0ZW91cyB3b2VzCiAgICBXZSBjYW5ub3Qgd2l0aG91dCBjaXJjdW1zdGFuY2UgZGVzY3J5LgoKICAgIFJlLWVudGVyIHNvbWUgb2YgdGhlIFdhdGNoLCB3aXRoIEJBTFRIQVNBUgoKU2Vjb25kIFdhdGNobWFuCgogICAgSGVyZSdzIFJvbWVvJ3MgbWFuOyB3ZSBmb3VuZCBoaW0gaW4gdGhlIGNodXJjaHlhcmQuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhvbGQgaGltIGluIHNhZmV0eSwgdGlsbCB0aGUgcHJpbmNlIGNvbWUgaGl0aGVyLgoKICAgIFJlLWVudGVyIG90aGVycyBvZiB0aGUgV2F0Y2gsIHdpdGggRlJJQVIgTEFVUkVOQ0UKClRoaXJkIFdhdGNobWFuCgogICAgSGVyZSBpcyBhIGZyaWFyLCB0aGF0IHRyZW1ibGVzLCBzaWdocyBhbmQgd2VlcHM6CiAgICBXZSB0b29rIHRoaXMgbWF0dG9jayBhbmQgdGhpcyBzcGFkZSBmcm9tIGhpbSwKICAgIEFzIGhlIHdhcyBjb21pbmcgZnJvbSB0aGlzIGNodXJjaHlhcmQgc2lkZS4KCkZpcnN0IFdhdGNobWFuCgogICAgQSBncmVhdCBzdXNwaWNpb246IHN0YXkgdGhlIGZyaWFyIHRvby4KCiAgICBFbnRlciB0aGUgUFJJTkNFIGFuZCBBdHRlbmRhbnRzCgpQUklOQ0UKCiAgICBXaGF0IG1pc2FkdmVudHVyZSBpcyBzbyBlYXJseSB1cCwKICAgIFRoYXQgY2FsbHMgb3VyIHBlcnNvbiBmcm9tIG91ciBtb3JuaW5nJ3MgcmVzdD8KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIGFuZCBvdGhlcnMKCkNBUFVMRVQKCiAgICBXaGF0IHNob3VsZCBpdCBiZSwgdGhhdCB0aGV5IHNvIHNocmllayBhYnJvYWQCgpMQURZIENBUFVMRVQKCiAgICBUaGUgcGVvcGxlIGluIHRoZSBzdHJlZXQgY3J5IFJvbWVvLAogICAgU29tZSBKdWxpZXQsIGFuZCBzb21lIFBhcmlzOyBhbmQgYWxsIHJ1biwKICAgIFdpdGggb3BlbiBvdXRjcnkgdG93YXJkIG91ciBtb251bWVudC4KClBSSU5DRQoKICAgIFdoYXQgZmVhciBpcyB0aGlzIHdoaWNoIHN0YXJ0bGVzIGluIG91ciBlYXJzPwoKRmlyc3QgV2F0Y2htYW4KCiAgICBTb3ZlcmVpZ24sIGhlcmUgbGllcyB0aGUgQ291bnR5IFBhcmlzIHNsYWluOwogICAgQW5kIFJvbWVvIGRlYWQ7IGFuZCBKdWxpZXQsIGRlYWQgYmVmb3JlLAogICAgV2FybSBhbmQgbmV3IGtpbGwnZC4KClBSSU5DRQoKICAgIFNlYXJjaCwgc2VlaywgYW5kIGtub3cgaG93IHRoaXMgZm91bCBtdXJkZXIgY29tZXMuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhlcmUgaXMgYSBmcmlhciwgYW5kIHNsYXVnaHRlcidkIFJvbWVvJ3MgbWFuOwogICAgV2l0aCBpbnN0cnVtZW50cyB1cG9uIHRoZW0sIGZpdCB0byBvcGVuCiAgICBUaGVzZSBkZWFkIG1lbidzIHRvbWJzLgoKQ0FQVUxFVAoKICAgIE8gaGVhdmVucyEgTyB3aWZlLCBsb29rIGhvdyBvdXIgZGF1Z2h0ZXIgYmxlZWRzIQogICAgVGhpcyBkYWdnZXIgaGF0aCBtaXN0YSdlbi0tZm9yLCBsbywgaGlzIGhvdXNlCiAgICBJcyBlbXB0eSBvbiB0aGUgYmFjayBvZiBNb250YWd1ZSwtLQogICAgQW5kIGl0IG1pcy1zaGVhdGhlZCBpbiBteSBkYXVnaHRlcidzIGJvc29tIQoKTEFEWSBDQVBVTEVUCgogICAgTyBtZSEgdGhpcyBzaWdodCBvZiBkZWF0aCBpcyBhcyBhIGJlbGwsCiAgICBUaGF0IHdhcm5zIG15IG9sZCBhZ2UgdG8gYSBzZXB1bGNocmUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIG90aGVycwoKUFJJTkNFCgogICAgQ29tZSwgTW9udGFndWU7IGZvciB0aG91IGFydCBlYXJseSB1cCwKICAgIFRvIHNlZSB0aHkgc29uIGFuZCBoZWlyIG1vcmUgZWFybHkgZG93bi4KCk1PTlRBR1VFCgogICAgQWxhcywgbXkgbGllZ2UsIG15IHdpZmUgaXMgZGVhZCB0by1uaWdodDsKICAgIEdyaWVmIG9mIG15IHNvbidzIGV4aWxlIGhhdGggc3RvcHAnZCBoZXIgYnJlYXRoOgogICAgV2hhdCBmdXJ0aGVyIHdvZSBjb25zcGlyZXMgYWdhaW5zdCBtaW5lIGFnZT8KClBSSU5DRQoKICAgIExvb2ssIGFuZCB0aG91IHNoYWx0IHNlZS4KCk1PTlRBR1VFCgogICAgTyB0aG91IHVudGF1Z2h0ISB3aGF0IG1hbm5lcnMgaXMgaW4gdGhpcz8KICAgIFRvIHByZXNzIGJlZm9yZSB0aHkgZmF0aGVyIHRvIGEgZ3JhdmUCgpQUklOQ0UKCiAgICBTZWFsIHVwIHRoZSBtb3V0aCBvZiBvdXRyYWdlIGZvciBhIHdoaWxlLAogICAgVGlsbCB3ZSBjYW4gY2xlYXIgdGhlc2UgYW1iaWd1aXRpZXMsCiAgICBBbmQga25vdyB0aGVpciBzcHJpbmcsIHRoZWlyIGhlYWQsIHRoZWlyCiAgICB0cnVlIGRlc2NlbnQ7CiAgICBBbmQgdGhlbiB3aWxsIEkgYmUgZ2VuZXJhbCBvZiB5b3VyIHdvZXMsCiAgICBBbmQgbGVhZCB5b3UgZXZlbiB0byBkZWF0aDogbWVhbnRpbWUgZm9yYmVhciwKICAgIEFuZCBsZXQgbWlzY2hhbmNlIGJlIHNsYXZlIHRvIHBhdGllbmNlLgogICAgQnJpbmcgZm9ydGggdGhlIHBhcnRpZXMgb2Ygc3VzcGljaW9uLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJIGFtIHRoZSBncmVhdGVzdCwgYWJsZSB0byBkbyBsZWFzdCwKICAgIFlldCBtb3N0IHN1c3BlY3RlZCwgYXMgdGhlIHRpbWUgYW5kIHBsYWNlCiAgICBEb3RoIG1ha2UgYWdhaW5zdCBtZSBvZiB0aGlzIGRpcmVmdWwgbXVyZGVyOwogICAgQW5kIGhlcmUgSSBzdGFuZCwgYm90aCB0byBpbXBlYWNoIGFuZCBwdXJnZQogICAgTXlzZWxmIGNvbmRlbW5lZCBhbmQgbXlzZWxmIGV4Y3VzZWQuCgpQUklOQ0UKCiAgICBUaGVuIHNheSBhdCBvbmNlIHdoYXQgdGhvdSBkb3N0IGtub3cgaW4gdGhpcy4KCkZSSUFSIExBVVJFTkNFCgogICAgSSB3aWxsIGJlIGJyaWVmLCBmb3IgbXkgc2hvcnQgZGF0ZSBvZiBicmVhdGgKICAgIElzIG5vdCBzbyBsb25nIGFzIGlzIGEgdGVkaW91cyB0YWxlLgogICAgUm9tZW8sIHRoZXJlIGRlYWQsIHdhcyBodXNiYW5kIHRvIHRoYXQgSnVsaWV0OwogICAgQW5kIHNoZSwgdGhlcmUgZGVhZCwgdGhhdCBSb21lbydzIGZhaXRoZnVsIHdpZmU6CiAgICBJIG1hcnJpZWQgdGhlbTsgYW5kIHRoZWlyIHN0b2wnbiBtYXJyaWFnZS1kYXkKICAgIFdhcyBUeWJhbHQncyBkb29tcy1kYXksIHdob3NlIHVudGltZWx5IGRlYXRoCiAgICBCYW5pc2gnZCB0aGUgbmV3LW1hZGUgYnJpZGVncm9vbSBmcm9tIHRoZSBjaXR5LAogICAgRm9yIHdob20sIGFuZCBub3QgZm9yIFR5YmFsdCwgSnVsaWV0IHBpbmVkLgogICAgWW91LCB0byByZW1vdmUgdGhhdCBzaWVnZSBvZiBncmllZiBmcm9tIGhlciwKICAgIEJldHJvdGgnZCBhbmQgd291bGQgaGF2ZSBtYXJyaWVkIGhlciBwZXJmb3JjZQogICAgVG8gQ291bnR5IFBhcmlzOiB0aGVuIGNvbWVzIHNoZSB0byBtZSwKICAgIEFuZCwgd2l0aCB3aWxkIGxvb2tzLCBiaWQgbWUgZGV2aXNlIHNvbWUgbWVhbgogICAgVG8gcmlkIGhlciBmcm9tIHRoaXMgc2Vjb25kIG1hcnJpYWdlLAogICAgT3IgaW4gbXkgY2VsbCB0aGVyZSB3b3VsZCBzaGUga2lsbCBoZXJzZWxmLgogICAgVGhlbiBnYXZlIEkgaGVyLCBzbyB0dXRvcidkIGJ5IG15IGFydCwKICAgIEEgc2xlZXBpbmcgcG90aW9uOyB3aGljaCBzbyB0b29rIGVmZmVjdAogICAgQXMgSSBpbnRlbmRlZCwgZm9yIGl0IHdyb3VnaHQgb24gaGVyCiAgICBUaGUgZm9ybSBvZiBkZWF0aDogbWVhbnRpbWUgSSB3cml0IHRvIFJvbWVvLAogICAgVGhhdCBoZSBzaG91bGQgaGl0aGVyIGNvbWUgYXMgdGhpcyBkaXJlIG5pZ2h0LAogICAgVG8gaGVscCB0byB0YWtlIGhlciBmcm9tIGhlciBib3Jyb3cnZCBncmF2ZSwKICAgIEJlaW5nIHRoZSB0aW1lIHRoZSBwb3Rpb24ncyBmb3JjZSBzaG91bGQgY2Vhc2UuCiAgICBCdXQgaGUgd2hpY2ggYm9yZSBteSBsZXR0ZXIsIEZyaWFyIEpvaG4sCiAgICBXYXMgc3RheSdkIGJ5IGFjY2lkZW50LCBhbmQgeWVzdGVybmlnaHQKICAgIFJldHVybidkIG15IGxldHRlciBiYWNrLiBUaGVuIGFsbCBhbG9uZQogICAgQXQgdGhlIHByZWZpeGVkIGhvdXIgb2YgaGVyIHdha2luZywKICAgIENhbWUgSSB0byB0YWtlIGhlciBmcm9tIGhlciBraW5kcmVkJ3MgdmF1bHQ7CiAgICBNZWFuaW5nIHRvIGtlZXAgaGVyIGNsb3NlbHkgYXQgbXkgY2VsbCwKICAgIFRpbGwgSSBjb252ZW5pZW50bHkgY291bGQgc2VuZCB0byBSb21lbzoKICAgIEJ1dCB3aGVuIEkgY2FtZSwgc29tZSBtaW51dGUgZXJlIHRoZSB0aW1lCiAgICBPZiBoZXIgYXdha2luZywgaGVyZSB1bnRpbWVseSBsYXkKICAgIFRoZSBub2JsZSBQYXJpcyBhbmQgdHJ1ZSBSb21lbyBkZWFkLgogICAgU2hlIHdha2VzOyBhbmQgSSBlbnRyZWF0ZWQgaGVyIGNvbWUgZm9ydGgsCiAgICBBbmQgYmVhciB0aGlzIHdvcmsgb2YgaGVhdmVuIHdpdGggcGF0aWVuY2U6CiAgICBCdXQgdGhlbiBhIG5vaXNlIGRpZCBzY2FyZSBtZSBmcm9tIHRoZSB0b21iOwogICAgQW5kIHNoZSwgdG9vIGRlc3BlcmF0ZSwgd291bGQgbm90IGdvIHdpdGggbWUsCiAgICBCdXQsIGFzIGl0IHNlZW1zLCBkaWQgdmlvbGVuY2Ugb24gaGVyc2VsZi4KICAgIEFsbCB0aGlzIEkga25vdzsgYW5kIHRvIHRoZSBtYXJyaWFnZQogICAgSGVyIG51cnNlIGlzIHByaXZ5OiBhbmQsIGlmIGF1Z2h0IGluIHRoaXMKICAgIE1pc2NhcnJpZWQgYnkgbXkgZmF1bHQsIGxldCBteSBvbGQgbGlmZQogICAgQmUgc2FjcmlmaWNlZCwgc29tZSBob3VyIGJlZm9yZSBoaXMgdGltZSwKICAgIFVudG8gdGhlIHJpZ291ciBvZiBzZXZlcmVzdCBsYXcuCgpQUklOQ0UKCiAgICBXZSBzdGlsbCBoYXZlIGtub3duIHRoZWUgZm9yIGEgaG9seSBtYW4uCiAgICBXaGVyZSdzIFJvbWVvJ3MgbWFuPyB3aGF0IGNhbiBoZSBzYXkgaW4gdGhpcz8KCkJBTFRIQVNBUgoKICAgIEkgYnJvdWdodCBteSBtYXN0ZXIgbmV3cyBvZiBKdWxpZXQncyBkZWF0aDsKICAgIEFuZCB0aGVuIGluIHBvc3QgaGUgY2FtZSBmcm9tIE1hbnR1YQogICAgVG8gdGhpcyBzYW1lIHBsYWNlLCB0byB0aGlzIHNhbWUgbW9udW1lbnQuCiAgICBUaGlzIGxldHRlciBoZSBlYXJseSBiaWQgbWUgZ2l2ZSBoaXMgZmF0aGVyLAogICAgQW5kIHRocmVhdGVuZWQgbWUgd2l0aCBkZWF0aCwgZ29pbmcgaW4gdGhlIHZhdWx0LAogICAgSSBkZXBhcnRlZCBub3QgYW5kIGxlZnQgaGltIHRoZXJlLgoKUFJJTkNFCgogICAgR2l2ZSBtZSB0aGUgbGV0dGVyOyBJIHdpbGwgbG9vayBvbiBpdC4KICAgIFdoZXJlIGlzIHRoZSBjb3VudHkncyBwYWdlLCB0aGF0IHJhaXNlZCB0aGUgd2F0Y2gCiAgICBTaXJyYWgsIHdoYXQgbWFkZSB5b3VyIG1hc3RlciBpbiB0aGlzIHBsYWNlPwoKUEFHRQoKICAgIEhlIGNhbWUgd2l0aCBmbG93ZXJzIHRvIHN0cmV3IGhpcyBsYWR5J3MgZ3JhdmU7CiAgICBBbmQgYmlkIG1lIHN0YW5kIGFsb29mLCBhbmQgc28gSSBkaWQ6CiAgICBBbm9uIGNvbWVzIG9uZSB3aXRoIGxpZ2h0IHRvIG9wZSB0aGUgdG9tYjsKICAgIEFuZCBieSBhbmQgYnkgbXkgbWFzdGVyIGRyZXcgb24gaGltOwogICAgQW5kIHRoZW4gSSByYW4gYXdheSB0byBjYWxsIHRoZSB3YXRjaC4KClBSSU5DRQoKICAgIFRoaXMgbGV0dGVyIGRvdGggbWFrZSBnb29kIHRoZSBmcmlhcidzIHdvcmRzLAogICAgVGhlaXIgY291cnNlIG9mIGxvdmUsIHRoZSB0aWRpbmdzIG9mIGhlciBkZWF0aDoKICAgIEFuZCBoZXJlIGhlIHdyaXRlcyB0aGF0IGhlIGRpZCBidXkgYSBwb2lzb24KICAgIE9mIGEgcG9vciAncG90aGVjYXJ5LCBhbmQgdGhlcmV3aXRoYWwKICAgIENhbWUgdG8gdGhpcyB2YXVsdCB0byBkaWUsIGFuZCBsaWUgd2l0aCBKdWxpZXQuCiAgICBXaGVyZSBiZSB0aGVzZSBlbmVtaWVzPyBDYXB1bGV0ISBNb250YWd1ZSEKICAgIFNlZSwgd2hhdCBhIHNjb3VyZ2UgaXMgbGFpZCB1cG9uIHlvdXIgaGF0ZSwKICAgIFRoYXQgaGVhdmVuIGZpbmRzIG1lYW5zIHRvIGtpbGwgeW91ciBqb3lzIHdpdGggbG92ZS4KICAgIEFuZCBJIGZvciB3aW5raW5nIGF0IHlvdXIgZGlzY29yZHMgdG9vCiAgICBIYXZlIGxvc3QgYSBicmFjZSBvZiBraW5zbWVuOiBhbGwgYXJlIHB1bmlzaCdkLgoKQ0FQVUxFVAoKICAgIE8gYnJvdGhlciBNb250YWd1ZSwgZ2l2ZSBtZSB0aHkgaGFuZDoKICAgIFRoaXMgaXMgbXkgZGF1Z2h0ZXIncyBqb2ludHVyZSwgZm9yIG5vIG1vcmUKICAgIENhbiBJIGRlbWFuZC4KCk1PTlRBR1VFCgogICAgQnV0IEkgY2FuIGdpdmUgdGhlZSBtb3JlOgogICAgRm9yIEkgd2lsbCByYWlzZSBoZXIgc3RhdHVlIGluIHB1cmUgZ29sZDsKICAgIFRoYXQgd2hpbGUgVmVyb25hIGJ5IHRoYXQgbmFtZSBpcyBrbm93biwKICAgIFRoZXJlIHNoYWxsIG5vIGZpZ3VyZSBhdCBzdWNoIHJhdGUgYmUgc2V0CiAgICBBcyB0aGF0IG9mIHRydWUgYW5kIGZhaXRoZnVsIEp1bGlldC4KCkNBUFVMRVQKCiAgICBBcyByaWNoIHNoYWxsIFJvbWVvJ3MgYnkgaGlzIGxhZHkncyBsaWU7CiAgICBQb29yIHNhY3JpZmljZXMgb2Ygb3VyIGVubWl0eSEKClBSSU5DRQoKICAgIEEgZ2xvb21pbmcgcGVhY2UgdGhpcyBtb3JuaW5nIHdpdGggaXQgYnJpbmdzOwogICAgVGhlIHN1biwgZm9yIHNvcnJvdywgd2lsbCBub3Qgc2hvdyBoaXMgaGVhZDoKICAgIEdvIGhlbmNlLCB0byBoYXZlIG1vcmUgdGFsayBvZiB0aGVzZSBzYWQgdGhpbmdzOwogICAgU29tZSBzaGFsbCBiZSBwYXJkb24nZCwgYW5kIHNvbWUgcHVuaXNoZWQ6CiAgICBGb3IgbmV2ZXIgd2FzIGEgc3Rvcnkgb2YgbW9yZSB3b2UKICAgIFRoYW4gdGhpcyBvZiBKdWxpZXQgYW5kIGhlciBSb21lby4KCiAgICBFeGV1bnQK

Chuck Cartledge
Chuck Cartledge
Chuck Cartledge

httpantonio-ferraroeupnword-clouds-in-r-packages-wordcloud2-and-tmrm(list=ls())library(wordcloud2)library(NLP)library(tm)library(RCurl) Necessary steps 1 Use imagesgooglecom to find an outline of the shape to fill (tmpusapng) 2 Use gimp to fill the outline with black 3 Use a command like wordcloud2(TDMasDF size = 20 figPath=tmpusapng backgroundColor = white fontFamily=Loma) to populate shape 4 Result is a web page with javascript embedded to create image and allow mouse overs Clean corpuscleanCorpus lt- function(corpus) corpustmp lt- tm_map(corpus removePunctuation) corpustmp lt- tm_map(corpustmpstripWhitespace) corpustmp lt- tm_map(corpustmptolower) corpustmp lt- tm_map(corpustmp PlainTextDocument) corpustmp lt- tm_map(corpustmpremoveWords stopwords(english)) return(corpustmp) Build TDMgenerateTDM lt- function(path) sdir lt-path scor lt-Corpus(DirSource(directory = sdir encoding= UTF-8)) scorcl lt- cleanCorpus(scor) stdm lt- TermDocumentMatrix(scorcl) stdminitData lt- function(path) if (direxists(path) == FALSE) If the directory does not exist create and populate with dummy data dummyDataFile lt- romeoAndJulietbase64 fileName lt- sprintf(sdummyDatatxt path) print(sprintf(Creating and populating the file s with dummy data fileName)) dircreate(path recursive = TRUE) write(base64( paste( readLines(dummyDataFile) collapse=) encode=FALSE) file=fileName) main lt- function() options(stringsAsFactors = FALSE) The working directory pathName lt- Text initData(pathName) Get the Term Document Matrix TDM lt- generateTDM(pathName) Do I need a matrix or a DF We will see TDMasMatrix lt- asmatrix(TDM) TDMasDFlt-dataframe(TDMasMatrix) TDMasDF$words lt-rownames(TDMasDF) Column headers colnames(TDMasDF) lt- c(freq word) TDMasDFlt-TDMasDF[ c(word freq)] TDMasDF lt- TDMasDF[order(TDMasDF$freqdecreasing=TRUE)] The results a lt- wordcloud2(TDMasDF size = 03 shape=star backgroundColor = black fontFamily=Loma) print(a) a lt- letterCloud(TDMasDF word=USA size = 03 fontFamily=Loma backgroundColor = black) print(a) a lt- wordcloud2(TDMasDF size = 13 figPath=heartpng backgroundColor = white fontFamily=Loma color=red) print(a) TDMasDF$freq lt- log(TDMasDF$freq) a lt- wordcloud2(TDMasDF size = 12 figPath=usapng backgroundColor = white shuffle=FALSE minRotation = 0 maxRotation = 2pi) print(a) print(The program has ended)main()

Chuck Cartledge
Page 3: Creating Shaped Wordclouds Using R - clc-ent.comThe wordcloud2 function behaves slightly di erently than most of the other R plot func-tions that I’ve used. The result from both

Figure 1 A sample word cloud based on Romeo and Juliet The image was created usingwordcloud function in the wordcloud library and the text from ldquoRomeo and Julietrdquo

2

Figure 2 A more interesting word cloud based on Romeo and Juliette The image wascreated using wordcloud2 function in the wordcloud2 library and the text from ldquoRomeo andJulietrdquo

3

Figure 3 An empty word cloud figure

4

Figure 4 A filled word cloud figure

5

Figure 5 A filled USA word cloud figure

The wordcloud2 function behaves slightly differently than most of the other R plot func-tions that Irsquove used The result from both wordcloud2 and letterCloud is not displayablewithin R These functions actually create an HTML page in a temporary directory with em-bedded JavaScript that performs the placement of the words within the shape and providesa level of interaction after the page is displayed R ldquounderstandsrdquo that the product fromthese functions is an HTML widget and starts up the default browser to show the page Thepage and its sub-directories are removed when R ends

The fact that the page uses JavaScript introduces some interesting aspects Buried in theJavaScript used by the page to place the words in the cloud are a plethora of Mathrandom()calls The JavaScript specification says that the Mathrandom() function has to return avalue greater than or equal to 0 and less than 1 which is reasonable for a random functionThe specification also says that the implementation of the random function is up to theJavaScript application and does not specify how the numbers are to be generated Meaningthat the same HTML page being viewed by two different browsers may generate two differentsequences of random numbers Most random number generators have the capability of settinga seed value so that a repeatable sequence can be generated JavaScript does not supportthe idea of a random number seed The HTML page and collection of directories can bemoved to a server where they are available for use and support

All of this means that each loading and viewing of the page will generate a different

1Available fromhttpsgithubcomLchiffonwordcloud2

6

image and there is no practical way to ldquoget backrdquo to an image that was goodIn the Files section (see Section A on page 9) is an R script and support files to work

with The R script was used to create various images (see Figure 6 on the following page)

3 Conclusion

The wordcloud2 library enables you to create word clouds of arbitrary shape inside an HTMLusing JavaScript to position and orient each word Each HTML page and its associatedlibrary files are placed in individual directories that are removed when the creating R processterminates Pages and files can be moved or copied for safe keeping if desired Because thepages use the Mathrandom() JavaScript function each time the page is loaded words willbe positioned differently in the cloud If the desired shape has an internal hole then it ispossible that some words may not be placed in the cloud

wordcloud2 allows you to create word clouds to support your data visualization needs

7

(a) A heart

(b) The letters ldquoUSArdquo

(c) A star

(d) The USA

Figure 6 A collection of sample word clouds These images were created with the attachedR script

8

A Misc files

The files used to create all these figures are attached to this report They are

1 romeoAndJulietbase64 ndash default text used to demonstrate the software

2 heartpng ndash a heart shape with a hole

3 usapng ndash an outline of the continental United States

4 wordCloudR ndash an R script to demonstrate making word clouds

9

ClJvbWVvIGFuZCBKdWxpZXQKU2hha2VzcGVhcmUgaG9tZXBhZ2UgfCBSb21lbyBhbmQgSnVsaWV0IHwgRW50aXJlIHBsYXkKQUNUIEkKUFJPTE9HVUUKCiAgICBUd28gaG91c2Vob2xkcywgYm90aCBhbGlrZSBpbiBkaWduaXR5LAogICAgSW4gZmFpciBWZXJvbmEsIHdoZXJlIHdlIGxheSBvdXIgc2NlbmUsCiAgICBGcm9tIGFuY2llbnQgZ3J1ZGdlIGJyZWFrIHRvIG5ldyBtdXRpbnksCiAgICBXaGVyZSBjaXZpbCBibG9vZCBtYWtlcyBjaXZpbCBoYW5kcyB1bmNsZWFuLgogICAgRnJvbSBmb3J0aCB0aGUgZmF0YWwgbG9pbnMgb2YgdGhlc2UgdHdvIGZvZXMKICAgIEEgcGFpciBvZiBzdGFyLWNyb3NzJ2QgbG92ZXJzIHRha2UgdGhlaXIgbGlmZTsKICAgIFdob3NlIG1pc2FkdmVudHVyZWQgcGl0ZW91cyBvdmVydGhyb3dzCiAgICBEbyB3aXRoIHRoZWlyIGRlYXRoIGJ1cnkgdGhlaXIgcGFyZW50cycgc3RyaWZlLgogICAgVGhlIGZlYXJmdWwgcGFzc2FnZSBvZiB0aGVpciBkZWF0aC1tYXJrJ2QgbG92ZSwKICAgIEFuZCB0aGUgY29udGludWFuY2Ugb2YgdGhlaXIgcGFyZW50cycgcmFnZSwKICAgIFdoaWNoLCBidXQgdGhlaXIgY2hpbGRyZW4ncyBlbmQsIG5vdWdodCBjb3VsZCByZW1vdmUsCiAgICBJcyBub3cgdGhlIHR3byBob3VycycgdHJhZmZpYyBvZiBvdXIgc3RhZ2U7CiAgICBUaGUgd2hpY2ggaWYgeW91IHdpdGggcGF0aWVudCBlYXJzIGF0dGVuZCwKICAgIFdoYXQgaGVyZSBzaGFsbCBtaXNzLCBvdXIgdG9pbCBzaGFsbCBzdHJpdmUgdG8gbWVuZC4KClNDRU5FIEkuIFZlcm9uYS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgU0FNUFNPTiBhbmQgR1JFR09SWSwgb2YgdGhlIGhvdXNlIG9mIENhcHVsZXQsIGFybWVkIHdpdGggc3dvcmRzIGFuZCBidWNrbGVycyAKClNBTVBTT04KCiAgICBHcmVnb3J5LCBvJyBteSB3b3JkLCB3ZSdsbCBub3QgY2FycnkgY29hbHMuCgpHUkVHT1JZCgogICAgTm8sIGZvciB0aGVuIHdlIHNob3VsZCBiZSBjb2xsaWVycy4KClNBTVBTT04KCiAgICBJIG1lYW4sIGFuIHdlIGJlIGluIGNob2xlciwgd2UnbGwgZHJhdy4KCkdSRUdPUlkKCiAgICBBeSwgd2hpbGUgeW91IGxpdmUsIGRyYXcgeW91ciBuZWNrIG91dCBvJyB0aGUgY29sbGFyLgoKU0FNUFNPTgoKICAgIEkgc3RyaWtlIHF1aWNrbHksIGJlaW5nIG1vdmVkLgoKR1JFR09SWQoKICAgIEJ1dCB0aG91IGFydCBub3QgcXVpY2tseSBtb3ZlZCB0byBzdHJpa2UuCgpTQU1QU09OCgogICAgQSBkb2cgb2YgdGhlIGhvdXNlIG9mIE1vbnRhZ3VlIG1vdmVzIG1lLgoKR1JFR09SWQoKICAgIFRvIG1vdmUgaXMgdG8gc3RpcjsgYW5kIHRvIGJlIHZhbGlhbnQgaXMgdG8gc3RhbmQ6CiAgICB0aGVyZWZvcmUsIGlmIHRob3UgYXJ0IG1vdmVkLCB0aG91IHJ1bm4nc3QgYXdheS4KClNBTVBTT04KCiAgICBBIGRvZyBvZiB0aGF0IGhvdXNlIHNoYWxsIG1vdmUgbWUgdG8gc3RhbmQ6IEkgd2lsbAogICAgdGFrZSB0aGUgd2FsbCBvZiBhbnkgbWFuIG9yIG1haWQgb2YgTW9udGFndWUncy4KCkdSRUdPUlkKCiAgICBUaGF0IHNob3dzIHRoZWUgYSB3ZWFrIHNsYXZlOyBmb3IgdGhlIHdlYWtlc3QgZ29lcwogICAgdG8gdGhlIHdhbGwuCgpTQU1QU09OCgogICAgVHJ1ZTsgYW5kIHRoZXJlZm9yZSB3b21lbiwgYmVpbmcgdGhlIHdlYWtlciB2ZXNzZWxzLAogICAgYXJlIGV2ZXIgdGhydXN0IHRvIHRoZSB3YWxsOiB0aGVyZWZvcmUgSSB3aWxsIHB1c2gKICAgIE1vbnRhZ3VlJ3MgbWVuIGZyb20gdGhlIHdhbGwsIGFuZCB0aHJ1c3QgaGlzIG1haWRzCiAgICB0byB0aGUgd2FsbC4KCkdSRUdPUlkKCiAgICBUaGUgcXVhcnJlbCBpcyBiZXR3ZWVuIG91ciBtYXN0ZXJzIGFuZCB1cyB0aGVpciBtZW4uCgpTQU1QU09OCgogICAgJ1RpcyBhbGwgb25lLCBJIHdpbGwgc2hvdyBteXNlbGYgYSB0eXJhbnQ6IHdoZW4gSQogICAgaGF2ZSBmb3VnaHQgd2l0aCB0aGUgbWVuLCBJIHdpbGwgYmUgY3J1ZWwgd2l0aCB0aGUKICAgIG1haWRzLCBhbmQgY3V0IG9mZiB0aGVpciBoZWFkcy4KCkdSRUdPUlkKCiAgICBUaGUgaGVhZHMgb2YgdGhlIG1haWRzPwoKU0FNUFNPTgoKICAgIEF5LCB0aGUgaGVhZHMgb2YgdGhlIG1haWRzLCBvciB0aGVpciBtYWlkZW5oZWFkczsKICAgIHRha2UgaXQgaW4gd2hhdCBzZW5zZSB0aG91IHdpbHQuCgpHUkVHT1JZCgogICAgVGhleSBtdXN0IHRha2UgaXQgaW4gc2Vuc2UgdGhhdCBmZWVsIGl0LgoKU0FNUFNPTgoKICAgIE1lIHRoZXkgc2hhbGwgZmVlbCB3aGlsZSBJIGFtIGFibGUgdG8gc3RhbmQ6IGFuZAogICAgJ3RpcyBrbm93biBJIGFtIGEgcHJldHR5IHBpZWNlIG9mIGZsZXNoLgoKR1JFR09SWQoKICAgICdUaXMgd2VsbCB0aG91IGFydCBub3QgZmlzaDsgaWYgdGhvdSBoYWRzdCwgdGhvdQogICAgaGFkc3QgYmVlbiBwb29yIEpvaG4uIERyYXcgdGh5IHRvb2whIGhlcmUgY29tZXMKICAgIHR3byBvZiB0aGUgaG91c2Ugb2YgdGhlIE1vbnRhZ3Vlcy4KClNBTVBTT04KCiAgICBNeSBuYWtlZCB3ZWFwb24gaXMgb3V0OiBxdWFycmVsLCBJIHdpbGwgYmFjayB0aGVlLgoKR1JFR09SWQoKICAgIEhvdyEgdHVybiB0aHkgYmFjayBhbmQgcnVuPwoKU0FNUFNPTgoKICAgIEZlYXIgbWUgbm90LgoKR1JFR09SWQoKICAgIE5vLCBtYXJyeTsgSSBmZWFyIHRoZWUhCgpTQU1QU09OCgogICAgTGV0IHVzIHRha2UgdGhlIGxhdyBvZiBvdXIgc2lkZXM7IGxldCB0aGVtIGJlZ2luLgoKR1JFR09SWQoKICAgIEkgd2lsbCBmcm93biBhcyBJIHBhc3MgYnksIGFuZCBsZXQgdGhlbSB0YWtlIGl0IGFzCiAgICB0aGV5IGxpc3QuCgpTQU1QU09OCgogICAgTmF5LCBhcyB0aGV5IGRhcmUuIEkgd2lsbCBiaXRlIG15IHRodW1iIGF0IHRoZW07CiAgICB3aGljaCBpcyBhIGRpc2dyYWNlIHRvIHRoZW0sIGlmIHRoZXkgYmVhciBpdC4KCiAgICBFbnRlciBBQlJBSEFNIGFuZCBCQUxUSEFTQVIKCkFCUkFIQU0KCiAgICBEbyB5b3UgYml0ZSB5b3VyIHRodW1iIGF0IHVzLCBzaXICgpTQU1QU09OCgogICAgSSBkbyBiaXRlIG15IHRodW1iLCBzaXIuCgpBQlJBSEFNCgogICAgRG8geW91IGJpdGUgeW91ciB0aHVtYiBhdCB1cywgc2lyPwoKU0FNUFNPTgoKICAgIFtBc2lkZSB0byBHUkVHT1JZXSBJcyB0aGUgbGF3IG9mIG91ciBzaWRlLCBpZiBJIHNheQogICAgYXkCgpHUkVHT1JZCgogICAgTm8uCgpTQU1QU09OCgogICAgTm8sIHNpciwgSSBkbyBub3QgYml0ZSBteSB0aHVtYiBhdCB5b3UsIHNpciwgYnV0IEkKICAgIGJpdGUgbXkgdGh1bWIsIHNpci4KCkdSRUdPUlkKCiAgICBEbyB5b3UgcXVhcnJlbCwgc2lyPwoKQUJSQUhBTQoKICAgIFF1YXJyZWwgc2lyISBubywgc2lyLgoKU0FNUFNPTgoKICAgIElmIHlvdSBkbywgc2lyLCBJIGFtIGZvciB5b3U6IEkgc2VydmUgYXMgZ29vZCBhIG1hbiBhcyB5b3UuCgpBQlJBSEFNCgogICAgTm8gYmV0dGVyLgoKU0FNUFNPTgoKICAgIFdlbGwsIHNpci4KCkdSRUdPUlkKCiAgICBTYXkgJ2JldHRlcjonIGhlcmUgY29tZXMgb25lIG9mIG15IG1hc3RlcidzIGtpbnNtZW4uCgpTQU1QU09OCgogICAgWWVzLCBiZXR0ZXIsIHNpci4KCkFCUkFIQU0KCiAgICBZb3UgbGllLgoKU0FNUFNPTgoKICAgIERyYXcsIGlmIHlvdSBiZSBtZW4uIEdyZWdvcnksIHJlbWVtYmVyIHRoeSBzd2FzaGluZyBibG93LgoKICAgIFRoZXkgZmlnaHQKCiAgICBFbnRlciBCRU5WT0xJTwoKQkVOVk9MSU8KCiAgICBQYXJ0LCBmb29scyEKICAgIFB1dCB1cCB5b3VyIHN3b3JkczsgeW91IGtub3cgbm90IHdoYXQgeW91IGRvLgoKICAgIEJlYXRzIGRvd24gdGhlaXIgc3dvcmRzCgogICAgRW50ZXIgVFlCQUxUCgpUWUJBTFQKCiAgICBXaGF0LCBhcnQgdGhvdSBkcmF3biBhbW9uZyB0aGVzZSBoZWFydGxlc3MgaGluZHMCiAgICBUdXJuIHRoZWUsIEJlbnZvbGlvLCBsb29rIHVwb24gdGh5IGRlYXRoLgoKQkVOVk9MSU8KCiAgICBJIGRvIGJ1dCBrZWVwIHRoZSBwZWFjZTogcHV0IHVwIHRoeSBzd29yZCwKICAgIE9yIG1hbmFnZSBpdCB0byBwYXJ0IHRoZXNlIG1lbiB3aXRoIG1lLgoKVFlCQUxUCgogICAgV2hhdCwgZHJhd24sIGFuZCB0YWxrIG9mIHBlYWNlISBJIGhhdGUgdGhlIHdvcmQsCiAgICBBcyBJIGhhdGUgaGVsbCwgYWxsIE1vbnRhZ3VlcywgYW5kIHRoZWU6CiAgICBIYXZlIGF0IHRoZWUsIGNvd2FyZCEKCiAgICBUaGV5IGZpZ2h0CgogICAgRW50ZXIsIHNldmVyYWwgb2YgYm90aCBob3VzZXMsIHdobyBqb2luIHRoZSBmcmF5OyB0aGVuIGVudGVyIENpdGl6ZW5zLCB3aXRoIGNsdWJzCgpGaXJzdCBDaXRpemVuCgogICAgQ2x1YnMsIGJpbGxzLCBhbmQgcGFydGlzYW5zISBzdHJpa2UhIGJlYXQgdGhlbSBkb3duIQogICAgRG93biB3aXRoIHRoZSBDYXB1bGV0cyEgZG93biB3aXRoIHRoZSBNb250YWd1ZXMhCgogICAgRW50ZXIgQ0FQVUxFVCBpbiBoaXMgZ293biwgYW5kIExBRFkgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgdGhpcz8gR2l2ZSBtZSBteSBsb25nIHN3b3JkLCBobyEKCkxBRFkgQ0FQVUxFVAoKICAgIEEgY3J1dGNoLCBhIGNydXRjaCEgd2h5IGNhbGwgeW91IGZvciBhIHN3b3JkPwoKQ0FQVUxFVAoKICAgIE15IHN3b3JkLCBJIHNheSEgT2xkIE1vbnRhZ3VlIGlzIGNvbWUsCiAgICBBbmQgZmxvdXJpc2hlcyBoaXMgYmxhZGUgaW4gc3BpdGUgb2YgbWUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIExBRFkgTU9OVEFHVUUKCk1PTlRBR1VFCgogICAgVGhvdSB2aWxsYWluIENhcHVsZXQsLS1Ib2xkIG1lIG5vdCwgbGV0IG1lIGdvLgoKTEFEWSBNT05UQUdVRQoKICAgIFRob3Ugc2hhbHQgbm90IHN0aXIgYSBmb290IHRvIHNlZWsgYSBmb2UuCgogICAgRW50ZXIgUFJJTkNFLCB3aXRoIEF0dGVuZGFudHMKClBSSU5DRQoKICAgIFJlYmVsbGlvdXMgc3ViamVjdHMsIGVuZW1pZXMgdG8gcGVhY2UsCiAgICBQcm9mYW5lcnMgb2YgdGhpcyBuZWlnaGJvdXItc3RhaW5lZCBzdGVlbCwtLQogICAgV2lsbCB0aGV5IG5vdCBoZWFyPyBXaGF0LCBobyEgeW91IG1lbiwgeW91IGJlYXN0cywKICAgIFRoYXQgcXVlbmNoIHRoZSBmaXJlIG9mIHlvdXIgcGVybmljaW91cyByYWdlCiAgICBXaXRoIHB1cnBsZSBmb3VudGFpbnMgaXNzdWluZyBmcm9tIHlvdXIgdmVpbnMsCiAgICBPbiBwYWluIG9mIHRvcnR1cmUsIGZyb20gdGhvc2UgYmxvb2R5IGhhbmRzCiAgICBUaHJvdyB5b3VyIG1pc3RlbXBlcidkIHdlYXBvbnMgdG8gdGhlIGdyb3VuZCwKICAgIEFuZCBoZWFyIHRoZSBzZW50ZW5jZSBvZiB5b3VyIG1vdmVkIHByaW5jZS4KICAgIFRocmVlIGNpdmlsIGJyYXdscywgYnJlZCBvZiBhbiBhaXJ5IHdvcmQsCiAgICBCeSB0aGVlLCBvbGQgQ2FwdWxldCwgYW5kIE1vbnRhZ3VlLAogICAgSGF2ZSB0aHJpY2UgZGlzdHVyYidkIHRoZSBxdWlldCBvZiBvdXIgc3RyZWV0cywKICAgIEFuZCBtYWRlIFZlcm9uYSdzIGFuY2llbnQgY2l0aXplbnMKICAgIENhc3QgYnkgdGhlaXIgZ3JhdmUgYmVzZWVtaW5nIG9ybmFtZW50cywKICAgIFRvIHdpZWxkIG9sZCBwYXJ0aXNhbnMsIGluIGhhbmRzIGFzIG9sZCwKICAgIENhbmtlcidkIHdpdGggcGVhY2UsIHRvIHBhcnQgeW91ciBjYW5rZXInZCBoYXRlOgogICAgSWYgZXZlciB5b3UgZGlzdHVyYiBvdXIgc3RyZWV0cyBhZ2FpbiwKICAgIFlvdXIgbGl2ZXMgc2hhbGwgcGF5IHRoZSBmb3JmZWl0IG9mIHRoZSBwZWFjZS4KICAgIEZvciB0aGlzIHRpbWUsIGFsbCB0aGUgcmVzdCBkZXBhcnQgYXdheToKICAgIFlvdSBDYXB1bGV0OyBzaGFsbCBnbyBhbG9uZyB3aXRoIG1lOgogICAgQW5kLCBNb250YWd1ZSwgY29tZSB5b3UgdGhpcyBhZnRlcm5vb24sCiAgICBUbyBrbm93IG91ciBmdXJ0aGVyIHBsZWFzdXJlIGluIHRoaXMgY2FzZSwKICAgIFRvIG9sZCBGcmVlLXRvd24sIG91ciBjb21tb24ganVkZ21lbnQtcGxhY2UuCiAgICBPbmNlIG1vcmUsIG9uIHBhaW4gb2YgZGVhdGgsIGFsbCBtZW4gZGVwYXJ0LgoKICAgIEV4ZXVudCBhbGwgYnV0IE1PTlRBR1VFLCBMQURZIE1PTlRBR1VFLCBhbmQgQkVOVk9MSU8KCk1PTlRBR1VFCgogICAgV2hvIHNldCB0aGlzIGFuY2llbnQgcXVhcnJlbCBuZXcgYWJyb2FjaD8KICAgIFNwZWFrLCBuZXBoZXcsIHdlcmUgeW91IGJ5IHdoZW4gaXQgYmVnYW4CgpCRU5WT0xJTwoKICAgIEhlcmUgd2VyZSB0aGUgc2VydmFudHMgb2YgeW91ciBhZHZlcnNhcnksCiAgICBBbmQgeW91cnMsIGNsb3NlIGZpZ2h0aW5nIGVyZSBJIGRpZCBhcHByb2FjaDoKICAgIEkgZHJldyB0byBwYXJ0IHRoZW06IGluIHRoZSBpbnN0YW50IGNhbWUKICAgIFRoZSBmaWVyeSBUeWJhbHQsIHdpdGggaGlzIHN3b3JkIHByZXBhcmVkLAogICAgV2hpY2gsIGFzIGhlIGJyZWF0aGVkIGRlZmlhbmNlIHRvIG15IGVhcnMsCiAgICBIZSBzd3VuZyBhYm91dCBoaXMgaGVhZCBhbmQgY3V0IHRoZSB3aW5kcywKICAgIFdobyBub3RoaW5nIGh1cnQgd2l0aGFsIGhpc3MnZCBoaW0gaW4gc2Nvcm46CiAgICBXaGlsZSB3ZSB3ZXJlIGludGVyY2hhbmdpbmcgdGhydXN0cyBhbmQgYmxvd3MsCiAgICBDYW1lIG1vcmUgYW5kIG1vcmUgYW5kIGZvdWdodCBvbiBwYXJ0IGFuZCBwYXJ0LAogICAgVGlsbCB0aGUgcHJpbmNlIGNhbWUsIHdobyBwYXJ0ZWQgZWl0aGVyIHBhcnQuCgpMQURZIE1PTlRBR1VFCgogICAgTywgd2hlcmUgaXMgUm9tZW8IHNhdyB5b3UgaGltIHRvLWRheT8KICAgIFJpZ2h0IGdsYWQgSSBhbSBoZSB3YXMgbm90IGF0IHRoaXMgZnJheS4KCkJFTlZPTElPCgogICAgTWFkYW0sIGFuIGhvdXIgYmVmb3JlIHRoZSB3b3JzaGlwcCdkIHN1bgogICAgUGVlcidkIGZvcnRoIHRoZSBnb2xkZW4gd2luZG93IG9mIHRoZSBlYXN0LAogICAgQSB0cm91YmxlZCBtaW5kIGRyYXZlIG1lIHRvIHdhbGsgYWJyb2FkOwogICAgV2hlcmUsIHVuZGVybmVhdGggdGhlIGdyb3ZlIG9mIHN5Y2Ftb3JlCiAgICBUaGF0IHdlc3R3YXJkIHJvb3RldGggZnJvbSB0aGUgY2l0eSdzIHNpZGUsCiAgICBTbyBlYXJseSB3YWxraW5nIGRpZCBJIHNlZSB5b3VyIHNvbjoKICAgIFRvd2FyZHMgaGltIEkgbWFkZSwgYnV0IGhlIHdhcyB3YXJlIG9mIG1lCiAgICBBbmQgc3RvbGUgaW50byB0aGUgY292ZXJ0IG9mIHRoZSB3b29kOgogICAgSSwgbWVhc3VyaW5nIGhpcyBhZmZlY3Rpb25zIGJ5IG15IG93biwKICAgIFRoYXQgbW9zdCBhcmUgYnVzaWVkIHdoZW4gdGhleSdyZSBtb3N0IGFsb25lLAogICAgUHVyc3VlZCBteSBodW1vdXIgbm90IHB1cnN1aW5nIGhpcywKICAgIEFuZCBnbGFkbHkgc2h1bm4nZCB3aG8gZ2xhZGx5IGZsZWQgZnJvbSBtZS4KCk1PTlRBR1VFCgogICAgTWFueSBhIG1vcm5pbmcgaGF0aCBoZSB0aGVyZSBiZWVuIHNlZW4sCiAgICBXaXRoIHRlYXJzIGF1Z21lbnRpbmcgdGhlIGZyZXNoIG1vcm5pbmcgZGV3LgogICAgQWRkaW5nIHRvIGNsb3VkcyBtb3JlIGNsb3VkcyB3aXRoIGhpcyBkZWVwIHNpZ2hzOwogICAgQnV0IGFsbCBzbyBzb29uIGFzIHRoZSBhbGwtY2hlZXJpbmcgc3VuCiAgICBTaG91bGQgaW4gdGhlIGZ1cnRoZXN0IGVhc3QgYmVnaW4gdG8gZHJhdwogICAgVGhlIHNoYWR5IGN1cnRhaW5zIGZyb20gQXVyb3JhJ3MgYmVkLAogICAgQXdheSBmcm9tIHRoZSBsaWdodCBzdGVhbHMgaG9tZSBteSBoZWF2eSBzb24sCiAgICBBbmQgcHJpdmF0ZSBpbiBoaXMgY2hhbWJlciBwZW5zIGhpbXNlbGYsCiAgICBTaHV0cyB1cCBoaXMgd2luZG93cywgbG9ja3MgZmFyIGRheWxpZ2h0IG91dAogICAgQW5kIG1ha2VzIGhpbXNlbGYgYW4gYXJ0aWZpY2lhbCBuaWdodDoKICAgIEJsYWNrIGFuZCBwb3J0ZW50b3VzIG11c3QgdGhpcyBodW1vdXIgcHJvdmUsCiAgICBVbmxlc3MgZ29vZCBjb3Vuc2VsIG1heSB0aGUgY2F1c2UgcmVtb3ZlLgoKQkVOVk9MSU8KCiAgICBNeSBub2JsZSB1bmNsZSwgZG8geW91IGtub3cgdGhlIGNhdXNlPwoKTU9OVEFHVUUKCiAgICBJIG5laXRoZXIga25vdyBpdCBub3IgY2FuIGxlYXJuIG9mIGhpbS4KCkJFTlZPTElPCgogICAgSGF2ZSB5b3UgaW1wb3J0dW5lZCBoaW0gYnkgYW55IG1lYW5zPwoKTU9OVEFHVUUKCiAgICBCb3RoIGJ5IG15c2VsZiBhbmQgbWFueSBvdGhlciBmcmllbmRzOgogICAgQnV0IGhlLCBoaXMgb3duIGFmZmVjdGlvbnMnIGNvdW5zZWxsb3IsCiAgICBJcyB0byBoaW1zZWxmLS1JIHdpb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UVPCgogICAgR29vZCBoZWFydCwgYXQgd2hhdD8KCkJFTlZPTElPCgogICAgQXQgdGh5IGdvb2QgaGVhcnQncyBvcHByZXNzaW9uLgoKUk9NRU8KCiAgICBXaHksIHN1Y2ggaXMgbG92ZSdzIHRyYW5zZ3Jlc3Npb24uCiAgICBHcmllZnMgb2YgbWluZSBvd24gbGllIGhlYXZ5IGluIG15IGJyZWFzdCwKICAgIFdoaWNoIHRob3Ugd2lsdCBwcm9wYWdhdGUsIHRvIGhhdmUgaXQgcHJlc3QKICAgIFdpdGggbW9yZSBvZiB0aGluZTogdGhpcyBsb3ZlIHRoYXQgdGhvdSBoYXN0IHNob3duCiAgICBEb3RoIGFkZCBtb3JlIGdyaWVmIHRvIHRvbyBtdWNoIG9mIG1pbmUgb3duLgogICAgTG92ZSBpcyBhIHNtb2tlIHJhaXNlZCB3aXRoIHRoZSBmdW1lIG9mIHNpZ2hzOwogICAgQmVpbmcgcHVyZ2VkLCBhIGZpcmUgc3BhcmtsaW5nIGluIGxvdmVycycgZXllczsKICAgIEJlaW5nIHZleCdkIGEgc2VhIG5vdXJpc2gnZCB3aXRoIGxvdmVycycgdGVhcnM6CiAgICBXaGF0IGlzIGl0IGVsc2UIGEgbWFkbmVzcyBtb3N0IGRpc2NyZWV0LAogICAgQSBjaG9raW5nIGdhbGwgYW5kIGEgcHJlc2VydmluZyBzd2VldC4KICAgIEZhcmV3ZWxsLCBteSBjb3ouCgpCRU5WT0xJTwoKICAgIFNvZnQhIEkgd2lsbCBnbyBhbG9uZzsKICAgIEFuIGlmIHlvdSBsZWF2ZSBtZSBzbywgeW91IGRvIG1lIHdyb25nLgoKUk9NRU8KCiAgICBUdXQsIEkgaGF2ZSBsb3N0IG15c2VsZjsgSSBhbSBub3QgaGVyZTsKICAgIFRoaXMgaXMgbm90IFJvbWVvLCBoZSdzIHNvbWUgb3RoZXIgd2hlcmUuCgpCRU5WT0xJTwoKICAgIFRlbGwgbWUgaW4gc2FkbmVzcywgd2hvIGlzIHRoYXQgeW91IGxvdmUuCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIEkgZ3JvYW4gYW5kIHRlbGwgdGhlZT8KCkJFTlZPTElPCgogICAgR3JvYW4hIHdoeSwgbm8uCiAgICBCdXQgc2FkbHkgdGVsbCBtZSB3aG8uCgpST01FTwoKICAgIEJpZCBhIHNpY2sgbWFuIGluIHNhZG5lc3MgbWFrZSBoaXMgd2lsbDoKICAgIEFoLCB3b3JkIGlsbCB1cmdlZCB0byBvbmUgdGhhdCBpcyBzbyBpbGwhCiAgICBJbiBzYWRuZXNzLCBjb3VzaW4sIEkgZG8gbG92ZSBhIHdvbWFuLgoKQkVOVk9MSU8KCiAgICBJIGFpbSdkIHNvIG5lYXIsIHdoZW4gSSBzdXBwb3NlZCB5b3UgbG92ZWQuCgpST01FTwoKICAgIEEgcmlnaHQgZ29vZCBtYXJrLW1hbiEgQW5kIHNoZSdzIGZhaXIgSSBsb3ZlLgoKQkVOVk9MSU8KCiAgICBBIHJpZ2h0IGZhaXIgbWFyaywgZmFpciBjb3osIGlzIHNvb25lc3QgaGl0LgoKUk9NRU8KCiAgICBXZWxsLCBpbiB0aGF0IGhpdCB5b3UgbWlzczogc2hlJ2xsIG5vdCBiZSBoaXQKICAgIFdpdGggQ3VwaWQncyBhcnJvdzsgc2hlIGhhdGggRGlhbidzIHdpdDsKICAgIEFuZCwgaW4gc3Ryb25nIHByb29mIG9mIGNoYXN0aXR5IHdlbGwgYXJtJ2QsCiAgICBGcm9tIGxvdmUncyB3ZWFrIGNoaWxkaXNoIGJvdyBzaGUgbGl2ZXMgdW5oYXJtJ2QuCiAgICBTaGUgd2lsbCBub3Qgc3RheSB0aGUgc2llZ2Ugb2YgbG92aW5nIHRlcm1zLAogICAgTm9yIGJpZGUgdGhlIGVuY291bnRlciBvZiBhc3NhaWxpbmcgZXllcywKICAgIE5vciBvcGUgaGVyIGxhcCB0byBzYWludC1zZWR1Y2luZyBnb2xkOgogICAgTywgc2hlIGlzIHJpY2ggaW4gYmVhdXR5LCBvbmx5IHBvb3IsCiAgICBUaGF0IHdoZW4gc2hlIGRpZXMgd2l0aCBiZWF1dHkgZGllcyBoZXIgc3RvcmUuCgpCRU5WT0xJTwoKICAgIFRoZW4gc2hlIGhhdGggc3dvcm4gdGhhdCBzaGUgd2lsbCBzdGlsbCBsaXZlIGNoYXN0ZT8KClJPTUVPCgogICAgU2hlIGhhdGgsIGFuZCBpbiB0aGF0IHNwYXJpbmcgbWFrZXMgaHVnZSB3YXN0ZSwKICAgIEZvciBiZWF1dHkgc3RhcnZlZCB3aXRoIGhlciBzZXZlcml0eQogICAgQ3V0cyBiZWF1dHkgb2ZmIGZyb20gYWxsIHBvc3Rlcml0eS4KICAgIFNoZSBpcyB0b28gZmFpciwgdG9vIHdpc2UsIHdpc2VseSB0b28gZmFpciwKICAgIFRvIG1lcml0IGJsaXNzIGJ5IG1ha2luZyBtZSBkZXNwYWlyOgogICAgU2hlIGhhdGggZm9yc3dvcm4gdG8gbG92ZSwgYW5kIGluIHRoYXQgdm93CiAgICBEbyBJIGxpdmUgZGVhZCB0aGF0IGxpdmUgdG8gdGVsbCBpdCBub3cuCgpCRU5WT0xJTwoKICAgIEJlIHJ1bGVkIGJ5IG1lLCBmb3JnZXQgdG8gdGhpbmsgb2YgaGVyLgoKUk9NRU8KCiAgICBPLCB0ZWFjaCBtZSBob3cgSSBzaG91bGQgZm9yZ2V0IHRvIHRoaW5rLgoKQkVOVk9MSU8KCiAgICBCeSBnaXZpbmcgbGliZXJ0eSB1bnRvIHRoaW5lIGV5ZXM7CiAgICBFeGFtaW5lIG90aGVyIGJlYXV0aWVzLgoKUk9NRU8KCiAgICAnVGlzIHRoZSB3YXkKICAgIFRvIGNhbGwgaGVycyBleHF1aXNpdGUsIGluIHF1ZXN0aW9uIG1vcmU6CiAgICBUaGVzZSBoYXBweSBtYXNrcyB0aGF0IGtpc3MgZmFpciBsYWRpZXMnIGJyb3dzCiAgICBCZWluZyBibGFjayBwdXQgdXMgaW4gbWluZCB0aGV5IGhpZGUgdGhlIGZhaXI7CiAgICBIZSB0aGF0IGlzIHN0cnVja2VuIGJsaW5kIGNhbm5vdCBmb3JnZXQKICAgIFRoZSBwcmVjaW91cyB0cmVhc3VyZSBvZiBoaXMgZXllc2lnaHQgbG9zdDoKICAgIFNob3cgbWUgYSBtaXN0cmVzcyB0aGF0IGlzIHBhc3NpbmcgZmFpciwKICAgIFdoYXQgZG90aCBoZXIgYmVhdXR5IHNlcnZlLCBidXQgYXMgYSBub3RlCiAgICBXaGVyZSBJIG1heSByZWFkIHdobyBwYXNzJ2QgdGhhdCBwYXNzaW5nIGZhaXICiAgICBGYXJld2VsbDogdGhvdSBjYW5zdCBub3QgdGVhY2ggbWUgdG8gZm9yZ2V0LgoKQkVOVk9MSU8KCiAgICBJJ2xsIHBheSB0aGF0IGRvY3RyaW5lLCBvciBlbHNlIGRpZSBpbiBkZWJ0LgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEEgc3RyZWV0LgoKICAgIEVudGVyIENBUFVMRVQsIFBBUklTLCBhbmQgU2VydmFudCAKCkNBUFVMRVQKCiAgICBCdXQgTW9udGFndWUgaXMgYm91bmQgYXMgd2VsbCBhcyBJLAogICAgSW4gcGVuYWx0eSBhbGlrZTsgYW5kICd0aXMgbm90IGhhcmQsIEkgdGhpbmssCiAgICBGb3IgbWVuIHNvIG9sZCBhcyB3ZSB0byBrZWVwIHRoZSBwZWFjZS4KClBBUklTCgogICAgT2YgaG9ub3VyYWJsZSByZWNrb25pbmcgYXJlIHlvdSBib3RoOwogICAgQW5kIHBpdHkgJ3RpcyB5b3UgbGl2ZWQgYXQgb2RkcyBzbyBsb25nLgogICAgQnV0IG5vdywgbXkgbG9yZCwgd2hhdCBzYXkgeW91IHRvIG15IHN1aXQCgpDQVBVTEVUCgogICAgQnV0IHNheWluZyBvJ2VyIHdoYXQgSSBoYXZlIHNhaWQgYmVmb3JlOgogICAgTXkgY2hpbGQgaXMgeWV0IGEgc3RyYW5nZXIgaW4gdGhlIHdvcmxkOwogICAgU2hlIGhhdGggbm90IHNlZW4gdGhlIGNoYW5nZSBvZiBmb3VydGVlbiB5ZWFycywKICAgIExldCB0d28gbW9yZSBzdW1tZXJzIHdpdGhlciBpbiB0aGVpciBwcmlkZSwKICAgIEVyZSB3ZSBtYXkgdGhpbmsgaGVyIHJpcGUgdG8gYmUgYSBicmlkZS4KClBBUklTCgogICAgWW91bmdlciB0aGFuIHNoZSBhcmUgaGFwcHkgbW90aGVycyBtYWRlLgoKQ0FQVUxFVAoKICAgIEFuZCB0b28gc29vbiBtYXJyJ2QgYXJlIHRob3NlIHNvIGVhcmx5IG1hZGUuCiAgICBUaGUgZWFydGggaGF0aCBzd2FsbG93J2QgYWxsIG15IGhvcGVzIGJ1dCBzaGUsCiAgICBTaGUgaXMgdGhlIGhvcGVmdWwgbGFkeSBvZiBteSBlYXJ0aDoKICAgIEJ1dCB3b28gaGVyLCBnZW50bGUgUGFyaXMsIGdldCBoZXIgaGVhcnQsCiAgICBNeSB3aWxsIHRvIGhlciBjb25zZW50IGlzIGJ1dCBhIHBhcnQ7CiAgICBBbiBzaGUgYWdyZWUsIHdpdGhpbiBoZXIgc2NvcGUgb2YgY2hvaWNlCiAgICBMaWVzIG15IGNvbnNlbnQgYW5kIGZhaXIgYWNjb3JkaW5nIHZvaWNlLgogICAgVGhpcyBuaWdodCBJIGhvbGQgYW4gb2xkIGFjY3VzdG9tJ2QgZmVhc3QsCiAgICBXaGVyZXRvIEkgaGF2ZSBpbnZpdGVkIG1hbnkgYSBndWVzdCwKICAgIFN1Y2ggYXMgSSBsb3ZlOyBhbmQgeW91LCBhbW9uZyB0aGUgc3RvcmUsCiAgICBPbmUgbW9yZSwgbW9zdCB3ZWxjb21lLCBtYWtlcyBteSBudW1iZXIgbW9yZS4KICAgIEF0IG15IHBvb3IgaG91c2UgbG9vayB0byBiZWhvbGQgdGhpcyBuaWdodAogICAgRWFydGgtdHJlYWRpbmcgc3RhcnMgdGhhdCBtYWtlIGRhcmsgaGVhdmVuIGxpZ2h0OgogICAgU3VjaCBjb21mb3J0IGFzIGRvIGx1c3R5IHlvdW5nIG1lbiBmZWVsCiAgICBXaGVuIHdlbGwtYXBwYXJlbGwnZCBBcHJpbCBvbiB0aGUgaGVlbAogICAgT2YgbGltcGluZyB3aW50ZXIgdHJlYWRzLCBldmVuIHN1Y2ggZGVsaWdodAogICAgQW1vbmcgZnJlc2ggZmVtYWxlIGJ1ZHMgc2hhbGwgeW91IHRoaXMgbmlnaHQKICAgIEluaGVyaXQgYXQgbXkgaG91c2U7IGhlYXIgYWxsLCBhbGwgc2VlLAogICAgQW5kIGxpa2UgaGVyIG1vc3Qgd2hvc2UgbWVyaXQgbW9zdCBzaGFsbCBiZToKICAgIFdoaWNoIG9uIG1vcmUgdmlldywgb2YgbWFueSBtaW5lIGJlaW5nIG9uZQogICAgTWF5IHN0YW5kIGluIG51bWJlciwgdGhvdWdoIGluIHJlY2tvbmluZyBub25lLAogICAgQ29tZSwgZ28gd2l0aCBtZS4KCiAgICBUbyBTZXJ2YW50LCBnaXZpbmcgYSBwYXBlcgogICAgR28sIHNpcnJhaCwgdHJ1ZGdlIGFib3V0CiAgICBUaHJvdWdoIGZhaXIgVmVyb25hOyBmaW5kIHRob3NlIHBlcnNvbnMgb3V0CiAgICBXaG9zZSBuYW1lcyBhcmUgd3JpdHRlbiB0aGVyZSwgYW5kIHRvIHRoZW0gc2F5LAogICAgTXkgaG91c2UgYW5kIHdlbGNvbWUgb24gdGhlaXIgcGxlYXN1cmUgc3RheS4KCiAgICBFeGV1bnQgQ0FQVUxFVCBhbmQgUEFSSVMKClNlcnZhbnQKCiAgICBGaW5kIHRoZW0gb3V0IHdob3NlIG5hbWVzIGFyZSB3cml0dGVuIGhlcmUhIEl0IGlzCiAgICB3cml0dGVuLCB0aGF0IHRoZSBzaG9lbWFrZXIgc2hvdWxkIG1lZGRsZSB3aXRoIGhpcwogICAgeWFyZCwgYW5kIHRoZSB0YWlsb3Igd2l0aCBoaXMgbGFzdCwgdGhlIGZpc2hlciB3aXRoCiAgICBoaXMgcGVuY2lsLCBhbmQgdGhlIHBhaW50ZXIgd2l0aCBoaXMgbmV0czsgYnV0IEkgYW0KICAgIHNlbnQgdG8gZmluZCB0aG9zZSBwZXJzb25zIHdob3NlIG5hbWVzIGFyZSBoZXJlCiAgICB3cml0LCBhbmQgY2FuIG5ldmVyIGZpbmQgd2hhdCBuYW1lcyB0aGUgd3JpdGluZwogICAgcGVyc29uIGhhdGggaGVyZSB3cml0LiBJIG11c3QgdG8gdGhlIGxlYXJuZWQuLS1JbiBnb29kIHRpbWUuCgogICAgRW50ZXIgQkVOVk9MSU8gYW5kIFJPTUVPCgpCRU5WT0xJTwoKICAgIFR1dCwgbWFuLCBvbmUgZmlyZSBidXJucyBvdXQgYW5vdGhlcidzIGJ1cm5pbmcsCiAgICBPbmUgcGFpbiBpcyBsZXNzZW4nZCBieSBhbm90aGVyJ3MgYW5ndWlzaDsKICAgIFR1cm4gZ2lkZHksIGFuZCBiZSBob2xwIGJ5IGJhY2t3YXJkIHR1cm5pbmc7CiAgICBPbmUgZGVzcGVyYXRlIGdyaWVmIGN1cmVzIHdpdGggYW5vdGhlcidzIGxhbmd1aXNoOgogICAgVGFrZSB0aG91IHNvbWUgbmV3IGluZmVjdGlvbiB0byB0aHkgZXllLAogICAgQW5kIHRoZSByYW5rIHBvaXNvbiBvZiB0aGUgb2xkIHdpbGwgZGllLgoKUk9NRU8KCiAgICBZb3VyIHBsYWludGFpbi1sZWFmIGlzIGV4Y2VsbGVudCBmb3IgdGhhdC4KCkJFTlZPTElPCgogICAgRm9yIHdoYXQsIEkgcHJheSB0aGVlPwoKUk9NRU8KCiAgICBGb3IgeW91ciBicm9rZW4gc2hpbi4KCkJFTlZPTElPCgogICAgV2h5LCBSb21lbywgYXJ0IHRob3UgbWFkPwoKUk9NRU8KCiAgICBOb3QgbWFkLCBidXQgYm91bmQgbW9yZSB0aGFuIGEgbWFkLW1hbiBpczsKICAgIFNodXQgdXAgaW4gcHJpc29uLCBrZXB0IHdpdGhvdXQgbXkgZm9vZCwKICAgIFdoaXBwJ2QgYW5kIHRvcm1lbnRlZCBhbmQtLUdvZC1kZW4sIGdvb2QgZmVsbG93LgoKU2VydmFudAoKICAgIEdvZCBnaScgZ29kLWRlbi4gSSBwcmF5LCBzaXIsIGNhbiB5b3UgcmVhZD8KClJPTUVPCgogICAgQXksIG1pbmUgb3duIGZvcnR1bmUgaW4gbXkgbWlzZXJ5LgoKU2VydmFudAoKICAgIFBlcmhhcHMgeW91IGhhdmUgbGVhcm5lZCBpdCB3aXRob3V0IGJvb2s6IGJ1dCwgSQogICAgcHJheSwgY2FuIHlvdSByZWFkIGFueSB0aGluZyB5b3Ugc2VlPwoKUk9NRU8KCiAgICBBeSwgaWYgSSBrbm93IHRoZSBsZXR0ZXJzIGFuZCB0aGUgbGFuZ3VhZ2UuCgpTZXJ2YW50CgogICAgWWUgc2F5IGhvbmVzdGx5OiByZXN0IHlvdSBtZXJyeSEKClJPTUVPCgogICAgU3RheSwgZmVsbG93OyBJIGNhbiByZWFkLgoKICAgIFJlYWRzCiAgICAnU2lnbmlvciBNYXJ0aW5vIGFuZCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOwogICAgQ291bnR5IEFuc2VsbWUgYW5kIGhpcyBiZWF1dGVvdXMgc2lzdGVyczsgdGhlIGxhZHkKICAgIHdpZG93IG9mIFZpdHJhdmlvOyBTaWduaW9yIFBsYWNlbnRpbyBhbmQgaGlzIGxvdmVseQogICAgbmllY2VzOyBNZXJjdXRpbyBhbmQgaGlzIGJyb3RoZXIgVmFsZW50aW5lOyBtaW5lCiAgICB1bmNsZSBDYXB1bGV0LCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOyBteSBmYWlyIG5pZWNlCiAgICBSb3NhbGluZTsgTGl2aWE7IFNpZ25pb3IgVmFsZW50aW8gYW5kIGhpcyBjb3VzaW4KICAgIFR5YmFsdCwgTHVjaW8gYW5kIHRoZSBsaXZlbHkgSGVsZW5hLicgQSBmYWlyCiAgICBhc3NlbWJseTogd2hpdGhlciBzaG91bGQgdGhleSBjb21lPwoKU2VydmFudAoKICAgIFVwLgoKUk9NRU8KCiAgICBXaGl0aGVyPwoKU2VydmFudAoKICAgIFRvIHN1cHBlcjsgdG8gb3VyIGhvdXNlLgoKUk9NRU8KCiAgICBXaG9zZSBob3VzZT8KClNlcnZhbnQKCiAgICBNeSBtYXN0ZXIncy4KClJPTUVPCgogICAgSW5kZWVkLCBJIHNob3VsZCBoYXZlIGFzaydkIHlvdSB0aGF0IGJlZm9yZS4KClNlcnZhbnQKCiAgICBOb3cgSSdsbCB0ZWxsIHlvdSB3aXRob3V0IGFza2luZzogbXkgbWFzdGVyIGlzIHRoZQogICAgZ3JlYXQgcmljaCBDYXB1bGV0OyBhbmQgaWYgeW91IGJlIG5vdCBvZiB0aGUgaG91c2UKICAgIG9mIE1vbnRhZ3VlcywgSSBwcmF5LCBjb21lIGFuZCBjcnVzaCBhIGN1cCBvZiB3aW5lLgogICAgUmVzdCB5b3UgbWVycnkhCgogICAgRXhpdAoKQkVOVk9MSU8KCiAgICBBdCB0aGlzIHNhbWUgYW5jaWVudCBmZWFzdCBvZiBDYXB1bGV0J3MKICAgIFN1cHMgdGhlIGZhaXIgUm9zYWxpbmUgd2hvbSB0aG91IHNvIGxvdmVzdCwKICAgIFdpdGggYWxsIHRoZSBhZG1pcmVkIGJlYXV0aWVzIG9mIFZlcm9uYToKICAgIEdvIHRoaXRoZXI7IGFuZCwgd2l0aCB1bmF0dGFpbnRlZCBleWUsCiAgICBDb21wYXJlIGhlciBmYWNlIHdpdGggc29tZSB0aGF0IEkgc2hhbGwgc2hvdywKICAgIEFuZCBJIHdpbGwgbWFrZSB0aGVlIHRoaW5rIHRoeSBzd2FuIGEgY3Jvdy4KClJPTUVPCgogICAgV2hlbiB0aGUgZGV2b3V0IHJlbGlnaW9uIG9mIG1pbmUgZXllCiAgICBNYWludGFpbnMgc3VjaCBmYWxzZWhvb2QsIHRoZW4gdHVybiB0ZWFycyB0byBmaXJlczsKICAgIEFuZCB0aGVzZSwgd2hvIG9mdGVuIGRyb3duJ2QgY291bGQgbmV2ZXIgZGllLAogICAgVHJhbnNwYXJlbnQgaGVyZXRpY3MsIGJlIGJ1cm50IGZvciBsaWFycyEKICAgIE9uZSBmYWlyZXIgdGhhbiBteSBsb3ZlISB0aGUgYWxsLXNlZWluZyBzdW4KICAgIE5lJ2VyIHNhdyBoZXIgbWF0Y2ggc2luY2UgZmlyc3QgdGhlIHdvcmxkIGJlZ3VuLgoKQkVOVk9MSU8KCiAgICBUdXQsIHlvdSBzYXcgaGVyIGZhaXIsIG5vbmUgZWxzZSBiZWluZyBieSwKICAgIEhlcnNlbGYgcG9pc2VkIHdpdGggaGVyc2VsZiBpbiBlaXRoZXIgZXllOgogICAgQnV0IGluIHRoYXQgY3J5c3RhbCBzY2FsZXMgbGV0IHRoZXJlIGJlIHdlaWdoJ2QKICAgIFlvdXIgbGFkeSdzIGxvdmUgYWdhaW5zdCBzb21lIG90aGVyIG1haWQKICAgIFRoYXQgSSB3aWxsIHNob3cgeW91IHNoaW5pbmcgYXQgdGhpcyBmZWFzdCwKICAgIEFuZCBzaGUgc2hhbGwgc2NhbnQgc2hvdyB3ZWxsIHRoYXQgbm93IHNob3dzIGJlc3QuCgpST01FTwoKICAgIEknbGwgZ28gYWxvbmcsIG5vIHN1Y2ggc2lnaHQgdG8gYmUgc2hvd24sCiAgICBCdXQgdG8gcmVqb2ljZSBpbiBzcGxlbmRvciBvZiBtaW5lIG93bi4KCiAgICBFeGV1bnQKClNDRU5FIElJSS4gQSByb29tIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgTnVyc2UsIHdoZXJlJ3MgbXkgZGF1Z2h0ZXIIGNhbGwgaGVyIGZvcnRoIHRvIG1lLgoKTnVyc2UKCiAgICBOb3csIGJ5IG15IG1haWRlbmhlYWQsIGF0IHR3ZWx2ZSB5ZWFyIG9sZCwKICAgIEkgYmFkZSBoZXIgY29tZS4gV2hhdCwgbGFtYiEgd2hhdCwgbGFkeWJpcmQhCiAgICBHb2QgZm9yYmlkISBXaGVyZSdzIHRoaXMgZ2lybD8gV2hhdCwgSnVsaWV0IQoKICAgIEVudGVyIEpVTElFVAoKSlVMSUVUCgogICAgSG93IG5vdyEgd2hvIGNhbGxzPwoKTnVyc2UKCiAgICBZb3VyIG1vdGhlci4KCkpVTElFVAoKICAgIE1hZGFtLCBJIGFtIGhlcmUuCiAgICBXaGF0IGlzIHlvdXIgd2lsbD8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoaXMgaXMgdGhlIG1hdHRlcjotLU51cnNlLCBnaXZlIGxlYXZlIGF3aGlsZSwKICAgIFdlIG11c3QgdGFsayBpbiBzZWNyZXQ6LS1udXJzZSwgY29tZSBiYWNrIGFnYWluOwogICAgSSBoYXZlIHJlbWVtYmVyJ2QgbWUsIHRob3UncyBoZWFyIG91ciBjb3Vuc2VsLgogICAgVGhvdSBrbm93J3N0IG15IGRhdWdodGVyJ3Mgb2YgYSBwcmV0dHkgYWdlLgoKTnVyc2UKCiAgICBGYWl0aCwgSSBjYW4gdGVsbCBoZXIgYWdlIHVudG8gYW4gaG91ci4KCkxBRFkgQ0FQVUxFVAoKICAgIFNoZSdzIG5vdCBmb3VydGVlbi4KCk51cnNlCgogICAgSSdsbCBsYXkgZm91cnRlZW4gb2YgbXkgdGVldGgsLS0KICAgIEFuZCB5ZXQsIHRvIG15IHRlZXRoIGJlIGl0IHNwb2tlbiwgSSBoYXZlIGJ1dCBmb3VyLS0KICAgIFNoZSBpcyBub3QgZm91cnRlZW4uIEhvdyBsb25nIGlzIGl0IG5vdwogICAgVG8gTGFtbWFzLXRpZGUCgpMQURZIENBUFVMRVQKCiAgICBBIGZvcnRuaWdodCBhbmQgb2RkIGRheXMuCgpOdXJzZQoKICAgIEV2ZW4gb3Igb2RkLCBvZiBhbGwgZGF5cyBpbiB0aGUgeWVhciwKICAgIENvbWUgTGFtbWFzLWV2ZSBhdCBuaWdodCBzaGFsbCBzaGUgYmUgZm91cnRlZW4uCiAgICBTdXNhbiBhbmQgc2hlLS1Hb2QgcmVzdCBhbGwgQ2hyaXN0aWFuIHNvdWxzIS0tCiAgICBXZXJlIG9mIGFuIGFnZTogd2VsbCwgU3VzYW4gaXMgd2l0aCBHb2Q7CiAgICBTaGUgd2FzIHRvbyBnb29kIGZvciBtZTogYnV0LCBhcyBJIHNhaWQsCiAgICBPbiBMYW1tYXMtZXZlIGF0IG5pZ2h0IHNoYWxsIHNoZSBiZSBmb3VydGVlbjsKICAgIFRoYXQgc2hhbGwgc2hlLCBtYXJyeTsgSSByZW1lbWJlciBpdCB3ZWxsLgogICAgJ1RpcyBzaW5jZSB0aGUgZWFydGhxdWFrZSBub3cgZWxldmVuIHllYXJzOwogICAgQW5kIHNoZSB3YXMgd2VhbidkLC0tSSBuZXZlciBzaGFsbCBmb3JnZXQgaXQsLS0KICAgIE9mIGFsbCB0aGUgZGF5cyBvZiB0aGUgeWVhciwgdXBvbiB0aGF0IGRheToKICAgIEZvciBJIGhhZCB0aGVuIGxhaWQgd29ybXdvb2QgdG8gbXkgZHVnLAogICAgU2l0dGluZyBpbiB0aGUgc3VuIHVuZGVyIHRoZSBkb3ZlLWhvdXNlIHdhbGw7CiAgICBNeSBsb3JkIGFuZCB5b3Ugd2VyZSB0aGVuIGF0IE1hbnR1YTotLQogICAgTmF5LCBJIGRvIGJlYXIgYSBicmFpbjotLWJ1dCwgYXMgSSBzYWlkLAogICAgV2hlbiBpdCBkaWQgdGFzdGUgdGhlIHdvcm13b29kIG9uIHRoZSBuaXBwbGUKICAgIE9mIG15IGR1ZyBhbmQgZmVsdCBpdCBiaXR0ZXIsIHByZXR0eSBmb29sLAogICAgVG8gc2VlIGl0IHRldGNoeSBhbmQgZmFsbCBvdXQgd2l0aCB0aGUgZHVnIQogICAgU2hha2UgcXVvdGggdGhlIGRvdmUtaG91c2U6ICd0d2FzIG5vIG5lZWQsIEkgdHJvdywKICAgIFRvIGJpZCBtZSB0cnVkZ2U6CiAgICBBbmQgc2luY2UgdGhhdCB0aW1lIGl0IGlzIGVsZXZlbiB5ZWFyczsKICAgIEZvciB0aGVuIHNoZSBjb3VsZCBzdGFuZCBhbG9uZTsgbmF5LCBieSB0aGUgcm9vZCwKICAgIFNoZSBjb3VsZCBoYXZlIHJ1biBhbmQgd2FkZGxlZCBhbGwgYWJvdXQ7CiAgICBGb3IgZXZlbiB0aGUgZGF5IGJlZm9yZSwgc2hlIGJyb2tlIGhlciBicm93OgogICAgQW5kIHRoZW4gbXkgaHVzYmFuZC0tR29kIGJlIHdpdGggaGlzIHNvdWwhCiAgICBBJyB3YXMgYSBtZXJyeSBtYW4tLXRvb2sgdXAgdGhlIGNoaWxkOgogICAgJ1llYSwnIHF1b3RoIGhlLCAnZG9zdCB0aG91IGZhbGwgdXBvbiB0aHkgZmFjZT8KICAgIFRob3Ugd2lsdCBmYWxsIGJhY2t3YXJkIHdoZW4gdGhvdSBoYXN0IG1vcmUgd2l0OwogICAgV2lsdCB0aG91IG5vdCwgSnVsZT8nIGFuZCwgYnkgbXkgaG9saWRhbWUsCiAgICBUaGUgcHJldHR5IHdyZXRjaCBsZWZ0IGNyeWluZyBhbmQgc2FpZCAnQXkuJwogICAgVG8gc2VlLCBub3csIGhvdyBhIGplc3Qgc2hhbGwgY29tZSBhYm91dCEKICAgIEkgd2FycmFudCwgYW4gSSBzaG91bGQgbGl2ZSBhIHRob3VzYW5kIHllYXJzLAogICAgSSBuZXZlciBzaG91bGQgZm9yZ2V0IGl0OiAnV2lsdCB0aG91IG5vdCwgSnVsZT8nIHF1b3RoIGhlOwogICAgQW5kLCBwcmV0dHkgZm9vbCwgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKTEFEWSBDQVBVTEVUCgogICAgRW5vdWdoIG9mIHRoaXM7IEkgcHJheSB0aGVlLCBob2xkIHRoeSBwZWFjZS4KCk51cnNlCgogICAgWWVzLCBtYWRhbTogeWV0IEkgY2Fubm90IGNob29zZSBidXQgbGF1Z2gsCiAgICBUbyB0aGluayBpdCBzaG91bGQgbGVhdmUgY3J5aW5nIGFuZCBzYXkgJ0F5LicKICAgIEFuZCB5ZXQsIEkgd2FycmFudCwgaXQgaGFkIHVwb24gaXRzIGJyb3cKICAgIEEgYnVtcCBhcyBiaWcgYXMgYSB5b3VuZyBjb2NrZXJlbCdzIHN0b25lOwogICAgQSBwYXJsb3VzIGtub2NrOyBhbmQgaXQgY3JpZWQgYml0dGVybHk6CiAgICAnWWVhLCcgcXVvdGggbXkgaHVzYmFuZCwnZmFsbCdzdCB1cG9uIHRoeSBmYWNlPwogICAgVGhvdSB3aWx0IGZhbGwgYmFja3dhcmQgd2hlbiB0aG91IGNvbWVzdCB0byBhZ2U7CiAgICBXaWx0IHRob3Ugbm90LCBKdWxlPycgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKSlVMSUVUCgogICAgQW5kIHN0aW50IHRob3UgdG9vLCBJIHByYXkgdGhlZSwgbnVyc2UsIHNheSBJLgoKTnVyc2UKCiAgICBQZWFjZSwgSSBoYXZlIGRvbmUuIEdvZCBtYXJrIHRoZWUgdG8gaGlzIGdyYWNlIQogICAgVGhvdSB3YXN0IHRoZSBwcmV0dGllc3QgYmFiZSB0aGF0IGUnZXIgSSBudXJzZWQ6CiAgICBBbiBJIG1pZ2h0IGxpdmUgdG8gc2VlIHRoZWUgbWFycmllZCBvbmNlLAogICAgSSBoYXZlIG15IHdpc2guCgpMQURZIENBUFVMRVQKCiAgICBNYXJyeSwgdGhhdCAnbWFycnknIGlzIHRoZSB2ZXJ5IHRoZW1lCiAgICBJIGNhbWUgdG8gdGFsayBvZi4gVGVsbCBtZSwgZGF1Z2h0ZXIgSnVsaWV0LAogICAgSG93IHN0YW5kcyB5b3VyIGRpc3Bvc2l0aW9uIHRvIGJlIG1hcnJpZWQCgpKVUxJRVQKCiAgICBJdCBpcyBhbiBob25vdXIgdGhhdCBJIGRyZWFtIG5vdCBvZi4KCk51cnNlCgogICAgQW4gaG9ub3VyISB3ZXJlIG5vdCBJIHRoaW5lIG9ubHkgbnVyc2UsCiAgICBJIHdvdWxkIHNheSB0aG91IGhhZHN0IHN1Y2snZCB3aXNkb20gZnJvbSB0aHkgdGVhdC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHRoaW5rIG9mIG1hcnJpYWdlIG5vdzsgeW91bmdlciB0aGFuIHlvdSwKICAgIEhlcmUgaW4gVmVyb25hLCBsYWRpZXMgb2YgZXN0ZWVtLAogICAgQXJlIG1hZGUgYWxyZWFkeSBtb3RoZXJzOiBieSBteSBjb3VudCwKICAgIEkgd2FzIHlvdXIgbW90aGVyIG11Y2ggdXBvbiB0aGVzZSB5ZWFycwogICAgVGhhdCB5b3UgYXJlIG5vdyBhIG1haWQuIFRodXMgdGhlbiBpbiBicmllZjoKICAgIFRoZSB2YWxpYW50IFBhcmlzIHNlZWtzIHlvdSBmb3IgaGlzIGxvdmUuCgpOdXJzZQoKICAgIEEgbWFuLCB5b3VuZyBsYWR5ISBsYWR5LCBzdWNoIGEgbWFuCiAgICBBcyBhbGwgdGhlIHdvcmxkLS13aHksIGhlJ3MgYSBtYW4gb2Ygd2F4LgoKTEFEWSBDQVBVTEVUCgogICAgVmVyb25hJ3Mgc3VtbWVyIGhhdGggbm90IHN1Y2ggYSBmbG93ZXIuCgpOdXJzZQoKICAgIE5heSwgaGUncyBhIGZsb3dlcjsgaW4gZmFpdGgsIGEgdmVyeSBmbG93ZXIuCgpMQURZIENBUFVMRVQKCiAgICBXaGF0IHNheSB5b3UIGNhbiB5b3UgbG92ZSB0aGUgZ2VudGxlbWFuPwogICAgVGhpcyBuaWdodCB5b3Ugc2hhbGwgYmVob2xkIGhpbSBhdCBvdXIgZmVhc3Q7CiAgICBSZWFkIG8nZXIgdGhlIHZvbHVtZSBvZiB5b3VuZyBQYXJpcycgZmFjZSwKICAgIEFuZCBmaW5kIGRlbGlnaHQgd3JpdCB0aGVyZSB3aXRoIGJlYXV0eSdzIHBlbjsKICAgIEV4YW1pbmUgZXZlcnkgbWFycmllZCBsaW5lYW1lbnQsCiAgICBBbmQgc2VlIGhvdyBvbmUgYW5vdGhlciBsZW5kcyBjb250ZW50CiAgICBBbmQgd2hhdCBvYnNjdXJlZCBpbiB0aGlzIGZhaXIgdm9sdW1lIGxpZXMKICAgIEZpbmQgd3JpdHRlbiBpbiB0aGUgbWFyZ2VudCBvZiBoaXMgZXllcy4KICAgIFRoaXMgcHJlY2lvdXMgYm9vayBvZiBsb3ZlLCB0aGlzIHVuYm91bmQgbG92ZXIsCiAgICBUbyBiZWF1dGlmeSBoaW0sIG9ubHkgbGFja3MgYSBjb3ZlcjoKICAgIFRoZSBmaXNoIGxpdmVzIGluIHRoZSBzZWEsIGFuZCAndGlzIG11Y2ggcHJpZGUKICAgIEZvciBmYWlyIHdpdGhvdXQgdGhlIGZhaXIgd2l0aGluIHRvIGhpZGU6CiAgICBUaGF0IGJvb2sgaW4gbWFueSdzIGV5ZXMgZG90aCBzaGFyZSB0aGUgZ2xvcnksCiAgICBUaGF0IGluIGdvbGQgY2xhc3BzIGxvY2tzIGluIHRoZSBnb2xkZW4gc3Rvcnk7CiAgICBTbyBzaGFsbCB5b3Ugc2hhcmUgYWxsIHRoYXQgaGUgZG90aCBwb3NzZXNzLAogICAgQnkgaGF2aW5nIGhpbSwgbWFraW5nIHlvdXJzZWxmIG5vIGxlc3MuCgpOdXJzZQoKICAgIE5vIGxlc3MhIG5heSwgYmlnZ2VyOyB3b21lbiBncm93IGJ5IG1lbi4KCkxBRFkgQ0FQVUxFVAoKICAgIFNwZWFrIGJyaWVmbHksIGNhbiB5b3UgbGlrZSBvZiBQYXJpcycgbG92ZT8KCkpVTElFVAoKICAgIEknbGwgbG9vayB0byBsaWtlLCBpZiBsb29raW5nIGxpa2luZyBtb3ZlOgogICAgQnV0IG5vIG1vcmUgZGVlcCB3aWxsIEkgZW5kYXJ0IG1pbmUgZXllCiAgICBUaGFuIHlvdXIgY29uc2VudCBnaXZlcyBzdHJlbmd0aCB0byBtYWtlIGl0IGZseS4KCiAgICBFbnRlciBhIFNlcnZhbnQKClNlcnZhbnQKCiAgICBNYWRhbSwgdGhlIGd1ZXN0cyBhcmUgY29tZSwgc3VwcGVyIHNlcnZlZCB1cCwgeW91CiAgICBjYWxsZWQsIG15IHlvdW5nIGxhZHkgYXNrZWQgZm9yLCB0aGUgbnVyc2UgY3Vyc2VkIGluCiAgICB0aGUgcGFudHJ5LCBhbmQgZXZlcnkgdGhpbmcgaW4gZXh0cmVtaXR5LiBJIG11c3QKICAgIGhlbmNlIHRvIHdhaXQ7IEkgYmVzZWVjaCB5b3UsIGZvbGxvdyBzdHJhaWdodC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlIGZvbGxvdyB0aGVlLgoKICAgIEV4aXQgU2VydmFudAogICAgSnVsaWV0LCB0aGUgY291bnR5IHN0YXlzLgoKTnVyc2UKCiAgICBHbywgZ2lybCwgc2VlayBoYXBweSBuaWdodHMgdG8gaGFwcHkgZGF5cy4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBST01FTywgTUVSQ1VUSU8sIEJFTlZPTElPLCB3aXRoIGZpdmUgb3Igc2l4IE1hc2tlcnMsIFRvcmNoLWJlYXJlcnMsIGFuZCBvdGhlcnMgCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIHRoaXMgc3BlZWNoIGJlIHNwb2tlIGZvciBvdXIgZXhjdXNlPwogICAgT3Igc2hhbGwgd2Ugb24gd2l0aG91dCBhIGFwb2xvZ3kCgpCRU5WT0xJTwoKICAgIFRoZSBkYXRlIGlzIG91dCBvZiBzdWNoIHByb2xpeGl0eToKICAgIFdlJ2xsIGhhdmUgbm8gQ3VwaWQgaG9vZHdpbmsnZCB3aXRoIGEgc2NhcmYsCiAgICBCZWFyaW5nIGEgVGFydGFyJ3MgcGFpbnRlZCBib3cgb2YgbGF0aCwKICAgIFNjYXJpbmcgdGhlIGxhZGllcyBsaWtlIGEgY3Jvdy1rZWVwZXI7CiAgICBOb3Igbm8gd2l0aG91dC1ib29rIHByb2xvZ3VlLCBmYWludGx5IHNwb2tlCiAgICBBZnRlciB0aGUgcHJvbXB0ZXIsIGZvciBvdXIgZW50cmFuY2U6CiAgICBCdXQgbGV0IHRoZW0gbWVhc3VyZSB1cyBieSB3aGF0IHRoZXkgd2lsbDsKICAgIFdlJ2xsIG1lYXN1cmUgdGhlbSBhIG1lYXN1cmUsIGFuZCBiZSBnb25lLgoKUk9NRU8KCiAgICBHaXZlIG1lIGEgdG9yY2g6IEkgYW0gbm90IGZvciB0aGlzIGFtYmxpbmc7CiAgICBCZWluZyBidXQgaGVhdnksIEkgd2lsbCBiZWFyIHRoZSBsaWdodC4KCk1FUkNVVElPCgogICAgTmF5LCBnZW50bGUgUm9tZW8sIHdlIG11c3QgaGF2ZSB5b3UgZGFuY2UuCgpST01FTwoKICAgIE5vdCBJLCBiZWxpZXZlIG1lOiB5b3UgaGF2ZSBkYW5jaW5nIHNob2VzCiAgICBXaXRoIG5pbWJsZSBzb2xlczogSSBoYXZlIGEgc291bCBvZiBsZWFkCiAgICBTbyBzdGFrZXMgbWUgdG8gdGhlIGdyb3VuZCBJIGNhbm5vdCBtb3ZlLgoKTUVSQ1VUSU8KCiAgICBZb3UgYXJlIGEgbG92ZXI7IGJvcnJvdyBDdXBpZCdzIHdpbmdzLAogICAgQW5kIHNvYXIgd2l0aCB0aGVtIGFib3ZlIGEgY29tbW9uIGJvdW5kLgoKUk9NRU8KCiAgICBJIGFtIHRvbyBzb3JlIGVucGllcmNlZCB3aXRoIGhpcyBzaGFmdAogICAgVG8gc29hciB3aXRoIGhpcyBsaWdodCBmZWF0aGVycywgYW5kIHNvIGJvdW5kLAogICAgSSBjYW5ub3QgYm91bmQgYSBwaXRjaCBhYm92ZSBkdWxsIHdvZToKICAgIFVuZGVyIGxvdmUncyBoZWF2eSBidXJkZW4gZG8gSSBzaW5rLgoKTUVSQ1VUSU8KCiAgICBBbmQsIHRvIHNpbmsgaW4gaXQsIHNob3VsZCB5b3UgYnVyZGVuIGxvdmU7CiAgICBUb28gZ3JlYXQgb3BwcmVzc2lvbiBmb3IgYSB0ZW5kZXIgdGhpbmcuCgpST01FTwoKICAgIElzIGxvdmUgYSB0ZW5kZXIgdGhpbmcIGl0IGlzIHRvbyByb3VnaCwKICAgIFRvbyBydWRlLCB0b28gYm9pc3Rlcm91cywgYW5kIGl0IHByaWNrcyBsaWtlIHRob3JuLgoKTUVSQ1VUSU8KCiAgICBJZiBsb3ZlIGJlIHJvdWdoIHdpdGggeW91LCBiZSByb3VnaCB3aXRoIGxvdmU7CiAgICBQcmljayBsb3ZlIGZvciBwcmlja2luZywgYW5kIHlvdSBiZWF0IGxvdmUgZG93bi4KICAgIEdpdmUgbWUgYSBjYXNlIHRvIHB1dCBteSB2aXNhZ2UgaW46CiAgICBBIHZpc29yIGZvciBhIHZpc29yISB3aGF0IGNhcmUgSQogICAgV2hhdCBjdXJpb3VzIGV5ZSBkb3RoIHF1b3RlIGRlZm9ybWl0aWVzPwogICAgSGVyZSBhcmUgdGhlIGJlZXRsZSBicm93cyBzaGFsbCBibHVzaCBmb3IgbWUuCgpCRU5WT0xJTwoKICAgIENvbWUsIGtub2NrIGFuZCBlbnRlcjsgYW5kIG5vIHNvb25lciBpbiwKICAgIEJ1dCBldmVyeSBtYW4gYmV0YWtlIGhpbSB0byBoaXMgbGVncy4KClJPTUVPCgogICAgQSB0b3JjaCBmb3IgbWU6IGxldCB3YW50b25zIGxpZ2h0IG9mIGhlYXJ0CiAgICBUaWNrbGUgdGhlIHNlbnNlbGVzcyBydXNoZXMgd2l0aCB0aGVpciBoZWVscywKICAgIEZvciBJIGFtIHByb3ZlcmInZCB3aXRoIGEgZ3JhbmRzaXJlIHBocmFzZTsKICAgIEknbGwgYmUgYSBjYW5kbGUtaG9sZGVyLCBhbmQgbG9vayBvbi4KICAgIFRoZSBnYW1lIHdhcyBuZSdlciBzbyBmYWlyLCBhbmQgSSBhbSBkb25lLgoKTUVSQ1VUSU8KCiAgICBUdXQsIGR1bidzIHRoZSBtb3VzZSwgdGhlIGNvbnN0YWJsZSdzIG93biB3b3JkOgogICAgSWYgdGhvdSBhcnQgZHVuLCB3ZSdsbCBkcmF3IHRoZWUgZnJvbSB0aGUgbWlyZQogICAgT2YgdGhpcyBzaXItcmV2ZXJlbmNlIGxvdmUsIHdoZXJlaW4gdGhvdSBzdGljaydzdAogICAgVXAgdG8gdGhlIGVhcnMuIENvbWUsIHdlIGJ1cm4gZGF5bGlnaHQsIGhvIQoKUk9NRU8KCiAgICBOYXksIHRoYXQncyBub3Qgc28uCgpNRVJDVVRJTwoKICAgIEkgbWVhbiwgc2lyLCBpbiBkZWxheQogICAgV2Ugd2FzdGUgb3VyIGxpZ2h0cyBpbiB2YWluLCBsaWtlIGxhbXBzIGJ5IGRheS4KICAgIFRha2Ugb3VyIGdvb2QgbWVhbmluZywgZm9yIG91ciBqdWRnbWVudCBzaXRzCiAgICBGaXZlIHRpbWVzIGluIHRoYXQgZXJlIG9uY2UgaW4gb3VyIGZpdmUgd2l0cy4KClJPTUVPCgogICAgQW5kIHdlIG1lYW4gd2VsbCBpbiBnb2luZyB0byB0aGlzIG1hc2s7CiAgICBCdXQgJ3RpcyBubyB3aXQgdG8gZ28uCgpNRVJDVVRJTwoKICAgIFdoeSwgbWF5IG9uZSBhc2sCgpST01FTwoKICAgIEkgZHJlYW0nZCBhIGRyZWFtIHRvLW5pZ2h0LgoKTUVSQ1VUSU8KCiAgICBBbmQgc28gZGlkIEkuCgpST01FTwoKICAgIFdlbGwsIHdoYXQgd2FzIHlvdXJzPwoKTUVSQ1VUSU8KCiAgICBUaGF0IGRyZWFtZXJzIG9mdGVuIGxpZS4KClJPTUVPCgogICAgSW4gYmVkIGFzbGVlcCwgd2hpbGUgdGhleSBkbyBkcmVhbSB0aGluZ3MgdHJ1ZS4KCk1FUkNVVElPCgogICAgTywgdGhlbiwgSSBzZWUgUXVlZW4gTWFiIGhhdGggYmVlbiB3aXRoIHlvdS4KICAgIFNoZSBpcyB0aGUgZmFpcmllcycgbWlkd2lmZSwgYW5kIHNoZSBjb21lcwogICAgSW4gc2hhcGUgbm8gYmlnZ2VyIHRoYW4gYW4gYWdhdGUtc3RvbmUKICAgIE9uIHRoZSBmb3JlLWZpbmdlciBvZiBhbiBhbGRlcm1hbiwKICAgIERyYXduIHdpdGggYSB0ZWFtIG9mIGxpdHRsZSBhdG9taWVzCiAgICBBdGh3YXJ0IG1lbidzIG5vc2VzIGFzIHRoZXkgbGllIGFzbGVlcDsKICAgIEhlciB3YWdvbi1zcG9rZXMgbWFkZSBvZiBsb25nIHNwaWRlcnMnIGxlZ3MsCiAgICBUaGUgY292ZXIgb2YgdGhlIHdpbmdzIG9mIGdyYXNzaG9wcGVycywKICAgIFRoZSB0cmFjZXMgb2YgdGhlIHNtYWxsZXN0IHNwaWRlcidzIHdlYiwKICAgIFRoZSBjb2xsYXJzIG9mIHRoZSBtb29uc2hpbmUncyB3YXRlcnkgYmVhbXMsCiAgICBIZXIgd2hpcCBvZiBjcmlja2V0J3MgYm9uZSwgdGhlIGxhc2ggb2YgZmlsbSwKICAgIEhlciB3YWdvbmVyIGEgc21hbGwgZ3JleS1jb2F0ZWQgZ25hdCwKICAgIE5vdCBzbyBiaWcgYXMgYSByb3VuZCBsaXR0bGUgd29ybQogICAgUHJpY2snZCBmcm9tIHRoZSBsYXp5IGZpbmdlciBvZiBhIG1haWQ7CiAgICBIZXIgY2hhcmlvdCBpcyBhbiBlbXB0eSBoYXplbC1udXQKICAgIE1hZGUgYnkgdGhlIGpvaW5lciBzcXVpcnJlbCBvciBvbGQgZ3J1YiwKICAgIFRpbWUgb3V0IG8nIG1pbmQgdGhlIGZhaXJpZXMnIGNvYWNobWFrZXJzLgogICAgQW5kIGluIHRoaXMgc3RhdGUgc2hlIGdhbGxvcHMgbmlnaHQgYnkgbmlnaHQKICAgIFRocm91Z2ggbG92ZXJzJyBicmFpbnMsIGFuZCB0aGVuIHRoZXkgZHJlYW0gb2YgbG92ZTsKICAgIE8nZXIgY291cnRpZXJzJyBrbmVlcywgdGhhdCBkcmVhbSBvbiBjb3VydCdzaWVzIHN0cmFpZ2h0LAogICAgTydlciBsYXd5ZXJzJyBmaW5nZXJzLCB3aG8gc3RyYWlnaHQgZHJlYW0gb24gZmVlcywKICAgIE8nZXIgbGFkaWVzICcgbGlwcywgd2hvIHN0cmFpZ2h0IG9uIGtpc3NlcyBkcmVhbSwKICAgIFdoaWNoIG9mdCB0aGUgYW5ncnkgTWFiIHdpdGggYmxpc3RlcnMgcGxhZ3VlcywKICAgIEJlY2F1c2UgdGhlaXIgYnJlYXRocyB3aXRoIHN3ZWV0bWVhdHMgdGFpbnRlZCBhcmU6CiAgICBTb21ldGltZSBzaGUgZ2FsbG9wcyBvJ2VyIGEgY291cnRpZXIncyBub3NlLAogICAgQW5kIHRoZW4gZHJlYW1zIGhlIG9mIHNtZWxsaW5nIG91dCBhIHN1aXQ7CiAgICBBbmQgc29tZXRpbWUgY29tZXMgc2hlIHdpdGggYSB0aXRoZS1waWcncyB0YWlsCiAgICBUaWNrbGluZyBhIHBhcnNvbidzIG5vc2UgYXMgYScgbGllcyBhc2xlZXAsCiAgICBUaGVuIGRyZWFtcywgaGUgb2YgYW5vdGhlciBiZW5lZmljZToKICAgIFNvbWV0aW1lIHNoZSBkcml2ZXRoIG8nZXIgYSBzb2xkaWVyJ3MgbmVjaywKICAgIEFuZCB0aGVuIGRyZWFtcyBoZSBvZiBjdXR0aW5nIGZvcmVpZ24gdGhyb2F0cywKICAgIE9mIGJyZWFjaGVzLCBhbWJ1c2NhZG9lcywgU3BhbmlzaCBibGFkZXMsCiAgICBPZiBoZWFsdGhzIGZpdmUtZmF0aG9tIGRlZXA7IGFuZCB0aGVuIGFub24KICAgIERydW1zIGluIGhpcyBlYXIsIGF0IHdoaWNoIGhlIHN0YXJ0cyBhbmQgd2FrZXMsCiAgICBBbmQgYmVpbmcgdGh1cyBmcmlnaHRlZCBzd2VhcnMgYSBwcmF5ZXIgb3IgdHdvCiAgICBBbmQgc2xlZXBzIGFnYWluLiBUaGlzIGlzIHRoYXQgdmVyeSBNYWIKICAgIFRoYXQgcGxhdHMgdGhlIG1hbmVzIG9mIGhvcnNlcyBpbiB0aGUgbmlnaHQsCiAgICBBbmQgYmFrZXMgdGhlIGVsZmxvY2tzIGluIGZvdWwgc2x1dHRpc2ggaGFpcnMsCiAgICBXaGljaCBvbmNlIHVudGFuZ2xlZCwgbXVjaCBtaXNmb3J0dW5lIGJvZGVzOgogICAgVGhpcyBpcyB0aGUgaGFnLCB3aGVuIG1haWRzIGxpZSBvbiB0aGVpciBiYWNrcywKICAgIFRoYXQgcHJlc3NlcyB0aGVtIGFuZCBsZWFybnMgdGhlbSBmaXJzdCB0byBiZWFyLAogICAgTWFraW5nIHRoZW0gd29tZW4gb2YgZ29vZCBjYXJyaWFnZToKICAgIFRoaXMgaXMgc2hlLS0KClJPTUVPCgogICAgUGVhY2UsIHBlYWNlLCBNZXJjdXRpbywgcGVhY2UhCiAgICBUaG91IHRhbGsnc3Qgb2Ygbm90aGluZy4KCk1FUkNVVElPCgogICAgVHJ1ZSwgSSB0YWxrIG9mIGRyZWFtcywKICAgIFdoaWNoIGFyZSB0aGUgY2hpbGRyZW4gb2YgYW4gaWRsZSBicmFpbiwKICAgIEJlZ290IG9mIG5vdGhpbmcgYnV0IHZhaW4gZmFudGFzeSwKICAgIFdoaWNoIGlzIGFzIHRoaW4gb2Ygc3Vic3RhbmNlIGFzIHRoZSBhaXIKICAgIEFuZCBtb3JlIGluY29uc3RhbnQgdGhhbiB0aGUgd2luZCwgd2hvIHdvb2VzCiAgICBFdmVuIG5vdyB0aGUgZnJvemVuIGJvc29tIG9mIHRoZSBub3J0aCwKICAgIEFuZCwgYmVpbmcgYW5nZXInZCwgcHVmZnMgYXdheSBmcm9tIHRoZW5jZSwKICAgIFR1cm5pbmcgaGlzIGZhY2UgdG8gdGhlIGRldy1kcm9wcGluZyBzb3V0aC4KCkJFTlZPTElPCgogICAgVGhpcyB3aW5kLCB5b3UgdGFsayBvZiwgYmxvd3MgdXMgZnJvbSBvdXJzZWx2ZXM7CiAgICBTdXBwZXIgaXMgZG9uZSwgYW5kIHdlIHNoYWxsIGNvbWUgdG9vIGxhdGUuCgpST01FTwoKICAgIEkgZmVhciwgdG9vIGVhcmx5OiBmb3IgbXkgbWluZCBtaXNnaXZlcwogICAgU29tZSBjb25zZXF1ZW5jZSB5ZXQgaGFuZ2luZyBpbiB0aGUgc3RhcnMKICAgIFNoYWxsIGJpdHRlcmx5IGJlZ2luIGhpcyBmZWFyZnVsIGRhdGUKICAgIFdpdGggdGhpcyBuaWdodCdzIHJldmVscyBhbmQgZXhwaXJlIHRoZSB0ZXJtCiAgICBPZiBhIGRlc3Bpc2VkIGxpZmUgY2xvc2VkIGluIG15IGJyZWFzdAogICAgQnkgc29tZSB2aWxlIGZvcmZlaXQgb2YgdW50aW1lbHkgZGVhdGguCiAgICBCdXQgSGUsIHRoYXQgaGF0aCB0aGUgc3RlZXJhZ2Ugb2YgbXkgY291cnNlLAogICAgRGlyZWN0IG15IHNhaWwhIE9uLCBsdXN0eSBnZW50bGVtZW4uCgpCRU5WT0xJTwoKICAgIFN0cmlrZSwgZHJ1bS4KCiAgICBFeGV1bnQKClNDRU5FIFYuIEEgaGFsbCBpbiBDYXB1bGV0J3MgaG91c2UuCgogICAgTXVzaWNpYW5zIHdhaXRpbmcuIEVudGVyIFNlcnZpbmdtZW4gd2l0aCBuYXBraW5zIAoKRmlyc3QgU2VydmFudAoKICAgIFdoZXJlJ3MgUG90cGFuLCB0aGF0IGhlIGhlbHBzIG5vdCB0byB0YWtlIGF3YXkIEhlCiAgICBzaGlmdCBhIHRyZW5jaGVyPyBoZSBzY3JhcGUgYSB0cmVuY2hlciEKClNlY29uZCBTZXJ2YW50CgogICAgV2hlbiBnb29kIG1hbm5lcnMgc2hhbGwgbGllIGFsbCBpbiBvbmUgb3IgdHdvIG1lbidzCiAgICBoYW5kcyBhbmQgdGhleSB1bndhc2hlZCB0b28sICd0aXMgYSBmb3VsIHRoaW5nLgoKRmlyc3QgU2VydmFudAoKICAgIEF3YXkgd2l0aCB0aGUgam9pbnQtc3Rvb2xzLCByZW1vdmUgdGhlCiAgICBjb3VydC1jdXBib2FyZCwgbG9vayB0byB0aGUgcGxhdGUuIEdvb2QgdGhvdSwgc2F2ZQogICAgbWUgYSBwaWVjZSBvZiBtYXJjaHBhbmU7IGFuZCwgYXMgdGhvdSBsb3Zlc3QgbWUsIGxldAogICAgdGhlIHBvcnRlciBsZXQgaW4gU3VzYW4gR3JpbmRzdG9uZSBhbmQgTmVsbC4KICAgIEFudG9ueSwgYW5kIFBvdHBhbiEKClNlY29uZCBTZXJ2YW50CgogICAgQXksIGJveSwgcmVhZHkuCgpGaXJzdCBTZXJ2YW50CgogICAgWW91IGFyZSBsb29rZWQgZm9yIGFuZCBjYWxsZWQgZm9yLCBhc2tlZCBmb3IgYW5kCiAgICBzb3VnaHQgZm9yLCBpbiB0aGUgZ3JlYXQgY2hhbWJlci4KClNlY29uZCBTZXJ2YW50CgogICAgV2UgY2Fubm90IGJlIGhlcmUgYW5kIHRoZXJlIHRvby4gQ2hlZXJseSwgYm95czsgYmUKICAgIGJyaXNrIGF3aGlsZSwgYW5kIHRoZSBsb25nZXIgbGl2ZXIgdGFrZSBhbGwuCgogICAgRW50ZXIgQ0FQVUxFVCwgd2l0aCBKVUxJRVQgYW5kIG90aGVycyBvZiBoaXMgaG91c2UsIG1lZXRpbmcgdGhlIEd1ZXN0cyBhbmQgTWFza2VycwoKQ0FQVUxFVAoKICAgIFdlbGNvbWUsIGdlbnRsZW1lbiEgbGFkaWVzIHRoYXQgaGF2ZSB0aGVpciB0b2VzCiAgICBVbnBsYWd1ZWQgd2l0aCBjb3JucyB3aWxsIGhhdmUgYSBib3V0IHdpdGggeW91LgogICAgQWggaGEsIG15IG1pc3RyZXNzZXMhIHdoaWNoIG9mIHlvdSBhbGwKICAgIFdpbGwgbm93IGRlbnkgdG8gZGFuY2UIHNoZSB0aGF0IG1ha2VzIGRhaW50eSwKICAgIFNoZSwgSSdsbCBzd2VhciwgaGF0aCBjb3JuczsgYW0gSSBjb21lIG5lYXIgeWUgbm93PwogICAgV2VsY29tZSwgZ2VudGxlbWVuISBJIGhhdmUgc2VlbiB0aGUgZGF5CiAgICBUaGF0IEkgaGF2ZSB3b3JuIGEgdmlzb3IgYW5kIGNvdWxkIHRlbGwKICAgIEEgd2hpc3BlcmluZyB0YWxlIGluIGEgZmFpciBsYWR5J3MgZWFyLAogICAgU3VjaCBhcyB3b3VsZCBwbGVhc2U6ICd0aXMgZ29uZSwgJ3RpcyBnb25lLCAndGlzIGdvbmU6CiAgICBZb3UgYXJlIHdlbGNvbWUsIGdlbnRsZW1lbiEgY29tZSwgbXVzaWNpYW5zLCBwbGF5LgogICAgQSBoYWxsLCBhIGhhbGwhIGdpdmUgcm9vbSEgYW5kIGZvb3QgaXQsIGdpcmxzLgoKICAgIE11c2ljIHBsYXlzLCBhbmQgdGhleSBkYW5jZQogICAgTW9yZSBsaWdodCwgeW91IGtuYXZlczsgYW5kIHR1cm4gdGhlIHRhYmxlcyB1cCwKICAgIEFuZCBxdWVuY2ggdGhlIGZpcmUsIHRoZSByb29tIGlzIGdyb3duIHRvbyBob3QuCiAgICBBaCwgc2lycmFoLCB0aGlzIHVubG9vaydkLWZvciBzcG9ydCBjb21lcyB3ZWxsLgogICAgTmF5LCBzaXQsIG5heSwgc2l0LCBnb29kIGNvdXNpbiBDYXB1bGV0OwogICAgRm9yIHlvdSBhbmQgSSBhcmUgcGFzdCBvdXIgZGFuY2luZyBkYXlzOgogICAgSG93IGxvbmcgaXMndCBub3cgc2luY2UgbGFzdCB5b3Vyc2VsZiBhbmQgSQogICAgV2VyZSBpbiBhIG1hc2sCgpTZWNvbmQgQ2FwdWxldAoKICAgIEJ5J3IgbGFkeSwgdGhpcnR5IHllYXJzLgoKQ0FQVUxFVAoKICAgIFdoYXQsIG1hbiEgJ3RpcyBub3Qgc28gbXVjaCwgJ3RpcyBub3Qgc28gbXVjaDoKICAgICdUaXMgc2luY2UgdGhlIG51cHRpYWxzIG9mIEx1Y2VudGlvLAogICAgQ29tZSBwZW50ZWNvc3QgYXMgcXVpY2tseSBhcyBpdCB3aWxsLAogICAgU29tZSBmaXZlIGFuZCB0d2VudHkgeWVhcnM7IGFuZCB0aGVuIHdlIG1hc2snZC4KClNlY29uZCBDYXB1bGV0CgogICAgJ1RpcyBtb3JlLCAndGlzIG1vcmUsIGhpcyBzb24gaXMgZWxkZXIsIHNpcjsKICAgIEhpcyBzb24gaXMgdGhpcnR5LgoKQ0FQVUxFVAoKICAgIFdpbGwgeW91IHRlbGwgbWUgdGhhdD8KICAgIEhpcyBzb24gd2FzIGJ1dCBhIHdhcmQgdHdvIHllYXJzIGFnby4KClJPTUVPCgogICAgW1RvIGEgU2VydmluZ21hbl0gV2hhdCBsYWR5IGlzIHRoYXQsIHdoaWNoIGRvdGgKICAgIGVucmljaCB0aGUgaGFuZAogICAgT2YgeW9uZGVyIGtuaWdodD8KClNlcnZhbnQKCiAgICBJIGtub3cgbm90LCBzaXIuCgpST01FTwoKICAgIE8sIHNoZSBkb3RoIHRlYWNoIHRoZSB0b3JjaGVzIHRvIGJ1cm4gYnJpZ2h0IQogICAgSXQgc2VlbXMgc2hlIGhhbmdzIHVwb24gdGhlIGNoZWVrIG9mIG5pZ2h0CiAgICBMaWtlIGEgcmljaCBqZXdlbCBpbiBhbiBFdGhpb3BlJ3MgZWFyOwogICAgQmVhdXR5IHRvbyByaWNoIGZvciB1c2UsIGZvciBlYXJ0aCB0b28gZGVhciEKICAgIFNvIHNob3dzIGEgc25vd3kgZG92ZSB0cm9vcGluZyB3aXRoIGNyb3dzLAogICAgQXMgeW9uZGVyIGxhZHkgbydlciBoZXIgZmVsbG93cyBzaG93cy4KICAgIFRoZSBtZWFzdXJlIGRvbmUsIEknbGwgd2F0Y2ggaGVyIHBsYWNlIG9mIHN0YW5kLAogICAgQW5kLCB0b3VjaGluZyBoZXJzLCBtYWtlIGJsZXNzZWQgbXkgcnVkZSBoYW5kLgogICAgRGlkIG15IGhlYXJ0IGxvdmUgdGlsbCBub3cIGZvcnN3ZWFyIGl0LCBzaWdodCEKICAgIEZvciBJIG5lJ2VyIHNhdyB0cnVlIGJlYXV0eSB0aWxsIHRoaXMgbmlnaHQuCgpUWUJBTFQKCiAgICBUaGlzLCBieSBoaXMgdm9pY2UsIHNob3VsZCBiZSBhIE1vbnRhZ3VlLgogICAgRmV0Y2ggbWUgbXkgcmFwaWVyLCBib3kuIFdoYXQgZGFyZXMgdGhlIHNsYXZlCiAgICBDb21lIGhpdGhlciwgY292ZXInZCB3aXRoIGFuIGFudGljIGZhY2UsCiAgICBUbyBmbGVlciBhbmQgc2Nvcm4gYXQgb3VyIHNvbGVtbml0eT8KICAgIE5vdywgYnkgdGhlIHN0b2NrIGFuZCBob25vdXIgb2YgbXkga2luLAogICAgVG8gc3RyaWtlIGhpbSBkZWFkLCBJIGhvbGQgaXQgbm90IGEgc2luLgoKQ0FQVUxFVAoKICAgIFdoeSwgaG93IG5vdywga2luc21hbiEgd2hlcmVmb3JlIHN0b3JtIHlvdSBzbz8KClRZQkFMVAoKICAgIFVuY2xlLCB0aGlzIGlzIGEgTW9udGFndWUsIG91ciBmb2UsCiAgICBBIHZpbGxhaW4gdGhhdCBpcyBoaXRoZXIgY29tZSBpbiBzcGl0ZSwKICAgIFRvIHNjb3JuIGF0IG91ciBzb2xlbW5pdHkgdGhpcyBuaWdodC4KCkNBUFVMRVQKCiAgICBZb3VuZyBSb21lbyBpcyBpdD8KClRZQkFMVAoKICAgICdUaXMgaGUsIHRoYXQgdmlsbGFpbiBSb21lby4KCkNBUFVMRVQKCiAgICBDb250ZW50IHRoZWUsIGdlbnRsZSBjb3osIGxldCBoaW0gYWxvbmU7CiAgICBIZSBiZWFycyBoaW0gbGlrZSBhIHBvcnRseSBnZW50bGVtYW47CiAgICBBbmQsIHRvIHNheSB0cnV0aCwgVmVyb25hIGJyYWdzIG9mIGhpbQogICAgVG8gYmUgYSB2aXJ0dW91cyBhbmQgd2VsbC1nb3Zlcm4nZCB5b3V0aDoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd2VhbHRoIG9mIGFsbCB0aGUgdG93bgogICAgSGVyZSBpbiBteSBob3VzZSBkbyBoaW0gZGlzcGFyYWdlbWVudDoKICAgIFRoZXJlZm9yZSBiZSBwYXRpZW50LCB0YWtlIG5vIG5vdGUgb2YgaGltOgogICAgSXQgaXMgbXkgd2lsbCwgdGhlIHdoaWNoIGlmIHRob3UgcmVzcGVjdCwKICAgIFNob3cgYSBmYWlyIHByZXNlbmNlIGFuZCBwdXQgb2ZmIHRoZXNlIGZyb3ducywKICAgIEFuZCBpbGwtYmVzZWVtaW5nIHNlbWJsYW5jZSBmb3IgYSBmZWFzdC4KClRZQkFMVAoKICAgIEl0IGZpdHMsIHdoZW4gc3VjaCBhIHZpbGxhaW4gaXMgYSBndWVzdDoKICAgIEknbGwgbm90IGVuZHVyZSBoaW0uCgpDQVBVTEVUCgogICAgSGUgc2hhbGwgYmUgZW5kdXJlZDoKICAgIFdoYXQsIGdvb2RtYW4gYm95ISBJIHNheSwgaGUgc2hhbGw6IGdvIHRvOwogICAgQW0gSSB0aGUgbWFzdGVyIGhlcmUsIG9yIHlvdT8gZ28gdG8uCiAgICBZb3UnbGwgbm90IGVuZHVyZSBoaW0hIEdvZCBzaGFsbCBtZW5kIG15IHNvdWwhCiAgICBZb3UnbGwgbWFrZSBhIG11dGlueSBhbW9uZyBteSBndWVzdHMhCiAgICBZb3Ugd2lsbCBzZXQgY29jay1hLWhvb3AhIHlvdSdsbCBiZSB0aGUgbWFuIQoKVFlCQUxUCgogICAgV2h5LCB1bmNsZSwgJ3RpcyBhIHNoYW1lLgoKQ0FQVUxFVAoKICAgIEdvIHRvLCBnbyB0bzsKICAgIFlvdSBhcmUgYSBzYXVjeSBib3k6IGlzJ3Qgc28sIGluZGVlZD8KICAgIFRoaXMgdHJpY2sgbWF5IGNoYW5jZSB0byBzY2F0aGUgeW91LCBJIGtub3cgd2hhdDoKICAgIFlvdSBtdXN0IGNvbnRyYXJ5IG1lISBtYXJyeSwgJ3RpcyB0aW1lLgogICAgV2VsbCBzYWlkLCBteSBoZWFydHMhIFlvdSBhcmUgYSBwcmluY294OyBnbzoKICAgIEJlIHF1aWV0LCBvci0tTW9yZSBsaWdodCwgbW9yZSBsaWdodCEgRm9yIHNoYW1lIQogICAgSSdsbCBtYWtlIHlvdSBxdWlldC4gV2hhdCwgY2hlZXJseSwgbXkgaGVhcnRzIQoKVFlCQUxUCgogICAgUGF0aWVuY2UgcGVyZm9yY2Ugd2l0aCB3aWxmdWwgY2hvbGVyIG1lZXRpbmcKICAgIE1ha2VzIG15IGZsZXNoIHRyZW1ibGUgaW4gdGhlaXIgZGlmZmVyZW50IGdyZWV0aW5nLgogICAgSSB3aWxsIHdpdGhkcmF3OiBidXQgdGhpcyBpbnRydXNpb24gc2hhbGwKICAgIE5vdyBzZWVtaW5nIHN3ZWV0IGNvbnZlcnQgdG8gYml0dGVyIGdhbGwuCgogICAgRXhpdAoKUk9NRU8KCiAgICBbVG8gSlVMSUVUXSBJZiBJIHByb2ZhbmUgd2l0aCBteSB1bndvcnRoaWVzdCBoYW5kCiAgICBUaGlzIGhvbHkgc2hyaW5lLCB0aGUgZ2VudGxlIGZpbmUgaXMgdGhpczoKICAgIE15IGxpcHMsIHR3byBibHVzaGluZyBwaWxncmltcywgcmVhZHkgc3RhbmQKICAgIFRvIHNtb290aCB0aGF0IHJvdWdoIHRvdWNoIHdpdGggYSB0ZW5kZXIga2lzcy4KCkpVTElFVAoKICAgIEdvb2QgcGlsZ3JpbSwgeW91IGRvIHdyb25nIHlvdXIgaGFuZCB0b28gbXVjaCwKICAgIFdoaWNoIG1hbm5lcmx5IGRldm90aW9uIHNob3dzIGluIHRoaXM7CiAgICBGb3Igc2FpbnRzIGhhdmUgaGFuZHMgdGhhdCBwaWxncmltcycgaGFuZHMgZG8gdG91Y2gsCiAgICBBbmQgcGF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lIGJlIG1hcnJpZWQuCiAgICBNeSBncmF2ZSBpcyBsaWtlIHRvIGJlIG15IHdlZGRpbmcgYmVkLgoKTnVyc2UKCiAgICBIaXMgbmFtZSBpcyBSb21lbywgYW5kIGEgTW9udGFndWU7CiAgICBUaGUgb25seSBzb24gb2YgeW91ciBncmVhdCBlbmVteS4KCkpVTElFVAoKICAgIE15IG9ubHkgbG92ZSBzcHJ1bmcgZnJvbSBteSBvbmx5IGhhdGUhCiAgICBUb28gZWFybHkgc2VlbiB1bmtub3duLCBhbmQga25vd24gdG9vIGxhdGUhCiAgICBQcm9kaWdpb3VzIGJpcnRoIG9mIGxvdmUgaXQgaXMgdG8gbWUsCiAgICBUaGF0IEkgbXVzdCBsb3ZlIGEgbG9hdGhlZCBlbmVteS4KCk51cnNlCgogICAgV2hhdCdzIHRoaXMIHdoYXQncyB0aGlzPwoKSlVMSUVUCgogICAgQSByaHltZSBJIGxlYXJuJ2QgZXZlbiBub3cKICAgIE9mIG9uZSBJIGRhbmNlZCB3aXRoYWwuCgogICAgT25lIGNhbGxzIHdpdGhpbiAnSnVsaWV0LicKCk51cnNlCgogICAgQW5vbiwgYW5vbiEKICAgIENvbWUsIGxldCdzIGF3YXk7IHRoZSBzdHJhbmdlcnMgYWxsIGFyZSBnb25lLgoKICAgIEV4ZXVudAoKQUNUIElJClBST0xPR1VFCgogICAgRW50ZXIgQ2hvcnVzIAoKQ2hvcnVzCgogICAgTm93IG9sZCBkZXNpcmUgZG90aCBpbiBoaXMgZGVhdGgtYmVkIGxpZSwKICAgIEFuZCB5b3VuZyBhZmZlY3Rpb24gZ2FwZXMgdG8gYmUgaGlzIGhlaXI7CiAgICBUaGF0IGZhaXIgZm9yIHdoaWNoIGxvdmUgZ3JvYW4nZCBmb3IgYW5kIHdvdWxkIGRpZSwKICAgIFdpdGggdGVuZGVyIEp1bGlldCBtYXRjaCdkLCBpcyBub3cgbm90IGZhaXIuCiAgICBOb3cgUm9tZW8gaXMgYmVsb3ZlZCBhbmQgbG92ZXMgYWdhaW4sCiAgICBBbGlrZSBiZXR3aXRjaGVkIGJ5IHRoZSBjaGFybSBvZiBsb29rcywKICAgIEJ1dCB0byBoaXMgZm9lIHN1cHBvc2VkIGhlIG11c3QgY29tcGxhaW4sCiAgICBBbmQgc2hlIHN0ZWFsIGxvdmUncyBzd2VldCBiYWl0IGZyb20gZmVhcmZ1bCBob29rczoKICAgIEJlaW5nIGhlbGQgYSBmb2UsIGhlIG1heSBub3QgaGF2ZSBhY2Nlc3MKICAgIFRvIGJyZWF0aGUgc3VjaCB2b3dzIGFzIGxvdmVycyB1c2UgdG8gc3dlYXI7CiAgICBBbmQgc2hlIGFzIG11Y2ggaW4gbG92ZSwgaGVyIG1lYW5zIG11Y2ggbGVzcwogICAgVG8gbWVldCBoZXIgbmV3LWJlbG92ZWQgYW55IHdoZXJlOgogICAgQnV0IHBhc3Npb24gbGVuZHMgdGhlbSBwb3dlciwgdGltZSBtZWFucywgdG8gbWVldAogICAgVGVtcGVyaW5nIGV4dHJlbWl0aWVzIHdpdGggZXh0cmVtZSBzd2VldC4KCiAgICBFeGl0CgpTQ0VORSBJLiBBIGxhbmUgYnkgdGhlIHdhbGwgb2YgQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gCgpST01FTwoKICAgIENhbiBJIGdvIGZvcndhcmQgd2hlbiBteSBoZWFydCBpcyBoZXJlPwogICAgVHVybiBiYWNrLCBkdWxsIGVhcnRoLCBhbmQgZmluZCB0aHkgY2VudHJlIG91dC4KCiAgICBIZSBjbGltYnMgdGhlIHdhbGwsIGFuZCBsZWFwcyBkb3duIHdpdGhpbiBpdAoKICAgIEVudGVyIEJFTlZPTElPIGFuZCBNRVJDVVRJTwoKQkVOVk9MSU8KCiAgICBSb21lbyEgbXkgY291c2luIFJvbWVvIQoKTUVSQ1VUSU8KCiAgICBIZSBpcyB3aXNlOwogICAgQW5kLCBvbiBteSBsaWUsIGhhdGggc3RvbCduIGhpbSBob21lIHRvIGJlZC4KCkJFTlZPTElPCgogICAgSGUgcmFuIHRoaXMgd2F5LCBhbmQgbGVhcCdkIHRoaXMgb3JjaGFyZCB3YWxsOgogICAgQ2FsbCwgZ29vZCBNZXJjdXRpby4KCk1FUkNVVElPCgogICAgTmF5LCBJJ2xsIGNvbmp1cmUgdG9vLgogICAgUm9tZW8hIGh1bW91cnMhIG1hZG1hbiEgcGFzc2lvbiEgbG92ZXIhCiAgICBBcHBlYXIgdGhvdSBpbiB0aGUgbGlrZW5lc3Mgb2YgYSBzaWdoOgogICAgU3BlYWsgYnV0IG9uZSByaHltZSwgYW5kIEkgYW0gc2F0aXNmaWVkOwogICAgQ3J5IGJ1dCAnQXkgbWUhJyBwcm9ub3VuY2UgYnV0ICdsb3ZlJyBhbmQgJ2RvdmU7JwogICAgU3BlYWsgdG8gbXkgZ29zc2lwIFZlbnVzIG9uZSBmYWlyIHdvcmQsCiAgICBPbmUgbmljay1uYW1lIGZvciBoZXIgcHVyYmxpbmQgc29uIGFuZCBoZWlyLAogICAgWW91bmcgQWRhbSBDdXBpZCwgaGUgdGhhdCBzaG90IHNvIHRyaW0sCiAgICBXaGVuIEtpbmcgQ29waGV0dWEgbG92ZWQgdGhlIGJlZ2dhci1tYWlkIQogICAgSGUgaGVhcmV0aCBub3QsIGhlIHN0aXJyZXRoIG5vdCwgaGUgbW92ZXRoIG5vdDsKICAgIFRoZSBhcGUgaXMgZGVhZCwgYW5kIEkgbXVzdCBjb25qdXJlIGhpbS4KICAgIEkgY29uanVyZSB0aGVlIGJ5IFJvc2FsaW5lJ3MgYnJpZ2h0IGV5ZXMsCiAgICBCeSBoZXIgaGlnaCBmb3JlaGVhZCBhbmQgaGVyIHNjYXJsZXQgbGlwLAogICAgQnkgaGVyIGZpbmUgZm9vdCwgc3RyYWlnaHQgbGVnIGFuZCBxdWl2ZXJpbmcgdGhpZ2gKICAgIEFuZCB0aGUgZGVtZXNuZXMgdGhhdCB0aGVyZSBhZGphY2VudCBsaWUsCiAgICBUaGF0IGluIHRoeSBsaWtlbmVzcyB0aG91IGFwcGVhciB0byB1cyEKCkJFTlZPTElPCgogICAgQW5kIGlmIGhlIGhlYXIgdGhlZSwgdGhvdSB3aWx0IGFuZ2VyIGhpbS4KCk1FUkNVVElPCgogICAgVGhpcyBjYW5ub3QgYW5nZXIgaGltOiAndHdvdWxkIGFuZ2VyIGhpbQogICAgVG8gcmFpc2UgYSBzcGlyaXQgaW4gaGlzIG1pc3RyZXNzJyBjaXJjbGUKICAgIE9mIHNvbWUgc3RyYW5nZSBuYXR1cmUsIGxldHRpbmcgaXQgdGhlcmUgc3RhbmQKICAgIFRpbGwgc2hlIGhhZCBsYWlkIGl0IGFuZCBjb25qdXJlZCBpdCBkb3duOwogICAgVGhhdCB3ZXJlIHNvbWUgc3BpdGU6IG15IGludm9jYXRpb24KICAgIElzIGZhaXIgYW5kIGhvbmVzdCwgYW5kIGluIGhpcyBtaXN0cmVzIHMnIG5hbWUKICAgIEkgY29uanVyZSBvbmx5IGJ1dCB0byByYWlzZSB1cCBoaW0uCgpCRU5WT0xJTwoKICAgIENvbWUsIGhlIGhhdGggaGlkIGhpbXNlbGYgYW1vbmcgdGhlc2UgdHJlZXMsCiAgICBUbyBiZSBjb25zb3J0ZWQgd2l0aCB0aGUgaHVtb3JvdXMgbmlnaHQ6CiAgICBCbGluZCBpcyBoaXMgbG92ZSBhbmQgYmVzdCBiZWZpdHMgdGhlIGRhcmsuCgpNRVJDVVRJTwoKICAgIElmIGxvdmUgYmUgYmxpbmQsIGxvdmUgY2Fubm90IGhpdCB0aGUgbWFyay4KICAgIE5vdyB3aWxsIGhlIHNpdCB1bmRlciBhIG1lZGxhciB0cmVlLAogICAgQW5kIHdpc2ggaGlzIG1pc3RyZXNzIHdlcmUgdGhhdCBraW5kIG9mIGZydWl0CiAgICBBcyBtYWlkcyBjYWxsIG1lZGxhcnMsIHdoZW4gdGhleSBsYXVnaCBhbG9uZS4KICAgIFJvbWVvLCB0aGF0IHNoZSB3ZXJlLCBPLCB0aGF0IHNoZSB3ZXJlCiAgICBBbiBvcGVuIGV0IGNhZXRlcmEsIHRob3UgYSBwb3BlcmluIHBlYXIhCiAgICBSb21lbywgZ29vZCBuaWdodDogSSdsbCB0byBteSB0cnVja2xlLWJlZDsKICAgIFRoaXMgZmllbGQtYmVkIGlzIHRvbyBjb2xkIGZvciBtZSB0byBzbGVlcDoKICAgIENvbWUsIHNoYWxsIHdlIGdvPwoKQkVOVk9MSU8KCiAgICBHbywgdGhlbjsgZm9yICd0aXMgaW4gdmFpbgogICAgVG8gc2VlayBoaW0gaGVyZSB0aGF0IG1lYW5zIG5vdCB0byBiZSBmb3VuZC4KCiAgICBFeGV1bnQKClNDRU5FIElJLiBDYXB1bGV0J3Mgb3JjaGFyZC4KCiAgICBFbnRlciBST01FTyAKClJPTUVPCgogICAgSGUgamVzdHMgYXQgc2NhcnMgdGhhdCBuZXZlciBmZWx0IGEgd291bmQuCgogICAgSlVMSUVUIGFwcGVhcnMgYWJvdmUgYXQgYSB3aW5kb3cKICAgIEJ1dCwgc29mdCEgd2hhdCBsaWdodCB0aHJvdWdoIHlvbmRlciB3aW5kb3cgYnJlYWtzPwogICAgSXQgaXMgdGhlIGVhc3QsIGFuZCBKdWxpZXQgaXMgdGhlIHN1bi4KICAgIEFyaXNlLCBmYWlyIHN1biwgYW5kIGtpbGwgdGhlIGVudmlvdXMgbW9vbiwKICAgIFdobyBpcyBhbHJlYWR5IHNpY2sgYW5kIHBhbGUgd2l0aCBncmllZiwKICAgIFRoYXQgdGhvdSBoZXIgbWFpZCBhcnQgZmFyIG1vcmUgZmFpciB0aGFuIHNoZToKICAgIEJlIG5vdCBoZXIgbWFpZCwgc2luY2Ugc2hlIGlzIGVudmlvdXM7CiAgICBIZXIgdmVzdGFsIGxpdmVyeSBpcyBidXQgc2ljayBhbmQgZ3JlZW4KICAgIEFuZCBub25lIGJ1dCBmb29scyBkbyB3ZWFyIGl0OyBjYXN0IGl0IG9mZi4KICAgIEl0IGlzIG15IGxhZHksIE8sIGl0IGlzIG15IGxvdmUhCiAgICBPLCB0aGF0IHNoZSBrbmV3IHNoZSB3ZXJlIQogICAgU2hlIHNwZWFrcyB5ZXQgc2hlIHNheXMgbm90aGluZzogd2hhdCBvZiB0aGF0PwogICAgSGVyIGV5ZSBkaXNjb3Vyc2VzOyBJIHdpbGwgYW5zd2VyIGl0LgogICAgSSBhbSB0b28gYm9sZCwgJ3RpcyBub3QgdG8gbWUgc2hlIHNwZWFrczoKICAgIFR3byBvZiB0aGUgZmFpcmVzdCBzdGFycyBpbiBhbGwgdGhlIGhlYXZlbiwKICAgIEhhdmluZyBzb21lIGJ1c2luZXNzLCBkbyBlbnRyZWF0IGhlciBleWVzCiAgICBUbyB0d2lua2xlIGluIHRoZWlyIHNwaGVyZXMgdGlsbCB0aGV5IHJldHVybi4KICAgIFdoYXQgaWYgaGVyIGV5ZXMgd2VyZSB0aGVyZSwgdGhleSBpbiBoZXIgaGVhZD8KICAgIFRoZSBicmlnaHRuZXNzIG9mIGhlciBjaGVlayB3b3VsZCBzaGFtZSB0aG9zZSBzdGFycywKICAgIEFzIGRheWxpZ2h0IGRvdGggYSBsYW1wOyBoZXIgZXllcyBpbiBoZWF2ZW4KICAgIFdvdWxkIHRocm91Z2ggdGhlIGFpcnkgcmVnaW9uIHN0cmVhbSBzbyBicmlnaHQKICAgIFRoYXQgYmlyZHMgd291bGQgc2luZyBhbmQgdGhpbmsgaXQgd2VyZSBub3QgbmlnaHQuCiAgICBTZWUsIGhvdyBzaGUgbGVhbnMgaGVyIGNoZWVrIHVwb24gaGVyIGhhbmQhCiAgICBPLCB0aGF0IEkgd2VyZSBhIGdsb3ZlIHVwb24gdGhhdCBoYW5kLAogICAgVGhhdCBJIG1pZ2h0IHRvdWNoIHRoYXQgY2hlZWshCgpKVUxJRVQKCiAgICBBeSBtZSEKClJPTUVPCgogICAgU2hlIHNwZWFrczoKICAgIE8sIHNwZWFrIGFnYWluLCBicmlnaHQgYW5nZWwhIGZvciB0aG91IGFydAogICAgQXMgZ2xvcmlvdXMgdG8gdGhpcyBuaWdodCwgYmVpbmcgbydlciBteSBoZWFkCiAgICBBcyBpcyBhIHdpbmdlZCBtZXNzZW5nZXIgb2YgaGVhdmVuCiAgICBVbnRvIHRoZSB3aGl0ZS11cHR1cm5lZCB3b25kZXJpbmcgZXllcwogICAgT2YgbW9ydGFscyB0aGF0IGZhbGwgYmFjayB0byBnYXplIG9uIGhpbQogICAgV2hlbiBoZSBiZXN0cmlkZXMgdGhlIGxhenktcGFjaW5nIGNsb3VkcwogICAgQW5kIHNhaWxzIHVwb24gdGhlIGJvc29tIG9mIHRoZSBhaXIuCgpKVUxJRVQKCiAgICBPIFJvbWVvLCBSb21lbyEgd2hlcmVmb3JlIGFydCB0aG91IFJvbWVvPwogICAgRGVueSB0aHkgZmF0aGVyIGFuZCByZWZ1c2UgdGh5IG5hbWU7CiAgICBPciwgaWYgdGhvdSB3aWx0IG5vdCwgYmUgYnV0IHN3b3JuIG15IGxvdmUsCiAgICBBbmQgSSdsbCBubyBsb25nZXIgYmUgYSBDYXB1bGV0LgoKUk9NRU8KCiAgICBbQXNpZGVdIFNoYWxsIEkgaGVhciBtb3JlLCBvciBzaGFsbCBJIHNwZWFrIGF0IHRoaXMCgpKVUxJRVQKCiAgICAnVGlzIGJ1dCB0aHkgbmFtZSB0aGF0IGlzIG15IGVuZW15OwogICAgVGhvdSBhcnQgdGh5c2VsZiwgdGhvdWdoIG5vdCBhIE1vbnRhZ3VlLgogICAgV2hhdCdzIE1vbnRhZ3VlPyBpdCBpcyBub3IgaGFuZCwgbm9yIGZvb3QsCiAgICBOb3IgYXJtLCBub3IgZmFjZSwgbm9yIGFueSBvdGhlciBwYXJ0CiAgICBCZWxvbmdpbmcgdG8gYSBtYW4uIE8sIGJlIHNvbWUgb3RoZXIgbmFtZSEKICAgIFdoYXQncyBpbiBhIG5hbWUIHRoYXQgd2hpY2ggd2UgY2FsbCBhIHJvc2UKICAgIEJ5IGFueSBvdGhlciBuYW1lIHdvdWxkIHNtZWxsIGFzIHN3ZWV0OwogICAgU28gUm9tZW8gd291bGQsIHdlcmUgaGUgbm90IFJvbWVvIGNhbGwnZCwKICAgIFJldGFpbiB0aGF0IGRlYXIgcGVyZmVjdGlvbiB3aGljaCBoZSBvd2VzCiAgICBXaXRob3V0IHRoYXQgdGl0bGUuIFJvbWVvLCBkb2ZmIHRoeSBuYW1lLAogICAgQW5kIGZvciB0aGF0IG5hbWUgd2hpY2ggaXMgbm8gcGFydCBvZiB0aGVlCiAgICBUYWtlIGFsbCBteXNlbGYuCgpST01FTwoKICAgIEkgdGFrZSB0aGVlIGF0IHRoeSB3b3JkOgogICAgQ2FsbCBtZSBidXQgbG92ZSwgYW5kIEknbGwgYmUgbmV3IGJhcHRpemVkOwogICAgSGVuY2Vmb3J0aCBJIG5ldmVyIHdpbGwgYmUgUm9tZW8uCgpKVUxJRVQKCiAgICBXaGF0IG1hbiBhcnQgdGhvdSB0aGF0IHRodXMgYmVzY3JlZW4nZCBpbiBuaWdodAogICAgU28gc3R1bWJsZXN0IG9uIG15IGNvdW5zZWwCgpST01FTwoKICAgIEJ5IGEgbmFtZQogICAgSSBrbm93IG5vdCBob3cgdG8gdGVsbCB0aGVlIHdobyBJIGFtOgogICAgTXkgbmFtZSwgZGVhciBzYWludCwgaXMgaGF0ZWZ1bCB0byBteXNlbGYsCiAgICBCZWNhdXNlIGl0IGlzIGFuIGVuZW15IHRvIHRoZWU7CiAgICBIYWQgSSBpdCB3cml0dGVuLCBJIHdvdWxkIHRlYXIgdGhlIHdvcmQuCgpKVUxJRVQKCiAgICBNeSBlYXJzIGhhdmUgbm90IHlldCBkcnVuayBhIGh1bmRyZWQgd29yZHMKICAgIE9mIHRoYXQgdG9uZ3VlJ3MgdXR0ZXJhbmNlLCB5ZXQgSSBrbm93IHRoZSBzb3VuZDoKICAgIEFydCB0aG91IG5vdCBSb21lbyBhbmQgYSBNb250YWd1ZT8KClJPTUVPCgogICAgTmVpdGhlciwgZmFpciBzYWludCwgaWYgZWl0aGVyIHRoZWUgZGlzbGlrZS4KCkpVTElFVAoKICAgIEhvdyBjYW1lc3QgdGhvdSBoaXRoZXIsIHRlbGwgbWUsIGFuZCB3aGVyZWZvcmUCiAgICBUaGUgb3JjaGFyZCB3YWxscyBhcmUgaGlnaCBhbmQgaGFyZCB0byBjbGltYiwKICAgIEFuZCB0aGUgcGxhY2UgZGVhdGgsIGNvbnNpZGVyaW5nIHdobyB0aG91IGFydCwKICAgIElmIGFueSBvZiBteSBraW5zbWVuIGZpbmQgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBXaXRoIGxvdmUncyBsaWdodCB3aW5ncyBkaWQgSSBvJ2VyLXBlcmNoIHRoZXNlIHdhbGxzOwogICAgRm9yIHN0b255IGxpbWl0cyBjYW5ub3QgaG9sZCBsb3ZlIG91dCwKICAgIEFuZCB3aGF0IGxvdmUgY2FuIGRvIHRoYXQgZGFyZXMgbG92ZSBhdHRlbXB0OwogICAgVGhlcmVmb3JlIHRoeSBraW5zbWVuIGFyZSBubyBsZXQgdG8gbWUuCgpKVUxJRVQKCiAgICBJZiB0aGV5IGRvIHNlZSB0aGVlLCB0aGV5IHdpbGwgbXVyZGVyIHRoZWUuCgpST01FTwoKICAgIEFsYWNrLCB0aGVyZSBsaWVzIG1vcmUgcGVyaWwgaW4gdGhpbmUgZXllCiAgICBUaGFuIHR3ZW50eSBvZiB0aGVpciBzd29yZHM6IGxvb2sgdGhvdSBidXQgc3dlZXQsCiAgICBBbmQgSSBhbSBwcm9vZiBhZ2FpbnN0IHRoZWlyIGVubWl0eS4KCkpVTElFVAoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd29ybGQgdGhleSBzYXcgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBJIGhhdmUgbmlnaHQncyBjbG9hayB0byBoaWRlIG1lIGZyb20gdGhlaXIgc2lnaHQ7CiAgICBBbmQgYnV0IHRob3UgbG92ZSBtZSwgbGV0IHRoZW0gZmluZCBtZSBoZXJlOgogICAgTXkgbGlmZSB3ZXJlIGJldHRlciBlbmRlZCBieSB0aGVpciBoYXRlLAogICAgVGhhbiBkZWF0aCBwcm9yb2d1ZWQsIHdhbnRpbmcgb2YgdGh5IGxvdmUuCgpKVUxJRVQKCiAgICBCeSB3aG9zZSBkaXJlY3Rpb24gZm91bmQnc3QgdGhvdSBvdXQgdGhpcyBwbGFjZT8KClJPTUVPCgogICAgQnkgbG92ZSwgd2hvIGZpcnN0IGRpZCBwcm9tcHQgbWUgdG8gaW5xdWlyZTsKICAgIEhlIGxlbnQgbWUgY291bnNlbCBhbmQgSSBsZW50IGhpbSBleWVzLgogICAgSSBhbSBubyBwaWxvdDsgeWV0LCB3ZXJ0IHRob3UgYXMgZmFyCiAgICBBcyB0aGF0IHZhc3Qgc2hvcmUgd2FzaCdkIHdpdGggdGhlIGZhcnRoZXN0IHNlYSwKICAgIEkgd291bGQgYWR2ZW50dXJlIGZvciBzdWNoIG1lcmNoYW5kaXNlLgoKSlVMSUVUCgogICAgVGhvdSBrbm93J3N0IHRoZSBtYXNrIG9mIG5pZ2h0IGlzIG9uIG15IGZhY2UsCiAgICBFbHNlIHdvdWxkIGEgbWFpZGVuIGJsdXNoIGJlcGFpbnQgbXkgY2hlZWsKICAgIEZvciB0aGF0IHdoaWNoIHRob3UgaGFzdCBoZWFyZCBtZSBzcGVhayB0by1uaWdodAogICAgRmFpbiB3b3VsZCBJIGR3ZWxsIG9uIGZvcm0sIGZhaW4sIGZhaW4gZGVueQogICAgV2hhdCBJIGhhdmUgc3Bva2U6IGJ1dCBmYXJld2VsbCBjb21wbGltZW50IQogICAgRG9zdCB0aG91IGxvdmUgbWUIEkga25vdyB0aG91IHdpbHQgc2F5ICdBeSwnCiAgICBBbmQgSSB3aWxsIHRha2UgdGh5IHdvcmQ6IHlldCBpZiB0aG91IHN3ZWFyJ3N0LAogICAgVGhvdSBtYXlzdCBwcm92ZSBmYWxzZTsgYXQgbG92ZXJzJyBwZXJqdXJpZXMKICAgIFRoZW4gc2F5LCBKb3ZlIGxhdWdocy4gTyBnZW50bGUgUm9tZW8sCiAgICBJZiB0aG91IGRvc3QgbG92ZSwgcHJvbm91bmNlIGl0IGZhaXRoZnVsbHk6CiAgICBPciBpZiB0aG91IHRoaW5rJ3N0IEkgYW0gdG9vIHF1aWNrbHkgd29uLAogICAgSSdsbCBmcm93biBhbmQgYmUgcGVydmVyc2UgYW4gc2F5IHRoZWUgbmF5LAogICAgU28gdGhvdSB3aWx0IHdvbzsgYnV0IGVsc2UsIG5vdCBmb3IgdGhlIHdvcmxkLgogICAgSW4gdHJ1dGgsIGZhaXIgTW9udGFndWUsIEkgYW0gdG9vIGZvbmQsCiAgICBBbmQgdGhlcmVmb3JlIHRob3UgbWF5c3QgdGhpbmsgbXkgJ2hhdmlvciBsaWdodDoKICAgIEJ1dCB0cnVzdCBtZSwgZ2VudGxlbWFuLCBJJ2xsIHByb3ZlIG1vcmUgdHJ1ZQogICAgVGhhbiB0aG9zZSB0aGF0IGhhdmUgbW9yZSBjdW5uaW5nIHRvIGJlIHN0cmFuZ2UuCiAgICBJIHNob3VsZCBoYXZlIGJlZW4gbW9yZSBzdHJhbmdlLCBJIG11c3QgY29uZmVzcywKICAgIEJ1dCB0aGF0IHRob3Ugb3ZlcmhlYXJkJ3N0LCBlcmUgSSB3YXMgd2FyZSwKICAgIE15IHRydWUgbG92ZSdzIHBhc3Npb246IHRoZXJlZm9yZSBwYXJkb24gbWUsCiAgICBBbmQgbm90IGltcHV0ZSB0aGlzIHlpZWxkaW5nIHRvIGxpZ2h0IGxvdmUsCiAgICBXaGljaCB0aGUgZGFyayBuaWdodCBoYXRoIHNvIGRpc2NvdmVyZWQuCgpST01FTwoKICAgIExhZHksIGJ5IHlvbmRlciBibGVzc2VkIG1vb24gSSBzd2VhcgogICAgVGhhdCB0aXBzIHdpdGggc2lsdmVyIGFsbCB0aGVzZSBmcnVpdC10cmVlIHRvcHMtLQoKSlVMSUVUCgogICAgTywgc3dlYXIgbm90IGJ5IHRoZSBtb29uLCB0aGUgaW5jb25zdGFudCBtb29uLAogICAgVGhhdCBtb250aGx5IGNoYW5nZXMgaW4gaGVyIGNpcmNsZWQgb3JiLAogICAgTGVzdCB0aGF0IHRoeSBsb3ZlIHByb3ZlIGxpa2V3aXNlIHZhcmlhYmxlLgoKUk9NRU8KCiAgICBXaGF0IHNoYWxsIEkgc3dlYXIgYnkCgpKVUxJRVQKCiAgICBEbyBub3Qgc3dlYXIgYXQgYWxsOwogICAgT3IsIGlmIHRob3Ugd2lsdCwgc3dlYXIgYnkgdGh5IGdyYWNpb3VzIHNlbGYsCiAgICBXaGljaCBpcyB0aGUgZ29kIG9mIG15IGlkb2xhdHJ5LAogICAgQW5kIEknbGwgYmVsaWV2ZSB0aGVlLgoKUk9NRU8KCiAgICBJZiBteSBoZWFydCdzIGRlYXIgbG92ZS0tCgpKVUxJRVQKCiAgICBXZWxsLCBkbyBub3Qgc3dlYXI6IGFsdGhvdWdoIEkgam95IGluIHRoZWUsCiAgICBJIGhhdmUgbm8gam95IG9mIHRoaXMgY29udHJhY3QgdG8tbmlnaHQ6CiAgICBJdCBpcyB0b28gcmFzaCwgdG9vIHVuYWR2aXNlZCwgdG9vIHN1ZGRlbjsKICAgIFRvbyBsaWtlIHRoZSBsaWdodG5pbmcsIHdoaWNoIGRvdGggY2Vhc2UgdG8gYmUKICAgIEVyZSBvbmUgY2FuIHNheSAnSXQgbGlnaHRlbnMuJyBTd2VldCwgZ29vZCBuaWdodCEKICAgIFRoaXMgYnVkIG9mIGxvdmUsIGJ5IHN1bW1lcidzIHJpcGVuaW5nIGJyZWF0aCwKICAgIE1heSBwcm92ZSBhIGJlYXV0ZW91cyBmbG93ZXIgd2hlbiBuZXh0IHdlIG1lZXQuCiAgICBHb29kIG5pZ2h0LCBnb29kIG5pZ2h0ISBhcyBzd2VldCByZXBvc2UgYW5kIHJlc3QKICAgIENvbWUgdG8gdGh5IGhlYXJ0IGFzIHRoYXQgd2l0aGluIG15IGJyZWFzdCEKClJPTUVPCgogICAgTywgd2lsdCB0aG91IGxlYXZlIG1lIHNvIHVuc2F0aXNmaWVkPwoKSlVMSUVUCgogICAgV2hhdCBzYXRpc2ZhY3Rpb24gY2Fuc3QgdGhvdSBoYXZlIHRvLW5pZ2h0PwoKUk9NRU8KCiAgICBUaGUgZXhjaGFuZ2Ugb2YgdGh5IGxvdmUncyBmYWl0aGZ1bCB2b3cgZm9yIG1pbmUuCgpKVUxJRVQKCiAgICBJIGdhdmUgdGhlZSBtaW5lIGJlZm9yZSB0aG91IGRpZHN0IHJlcXVlc3QgaXQ6CiAgICBBbmQgeWV0IEkgd291bGQgaXQgd2VyZSB0byBnaXZlIGFnYWluLgoKUk9NRU8KCiAgICBXb3VsZHN0IHRob3Ugd2l0aGRyYXcgaXQIGZvciB3aGF0IHB1cnBvc2UsIGxvdmUCgpKVUxJRVQKCiAgICBCdXQgdG8gYmUgZnJhbmssIGFuZCBnaXZlIGl0IHRoZWUgYWdhaW4uCiAgICBBbmQgeWV0IEkgd2lzaCBidXQgZm9yIHRoZSB0aGluZyBJIGhhdmU6CiAgICBNeSBib3VudHkgaXMgYXMgYm91bmRsZXNzIGFzIHRoZSBzZWEsCiAgICBNeSBsb3ZlIGFzIGRlZXA7IHRoZSBtb3JlIEkgZ2l2ZSB0byB0aGVlLAogICAgVGhlIG1vcmUgSSBoYXZlLCBmb3IgYm90aCBhcmUgaW5maW5pdGUuCgogICAgTnVyc2UgY2FsbHMgd2l0aGluCiAgICBJIGhlYXIgc29tZSBub2lzZSB3aXRoaW47IGRlYXIgbG92ZSwgYWRpZXUhCiAgICBBbm9uLCBnb29kIG51cnNlISBTd2VldCBNb250YWd1ZSwgYmUgdHJ1ZS4KICAgIFN0YXkgYnV0IGEgbGl0dGxlLCBJIHdpbGwgY29tZSBhZ2Fpbi4KCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBPIGJsZXNzZWQsIGJsZXNzZWQgbmlnaHQhIEkgYW0gYWZlYXJkLgogICAgQmVpbmcgaW4gbmlnaHQsIGFsbCB0aGlzIGlzIGJ1dCBhIGRyZWFtLAogICAgVG9vIGZsYXR0ZXJpbmctc3dlZXQgdG8gYmUgc3Vic3RhbnRpYWwuCgogICAgUmUtZW50ZXIgSlVMSUVULCBhYm92ZQoKSlVMSUVUCgogICAgVGhyZWUgd29yZHMsIGRlYXIgUm9tZW8sIGFuZCBnb29kIG5pZ2h0IGluZGVlZC4KICAgIElmIHRoYXQgdGh5IGJlbnQgb2YgbG92ZSBiZSBob25vdXJhYmxlLAogICAgVGh5IHB1cnBvc2UgbWFycmlhZ2UsIHNlbmQgbWUgd29yZCB0by1tb3Jyb3csCiAgICBCeSBvbmUgdGhhdCBJJ2xsIHByb2N1cmUgdG8gY29tZSB0byB0aGVlLAogICAgV2hlcmUgYW5kIHdoYXQgdGltZSB0aG91IHdpbHQgcGVyZm9ybSB0aGUgcml0ZTsKICAgIEFuZCBhbGwgbXkgZm9ydHVuZXMgYXQgdGh5IGZvb3QgSSdsbCBsYXkKICAgIEFuZCBmb2xsb3cgdGhlZSBteSBsb3JkIHRocm91Z2hvdXQgdGhlIHdvcmxkLgoKTnVyc2UKCiAgICBbV2l0aGluXSBNYWRhbSEKCkpVTElFVAoKICAgIEkgY29tZSwgYW5vbi4tLUJ1dCBpZiB0aG91IG1lYW4nc3Qgbm90IHdlbGwsCiAgICBJIGRvIGJlc2VlY2ggdGhlZS0tCgpOdXJzZQoKICAgIFtXaXRoaW5dIE1hZGFtIQoKSlVMSUVUCgogICAgQnkgYW5kIGJ5LCBJIGNvbWU6LS0KICAgIFRvIGNlYXNlIHRoeSBzdWl0LCBhbmQgbGVhdmUgbWUgdG8gbXkgZ3JpZWY6CiAgICBUby1tb3Jyb3cgd2lsbCBJIHNlbmQuCgpST01FTwoKICAgIFNvIHRocml2ZSBteSBzb3VsLS0KCkpVTElFVAoKICAgIEEgdGhvdXNhbmQgdGltZXMgZ29vZCBuaWdodCEKCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBBIHRob3VzYW5kIHRpbWVzIHRoZSB3b3JzZSwgdG8gd2FudCB0aHkgbGlnaHQuCiAgICBMb3ZlIGdvZXMgdG93YXJkIGxvdmUsIGFzIHNjaG9vbGJveXMgZnJvbQogICAgdGhlaXIgYm9va3MsCiAgICBCdXQgbG92ZSBmcm9tIGxvdmUsIHRvd2FyZCBzY2hvb2wgd2l0aCBoZWF2eSBsb29rcy4KCiAgICBSZXRpcmluZwoKICAgIFJlLWVudGVyIEpVTElFVCwgYWJvdmUKCkpVTElFVAoKICAgIEhpc3QhIFJvbWVvLCBoaXN0ISBPLCBmb3IgYSBmYWxjb25lcidzIHZvaWNlLAogICAgVG8gbHVyZSB0aGlzIHRhc3NlbC1nZW50bGUgYmFjayBhZ2FpbiEKICAgIEJvbmRhZ2UgaXMgaG9hcnNlLCBhbmQgbWF5IG5vdCBzcGVhayBhbG91ZDsKICAgIEVsc2Ugd291bGQgSSB0ZWFyIHRoZSBjYXZlIHdoZXJlIEVjaG8gbGllcywKICAgIEFuZCBtYWtlIGhlciBhaXJ5IHRvbmd1ZSBtb3JlIGhvYXJzZSB0aGFuIG1pbmUsCiAgICBXaXRoIHJlcGV0aXRpb24gb2YgbXkgUm9tZW8ncyBuYW1lLgoKUk9NRU8KCiAgICBJdCBpcyBteSBzb3VsIHRoYXQgY2FsbHMgdXBvbiBteSBuYW1lOgogICAgSG93IHNpbHZlci1zd2VldCBzb3VuZCBsb3ZlcnMnIHRvbmd1ZXMgYnkgbmlnaHQsCiAgICBMaWtlIHNvZnRlc3QgbXVzaWMgdG8gYXR0ZW5kaW5nIGVhcnMhCgpKVUxJRVQKCiAgICBSb21lbyEKClJPTUVPCgogICAgTXkgZGVhcj8KCkpVTElFVAoKICAgIEF0IHdoYXQgbydjbG9jayB0by1tb3Jyb3cKICAgIFNoYWxsIEkgc2VuZCB0byB0aGVlPwoKUk9NRU8KCiAgICBBdCB0aGUgaG91ciBvZiBuaW5lLgoKSlVMSUVUCgogICAgSSB3aWxsIG5vdCBmYWlsOiAndGlzIHR3ZW50eSB5ZWFycyB0aWxsIHRoZW4uCiAgICBJIGhhdmUgZm9yZ290IHdoeSBJIGRpZCBjYWxsIHRoZWUgYmFjay4KClJPTUVPCgogICAgTGV0IG1lIHN0YW5kIGhlcmUgdGlsbCB0aG91IHJlbWVtYmVyIGl0LgoKSlVMSUVUCgogICAgSSBzaGFsbCBmb3JnZXQsIHRvIGhhdmUgdGhlZSBzdGlsbCBzdGFuZCB0aGVyZSwKICAgIFJlbWVtYmVyaW5nIGhvdyBJIGxvdmUgdGh5IGNvbXBhbnkuCgpST01FTwoKICAgIEFuZCBJJ2xsIHN0aWxsIHN0YXksIHRvIGhhdmUgdGhlZSBzdGlsbCBmb3JnZXQsCiAgICBGb3JnZXR0aW5nIGFueSBvdGhlciBob21lIGJ1dCB0aGlzLgoKSlVMSUVUCgogICAgJ1RpcyBhbG1vc3QgbW9ybmluZzsgSSB3b3VsZCBoYXZlIHRoZWUgZ29uZToKICAgIEFuZCB5ZXQgbm8gZnVydGhlciB0aGFuIGEgd2FudG9uJ3MgYmlyZDsKICAgIFdobyBsZXRzIGl0IGhvcCBhIGxpdHRsZSBmcm9tIGhlciBoYW5kLAogICAgTGlrZSBhIHBvb3IgcHJpc29uZXIgaW4gaGlzIHR3aXN0ZWQgZ3l2ZXMsCiAgICBBbmQgd2l0aCBhIHNpbGsgdGhyZWFkIHBsdWNrcyBpdCBiYWNrIGFnYWluLAogICAgU28gbG92aW5nLWplYWxvdXMgb2YgaGlzIGxpYmVydHkuCgpST01FTwoKICAgIEkgd291bGQgSSB3ZXJlIHRoeSBiaXJkLgoKSlVMSUVUCgogICAgU3dlZXQsIHNvIHdvdWxkIEk6CiAgICBZZXQgSSBzaG91bGQga2lsbCB0aGVlIHdpdGggbXVjaCBjaGVyaXNoaW5nLgogICAgR29vZCBuaWdodCwgZ29vZCBuaWdodCEgcGFydGluZyBpcyBzdWNoCiAgICBzd2VldCBzb3Jyb3csCiAgICBUaGF0IEkgc2hhbGwgc2F5IGdvb2QgbmlnaHQgdGlsbCBpdCBiZSBtb3Jyb3cuCgogICAgRXhpdCBhYm92ZQoKUk9NRU8KCiAgICBTbGVlcCBkd2VsbCB1cG9uIHRoaW5lIGV5ZXMsIHBlYWNlIGluIHRoeSBicmVhc3QhCiAgICBXb3VsZCBJIHdlcmUgc2xlZXAgYW5kIHBlYWNlLCBzbyBzd2VldCB0byByZXN0IQogICAgSGVuY2Ugd2lsbCBJIHRvIG15IGdob3N0bHkgZmF0aGVyJ3MgY2VsbCwKICAgIEhpcyBoZWxwIHRvIGNyYXZlLCBhbmQgbXkgZGVhciBoYXAgdG8gdGVsbC4KCiAgICBFeGl0CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSwgd2l0aCBhIGJhc2tldCAKCkZSSUFSIExBVVJFTkNFCgogICAgVGhlIGdyZXktZXllZCBtb3JuIHNtaWxlcyBvbiB0aGUgZnJvd25pbmcgbmlnaHQsCiAgICBDaGVxdWVyaW5nIHRoZSBlYXN0ZXJuIGNsb3VkcyB3aXRoIHN0cmVha3Mgb2YgbGlnaHQsCiAgICBBbmQgZmxlY2tlZCBkYXJrbmVzcyBsaWtlIGEgZHJ1bmthcmQgcmVlbHMKICAgIEZyb20gZm9ydGggZGF5J3MgcGF0aCBhbmQgVGl0YW4ncyBmaWVyeSB3aGVlbHM6CiAgICBOb3csIGVyZSB0aGUgc3VuIGFkdmFuY2UgaGlzIGJ1cm5pbmcgZXllLAogICAgVGhlIGRheSB0byBjaGVlciBhbmQgbmlnaHQncyBkYW5rIGRldyB0byBkcnksCiAgICBJIG11c3QgdXAtZmlsbCB0aGlzIG9zaWVyIGNhZ2Ugb2Ygb3VycwogICAgV2l0aCBiYWxlZnVsIHdlZWRzIGFuZCBwcmVjaW91cy1qdWljZWQgZmxvd2Vycy4KICAgIFRoZSBlYXJ0aCB0aGF0J3MgbmF0dXJlJ3MgbW90aGVyIGlzIGhlciB0b21iOwogICAgV2hhdCBpcyBoZXIgYnVyeWluZyBncmF2ZSB0aGF0IGlzIGhlciB3b21iLAogICAgQW5kIGZyb20gaGVyIHdvbWIgY2hpbGRyZW4gb2YgZGl2ZXJzIGtpbmQKICAgIFdlIHN1Y2tpbmcgb24gaGVyIG5hdHVyYWwgYm9zb20gZmluZCwKICAgIE1hbnkgZm9yIG1hbnkgdmlydHVlcyBleGNlbGxlbnQsCiAgICBOb25lIGJ1dCBmb3Igc29tZSBhbmQgeWV0IGFsbCBkaWZmZXJlbnQuCiAgICBPLCBtaWNrbGUgaXMgdGhlIHBvd2VyZnVsIGdyYWNlIHRoYXQgbGllcwogICAgSW4gaGVyYnMsIHBsYW50cywgc3RvbmVzLCBhbmQgdGhlaXIgdHJ1ZSBxdWFsaXRpZXM6CiAgICBGb3Igbm91Z2h0IHNvIHZpbGUgdGhhdCBvbiB0aGUgZWFydGggZG90aCBsaXZlCiAgICBCdXQgdG8gdGhlIGVhcnRoIHNvbWUgc3BlY2lhbCBnb29kIGRvdGggZ2l2ZSwKICAgIE5vciBhdWdodCBzbyBnb29kIGJ1dCBzdHJhaW4nZCBmcm9tIHRoYXQgZmFpciB1c2UKICAgIFJldm9sdHMgZnJvbSB0cnVlIGJpcnRoLCBzdHVtYmxpbmcgb24gYWJ1c2U6CiAgICBWaXJ0dWUgaXRzZWxmIHR1cm5zIHZpY2UsIGJlaW5nIG1pc2FwcGxpZWQ7CiAgICBBbmQgdmljZSBzb21ldGltZXMgYnkgYWN0aW9uIGRpZ25pZmllZC4KICAgIFdpdGhpbiB0aGUgaW5mYW50IHJpbmQgb2YgdGhpcyBzbWFsbCBmbG93ZXIKICAgIFBvaXNvbiBoYXRoIHJlc2lkZW5jZSBhbmQgbWVkaWNpbmUgcG93ZXI6CiAgICBGb3IgdGhpcywgYmVpbmcgc21lbHQsIHdpdGggdGhhdCBwYXJ0IGNoZWVycyBlYWNoIHBhcnQ7CiAgICBCZWluZyB0YXN0ZWQsIHNsYXlzIGFsbCBzZW5zZXMgd2l0aCB0aGUgaGVhcnQuCiAgICBUd28gc3VjaCBvcHBvc2VkIGtpbmdzIGVuY2FtcCB0aGVtIHN0aWxsCiAgICBJbiBtYW4gYXMgd2VsbCBhcyBoZXJicywgZ3JhY2UgYW5kIHJ1ZGUgd2lsbDsKICAgIEFuZCB3aGVyZSB0aGUgd29yc2VyIGlzIHByZWRvbWluYW50LAogICAgRnVsbCBzb29uIHRoZSBjYW5rZXIgZGVhdGggZWF0cyB1cCB0aGF0IHBsYW50LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEdvb2QgbW9ycm93LCBmYXRoZXIuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlbmVkaWNpdGUhCiAgICBXaGF0IGVhcmx5IHRvbmd1ZSBzbyBzd2VldCBzYWx1dGV0aCBtZT8KICAgIFlvdW5nIHNvbiwgaXQgYXJndWVzIGEgZGlzdGVtcGVyJ2QgaGVhZAogICAgU28gc29vbiB0byBiaWQgZ29vZCBtb3Jyb3cgdG8gdGh5IGJlZDoKICAgIENhcmUga2VlcHMgaGlzIHdhdGNoIGluIGV2ZXJ5IG9sZCBtYW4ncyBleWUsCiAgICBBbmQgd2hlcmUgY2FyZSBsb2RnZXMsIHNsZWVwIHdpbGwgbmV2ZXIgbGllOwogICAgQnV0IHdoZXJlIHVuYnJ1aXNlZCB5b3V0aCB3aXRoIHVuc3R1ZmYnZCBicmFpbgogICAgRG90aCBjb3VjaCBoaXMgbGltYnMsIHRoZXJlIGdvbGRlbiBzbGVlcCBkb3RoIHJlaWduOgogICAgVGhlcmVmb3JlIHRoeSBlYXJsaW5lc3MgZG90aCBtZSBhc3N1cmUKICAgIFRob3UgYXJ0IHVwLXJvdXNlZCBieSBzb21lIGRpc3RlbXBlcmF0dXJlOwogICAgT3IgaWYgbm90IHNvLCB0aGVuIGhlcmUgSSBoaXQgaXQgcmlnaHQsCiAgICBPdXIgUm9tZW8gaGF0aCBub3QgYmVlbiBpbiBiZWQgdG8tbmlnaHQuCgpST01FTwoKICAgIFRoYXQgbGFzdCBpcyB0cnVlOyB0aGUgc3dlZXRlciByZXN0IHdhcyBtaW5lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHb2QgcGFyZG9uIHNpbiEgd2FzdCB0aG91IHdpdGggUm9zYWxpbmUCgpST01FTwoKICAgIFdpdGggUm9zYWxpbmUsIG15IGdob3N0bHkgZmF0aGVyPyBubzsKICAgIEkgaGF2ZSBmb3Jnb3QgdGhhdCBuYW1lLCBhbmQgdGhhdCBuYW1lJ3Mgd29lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGF0J3MgbXkgZ29vZCBzb246IGJ1dCB3aGVyZSBoYXN0IHRob3UgYmVlbiwgdGhlbj8KClJPTUVPCgogICAgSSdsbCB0ZWxsIHRoZWUsIGVyZSB0aG91IGFzayBpdCBtZSBhZ2Fpbi4KICAgIEkgaGF2ZSBiZWVuIGZlYXN0aW5nIHdpdGggbWluZSBlbmVteSwKICAgIFdoZXJlIG9uIGEgc3VkZGVuIG9uZSBoYXRoIHdvdW5kZWQgbWUsCiAgICBUaGF0J3MgYnkgbWUgd291bmRlZDogYm90aCBvdXIgcmVtZWRpZXMKICAgIFdpdGhpbiB0aHkgaGVscCBhbmQgaG9seSBwaHlzaWMgbGllczoKICAgIEkgYmVhciBubyBoYXRyZWQsIGJsZXNzZWQgbWFuLCBmb3IsIGxvLAogICAgTXkgaW50ZXJjZXNzaW9uIGxpa2V3aXNlIHN0ZWFkcyBteSBmb2UuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlIHBsYWluLCBnb29kIHNvbiwgYW5kIGhvbWVseSBpbiB0aHkgZHJpZnQ7CiAgICBSaWRkbGluZyBjb25mZXNzaW9uIGZpbmRzIGJ1dCByaWRkbGluZyBzaHJpZnQuCgpST01FTwoKICAgIFRoZW4gcGxhaW5seSBrbm93IG15IGhlYXJ0J3MgZGVhciBsb3ZlIGlzIHNldAogICAgT24gdGhlIGZhaXIgZGF1Z2h0ZXIgb2YgcmljaCBDYXB1bGV0OgogICAgQXMgbWluZSBvbiBoZXJzLCBzbyBoZXJzIGlzIHNldCBvbiBtaW5lOwogICAgQW5kIGFsbCBjb21iaW5lZCwgc2F2ZSB3aGF0IHRob3UgbXVzdCBjb21iaW5lCiAgICBCeSBob2x5IG1hcnJpYWdlOiB3aGVuIGFuZCB3aGVyZSBhbmQgaG93CiAgICBXZSBtZXQsIHdlIHdvbydkIGFuZCBtYWRlIGV4Y2hhbmdlIG9mIHZvdywKICAgIEknbGwgdGVsbCB0aGVlIGFzIHdlIHBhc3M7IGJ1dCB0aGlzIEkgcHJheSwKICAgIFRoYXQgdGhvdSBjb25zZW50IHRvIG1hcnJ5IHVzIHRvLWRheS4KCkZSSUFSIExBVVJFTkNFCgogICAgSG9seSBTYWludCBGcmFuY2lzLCB3aGF0IGEgY2hhbmdlIGlzIGhlcmUhCiAgICBJcyBSb3NhbGluZSwgd2hvbSB0aG91IGRpZHN0IGxvdmUgc28gZGVhciwKICAgIFNvIHNvb24gZm9yc2FrZW4IHlvdW5nIG1lbidzIGxvdmUgdGhlbiBsaWVzCiAgICBOb3QgdHJ1bHkgaW4gdGhlaXIgaGVhcnRzLCBidXQgaW4gdGhlaXIgZXllcy4KICAgIEplc3UgTWFyaWEsIHdoYXQgYSBkZWFsIG9mIGJyaW5lCiAgICBIYXRoIHdhc2gnZCB0aHkgc2FsbG93IGNoZWVrcyBmb3IgUm9zYWxpbmUhCiAgICBIb3cgbXVjaCBzYWx0IHdhdGVyIHRocm93biBhd2F5IGluIHdhc3RlLAogICAgVG8gc2Vhc29uIGxvdmUsIHRoYXQgb2YgaXQgZG90aCBub3QgdGFzdGUhCiAgICBUaGUgc3VuIG5vdCB5ZXQgdGh5IHNpZ2hzIGZyb20gaGVhdmVuIGNsZWFycywKICAgIFRoeSBvbGQgZ3JvYW5zIHJpbmcgeWV0IGluIG15IGFuY2llbnQgZWFyczsKICAgIExvLCBoZXJlIHVwb24gdGh5IGNoZWVrIHRoZSBzdGFpbiBkb3RoIHNpdAogICAgT2YgYW4gb2xkIHRlYXIgdGhhdCBpcyBub3Qgd2FzaCdkIG9mZiB5ZXQ6CiAgICBJZiBlJ2VyIHRob3Ugd2FzdCB0aHlzZWxmIGFuZCB0aGVzZSB3b2VzIHRoaW5lLAogICAgVGhvdSBhbmQgdGhlc2Ugd29lcyB3ZXJlIGFsbCBmb3IgUm9zYWxpbmU6CiAgICBBbmQgYXJ0IHRob3UgY2hhbmdlZD8gcHJvbm91bmNlIHRoaXMgc2VudGVuY2UgdGhlbiwKICAgIFdvbWVuIG1heSBmYWxsLCB3aGVuIHRoZXJlJ3Mgbm8gc3RyZW5ndGggaW4gbWVuLgoKUk9NRU8KCiAgICBUaG91IGNoaWQnc3QgbWUgb2Z0IGZvciBsb3ZpbmcgUm9zYWxpbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIEZvciBkb3RpbmcsIG5vdCBmb3IgbG92aW5nLCBwdXBpbCBtaW5lLgoKUk9NRU8KCiAgICBBbmQgYmFkJ3N0IG1lIGJ1cnkgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTm90IGluIGEgZ3JhdmUsCiAgICBUbyBsYXkgb25lIGluLCBhbm90aGVyIG91dCB0byBoYXZlLgoKUk9NRU8KCiAgICBJIHByYXkgdGhlZSwgY2hpZGUgbm90OyBzaGUgd2hvbSBJIGxvdmUgbm93CiAgICBEb3RoIGdyYWNlIGZvciBncmFjZSBhbmQgbG92ZSBmb3IgbG92ZSBhbGxvdzsKICAgIFRoZSBvdGhlciBkaWQgbm90IHNvLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBPLCBzaGUga25ldyB3ZWxsCiAgICBUaHkgbG92ZSBkaWQgcmVhZCBieSByb3RlIGFuZCBjb3VsZCBub3Qgc3BlbGwuCiAgICBCdXQgY29tZSwgeW91bmcgd2F2ZXJlciwgY29tZSwgZ28gd2l0aCBtZSwKICAgIEluIG9uZSByZXNwZWN0IEknbGwgdGh5IGFzc2lzdGFudCBiZTsKICAgIEZvciB0aGlzIGFsbGlhbmNlIG1heSBzbyBoYXBweSBwcm92ZSwKICAgIFRvIHR1cm4geW91ciBob3VzZWhvbGRzJyByYW5jb3VyIHRvIHB1cmUgbG92ZS4KClJPTUVPCgogICAgTywgbGV0IHVzIGhlbmNlOyBJIHN0YW5kIG9uIHN1ZGRlbiBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2lzZWx5IGFuZCBzbG93OyB0aGV5IHN0dW1ibGUgdGhhdCBydW4gZmFzdC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBCRU5WT0xJTyBhbmQgTUVSQ1VUSU8gCgpNRVJDVVRJTwoKICAgIFdoZXJlIHRoZSBkZXZpbCBzaG91bGQgdGhpcyBSb21lbyBiZT8KICAgIENhbWUgaGUgbm90IGhvbWUgdG8tbmlnaHQCgpCRU5WT0xJTwoKICAgIE5vdCB0byBoaXMgZmF0aGVyJ3M7IEkgc3Bva2Ugd2l0aCBoaXMgbWFuLgoKTUVSQ1VUSU8KCiAgICBBaCwgdGhhdCBzYW1lIHBhbGUgaGFyZC1oZWFydGVkIHdlbmNoLCB0aGF0IFJvc2FsaW5lLgogICAgVG9ybWVudHMgaGltIHNvLCB0aGF0IGhlIHdpbGwgc3VyZSBydW4gbWFkLgoKQkVOVk9MSU8KCiAgICBUeWJhbHQsIHRoZSBraW5zbWFuIG9mIG9sZCBDYXB1bGV0LAogICAgSGF0aCBzZW50IGEgbGV0dGVyIHRvIGhpcyBmYXRoZXIncyBob3VzZS4KCk1FUkNVVElPCgogICAgQSBjaGFsbGVuZ2UsIG9uIG15IGxpZmUuCgpCRU5WT0xJTwoKICAgIFJvbWVvIHdpbGwgYW5zd2VyIGl0LgoKTUVSQ1VUSU8KCiAgICBBbnkgbWFuIHRoYXQgY2FuIHdyaXRlIG1heSBhbnN3ZXIgYSBsZXR0ZXIuCgpCRU5WT0xJTwoKICAgIE5heSwgaGUgd2lsbCBhbnN3ZXIgdGhlIGxldHRlcidzIG1hc3RlciwgaG93IGhlCiAgICBkYXJlcywgYmVpbmcgZGFyZWQuCgpNRVJDVVRJTwoKICAgIEFsYXMgcG9vciBSb21lbyEgaGUgaXMgYWxyZWFkeSBkZWFkOyBzdGFiYmVkIHdpdGggYQogICAgd2hpdGUgd2VuY2gncyBibGFjayBleWU7IHNob3QgdGhyb3VnaCB0aGUgZWFyIHdpdGggYQogICAgbG92ZS1zb25nOyB0aGUgdmVyeSBwaW4gb2YgaGlzIGhlYXJ0IGNsZWZ0IHdpdGggdGhlCiAgICBibGluZCBib3ctYm95J3MgYnV0dC1zaGFmdDogYW5kIGlzIGhlIGEgbWFuIHRvCiAgICBlbmNvdW50ZXIgVHliYWx0PwoKQkVOVk9MSU8KCiAgICBXaHksIHdoYXQgaXMgVHliYWx0PwoKTUVSQ1VUSU8KCiAgICBNb3JlIHRoYW4gcHJpbmNlIG9mIGNhdHMsIEkgY2FuIHRlbGwgeW91LiBPLCBoZSBpcwogICAgdGhlIGNvdXJhZ2VvdXMgY2FwdGFpbiBvZiBjb21wbGltZW50cy4gSGUgZmlnaHRzIGFzCiAgICB5b3Ugc2luZyBwcmljay1zb25nLCBrZWVwcyB0aW1lLCBkaXN0YW5jZSwgYW5kCiAgICBwcm9wb3J0aW9uOyByZXN0cyBtZSBoaXMgbWluaW0gcmVzdCwgb25lLCB0d28sIGFuZAogICAgdGhlIHRoaXJkIGluIHlvdXIgYm9zb206IHRoZSB2ZXJ5IGJ1dGNoZXIgb2YgYSBzaWxrCiAgICBidXR0b24sIGEgZHVlbGxpc3QsIGEgZHVlbGxpc3Q7IGEgZ2VudGxlbWFuIG9mIHRoZQogICAgdmVyeSBmaXJzdCBob3VzZSwgb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2F1c2U6CiAgICBhaCwgdGhlIGltbW9ydGFsIHBhc3NhZG8hIHRoZSBwdW50byByZXZlcnNvISB0aGUKICAgIGhhaSEKCkJFTlZPTElPCgogICAgVGhlIHdoYXQCgpNRVJDVVRJTwoKICAgIFRoZSBwb3ggb2Ygc3VjaCBhbnRpYywgbGlzcGluZywgYWZmZWN0aW5nCiAgICBmYW50YXN0aWNvZXM7IHRoZXNlIG5ldyB0dW5lcnMgb2YgYWNjZW50cyEgJ0J5IEplc3UsCiAgICBhIHZlcnkgZ29vZCBibGFkZSEgYSB2ZXJ5IHRhbGwgbWFuISBhIHZlcnkgZ29vZAogICAgd2hvcmUhJyBXaHksIGlzIG5vdCB0aGlzIGEgbGFtZW50YWJsZSB0aGluZywKICAgIGdyYW5kc2lyZSwgdGhhdCB3ZSBzaG91bGQgYmUgdGh1cyBhZmZsaWN0ZWQgd2l0aAogICAgdGhlc2Ugc3RyYW5nZSBmbGllcywgdGhlc2UgZmFzaGlvbi1tb25nZXJzLCB0aGVzZQogICAgcGVyZG9uYS1taSdzLCB3aG8gc3RhbmQgc28gbXVjaCBvbiB0aGUgbmV3IGZvcm0sCiAgICB0aGF0IHRoZXkgY2Fubm90IGF0IGVhc2Ugb24gdGhlIG9sZCBiZW5jaD8gTywgdGhlaXIKICAgIGJvbmVzLCB0aGVpciBib25lcyEKCiAgICBFbnRlciBST01FTwoKQkVOVk9MSU8KCiAgICBIZXJlIGNvbWVzIFJvbWVvLCBoZXJlIGNvbWVzIFJvbWVvLgoKTUVSQ1VUSU8KCiAgICBXaXRob3V0IGhpcyByb2UsIGxpa2UgYSBkcmllZCBoZXJyaW5nOiBmbGVzaCwgZmxlc2gsCiAgICBob3cgYXJ0IHRob3UgZmlzaGlmaWVkISBOb3cgaXMgaGUgZm9yIHRoZSBudW1iZXJzCiAgICB0aGF0IFBldHJhcmNoIGZsb3dlZCBpbjogTGF1cmEgdG8gaGlzIGxhZHkgd2FzIGJ1dCBhCiAgICBraXRjaGVuLXdlbmNoOyBtYXJyeSwgc2hlIGhhZCBhIGJldHRlciBsb3ZlIHRvCiAgICBiZS1yaHltZSBoZXI7IERpZG8gYSBkb3dkeTsgQ2xlb3BhdHJhIGEgZ2lwc3k7CiAgICBIZWxlbiBhbmQgSGVybyBoaWxkaW5ncyBhbmQgaGFybG90czsgVGhpc2JlIGEgZ3JleQogICAgZXllIG9yIHNvLCBidXQgbm90IHRvIHRoZSBwdXJwb3NlLiBTaWduaW9yCiAgICBSb21lbywgYm9uIGpvdXIhIHRoZXJlJ3MgYSBGcmVuY2ggc2FsdXRhdGlvbgogICAgdG8geW91ciBGcmVuY2ggc2xvcC4gWW91IGdhdmUgdXMgdGhlIGNvdW50ZXJmZWl0CiAgICBmYWlybHkgbGFzdCBuaWdodC4KClJPTUVPCgogICAgR29vZCBtb3Jyb3cgdG8geW91IGJvdGguIFdoYXQgY291bnRlcmZlaXQgZGlkIEkgZ2l2ZSB5b3UCgpNRVJDVVRJTwoKICAgIFRoZSBzaGlwLCBzaXIsIHRoZSBzbGlwOyBjYW4geW91IG5vdCBjb25jZWl2ZT8KClJPTUVPCgogICAgUGFyZG9uLCBnb29kIE1lcmN1dGlvLCBteSBidXNpbmVzcyB3YXMgZ3JlYXQ7IGFuZCBpbgogICAgc3VjaCBhIGNhc2UgYXMgbWluZSBhIG1hbiBtYXkgc3RyYWluIGNvdXJ0ZXN5LgoKTUVSQ1VUSU8KCiAgICBUaGF0J3MgYXMgbXVjaCBhcyB0byBzYXksIHN1Y2ggYSBjYXNlIGFzIHlvdXJzCiAgICBjb25zdHJhaW5zIGEgbWFuIHRvIGJvdyBpbiB0aGUgaGFtcy4KClJPTUVPCgogICAgTWVhbmluZywgdG8gY291cnQnc3kuCgpNRVJDVVRJTwoKICAgIFRob3UgaGFzdCBtb3N0IGtpbmRseSBoaXQgaXQuCgpST01FTwoKICAgIEEgbW9zdCBjb3VydGVvdXMgZXhwb3NpdGlvbi4KCk1FUkNVVElPCgogICAgTmF5LCBJIGFtIHRoZSB2ZXJ5IHBpbmsgb2YgY291cnRlc3kuCgpST01FTwoKICAgIFBpbmsgZm9yIGZsb3dlci4KCk1FUkNVVElPCgogICAgUmlnaHQuCgpST01FTwoKICAgIFdoeSwgdGhlbiBpcyBteSBwdW1wIHdlbGwgZmxvd2VyZWQuCgpNRVJDVVRJTwoKICAgIFdlbGwgc2FpZDogZm9sbG93IG1lIHRoaXMgamVzdCBub3cgdGlsbCB0aG91IGhhc3QKICAgIHdvcm4gb3V0IHRoeSBwdW1wLCB0aGF0IHdoZW4gdGhlIHNpbmdsZSBzb2xlIG9mIGl0CiAgICBpcyB3b3JuLCB0aGUgamVzdCBtYXkgcmVtYWluIGFmdGVyIHRoZSB3ZWFyaW5nIHNvbGUgc2luZ3VsYXIuCgpST01FTwoKICAgIE8gc2luZ2xlLXNvbGVkIGplc3QsIHNvbGVseSBzaW5ndWxhciBmb3IgdGhlCiAgICBzaW5nbGVuZXNzLgoKTUVSQ1VUSU8KCiAgICBDb21lIGJldHdlZW4gdXMsIGdvb2QgQmVudm9saW87IG15IHdpdHMgZmFpbnQuCgpST01FTwoKICAgIFN3aXRjaCBhbmQgc3B1cnMsIHN3aXRjaCBhbmQgc3B1cnM7IG9yIEknbGwgY3J5IGEgbWF0Y2guCgpNRVJDVVRJTwoKICAgIE5heSwgaWYgdGh5IHdpdHMgcnVuIHRoZSB3aWxkLWdvb3NlIGNoYXNlLCBJIGhhdmUKICAgIGRvbmUsIGZvciB0aG91IGhhc3QgbW9yZSBvZiB0aGUgd2lsZC1nb29zZSBpbiBvbmUgb2YKICAgIHRoeSB3aXRzIHRoYW4sIEkgYW0gc3VyZSwgSSBoYXZlIGluIG15IHdob2xlIGZpdmU6CiAgICB3YXMgSSB3aXRoIHlvdSB0aGVyZSBmb3IgdGhlIGdvb3NlPwoKUk9NRU8KCiAgICBUaG91IHdhc3QgbmV2ZXIgd2l0aCBtZSBmb3IgYW55IHRoaW5nIHdoZW4gdGhvdSB3YXN0CiAgICBub3QgdGhlcmUgZm9yIHRoZSBnb29zZS4KCk1FUkNVVElPCgogICAgSSB3aWxsIGJpdGUgdGhlZSBieSB0aGUgZWFyIGZvciB0aGF0IGplc3QuCgpST01FTwoKICAgIE5heSwgZ29vZCBnb29zZSwgYml0ZSBub3QuCgpNRVJDVVRJTwoKICAgIFRoeSB3aXQgaXMgYSB2ZXJ5IGJpdHRlciBzd2VldGluZzsgaXQgaXMgYSBtb3N0CiAgICBzaGFycCBzYXVjZS4KClJPTUVPCgogICAgQW5kIGlzIGl0IG5vdCB3ZWxsIHNlcnZlZCBpbiB0byBhIHN3ZWV0IGdvb3NlPwoKTUVSQ1VUSU8KCiAgICBPIGhlcmUncyBhIHdpdCBvZiBjaGV2ZXJpbCwgdGhhdCBzdHJldGNoZXMgZnJvbSBhbgogICAgaW5jaCBuYXJyb3cgdG8gYW4gZWxsIGJyb2FkIQoKUk9NRU8KCiAgICBJIHN0cmV0Y2ggaXQgb3V0IGZvciB0aGF0IHdvcmQgJ2Jyb2FkOycgd2hpY2ggYWRkZWQKICAgIHRvIHRoZSBnb29zZSwgcHJvdmVzIHRoZWUgZmFyIGFuZCB3aWRlIGEgYnJvYWQgZ29vc2UuCgpNRVJDVVRJTwoKICAgIFdoeSwgaXMgbm90IHRoaXMgYmV0dGVyIG5vdyB0aGFuIGdyb2FuaW5nIGZvciBsb3ZlPwogICAgbm93IGFydCB0aG91IHNvY2lhYmxlLCBub3cgYXJ0IHRob3UgUm9tZW87IG5vdyBhcnQKICAgIHRob3Ugd2hhdCB0aG91IGFydCwgYnkgYXJ0IGFzIHdlbGwgYXMgYnkgbmF0dXJlOgogICAgZm9yIHRoaXMgZHJpdmVsbGluZyBsb3ZlIGlzIGxpa2UgYSBncmVhdCBuYXR1cmFsLAogICAgdGhhdCBydW5zIGxvbGxpbmcgdXAgYW5kIGRvd24gdG8gaGlkZSBoaXMgYmF1YmxlIGluIGEgaG9sZS4KCkJFTlZPTElPCgogICAgU3RvcCB0aGVyZSwgc3RvcCB0aGVyZS4KCk1FUkNVVElPCgogICAgVGhvdSBkZXNpcmVzdCBtZSB0byBzdG9wIGluIG15IHRhbGUgYWdhaW5zdCB0aGUgaGFpci4KCkJFTlZPTElPCgogICAgVGhvdSB3b3VsZHN0IGVsc2UgaGF2ZSBtYWRlIHRoeSB0YWxlIGxhcmdlLgoKTUVSQ1VUSU8KCiAgICBPLCB0aG91IGFydCBkZWNlaXZlZDsgSSB3b3VsZCBoYXZlIG1hZGUgaXQgc2hvcnQ6CiAgICBmb3IgSSB3YXMgY29tZSB0byB0aGUgd2hvbGUgZGVwdGggb2YgbXkgdGFsZTsgYW5kCiAgICBtZWFudCwgaW5kZWVkLCB0byBvY2N1cHkgdGhlIGFyZ3VtZW50IG5vIGxvbmdlci4KClJPTUVPCgogICAgSGVyZSdzIGdvb2RseSBnZWFyIQoKICAgIEVudGVyIE51cnNlIGFuZCBQRVRFUgoKTUVSQ1VUSU8KCiAgICBBIHNhaWwsIGEgc2FpbCEKCkJFTlZPTElPCgogICAgVHdvLCB0d287IGEgc2hpcnQgYW5kIGEgc21vY2suCgpOdXJzZQoKICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBNeSBmYW4sIFBldGVyLgoKTUVSQ1VUSU8KCiAgICBHb29kIFBldGVyLCB0byBoaWRlIGhlciBmYWNlOyBmb3IgaGVyIGZhbidzIHRoZQogICAgZmFpcmVyIGZhY2UuCgpOdXJzZQoKICAgIEdvZCB5ZSBnb29kIG1vcnJvdywgZ2VudGxlbWVuLgoKTUVSQ1VUSU8KCiAgICBHb2QgeWUgZ29vZCBkZW4sIGZhaXIgZ2VudGxld29tYW4uCgpOdXJzZQoKICAgIElzIGl0IGdvb2QgZGVuPwoKTUVSQ1VUSU8KCiAgICAnVGlzIG5vIGxlc3MsIEkgdGVsbCB5b3UsIGZvciB0aGUgYmF3ZHkgaGFuZCBvZiB0aGUKICAgIGRpYWwgaXMgbm93IHVwb24gdGhlIHByaWNrIG9mIG5vb24uCgpOdXJzZQoKICAgIE91dCB1cG9uIHlvdSEgd2hhdCBhIG1hbiBhcmUgeW91IQoKUk9NRU8KCiAgICBPbmUsIGdlbnRsZXdvbWFuLCB0aGF0IEdvZCBoYXRoIG1hZGUgZm9yIGhpbXNlbGYgdG8KICAgIG1hci4KCk51cnNlCgogICAgQnkgbXkgdHJvdGgsIGl0IGlzIHdlbGwgc2FpZDsgJ2ZvciBoaW1zZWxmIHRvIG1hciwnCiAgICBxdW90aCBhJz8gR2VudGxlbWVuLCBjYW4gYW55IG9mIHlvdSB0ZWxsIG1lIHdoZXJlIEkKICAgIG1heSBmaW5kIHRoZSB5b3VuZyBSb21lbz8KClJPTUVPCgogICAgSSBjYW4gdGVsbCB5b3U7IGJ1dCB5b3VuZyBSb21lbyB3aWxsIGJlIG9sZGVyIHdoZW4KICAgIHlvdSBoYXZlIGZvdW5kIGhpbSB0aGFuIGhlIHdhcyB3aGVuIHlvdSBzb3VnaHQgaGltOgogICAgSSBhbSB0aGUgeW91bmdlc3Qgb2YgdGhhdCBuYW1lLCBmb3IgZmF1bHQgb2YgYSB3b3JzZS4KCk51cnNlCgogICAgWW91IHNheSB3ZWxsLgoKTUVSQ1VUSU8KCiAgICBZZWEsIGlzIHRoZSB3b3JzdCB3ZWxsPyB2ZXJ5IHdlbGwgdG9vaywgaScgZmFpdGg7CiAgICB3aXNlbHksIHdpc2VseS4KCk51cnNlCgogICAgaWYgeW91IGJlIGhlLCBzaXIsIEkgZGVzaXJlIHNvbWUgY29uZmlkZW5jZSB3aXRoCiAgICB5b3UuCgpCRU5WT0xJTwoKICAgIFNoZSB3aWxsIGluZGl0ZSBoaW0gdG8gc29tZSBzdXBwZXIuCgpNRVJDVVRJTwoKICAgIEEgYmF3ZCwgYSBiYXdkLCBhIGJhd2QhIHNvIGhvIQoKUk9NRU8KCiAgICBXaGF0IGhhc3QgdGhvdSBmb3VuZD8KCk1FUkNVVElPCgogICAgTm8gaGFyZSwgc2lyOyB1bmxlc3MgYSBoYXJlLCBzaXIsIGluIGEgbGVudGVuIHBpZSwKICAgIHRoYXQgaXMgc29tZXRoaW5nIHN0YWxlIGFuZCBob2FyIGVyZSBpdCBiZSBzcGVudC4KCiAgICBTaW5ncwogICAgQW4gb2xkIGhhcmUgaG9hciwKICAgIEFuZCBhbiBvbGQgaGFyZSBob2FyLAogICAgSXMgdmVyeSBnb29kIG1lYXQgaW4gbGVudAogICAgQnV0IGEgaGFyZSB0aGF0IGlzIGhvYXIKICAgIElzIHRvbyBtdWNoIGZvciBhIHNjb3JlLAogICAgV2hlbiBpdCBob2FycyBlcmUgaXQgYmUgc3BlbnQuCiAgICBSb21lbywgd2lsbCB5b3UgY29tZSB0byB5b3VyIGZhdGhlcidzPyB3ZSdsbAogICAgdG8gZGlubmVyLCB0aGl0aGVyLgoKUk9NRU8KCiAgICBJIHdpbGwgZm9sbG93IHlvdS4KCk1FUkNVVElPCgogICAgRmFyZXdlbGwsIGFuY2llbnQgbGFkeTsgZmFyZXdlbGwsCgogICAgU2luZ2luZwogICAgJ2xhZHksIGxhZHksIGxhZHkuJwoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KCk51cnNlCgogICAgTWFycnksIGZhcmV3ZWxsISBJIHByYXkgeW91LCBzaXIsIHdoYXQgc2F1Y3kKICAgIG1lcmNoYW50IHdhcyB0aGlzLCB0aGF0IHdhcyBzbyBmdWxsIG9mIGhpcyByb3BlcnkCgpST01FTwoKICAgIEEgZ2VudGxlbWFuLCBudXJzZSwgdGhhdCBsb3ZlcyB0byBoZWFyIGhpbXNlbGYgdGFsaywKICAgIGFuZCB3aWxsIHNwZWFrIG1vcmUgaW4gYSBtaW51dGUgdGhhbiBoZSB3aWxsIHN0YW5kCiAgICB0byBpbiBhIG1vbnRoLgoKTnVyc2UKCiAgICBBbiBhJyBzcGVhayBhbnkgdGhpbmcgYWdhaW5zdCBtZSwgSSdsbCB0YWtlIGhpbQogICAgZG93biwgYW4gYScgd2VyZSBsdXN0aWVyIHRoYW4gaGUgaXMsIGFuZCB0d2VudHkgc3VjaAogICAgSmFja3M7IGFuZCBpZiBJIGNhbm5vdCwgSSdsbCBmaW5kIHRob3NlIHRoYXQgc2hhbGwuCiAgICBTY3Vydnkga25hdmUhIEkgYW0gbm9uZSBvZiBoaXMgZmxpcnQtZ2lsbHM7IEkgYW0KICAgIG5vbmUgb2YgaGlzIHNrYWlucy1tYXRlcy4gQW5kIHRob3UgbXVzdCBzdGFuZCBieQogICAgdG9vLCBhbmQgc3VmZmVyIGV2ZXJ5IGtuYXZlIHRvIHVzZSBtZSBhdCBoaXMgcGxlYXN1cmUCgpQRVRFUgoKICAgIEkgc2F3IG5vIG1hbiB1c2UgeW91IGEgcGxlYXN1cmU7IGlmIEkgaGFkLCBteSB3ZWFwb24KICAgIHNob3VsZCBxdWlja2x5IGhhdmUgYmVlbiBvdXQsIEkgd2FycmFudCB5b3U6IEkgZGFyZQogICAgZHJhdyBhcyBzb29uIGFzIGFub3RoZXIgbWFuLCBpZiBJIHNlZSBvY2Nhc2lvbiBpbiBhCiAgICBnb29kIHF1YXJyZWwsIGFuZCB0aGUgbGF3IG9uIG15IHNpZGUuCgpOdXJzZQoKICAgIE5vdywgYWZvcmUgR29kLCBJIGFtIHNvIHZleGVkLCB0aGF0IGV2ZXJ5IHBhcnQgYWJvdXQKICAgIG1lIHF1aXZlcnMuIFNjdXJ2eSBrbmF2ZSEgUHJheSB5b3UsIHNpciwgYSB3b3JkOgogICAgYW5kIGFzIEkgdG9sZCB5b3UsIG15IHlvdW5nIGxhZHkgYmFkZSBtZSBpbnF1aXJlIHlvdQogICAgb3V0OyB3aGF0IHNoZSBiYWRlIG1lIHNheSwgSSB3aWxsIGtlZXAgdG8gbXlzZWxmOgogICAgYnV0IGZpcnN0IGxldCBtZSB0ZWxsIHllLCBpZiB5ZSBzaG91bGQgbGVhZCBoZXIgaW50bwogICAgYSBmb29sJ3MgcGFyYWRpc2UsIGFzIHRoZXkgc2F5LCBpdCB3ZXJlIGEgdmVyeSBncm9zcwogICAga2luZCBvZiBiZWhhdmlvciwgYXMgdGhleSBzYXk6IGZvciB0aGUgZ2VudGxld29tYW4KICAgIGlzIHlvdW5nOyBhbmQsIHRoZXJlZm9yZSwgaWYgeW91IHNob3VsZCBkZWFsIGRvdWJsZQogICAgd2l0aCBoZXIsIHRydWx5IGl0IHdlcmUgYW4gaWxsIHRoaW5nIHRvIGJlIG9mZmVyZWQKICAgIHRvIGFueSBnZW50bGV3b21hbiwgYW5kIHZlcnkgd2VhayBkZWFsaW5nLgoKUk9NRU8KCiAgICBOdXJzZSwgY29tbWVuZCBtZSB0byB0aHkgbGFkeSBhbmQgbWlzdHJlc3MuIEkKICAgIHByb3Rlc3QgdW50byB0aGVlLS0KCk51cnNlCgogICAgR29vZCBoZWFydCwgYW5kLCBpJyBmYWl0aCwgSSB3aWxsIHRlbGwgaGVyIGFzIG11Y2g6CiAgICBMb3JkLCBMb3JkLCBzaGUgd2lsbCBiZSBhIGpveWZ1bCB3b21hbi4KClJPTUVPCgogICAgV2hhdCB3aWx0IHRob3UgdGVsbCBoZXIsIG51cnNlPyB0aG91IGRvc3Qgbm90IG1hcmsgbWUuCgpOdXJzZQoKICAgIEkgd2lsbCB0ZWxsIGhlciwgc2lyLCB0aGF0IHlvdSBkbyBwcm90ZXN0OyB3aGljaCwgYXMKICAgIEkgdGFrZSBpdCwgaXMgYSBnZW50bGVtYW5saWtlIG9mZmVyLgoKUk9NRU8KCiAgICBCaWQgaGVyIGRldmlzZQogICAgU29tZSBtZWFucyB0byBjb21lIHRvIHNocmlmdCB0aGlzIGFmdGVybm9vbjsKICAgIEFuZCB0aGVyZSBzaGUgc2hhbGwgYXQgRnJpYXIgTGF1cmVuY2UnIGNlbGwKICAgIEJlIHNocml2ZWQgYW5kIG1hcnJpZWQuIEhlcmUgaXMgZm9yIHRoeSBwYWlucy4KCk51cnNlCgogICAgTm8gdHJ1bHkgc2lyOyBub3QgYSBwZW5ueS4KClJPTUVPCgogICAgR28gdG87IEkgc2F5IHlvdSBzaGFsbC4KCk51cnNlCgogICAgVGhpcyBhZnRlcm5vb24sIHNpcj8gd2VsbCwgc2hlIHNoYWxsIGJlIHRoZXJlLgoKUk9NRU8KCiAgICBBbmQgc3RheSwgZ29vZCBudXJzZSwgYmVoaW5kIHRoZSBhYmJleSB3YWxsOgogICAgV2l0aGluIHRoaXMgaG91ciBteSBtYW4gc2hhbGwgYmUgd2l0aCB0aGVlCiAgICBBbmQgYnJpbmcgdGhlZSBjb3JkcyBtYWRlIGxpa2UgYSB0YWNrbGVkIHN0YWlyOwogICAgV2hpY2ggdG8gdGhlIGhpZ2ggdG9wLWdhbGxhbnQgb2YgbXkgam95CiAgICBNdXN0IGJlIG15IGNvbnZveSBpbiB0aGUgc2VjcmV0IG5pZ2h0LgogICAgRmFyZXdlbGw7IGJlIHRydXN0eSwgYW5kIEknbGwgcXVpdCB0aHkgcGFpbnM6CiAgICBGYXJld2VsbDsgY29tbWVuZCBtZSB0byB0aHkgbWlzdHJlc3MuCgpOdXJzZQoKICAgIE5vdyBHb2QgaW4gaGVhdmVuIGJsZXNzIHRoZWUhIEhhcmsgeW91LCBzaXIuCgpST01FTwoKICAgIFdoYXQgc2F5J3N0IHRob3UsIG15IGRlYXIgbnVyc2UCgpOdXJzZQoKICAgIElzIHlvdXIgbWFuIHNlY3JldD8gRGlkIHlvdSBuZSdlciBoZWFyIHNheSwKICAgIFR3byBtYXkga2VlcCBjb3Vuc2VsLCBwdXR0aW5nIG9uZSBhd2F5PwoKUk9NRU8KCiAgICBJIHdhcnJhbnQgdGhlZSwgbXkgbWFuJ3MgYXMgdHJ1ZSBhcyBzdGVlbC4KCk5VUlNFCgogICAgV2VsbCwgc2lyOyBteSBtaXN0cmVzcyBpcyB0aGUgc3dlZXRlc3QgbGFkeS0tTG9yZCwKICAgIExvcmQhIHdoZW4gJ3R3YXMgYSBsaXR0bGUgcHJhdGluZyB0aGluZzotLU8sIHRoZXJlCiAgICBpcyBhIG5vYmxlbWFuIGluIHRvd24sIG9uZSBQYXJpcywgdGhhdCB3b3VsZCBmYWluCiAgICBsYXkga25pZmUgYWJvYXJkOyBidXQgc2hlLCBnb29kIHNvdWwsIGhhZCBhcyBsaWVmCiAgICBzZWUgYSB0b2FkLCBhIHZlcnkgdG9hZCwgYXMgc2VlIGhpbS4gSSBhbmdlciBoZXIKICAgIHNvbWV0aW1lcyBhbmQgdGVsbCBoZXIgdGhhdCBQYXJpcyBpcyB0aGUgcHJvcGVyZXIKICAgIG1hbjsgYnV0LCBJJ2xsIHdhcnJhbnQgeW91LCB3aGVuIEkgc2F5IHNvLCBzaGUgbG9va3MKICAgIGFzIHBhbGUgYXMgYW55IGNsb3V0IGluIHRoZSB2ZXJzYWwgd29ybGQuIERvdGggbm90CiAgICByb3NlbWFyeSBhbmQgUm9tZW8gYmVnaW4gYm90aCB3aXRoIGEgbGV0dGVyPwoKUk9NRU8KCiAgICBBeSwgbnVyc2U7IHdoYXQgb2YgdGhhdD8gYm90aCB3aXRoIGFuIFIuCgpOdXJzZQoKICAgIEFoLiBtb2NrZXIhIHRoYXQncyB0aGUgZG9nJ3MgbmFtZTsgUiBpcyBmb3IKICAgIHRoZS0tTm87IEkga25vdyBpdCBiZWdpbnMgd2l0aCBzb21lIG90aGVyCiAgICBsZXR0ZXI6LS1hbmQgc2hlIGhhdGggdGhlIHByZXR0aWVzdCBzZW50ZW50aW91cyBvZgogICAgaXQsIG9mIHlvdSBhbmQgcm9zZW1hcnksIHRoYXQgaXQgd291bGQgZG8geW91IGdvb2QKICAgIHRvIGhlYXIgaXQuCgpST01FTwoKICAgIENvbW1lbmQgbWUgdG8gdGh5IGxhZHkuCgpOdXJzZQoKICAgIEF5LCBhIHRob3VzYW5kIHRpbWVzLgoKICAgIEV4aXQgUm9tZW8KICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBQZXRlciwgdGFrZSBteSBmYW4sIGFuZCBnbyBiZWZvcmUgYW5kIGFwYWNlLgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgSlVMSUVUIAoKSlVMSUVUCgogICAgVGhlIGNsb2NrIHN0cnVjayBuaW5lIHdoZW4gSSBkaWQgc2VuZCB0aGUgbnVyc2U7CiAgICBJbiBoYWxmIGFuIGhvdXIgc2hlIHByb21pc2VkIHRvIHJldHVybi4KICAgIFBlcmNoYW5jZSBzaGUgY2Fubm90IG1lZXQgaGltOiB0aGF0J3Mgbm90IHNvLgogICAgTywgc2hlIGlzIGxhbWUhIGxvdmUncyBoZXJhbGRzIHNob3VsZCBiZSB0aG91Z2h0cywKICAgIFdoaWNoIHRlbiB0aW1lcyBmYXN0ZXIgZ2xpZGUgdGhhbiB0aGUgc3VuJ3MgYmVhbXMsCiAgICBEcml2aW5nIGJhY2sgc2hhZG93cyBvdmVyIGxvdXJpbmcgaGlsbHM6CiAgICBUaGVyZWZvcmUgZG8gbmltYmxlLXBpbmlvbidkIGRvdmVzIGRyYXcgbG92ZSwKICAgIEFuZCB0aGVyZWZvcmUgaGF0aCB0aGUgd2luZC1zd2lmdCBDdXBpZCB3aW5ncy4KICAgIE5vdyBpcyB0aGUgc3VuIHVwb24gdGhlIGhpZ2htb3N0IGhpbGwKICAgIE9mIHRoaXMgZGF5J3Mgam91cm5leSwgYW5kIGZyb20gbmluZSB0aWxsIHR3ZWx2ZQogICAgSXMgdGhyZWUgbG9uZyBob3VycywgeWV0IHNoZSBpcyBub3QgY29tZS4KICAgIEhhZCBzaGUgYWZmZWN0aW9ucyBhbmQgd2FybSB5b3V0aGZ1bCBibG9vZCwKICAgIFNoZSB3b3VsZCBiZSBhcyBzd2lmdCBpbiBtb3Rpb24gYXMgYSBiYWxsOwogICAgTXkgd29yZHMgd291bGQgYmFuZHkgaGVyIHRvIG15IHN3ZWV0IGxvdmUsCiAgICBBbmQgaGlzIHRvIG1lOgogICAgQnV0IG9sZCBmb2xrcywgbWFueSBmZWlnbiBhcyB0aGV5IHdlcmUgZGVhZDsKICAgIFVud2llbGR5LCBzbG93LCBoZWF2eSBhbmQgcGFsZSBhcyBsZWFkLgogICAgTyBHb2QsIHNoZSBjb21lcyEKCiAgICBFbnRlciBOdXJzZSBhbmQgUEVURVIKICAgIE8gaG9uZXkgbnVyc2UsIHdoYXQgbmV3cz8KICAgIEhhc3QgdGhvdSBtZXQgd2l0aCBoaW0IFNlbmQgdGh5IG1hbiBhd2F5LgoKTnVyc2UKCiAgICBQZXRlciwgc3RheSBhdCB0aGUgZ2F0ZS4KCiAgICBFeGl0IFBFVEVSCgpKVUxJRVQKCiAgICBOb3csIGdvb2Qgc3dlZXQgbnVyc2UsLS1PIExvcmQsIHdoeSBsb29rJ3N0IHRob3Ugc2FkPwogICAgVGhvdWdoIG5ld3MgYmUgc2FkLCB5ZXQgdGVsbCB0aGVtIG1lcnJpbHk7CiAgICBJZiBnb29kLCB0aG91IHNoYW1lc3QgdGhlIG11c2ljIG9mIHN3ZWV0IG5ld3MKICAgIEJ5IHBsYXlpbmcgaXQgdG8gbWUgd2l0aCBzbyBzb3VyIGEgZmFjZS4KCk51cnNlCgogICAgSSBhbSBhLXdlYXJ5LCBnaXZlIG1lIGxlYXZlIGF3aGlsZToKICAgIEZpZSwgaG93IG15IGJvbmVzIGFjaGUhIHdoYXQgYSBqYXVudCBoYXZlIEkgaGFkIQoKSlVMSUVUCgogICAgSSB3b3VsZCB0aG91IGhhZHN0IG15IGJvbmVzLCBhbmQgSSB0aHkgbmV3czoKICAgIE5heSwgY29tZSwgSSBwcmF5IHRoZWUsIHNwZWFrOyBnb29kLCBnb29kIG51cnNlLCBzcGVhay4KCk51cnNlCgogICAgSmVzdSwgd2hhdCBoYXN0ZT8gY2FuIHlvdSBub3Qgc3RheSBhd2hpbGUCiAgICBEbyB5b3Ugbm90IHNlZSB0aGF0IEkgYW0gb3V0IG9mIGJyZWF0aD8KCkpVTElFVAoKICAgIEhvdyBhcnQgdGhvdSBvdXQgb2YgYnJlYXRoLCB3aGVuIHRob3UgaGFzdCBicmVhdGgKICAgIFRvIHNheSB0byBtZSB0aGF0IHRob3UgYXJ0IG91dCBvZiBicmVhdGgCiAgICBUaGUgZXhjdXNlIHRoYXQgdGhvdSBkb3N0IG1ha2UgaW4gdGhpcyBkZWxheQogICAgSXMgbG9uZ2VyIHRoYW4gdGhlIHRhbGUgdGhvdSBkb3N0IGV4Y3VzZS4KICAgIElzIHRoeSBuZXdzIGdvb2QsIG9yIGJhZD8gYW5zd2VyIHRvIHRoYXQ7CiAgICBTYXkgZWl0aGVyLCBhbmQgSSdsbCBzdGF5IHRoZSBjaXJjdW1zdGFuY2U6CiAgICBMZXQgbWUgYmUgc2F0aXNmaWVkLCBpcyd0IGdvb2Qgb3IgYmFkPwoKTnVyc2UKCiAgICBXZWxsLCB5b3UgaGF2ZSBtYWRlIGEgc2ltcGxlIGNob2ljZTsgeW91IGtub3cgbm90CiAgICBob3cgdG8gY2hvb3NlIGEgbWFuOiBSb21lbyEgbm8sIG5vdCBoZTsgdGhvdWdoIGhpcwogICAgZmFjZSBiZSBiZXR0ZXIgdGhhbiBhbnkgbWFuJ3MsIHlldCBoaXMgbGVnIGV4Y2VscwogICAgYWxsIG1lbidzOyBhbmQgZm9yIGEgaGFuZCwgYW5kIGEgZm9vdCwgYW5kIGEgYm9keSwKICAgIHRob3VnaCB0aGV5IGJlIG5vdCB0byBiZSB0YWxrZWQgb24sIHlldCB0aGV5IGFyZQogICAgcGFzdCBjb21wYXJlOiBoZSBpcyBub3QgdGhlIGZsb3dlciBvZiBjb3VydGVzeSwKICAgIGJ1dCwgSSdsbCB3YXJyYW50IGhpbSwgYXMgZ2VudGxlIGFzIGEgbGFtYi4gR28gdGh5CiAgICB3YXlzLCB3ZW5jaDsgc2VydmUgR29kLiBXaGF0LCBoYXZlIHlvdSBkaW5lZCBhdCBob21lPwoKSlVMSUVUCgogICAgTm8sIG5vOiBidXQgYWxsIHRoaXMgZGlkIEkga25vdyBiZWZvcmUuCiAgICBXaGF0IHNheXMgaGUgb2Ygb3VyIG1hcnJpYWdlPyB3aGF0IG9mIHRoYXQCgpOdXJzZQoKICAgIExvcmQsIGhvdyBteSBoZWFkIGFjaGVzISB3aGF0IGEgaGVhZCBoYXZlIEkhCiAgICBJdCBiZWF0cyBhcyBpdCB3b3VsZCBmYWxsIGluIHR3ZW50eSBwaWVjZXMuCiAgICBNeSBiYWNrIG8nIHQnIG90aGVyIHNpZGUsLS1PLCBteSBiYWNrLCBteSBiYWNrIQogICAgQmVzaHJldyB5b3VyIGhlYXJ0IGZvciBzZW5kaW5nIG1lIGFib3V0LAogICAgVG8gY2F0Y2ggbXkgZGVhdGggd2l0aCBqYXVudGluZyB1cCBhbmQgZG93biEKCkpVTElFVAoKICAgIEknIGZhaXRoLCBJIGFtIHNvcnJ5IHRoYXQgdGhvdSBhcnQgbm90IHdlbGwuCiAgICBTd2VldCwgc3dlZXQsIHN3ZWV0IG51cnNlLCB0ZWxsIG1lLCB3aGF0IHNheXMgbXkgbG92ZT8KCk51cnNlCgogICAgWW91ciBsb3ZlIHNheXMsIGxpa2UgYW4gaG9uZXN0IGdlbnRsZW1hbiwgYW5kIGEKICAgIGNvdXJ0ZW91cywgYW5kIGEga2luZCwgYW5kIGEgaGFuZHNvbWUsIGFuZCwgSQogICAgd2FycmFudCwgYSB2aXJ0dW91cywtLVdoZXJlIGlzIHlvdXIgbW90aGVyPwoKSlVMSUVUCgogICAgV2hlcmUgaXMgbXkgbW90aGVyISB3aHksIHNoZSBpcyB3aXRoaW47CiAgICBXaGVyZSBzaG91bGQgc2hlIGJlPyBIb3cgb2RkbHkgdGhvdSByZXBsaWVzdCEKICAgICdZb3VyIGxvdmUgc2F5cywgbGlrZSBhbiBob25lc3QgZ2VudGxlbWFuLAogICAgV2hlcmUgaXMgeW91ciBtb3RoZXIJwoKTnVyc2UKCiAgICBPIEdvZCdzIGxhZHkgZGVhciEKICAgIEFyZSB5b3Ugc28gaG90PyBtYXJyeSwgY29tZSB1cCwgSSB0cm93OwogICAgSXMgdGhpcyB0aGUgcG91bHRpY2UgZm9yIG15IGFjaGluZyBib25lcz8KICAgIEhlbmNlZm9yd2FyZCBkbyB5b3VyIG1lc3NhZ2VzIHlvdXJzZWxmLgoKSlVMSUVUCgogICAgSGVyZSdzIHN1Y2ggYSBjb2lsISBjb21lLCB3aGF0IHNheXMgUm9tZW8CgpOdXJzZQoKICAgIEhhdmUgeW91IGdvdCBsZWF2ZSB0byBnbyB0byBzaHJpZnQgdG8tZGF5PwoKSlVMSUVUCgogICAgSSBoYXZlLgoKTnVyc2UKCiAgICBUaGVuIGhpZSB5b3UgaGVuY2UgdG8gRnJpYXIgTGF1cmVuY2UnIGNlbGw7CiAgICBUaGVyZSBzdGF5cyBhIGh1c2JhbmQgdG8gbWFrZSB5b3UgYSB3aWZlOgogICAgTm93IGNvbWVzIHRoZSB3YW50b24gYmxvb2QgdXAgaW4geW91ciBjaGVla3MsCiAgICBUaGV5J2xsIGJlIGluIHNjYXJsZXQgc3RyYWlnaHQgYXQgYW55IG5ld3MuCiAgICBIaWUgeW91IHRvIGNodXJjaDsgSSBtdXN0IGFub3RoZXIgd2F5LAogICAgVG8gZmV0Y2ggYSBsYWRkZXIsIGJ5IHRoZSB3aGljaCB5b3VyIGxvdmUKICAgIE11c3QgY2xpbWIgYSBiaXJkJ3MgbmVzdCBzb29uIHdoZW4gaXQgaXMgZGFyazoKICAgIEkgYW0gdGhlIGRydWRnZSBhbmQgdG9pbCBpbiB5b3VyIGRlbGlnaHQsCiAgICBCdXQgeW91IHNoYWxsIGJlYXIgdGhlIGJ1cmRlbiBzb29uIGF0IG5pZ2h0LgogICAgR287IEknbGwgdG8gZGlubmVyOiBoaWUgeW91IHRvIHRoZSBjZWxsLgoKSlVMSUVUCgogICAgSGllIHRvIGhpZ2ggZm9ydHVuZSEgSG9uZXN0IG51cnNlLCBmYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIFZJLiBGcmlhciBMYXVyZW5jZSdzIGNlbGwuCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UgYW5kIFJPTUVPIAoKRlJJQVIgTEFVUkVOQ0UKCiAgICBTbyBzbWlsZSB0aGUgaGVhdmVucyB1cG9uIHRoaXMgaG9seSBhY3QsCiAgICBUaGF0IGFmdGVyIGhvdXJzIHdpdGggc29ycm93IGNoaWRlIHVzIG5vdCEKClJPTUVPCgogICAgQW1lbiwgYW1lbiEgYnV0IGNvbWUgd2hhdCBzb3Jyb3cgY2FuLAogICAgSXQgY2Fubm90IGNvdW50ZXJ2YWlsIHRoZSBleGNoYW5nZSBvZiBqb3kKICAgIFRoYXQgb25lIHNob3J0IG1pbnV0ZSBnaXZlcyBtZSBpbiBoZXIgc2lnaHQ6CiAgICBEbyB0aG91IGJ1dCBjbG9zZSBvdXIgaGFuZHMgd2l0aCBob2x5IHdvcmRzLAogICAgVGhlbiBsb3ZlLWRldm91cmluZyBkZWF0aCBkbyB3aGF0IGhlIGRhcmU7CiAgICBJdCBpcyBlbm91Z2ggSSBtYXkgYnV0IGNhbGwgaGVyIG1pbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFRoZXNlIHZpb2xlbnQgZGVsaWdodHMgaGF2ZSB2aW9sZW50IGVuZHMKICAgIEFuZCBpbiB0aGVpciB0cml1bXBoIGRpZSwgbGlrZSBmaXJlIGFuZCBwb3dkZXIsCiAgICBXaGljaCBhcyB0aGV5IGtpc3MgY29uc3VtZTogdGhlIHN3ZWV0ZXN0IGhvbmV5CiAgICBJcyBsb2F0aHNvbWUgaW4gaGlzIG93biBkZWxpY2lvdXNuZXNzCiAgICBBbmQgaW4gdGhlIHRhc3RlIGNvbmZvdW5kcyB0aGUgYXBwZXRpdGU6CiAgICBUaGVyZWZvcmUgbG92ZSBtb2RlcmF0ZWx5OyBsb25nIGxvdmUgZG90aCBzbzsKICAgIFRvbyBzd2lmdCBhcnJpdmVzIGFzIHRhcmR5IGFzIHRvbyBzbG93LgoKICAgIEVudGVyIEpVTElFVAogICAgSGVyZSBjb21lcyB0aGUgbGFkeTogTywgc28gbGlnaHQgYSBmb290CiAgICBXaWxsIG5lJ2VyIHdlYXIgb3V0IHRoZSBldmVybGFzdGluZyBmbGludDoKICAgIEEgbG92ZXIgbWF5IGJlc3RyaWRlIHRoZSBnb3NzYW1lcgogICAgVGhhdCBpZGxlcyBpbiB0aGUgd2FudG9uIHN1bW1lciBhaXIsCiAgICBBbmQgeWV0IG5vdCBmYWxsOyBzbyBsaWdodCBpcyB2YW5pdHkuCgpKVUxJRVQKCiAgICBHb29kIGV2ZW4gdG8gbXkgZ2hvc3RseSBjb25mZXNzb3IuCgpGUklBUiBMQVVSRU5DRQoKICAgIFJvbWVvIHNoYWxsIHRoYW5rIHRoZWUsIGRhdWdodGVyLCBmb3IgdXMgYm90aC4KCkpVTElFVAoKICAgIEFzIG11Y2ggdG8gaGltLCBlbHNlIGlzIGhpcyB0aGFua3MgdG9vIG11Y2guCgpST01FTwoKICAgIEFoLCBKdWxpZXQsIGlmIHRoZSBtZWFzdXJlIG9mIHRoeSBqb3kKICAgIEJlIGhlYXAnZCBsaWtlIG1pbmUgYW5kIHRoYXQgdGh5IHNraWxsIGJlIG1vcmUKICAgIFRvIGJsYXpvbiBpdCwgdGhlbiBzd2VldGVuIHdpdGggdGh5IGJyZWF0aAogICAgVGhpcyBuZWlnaGJvdXIgYWlyLCBhbmQgbGV0IHJpY2ggbXVzaWMncyB0b25ndWUKICAgIFVuZm9sZCB0aGUgaW1hZ2luZWQgaGFwcGluZXNzIHRoYXQgYm90aAogICAgUmVjZWl2ZSBpbiBlaXRoZXIgYnkgdGhpcyBkZWFyIGVuY291bnRlci4KCkpVTElFVAoKICAgIENvbmNlaXQsIG1vcmUgcmljaCBpbiBtYXR0ZXIgdGhhbiBpbiB3b3JkcywKICAgIEJyYWdzIG9mIGhpcyBzdWJzdGFuY2UsIG5vdCBvZiBvcm5hbWVudDoKICAgIFRoZXkgYXJlIGJ1dCBiZWdnYXJzIHRoYXQgY2FuIGNvdW50IHRoZWlyIHdvcnRoOwogICAgQnV0IG15IHRydWUgbG92ZSBpcyBncm93biB0byBzdWNoIGV4Y2VzcwogICAgSSBjYW5ub3Qgc3VtIHVwIHN1bSBvZiBoYWxmIG15IHdlYWx0aC4KCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgY29tZSB3aXRoIG1lLCBhbmQgd2Ugd2lsbCBtYWtlIHNob3J0IHdvcms7CiAgICBGb3IsIGJ5IHlvdXIgbGVhdmVzLCB5b3Ugc2hhbGwgbm90IHN0YXkgYWxvbmUKICAgIFRpbGwgaG9seSBjaHVyY2ggaW5jb3Jwb3JhdGUgdHdvIGluIG9uZS4KCiAgICBFeGV1bnQKCkFDVCBJSUkKU0NFTkUgSS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgTUVSQ1VUSU8sIEJFTlZPTElPLCBQYWdlLCBhbmQgU2VydmFudHMgCgpCRU5WT0xJTwoKICAgIEkgcHJheSB0aGVlLCBnb29kIE1lcmN1dGlvLCBsZXQncyByZXRpcmU6CiAgICBUaGUgZGF5IGlzIGhvdCwgdGhlIENhcHVsZXRzIGFicm9hZCwKICAgIEFuZCwgaWYgd2UgbWVldCwgd2Ugc2hhbGwgbm90IHNjYXBlIGEgYnJhd2w7CiAgICBGb3Igbm93LCB0aGVzZSBob3QgZGF5cywgaXMgdGhlIG1hZCBibG9vZCBzdGlycmluZy4KCk1FUkNVVElPCgogICAgVGhvdSBhcnQgbGlrZSBvbmUgb2YgdGhvc2UgZmVsbG93cyB0aGF0IHdoZW4gaGUKICAgIGVudGVycyB0aGUgY29uZmluZXMgb2YgYSB0YXZlcm4gY2xhcHMgbWUgaGlzIHN3b3JkCiAgICB1cG9uIHRoZSB0YWJsZSBhbmQgc2F5cyAnR29kIHNlbmQgbWUgbm8gbmVlZCBvZgogICAgdGhlZSEnIGFuZCBieSB0aGUgb3BlcmF0aW9uIG9mIHRoZSBzZWNvbmQgY3VwIGRyYXdzCiAgICBpdCBvbiB0aGUgZHJhd2VyLCB3aGVuIGluZGVlZCB0aGVyZSBpcyBubyBuZWVkLgoKQkVOVk9MSU8KCiAgICBBbSBJIGxpa2Ugc3VjaCBhIGZlbGxvdz8KCk1FUkNVVElPCgogICAgQ29tZSwgY29tZSwgdGhvdSBhcnQgYXMgaG90IGEgSmFjayBpbiB0aHkgbW9vZCBhcwogICAgYW55IGluIEl0YWx5LCBhbmQgYXMgc29vbiBtb3ZlZCB0byBiZSBtb29keSwgYW5kIGFzCiAgICBzb29uIG1vb2R5IHRvIGJlIG1vdmVkLgoKQkVOVk9MSU8KCiAgICBBbmQgd2hhdCB0bz8KCk1FUkNVVElPCgogICAgTmF5LCBhbiB0aGVyZSB3ZXJlIHR3byBzdWNoLCB3ZSBzaG91bGQgaGF2ZSBub25lCiAgICBzaG9ydGx5LCBmb3Igb25lIHdvdWxkIGtpbGwgdGhlIG90aGVyLiBUaG91ISB3aHksCiAgICB0aG91IHdpbHQgcXVhcnJlbCB3aXRoIGEgbWFuIHRoYXQgaGF0aCBhIGhhaXIgbW9yZSwKICAgIG9yIGEgaGFpciBsZXNzLCBpbiBoaXMgYmVhcmQsIHRoYW4gdGhvdSBoYXN0OiB0aG91CiAgICB3aWx0IHF1YXJyZWwgd2l0aCBhIG1hbiBmb3IgY3JhY2tpbmcgbnV0cywgaGF2aW5nIG5vCiAgICBvdGhlciByZWFzb24gYnV0IGJlY2F1c2UgdGhvdSBoYXN0IGhhemVsIGV5ZXM6IHdoYXQKICAgIGV5ZSBidXQgc3VjaCBhbiBleWUgd291bGQgc3B5IG91dCBzdWNoIGEgcXVhcnJlbD8KICAgIFRoeSBoZWFkIGlzIGFzIGZ1biBvZiBxdWFycmVscyBhcyBhbiBlZ2cgaXMgZnVsbCBvZgogICAgbWVhdCwgYW5kIHlldCB0aHkgaGVhZCBoYXRoIGJlZW4gYmVhdGVuIGFzIGFkZGxlIGFzCiAgICBhbiBlZ2cgZm9yIHF1YXJyZWxsaW5nOiB0aG91IGhhc3QgcXVhcnJlbGxlZCB3aXRoIGEKICAgIG1hbiBmb3IgY291Z2hpbmcgaW4gdGhlIHN0cmVldCwgYmVjYXVzZSBoZSBoYXRoCiAgICB3YWtlbmVkIHRoeSBkb2cgdGhhdCBoYXRoIGxhaW4gYXNsZWVwIGluIHRoZSBzdW46CiAgICBkaWRzdCB0aG91IG5vdCBmYWxsIG91dCB3aXRoIGEgdGFpbG9yIGZvciB3ZWFyaW5nCiAgICBoaXMgbmV3IGRvdWJsZXQgYmVmb3JlIEVhc3Rlcj8gd2l0aCBhbm90aGVyLCBmb3IKICAgIHR5aW5nIGhpcyBuZXcgc2hvZXMgd2l0aCBvbGQgcmliYW5kPyBhbmQgeWV0IHRob3UKICAgIHdpbHQgdHV0b3IgbWUgZnJvbSBxdWFycmVsbGluZyEKCkJFTlZPTElPCgogICAgQW4gSSB3ZXJlIHNvIGFwdCB0byBxdWFycmVsIGFzIHRob3UgYXJ0LCBhbnkgbWFuCiAgICBzaG91bGQgYnV5IHRoZSBmZWUtc2ltcGxlIG9mIG15IGxpZmUgZm9yIGFuIGhvdXIgYW5kIGEgcXVhcnRlci4KCk1FUkNVVElPCgogICAgVGhlIGZlZS1zaW1wbGUhIE8gc2ltcGxlIQoKQkVOVk9MSU8KCiAgICBCeSBteSBoZWFkLCBoZXJlIGNvbWUgdGhlIENhcHVsZXRzLgoKTUVSQ1VUSU8KCiAgICBCeSBteSBoZWVsLCBJIGNhcmUgbm90LgoKICAgIEVudGVyIFRZQkFMVCBhbmQgb3RoZXJzCgpUWUJBTFQKCiAgICBGb2xsb3cgbWUgY2xvc2UsIGZvciBJIHdpbGwgc3BlYWsgdG8gdGhlbS4KICAgIEdlbnRsZW1lbiwgZ29vZCBkZW46IGEgd29yZCB3aXRoIG9uZSBvZiB5b3UuCgpNRVJDVVRJTwoKICAgIEFuZCBidXQgb25lIHdvcmQgd2l0aCBvbmUgb2YgdXMIGNvdXBsZSBpdCB3aXRoCiAgICBzb21ldGhpbmc7IG1ha2UgaXQgYSB3b3JkIGFuZCBhIGJsb3cuCgpUWUJBTFQKCiAgICBZb3Ugc2hhbGwgZmluZCBtZSBhcHQgZW5vdWdoIHRvIHRoYXQsIHNpciwgYW4geW91CiAgICB3aWxsIGdpdmUgbWUgb2NjYXNpb24uCgpNRVJDVVRJTwoKICAgIENvdWxkIHlvdSBub3QgdGFrZSBzb21lIG9jY2FzaW9uIHdpdGhvdXQgZ2l2aW5nPwoKVFlCQUxUCgogICAgTWVyY3V0aW8sIHRob3UgY29uc29ydCdzdCB3aXRoIFJvbWVvLC0tCgpNRVJDVVRJTwoKICAgIENvbnNvcnQhIHdoYXQsIGRvc3QgdGhvdSBtYWtlIHVzIG1pbnN0cmVscz8gYW4KICAgIHRob3UgbWFrZSBtaW5zdHJlbHMgb2YgdXMsIGxvb2sgdG8gaGVhciBub3RoaW5nIGJ1dAogICAgZGlzY29yZHM6IGhlcmUncyBteSBmaWRkbGVzdGljazsgaGVyZSdzIHRoYXQgc2hhbGwKICAgIG1ha2UgeW91IGRhbmNlLiAnWm91bmRzLCBjb25zb3J0IQoKQkVOVk9MSU8KCiAgICBXZSB0YWxrIGhlcmUgaW4gdGhlIHB1YmxpYyBoYXVudCBvZiBtZW46CiAgICBFaXRoZXIgd2l0aGRyYXcgdW50byBzb21lIHByaXZhdGUgcGxhY2UsCiAgICBBbmQgcmVhc29uIGNvbGRseSBvZiB5b3VyIGdyaWV2YW5jZXMsCiAgICBPciBlbHNlIGRlcGFydDsgaGVyZSBhbGwgZXllcyBnYXplIG9uIHVzLgoKTUVSQ1VUSU8KCiAgICBNZW4ncyBleWVzIHdlcmUgbWFkZSB0byBsb29rLCBhbmQgbGV0IHRoZW0gZ2F6ZTsKICAgIEkgd2lsbCBub3QgYnVkZ2UgZm9yIG5vIG1hbidzIHBsZWFzdXJlLCBJLgoKICAgIEVudGVyIFJPTUVPCgpUWUJBTFQKCiAgICBXZWxsLCBwZWFjZSBiZSB3aXRoIHlvdSwgc2lyOiBoZXJlIGNvbWVzIG15IG1hbi4KCk1FUkNVVElPCgogICAgQnV0IEknbGwgYmUgaGFuZ2VkLCBzaXIsIGlmIGhlIHdlYXIgeW91ciBsaXZlcnk6CiAgICBNYXJyeSwgZ28gYmVmb3JlIHRvIGZpZWxkLCBoZSdsbCBiZSB5b3VyIGZvbGxvd2VyOwogICAgWW91ciB3b3JzaGlwIGluIHRoYXQgc2Vuc2UgbWF5IGNhbGwgaGltICdtYW4uJwoKVFlCQUxUCgogICAgUm9tZW8sIHRoZSBoYXRlIEkgYmVhciB0aGVlIGNhbiBhZmZvcmQKICAgIE5vIGJldHRlciB0ZXJtIHRoYW4gdGhpcywtLXRob3UgYXJ0IGEgdmlsbGFpbi4KClJPTUVPCgogICAgVHliYWx0LCB0aGUgcmVhc29uIHRoYXQgSSBoYXZlIHRvIGxvdmUgdGhlZQogICAgRG90aCBtdWNoIGV4Y3VzZSB0aGUgYXBwZXJ0YWluaW5nIHJhZ2UKICAgIFRvIHN1Y2ggYSBncmVldGluZzogdmlsbGFpbiBhbSBJIG5vbmU7CiAgICBUaGVyZWZvcmUgZmFyZXdlbGw7IEkgc2VlIHRob3Uga25vdydzdCBtZSBub3QuCgpUWUJBTFQKCiAgICBCb3ksIHRoaXMgc2hhbGwgbm90IGV4Y3VzZSB0aGUgaW5qdXJpZXMKICAgIFRoYXQgdGhvdSBoYXN0IGRvbmUgbWU7IHRoZXJlZm9yZSB0dXJuIGFuZCBkcmF3LgoKUk9NRU8KCiAgICBJIGRvIHByb3Rlc3QsIEkgbmV2ZXIgaW5qdXJlZCB0aGVlLAogICAgQnV0IGxvdmUgdGhlZSBiZXR0ZXIgdGhhbiB0aG91IGNhbnN0IGRldmlzZSwKICAgIFRpbGwgdGhvdSBzaGFsdCBrbm93IHRoZSByZWFzb24gb2YgbXkgbG92ZToKICAgIEFuZCBzbywgZ29vZCBDYXB1bGV0LC0td2hpY2ggbmFtZSBJIHRlbmRlcgogICAgQXMgZGVhcmx5IGFzIG15IG93biwtLWJlIHNhdGlzZmllZC4KCk1FUkNVVElPCgogICAgTyBjYWxtLCBkaXNob25vdXJhYmxlLCB2aWxlIHN1Ym1pc3Npb24hCiAgICBBbGxhIHN0b2NjYXRhIGNhcnJpZXMgaXQgYXdheS4KCiAgICBEcmF3cwogICAgVHliYWx0LCB5b3UgcmF0LWNhdGNoZXIsIHdpbGwgeW91IHdhbGsCgpUWUJBTFQKCiAgICBXaGF0IHdvdWxkc3QgdGhvdSBoYXZlIHdpdGggbWUCgpNRVJDVVRJTwoKICAgIEdvb2Qga2luZyBvZiBjYXRzLCBub3RoaW5nIGJ1dCBvbmUgb2YgeW91ciBuaW5lCiAgICBsaXZlczsgdGhhdCBJIG1lYW4gdG8gbWFrZSBib2xkIHdpdGhhbCwgYW5kIGFzIHlvdQogICAgc2hhbGwgdXNlIG1lIGhlcmVhZnRlciwgZHJ5YmVhdCB0aGUgcmVzdCBvZiB0aGUKICAgIGVpZ2h0LiBXaWxsIHlvdSBwbHVjayB5b3VyIHN3b3JkIG91dCBvZiBoaXMgcGl0Y2hlcgogICAgYnkgdGhlIGVhcnMIG1ha2UgaGFzdGUsIGxlc3QgbWluZSBiZSBhYm91dCB5b3VyCiAgICBlYXJzIGVyZSBpdCBiZSBvdXQuCgpUWUJBTFQKCiAgICBJIGFtIGZvciB5b3UuCgogICAgRHJhd2luZwoKUk9NRU8KCiAgICBHZW50bGUgTWVyY3V0aW8sIHB1dCB0aHkgcmFwaWVyIHVwLgoKTUVSQ1VUSU8KCiAgICBDb21lLCBzaXIsIHlvdXIgcGFzc2Fkby4KCiAgICBUaGV5IGZpZ2h0CgpST01FTwoKICAgIERyYXcsIEJlbnZvbGlvOyBiZWF0IGRvd24gdGhlaXIgd2VhcG9ucy4KICAgIEdlbnRsZW1lbiwgZm9yIHNoYW1lLCBmb3JiZWFyIHRoaXMgb3V0cmFnZSEKICAgIFR5YmFsdCwgTWVyY3V0aW8sIHRoZSBwcmluY2UgZXhwcmVzc2x5IGhhdGgKICAgIEZvcmJpZGRlbiBiYW5keWluZyBpbiBWZXJvbmEgc3RyZWV0czoKICAgIEhvbGQsIFR5YmFsdCEgZ29vZCBNZXJjdXRpbyEKCiAgICBUWUJBTFQgdW5kZXIgUk9NRU8ncyBhcm0gc3RhYnMgTUVSQ1VUSU8sIGFuZCBmbGllcyB3aXRoIGhpcyBmb2xsb3dlcnMKCk1FUkNVVElPCgogICAgSSBhbSBodXJ0LgogICAgQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEgSSBhbSBzcGVkLgogICAgSXMgaGUgZ29uZSwgYW5kIGhhdGggbm90aGluZz8KCkJFTlZPTElPCgogICAgV2hhdCwgYXJ0IHRob3UgaHVydD8KCk1FUkNVVElPCgogICAgQXksIGF5LCBhIHNjcmF0Y2gsIGEgc2NyYXRjaDsgbWFycnksICd0aXMgZW5vdWdoLgogICAgV2hlcmUgaXMgbXkgcGFnZT8gR28sIHZpbGxhaW4sIGZldGNoIGEgc3VyZ2Vvbi4KCiAgICBFeGl0IFBhZ2UKClJPTUVPCgogICAgQ291cmFnZSwgbWFuOyB0aGUgaHVydCBjYW5ub3QgYmUgbXVjaC4KCk1FUkNVVElPCgogICAgTm8sICd0aXMgbm90IHNvIGRlZXAgYXMgYSB3ZWxsLCBub3Igc28gd2lkZSBhcyBhCiAgICBjaHVyY2gtZG9vcjsgYnV0ICd0aXMgZW5vdWdoLCd0d2lsbCBzZXJ2ZTogYXNrIGZvcgogICAgbWUgdG8tbW9ycm93LCBhbmQgeW91IHNoYWxsIGZpbmQgbWUgYSBncmF2ZSBtYW4uIEkKICAgIGFtIHBlcHBlcmVkLCBJIHdhcnJhbnQsIGZvciB0aGlzIHdvcmxkLiBBIHBsYWd1ZSBvJwogICAgYm90aCB5b3VyIGhvdXNlcyEgJ1pvdW5kcywgYSBkb2csIGEgcmF0LCBhIG1vdXNlLCBhCiAgICBjYXQsIHRvIHNjcmF0Y2ggYSBtYW4gdG8gZGVhdGghIGEgYnJhZ2dhcnQsIGEKICAgIHJvZ3VlLCBhIHZpbGxhaW4sIHRoYXQgZmlnaHRzIGJ5IHRoZSBib29rIG9mCiAgICBhcml0aG1ldGljISBXaHkgdGhlIGRldmlsIGNhbWUgeW91IGJldHdlZW4gdXMIEkKICAgIHdhcyBodXJ0IHVuZGVyIHlvdXIgYXJtLgoKUk9NRU8KCiAgICBJIHRob3VnaHQgYWxsIGZvciB0aGUgYmVzdC4KCk1FUkNVVElPCgogICAgSGVscCBtZSBpbnRvIHNvbWUgaG91c2UsIEJlbnZvbGlvLAogICAgT3IgSSBzaGFsbCBmYWludC4gQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEKICAgIFRoZXkgaGF2ZSBtYWRlIHdvcm1zJyBtZWF0IG9mIG1lOiBJIGhhdmUgaXQsCiAgICBBbmQgc291bmRseSB0b286IHlvdXIgaG91c2VzIQoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KClJPTUVPCgogICAgVGhpcyBnZW50bGVtYW4sIHRoZSBwcmluY2UncyBuZWFyIGFsbHksCiAgICBNeSB2ZXJ5IGZyaWVuZCwgaGF0aCBnb3QgaGlzIG1vcnRhbCBodXJ0CiAgICBJbiBteSBiZWhhbGY7IG15IHJlcHV0YXRpb24gc3RhaW4nZAogICAgV2l0aCBUeWJhbHQncyBzbGFuZGVyLC0tVHliYWx0LCB0aGF0IGFuIGhvdXIKICAgIEhhdGggYmVlbiBteSBraW5zbWFuISBPIHN3ZWV0IEp1bGlldCwKICAgIFRoeSBiZWF1dHkgaGF0aCBtYWRlIG1lIGVmZmVtaW5hdGUKICAgIEFuZCBpbiBteSB0ZW1wZXIgc29mdGVuJ2QgdmFsb3VyJ3Mgc3RlZWwhCgogICAgUmUtZW50ZXIgQkVOVk9MSU8KCkJFTlZPTElPCgogICAgTyBSb21lbywgUm9tZW8sIGJyYXZlIE1lcmN1dGlvJ3MgZGVhZCEKICAgIFRoYXQgZ2FsbGFudCBzcGlyaXQgaGF0aCBhc3BpcmVkIHRoZSBjbG91ZHMsCiAgICBXaGljaCB0b28gdW50aW1lbHkgaGVyZSBkaWQgc2Nvcm4gdGhlIGVhcnRoLgoKUk9NRU8KCiAgICBUaGlzIGRheSdzIGJsYWNrIGZhdGUgb24gbW9yZSBkYXlzIGRvdGggZGVwZW5kOwogICAgVGhpcyBidXQgYmVnaW5zIHRoZSB3b2UsIG90aGVycyBtdXN0IGVuZC4KCkJFTlZPTElPCgogICAgSGVyZSBjb21lcyB0aGUgZnVyaW91cyBUeWJhbHQgYmFjayBhZ2Fpbi4KClJPTUVPCgogICAgQWxpdmUsIGluIHRyaXVtcGghIGFuZCBNZXJjdXRpbyBzbGFpbiEKICAgIEF3YXkgdG8gaGVhdmVuLCByZXNwZWN0aXZlIGxlbml0eSwKICAgIEFuZCBmaXJlLWV5ZWQgZnVyeSBiZSBteSBjb25kdWN0IG5vdyEKCiAgICBSZS1lbnRlciBUWUJBTFQKICAgIE5vdywgVHliYWx0LCB0YWtlIHRoZSB2aWxsYWluIGJhY2sgYWdhaW4sCiAgICBUaGF0IGxhdGUgdGhvdSBnYXZlc3QgbWU7IGZvciBNZXJjdXRpbydzIHNvdWwKICAgIElzIGJ1dCBhIGxpdHRsZSB3YXkgYWJvdmUgb3VyIGhlYWRzLAogICAgU3RheWluZyBmb3IgdGhpbmUgdG8ga2VlcCBoaW0gY29tcGFueToKICAgIEVpdGhlciB0aG91LCBvciBJLCBvciBib3RoLCBtdXN0IGdvIHdpdGggaGltLgoKVFlCQUxUCgogICAgVGhvdSwgd3JldGNoZWQgYm95LCB0aGF0IGRpZHN0IGNvbnNvcnQgaGltIGhlcmUsCiAgICBTaGFsdCB3aXRoIGhpbSBoZW5jZS4KClJPTUVPCgogICAgVGhpcyBzaGFsbCBkZXRlcm1pbmUgdGhhdC4KCiAgICBUaGV5IGZpZ2h0OyBUWUJBTFQgZmFsbHMKCkJFTlZPTElPCgogICAgUm9tZW8sIGF3YXksIGJlIGdvbmUhCiAgICBUaGUgY2l0aXplbnMgYXJlIHVwLCBhbmQgVHliYWx0IHNsYWluLgogICAgU3RhbmQgbm90IGFtYXplZDogdGhlIHByaW5jZSB3aWxsIGRvb20gdGhlZSBkZWF0aCwKICAgIElmIHRob3UgYXJ0IHRha2VuOiBoZW5jZSwgYmUgZ29uZSwgYXdheSEKClJPTUVPCgogICAgTywgSSBhbSBmb3J0dW5lJ3MgZm9vbCEKCkJFTlZPTElPCgogICAgV2h5IGRvc3QgdGhvdSBzdGF5PwoKICAgIEV4aXQgUk9NRU8KCiAgICBFbnRlciBDaXRpemVucywgJiBjCgpGaXJzdCBDaXRpemVuCgogICAgV2hpY2ggd2F5IHJhbiBoZSB0aGF0IGtpbGwnZCBNZXJjdXRpbz8KICAgIFR5YmFsdCwgdGhhdCBtdXJkZXJlciwgd2hpY2ggd2F5IHJhbiBoZT8KCkJFTlZPTElPCgogICAgVGhlcmUgbGllcyB0aGF0IFR5YmFsdC4KCkZpcnN0IENpdGl6ZW4KCiAgICBVcCwgc2lyLCBnbyB3aXRoIG1lOwogICAgSSBjaGFyZ2UgdGhlZSBpbiB0aGUgcHJpbmNlcyBuYW1lLCBvYmV5LgoKICAgIEVudGVyIFByaW5jZSwgYXR0ZW5kZWQ7IE1PTlRBR1VFLCBDQVBVTEVULCB0aGVpciBXaXZlcywgYW5kIG90aGVycwoKUFJJTkNFCgogICAgV2hlcmUgYXJlIHRoZSB2aWxlIGJlZ2lubmVycyBvZiB0aGlzIGZyYXkCgpCRU5WT0xJTwoKICAgIE8gbm9ibGUgcHJpbmNlLCBJIGNhbiBkaXNjb3ZlciBhbGwKICAgIFRoZSB1bmx1Y2t5IG1hbmFnZSBvZiB0aGlzIGZhdGFsIGJyYXdsOgogICAgVGhlcmUgbGllcyB0aGUgbWFuLCBzbGFpbiBieSB5b3VuZyBSb21lbywKICAgIFRoYXQgc2xldyB0aHkga2luc21hbiwgYnJhdmUgTWVyY3V0aW8uCgpMQURZIENBUFVMRVQKCiAgICBUeWJhbHQsIG15IGNvdXNpbiEgTyBteSBicm90aGVyJ3MgY2hpbGQhCiAgICBPIHByaW5jZSEgTyBjb3VzaW4hIGh1c2JhbmQhIE8sIHRoZSBibG9vZCBpcyBzcGlsdAogICAgTyBteSBkZWFyIGtpbnNtYW4hIFByaW5jZSwgYXMgdGhvdSBhcnQgdHJ1ZSwKICAgIEZvciBibG9vZCBvZiBvdXJzLCBzaGVkIGJsb29kIG9mIE1vbnRhZ3VlLgogICAgTyBjb3VzaW4sIGNvdXNpbiEKClBSSU5DRQoKICAgIEJlbnZvbGlvLCB3aG8gYmVnYW4gdGhpcyBibG9vZHkgZnJheT8KCkJFTlZPTElPCgogICAgVHliYWx0LCBoZXJlIHNsYWluLCB3aG9tIFJvbWVvJ3MgaGFuZCBkaWQgc2xheTsKICAgIFJvbWVvIHRoYXQgc3Bva2UgaGltIGZhaXIsIGJhZGUgaGltIGJldGhpbmsKICAgIEhvdyBuaWNlIHRoZSBxdWFycmVsIHdhcywgYW5kIHVyZ2VkIHdpdGhhbAogICAgWW91ciBoaWdoIGRpc3BsZWFzdXJlOiBhbGwgdGhpcyB1dHRlcmVkCiAgICBXaXRoIGdlbnRsZSBicmVhdGgsIGNhbG0gbG9vaywga25lZXMgaHVtYmx5IGJvdydkLAogICAgQ291bGQgbm90IHRha2UgdHJ1Y2Ugd2l0aCB0aGUgdW5ydWx5IHNwbGVlbgogICAgT2YgVHliYWx0IGRlYWYgdG8gcGVhY2UsIGJ1dCB0aGF0IGhlIHRpbHRzCiAgICBXaXRoIHBpZXJjaW5nIHN0ZWVsIGF0IGJvbGQgTWVyY3V0aW8ncyBicmVhc3QsCiAgICBXaG8gYWxsIGFzIGhvdCwgdHVybnMgZGVhZGx5IHBvaW50IHRvIHBvaW50LAogICAgQW5kLCB3aXRoIGEgbWFydGlhbCBzY29ybiwgd2l0aCBvbmUgaGFuZCBiZWF0cwogICAgQ29sZCBkZWF0aCBhc2lkZSwgYW5kIHdpdGggdGhlIG90aGVyIHNlbmRzCiAgICBJdCBiYWNrIHRvIFR5YmFsdCwgd2hvc2UgZGV4dGVyaXR5LAogICAgUmV0b3J0cyBpdDogUm9tZW8gaGUgY3JpZXMgYWxvdWQsCiAgICAnSG9sZCwgZnJpZW5kcyEgZnJpZW5kcywgcGFydCEnIGFuZCwgc3dpZnRlciB0aGFuCiAgICBoaXMgdG9uZ3VlLAogICAgSGlzIGFnaWxlIGFybSBiZWF0cyBkb3duIHRoZWlyIGZhdGFsIHBvaW50cywKICAgIEFuZCAndHdpeHQgdGhlbSBydXNoZXM7IHVuZGVybmVhdGggd2hvc2UgYXJtCiAgICBBbiBlbnZpb3VzIHRocnVzdCBmcm9tIFR5YmFsdCBoaXQgdGhlIGxpZmUKICAgIE9mIHN0b3V0IE1lcmN1dGlvLCBhbmQgdGhlbiBUeWJhbHQgZmxlZDsKICAgIEJ1dCBieSBhbmQgYnkgY29tZXMgYmFjayB0byBSb21lbywKICAgIFdobyBoYWQgYnV0IG5ld2x5IGVudGVydGFpbidkIHJldmVuZ2UsCiAgICBBbmQgdG8gJ3QgdGhleSBnbyBsaWtlIGxpZ2h0bmluZywgZm9yLCBlcmUgSQogICAgQ291bGQgZHJhdyB0byBwYXJ0IHRoZW0sIHdhcyBzdG91dCBUeWJhbHQgc2xhaW4uCiAgICBBbmQsIGFzIGhlIGZlbGwsIGRpZCBSb21lbyB0dXJuIGFuZCBmbHkuCiAgICBUaGlzIGlzIHRoZSB0cnV0aCwgb3IgbGV0IEJlbnZvbGlvIGRpZS4KCkxBRFkgQ0FQVUxFVAoKICAgIEhlIGlzIGEga2luc21hbiB0byB0aGUgTW9udGFndWU7CiAgICBBZmZlY3Rpb24gbWFrZXMgaGltIGZhbHNlOyBoZSBzcGVha3Mgbm90IHRydWU6CiAgICBTb21lIHR3ZW50eSBvZiB0aGVtIGZvdWdodCBpbiB0aGlzIGJsYWNrIHN0cmlmZSwKICAgIEFuZCBhbGwgdGhvc2UgdHdlbnR5IGNvdWxkIGJ1dCBraWxsIG9uZSBsaWZlLgogICAgSSBiZWcgZm9yIGp1c3RpY2UsIHdoaWNoIHRob3UsIHByaW5jZSwgbXVzdCBnaXZlOwogICAgUm9tZW8gc2xldyBUeWJhbHQsIFJvbWVvIG11c3Qgbm90IGxpdmUuCgpQUklOQ0UKCiAgICBSb21lbyBzbGV3IGhpbSwgaGUgc2xldyBNZXJjdXRpbzsKICAgIFdobyBub3cgdGhlIHByaWNlIG9mIGhpcyBkZWFyIGJsb29kIGRvdGggb3dlPwoKTU9OVEFHVUUKCiAgICBOb3QgUm9tZW8sIHByaW5jZSwgaGUgd2FzIE1lcmN1dGlvJ3MgZnJpZW5kOwogICAgSGlzIGZhdWx0IGNvbmNsdWRlcyBidXQgd2hhdCB0aGUgbGF3IHNob3VsZCBlbmQsCiAgICBUaGUgbGlmZSBvZiBUeWJhbHQuCgpQUklOQ0UKCiAgICBBbmQgZm9yIHRoYXQgb2ZmZW5jZQogICAgSW1tZWRpYXRlbHkgd2UgZG8gZXhpbGUgaGltIGhlbmNlOgogICAgSSBoYXZlIGFuIGludGVyZXN0IGluIHlvdXIgaGF0ZSdzIHByb2NlZWRpbmcsCiAgICBNeSBibG9vZCBmb3IgeW91ciBydWRlIGJyYXdscyBkb3RoIGxpZSBhLWJsZWVkaW5nOwogICAgQnV0IEknbGwgYW1lcmNlIHlvdSB3aXRoIHNvIHN0cm9uZyBhIGZpbmUKICAgIFRoYXQgeW91IHNoYWxsIGFsbCByZXBlbnQgdGhlIGxvc3Mgb2YgbWluZToKICAgIEkgd2lsbCBiZSBkZWFmIHRvIHBsZWFkaW5nIGFuZCBleGN1c2VzOwogICAgTm9yIHRlYXJzIG5vciBwcmF5ZXJzIHNoYWxsIHB1cmNoYXNlIG91dCBhYnVzZXM6CiAgICBUaGVyZWZvcmUgdXNlIG5vbmU6IGxldCBSb21lbyBoZW5jZSBpbiBoYXN0ZSwKICAgIEVsc2UsIHdoZW4gaGUncyBmb3VuZCwgdGhhdCBob3VyIGlzIGhpcyBsYXN0LgogICAgQmVhciBoZW5jZSB0aGlzIGJvZHkgYW5kIGF0dGVuZCBvdXIgd2lsbDoKICAgIE1lcmN5IGJ1dCBtdXJkZXJzLCBwYXJkb25pbmcgdGhvc2UgdGhhdCBraWxsLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIENhcHVsZXQncyBvcmNoYXJkLgoKICAgIEVudGVyIEpVTElFVCAKCkpVTElFVAoKICAgIEdhbGxvcCBhcGFjZSwgeW91IGZpZXJ5LWZvb3RlZCBzdGVlZHMsCiAgICBUb3dhcmRzIFBob2VidXMnIGxvZGdpbmc6IHN1Y2ggYSB3YWdvbmVyCiAgICBBcyBQaGFldGhvbiB3b3VsZCB3aGlwIHlvdSB0byB0aGUgd2VzdCwKICAgIEFuZCBicmluZyBpbiBjbG91ZHkgbmlnaHQgaW1tZWRpYXRlbHkuCiAgICBTcHJlYWQgdGh5IGNsb3NlIGN1cnRhaW4sIGxvdmUtcGVyZm9ybWluZyBuaWdodCwKICAgIFRoYXQgcnVuYXdheSdzIGV5ZXMgbWF5IHdpbmsgYW5kIFJvbWVvCiAgICBMZWFwIHRvIHRoZXNlIGFybXMsIHVudGFsaydkIG9mIGFuZCB1bnNlZW4uCiAgICBMb3ZlcnMgY2FuIHNlZSB0byBkbyB0aGVpciBhbW9yb3VzIHJpdGVzCiAgICBCeSB0aGVpciBvd24gYmVhdXRpZXM7IG9yLCBpZiBsb3ZlIGJlIGJsaW5kLAogICAgSXQgYmVzdCBhZ3JlZXMgd2l0aCBuaWdodC4gQ29tZSwgY2l2aWwgbmlnaHQsCiAgICBUaG91IHNvYmVyLXN1aXRlZCBtYXRyb24sIGFsbCBpbiBibGFjaywKICAgIEFuZCBsZWFybiBtZSBob3cgdG8gbG9zZSBhIHdpbm5pbmcgbWF0Y2gsCiAgICBQbGF5J2QgZm9yIGEgcGFpciBvZiBzdGFpbmxlc3MgbWFpZGVuaG9vZHM6CiAgICBIb29kIG15IHVubWFubidkIGJsb29kLCBiYXRpbmcgaW4gbXkgY2hlZWtzLAogICAgV2l0aCB0aHkgYmxhY2sgbWFudGxlOyB0aWxsIHN0cmFuZ2UgbG92ZSwgZ3Jvd24gYm9sZCwKICAgIFRoaW5rIHRydWUgbG92ZSBhY3RlZCBzaW1wbGUgbW9kZXN0eS4KICAgIENvbWUsIG5pZ2h0OyBjb21lLCBSb21lbzsgY29tZSwgdGhvdSBkYXkgaW4gbmlnaHQ7CiAgICBGb3IgdGhvdSB3aWx0IGxpZSB1cG9uIHRoZSB3aW5ncyBvZiBuaWdodAogICAgV2hpdGVyIHRoYW4gbmV3IHNub3cgb24gYSByYXZlbidzIGJhY2suCiAgICBDb21lLCBnZW50bGUgbmlnaHQsIGNvbWUsIGxvdmluZywgYmxhY2stYnJvdydkIG5pZ2h0LAogICAgR2l2ZSBtZSBteSBSb21lbzsgYW5kLCB3aGVuIGhlIHNoYWxsIGRpZSwKICAgIFRha2UgaGltIGFuZCBjdXQgaGltIG91dCBpbiBsaXR0bGUgc3RhcnMsCiAgICBBbmQgaGUgd2lsbCBtYWtlIHRoZSBmYWNlIG9mIGhlYXZlbiBzbyBmaW5lCiAgICBUaGF0IGFsbCB0aGUgd29ybGQgd2lsbCBiZSBpbiBsb3ZlIHdpdGggbmlnaHQKICAgIEFuZCBwYXkgbm8gd29yc2hpcCB0byB0aGUgZ2FyaXNoIHN1bi4KICAgIE8sIEkgaGF2ZSBib3VnaHQgdGhlIG1hbnNpb24gb2YgYSBsb3ZlLAogICAgQnV0IG5vdCBwb3NzZXNzJ2QgaXQsIGFuZCwgdGhvdWdoIEkgYW0gc29sZCwKICAgIE5vdCB5ZXQgZW5qb3knZDogc28gdGVkaW91cyBpcyB0aGlzIGRheQogICAgQXMgaXMgdGhlIG5pZ2h0IGJlZm9yZSBzb21lIGZlc3RpdmFsCiAgICBUbyBhbiBpbXBhdGllbnQgY2hpbGQgdGhhdCBoYXRoIG5ldyByb2JlcwogICAgQW5kIG1heSBub3Qgd2VhciB0aGVtLiBPLCBoZXJlIGNvbWVzIG15IG51cnNlLAogICAgQW5kIHNoZSBicmluZ3MgbmV3czsgYW5kIGV2ZXJ5IHRvbmd1ZSB0aGF0IHNwZWFrcwogICAgQnV0IFJvbWVvJ3MgbmFtZSBzcGVha3MgaGVhdmVubHkgZWxvcXVlbmNlLgoKICAgIEVudGVyIE51cnNlLCB3aXRoIGNvcmRzCiAgICBOb3csIG51cnNlLCB3aGF0IG5ld3MIFdoYXQgaGFzdCB0aG91IHRoZXJlPyB0aGUgY29yZHMKICAgIFRoYXQgUm9tZW8gYmlkIHRoZWUgZmV0Y2gCgpOdXJzZQoKICAgIEF5LCBheSwgdGhlIGNvcmRzLgoKICAgIFRocm93cyB0aGVtIGRvd24KCkpVTElFVAoKICAgIEF5IG1lISB3aGF0IG5ld3MIHdoeSBkb3N0IHRob3Ugd3JpbmcgdGh5IGhhbmRzPwoKTnVyc2UKCiAgICBBaCwgd2VsbC1hLWRheSEgaGUncyBkZWFkLCBoZSdzIGRlYWQsIGhlJ3MgZGVhZCEKICAgIFdlIGFyZSB1bmRvbmUsIGxhZHksIHdlIGFyZSB1bmRvbmUhCiAgICBBbGFjayB0aGUgZGF5ISBoZSdzIGdvbmUsIGhlJ3Mga2lsbCdkLCBoZSdzIGRlYWQhCgpKVUxJRVQKCiAgICBDYW4gaGVhdmVuIGJlIHNvIGVudmlvdXMCgpOdXJzZQoKICAgIFJvbWVvIGNhbiwKICAgIFRob3VnaCBoZWF2ZW4gY2Fubm90OiBPIFJvbWVvLCBSb21lbyEKICAgIFdobyBldmVyIHdvdWxkIGhhdmUgdGhvdWdodCBpdD8gUm9tZW8hCgpKVUxJRVQKCiAgICBXaGF0IGRldmlsIGFydCB0aG91LCB0aGF0IGRvc3QgdG9ybWVudCBtZSB0aHVzPwogICAgVGhpcyB0b3J0dXJlIHNob3VsZCBiZSByb2FyJ2QgaW4gZGlzbWFsIGhlbGwuCiAgICBIYXRoIFJvbWVvIHNsYWluIGhpbXNlbGYIHNheSB0aG91IGJ1dCAnSSwnCiAgICBBbmQgdGhhdCBiYXJlIHZvd2VsICdJJyBzaGFsbCBwb2lzb24gbW9yZQogICAgVGhhbiB0aGUgZGVhdGgtZGFydGluZyBleWUgb2YgY29ja2F0cmljZToKICAgIEkgYW0gbm90IEksIGlmIHRoZXJlIGJlIHN1Y2ggYW4gSTsKICAgIE9yIHRob3NlIGV5ZXMgc2h1dCwgdGhhdCBtYWtlIHRoZWUgYW5zd2VyICdJLicKICAgIElmIGhlIGJlIHNsYWluLCBzYXkgJ0knOyBvciBpZiBub3QsIG5vOgogICAgQnJpZWYgc291bmRzIGRldGVybWluZSBvZiBteSB3ZWFsIG9yIHdvZS4KCk51cnNlCgogICAgSSBzYXcgdGhlIHdvdW5kLCBJIHNhdyBpdCB3aXRoIG1pbmUgZXllcywtLQogICAgR29kIHNhdmUgdGhlIG1hcmshLS1oZXJlIG9uIGhpcyBtYW5seSBicmVhc3Q6CiAgICBBIHBpdGVvdXMgY29yc2UsIGEgYmxvb2R5IHBpdGVvdXMgY29yc2U7CiAgICBQYWxlLCBwYWxlIGFzIGFzaGVzLCBhbGwgYmVkYXViJ2QgaW4gYmxvb2QsCiAgICBBbGwgaW4gZ29yZS1ibG9vZDsgSSBzd291bmRlZCBhdCB0aGUgc2lnaHQuCgpKVUxJRVQKCiAgICBPLCBicmVhaywgbXkgaGVhcnQhIHBvb3IgYmFua3J1cHQsIGJyZWFrIGF0IG9uY2UhCiAgICBUbyBwcmlzb24sIGV5ZXMsIG5lJ2VyIGxvb2sgb24gbGliZXJ0eSEKICAgIFZpbGUgZWFydGgsIHRvIGVhcnRoIHJlc2lnbjsgZW5kIG1vdGlvbiBoZXJlOwogICAgQW5kIHRob3UgYW5kIFJvbWVvIHByZXNzIG9uZSBoZWF2eSBiaWVyIQoKTnVyc2UKCiAgICBPIFR5YmFsdCwgVHliYWx0LCB0aGUgYmVzdCBmcmllbmQgSSBoYWQhCiAgICBPIGNvdXJ0ZW91cyBUeWJhbHQhIGhvbmVzdCBnZW50bGVtYW4hCiAgICBUaGF0IGV2ZXIgSSBzaG91bGQgbGl2ZSB0byBzZWUgdGhlZSBkZWFkIQoKSlVMSUVUCgogICAgV2hhdCBzdG9ybSBpcyB0aGlzIHRoYXQgYmxvd3Mgc28gY29udHJhcnkCiAgICBJcyBSb21lbyBzbGF1Z2h0ZXInZCwgYW5kIGlzIFR5YmFsdCBkZWFkPwogICAgTXkgZGVhci1sb3ZlZCBjb3VzaW4sIGFuZCBteSBkZWFyZXIgbG9yZD8KICAgIFRoZW4sIGRyZWFkZnVsIHRydW1wZXQsIHNvdW5kIHRoZSBnZW5lcmFsIGRvb20hCiAgICBGb3Igd2hvIGlzIGxpdmluZywgaWYgdGhvc2UgdHdvIGFyZSBnb25lPwoKTnVyc2UKCiAgICBUeWJhbHQgaXMgZ29uZSwgYW5kIFJvbWVvIGJhbmlzaGVkOwogICAgUm9tZW8gdGhhdCBraWxsJ2QgaGltLCBoZSBpcyBiYW5pc2hlZC4KCkpVTElFVAoKICAgIE8gR29kISBkaWQgUm9tZW8ncyBoYW5kIHNoZWQgVHliYWx0J3MgYmxvb2QCgpOdXJzZQoKICAgIEl0IGRpZCwgaXQgZGlkOyBhbGFzIHRoZSBkYXksIGl0IGRpZCEKCkpVTElFVAoKICAgIE8gc2VycGVudCBoZWFydCwgaGlkIHdpdGggYSBmbG93ZXJpbmcgZmFjZSEKICAgIERpZCBldmVyIGRyYWdvbiBrZWVwIHNvIGZhaXIgYSBjYXZlPwogICAgQmVhdXRpZnVsIHR5cmFudCEgZmllbmQgYW5nZWxpY2FsIQogICAgRG92ZS1mZWF0aGVyJ2QgcmF2ZW4hIHdvbHZpc2gtcmF2ZW5pbmcgbGFtYiEKICAgIERlc3Bpc2VkIHN1YnN0YW5jZSBvZiBkaXZpbmVzdCBzaG93IQogICAgSnVzdCBvcHBvc2l0ZSB0byB3aGF0IHRob3UganVzdGx5IHNlZW0nc3QsCiAgICBBIGRhbW5lZCBzYWludCwgYW4gaG9ub3VyYWJsZSB2aWxsYWluIQogICAgTyBuYXR1cmUsIHdoYXQgaGFkc3QgdGhvdSB0byBkbyBpbiBoZWxsLAogICAgV2hlbiB0aG91IGRpZHN0IGJvd2VyIHRoZSBzcGlyaXQgb2YgYSBmaWVuZAogICAgSW4gbW9yYWwgcGFyYWRpc2Ugb2Ygc3VjaCBzd2VldCBmbGVzaD8KICAgIFdhcyBldmVyIGJvb2sgY29udGFpbmluZyBzdWNoIHZpbGUgbWF0dGVyCiAgICBTbyBmYWlybHkgYm91bmQIE8gdGhhdCBkZWNlaXQgc2hvdWxkIGR3ZWxsCiAgICBJbiBzdWNoIGEgZ29yZ2VvdXMgcGFsYWNlIQoKTnVyc2UKCiAgICBUaGVyZSdzIG5vIHRydXN0LAogICAgTm8gZmFpdGgsIG5vIGhvbmVzdHkgaW4gbWVuOyBhbGwgcGVyanVyZWQsCiAgICBBbGwgZm9yc3dvcm4sIGFsbCBuYXVnaHQsIGFsbCBkaXNzZW1ibGVycy4KICAgIEFoLCB3aGVyZSdzIG15IG1hbj8gZ2l2ZSBtZSBzb21lIGFxdWEgdml0YWU6CiAgICBUaGVzZSBncmllZnMsIHRoZXNlIHdvZXMsIHRoZXNlIHNvcnJvd3MgbWFrZSBtZSBvbGQuCiAgICBTaGFtZSBjb21lIHRvIFJvbWVvIQoKSlVMSUVUCgogICAgQmxpc3RlcidkIGJlIHRoeSB0b25ndWUKICAgIEZvciBzdWNoIGEgd2lzaCEgaGUgd2FzIG5vdCBib3JuIHRvIHNoYW1lOgogICAgVXBvbiBoaXMgYnJvdyBzaGFtZSBpcyBhc2hhbWVkIHRvIHNpdDsKICAgIEZvciAndGlzIGEgdGhyb25lIHdoZXJlIGhvbm91ciBtYXkgYmUgY3Jvd24nZAogICAgU29sZSBtb25hcmNoIG9mIHRoZSB1bml2ZXJzYWwgZWFydGguCiAgICBPLCB3aGF0IGEgYmVhc3Qgd2FzIEkgdG8gY2hpZGUgYXQgaGltIQoKTnVyc2UKCiAgICBXaWxsIHlvdSBzcGVhayB3ZWxsIG9mIGhpbSB0aGF0IGtpbGwnZCB5b3VyIGNvdXNpbj8KCkpVTElFVAoKICAgIFNoYWxsIEkgc3BlYWsgaWxsIG9mIGhpbSB0aGF0IGlzIG15IGh1c2JhbmQCiAgICBBaCwgcG9vciBteSBsb3JkLCB3aGF0IHRvbmd1ZSBzaGFsbCBzbW9vdGggdGh5IG5hbWUsCiAgICBXaGVuIEksIHRoeSB0aHJlZS1ob3VycyB3aWZlLCBoYXZlIG1hbmdsZWQgaXQCiAgICBCdXQsIHdoZXJlZm9yZSwgdmlsbGFpbiwgZGlkc3QgdGhvdSBraWxsIG15IGNvdXNpbj8KICAgIFRoYXQgdmlsbGFpbiBjb3VzaW4gd291bGQgaGF2ZSBraWxsJ2QgbXkgaHVzYmFuZDoKICAgIEJhY2ssIGZvb2xpc2ggdGVhcnMsIGJhY2sgdG8geW91ciBuYXRpdmUgc3ByaW5nOwogICAgWW91ciB0cmlidXRhcnkgZHJvcHMgYmVsb25nIHRvIHdvZSwKICAgIFdoaWNoIHlvdSwgbWlzdGFraW5nLCBvZmZlciB1cCB0byBqb3kuCiAgICBNeSBodXNiYW5kIGxpdmVzLCB0aGF0IFR5YmFsdCB3b3VsZCBoYXZlIHNsYWluOwogICAgQW5kIFR5YmFsdCdzIGRlYWQsIHRoYXQgd291bGQgaGF2ZSBzbGFpbiBteSBodXNiYW5kOgogICAgQWxsIHRoaXMgaXMgY29tZm9ydDsgd2hlcmVmb3JlIHdlZXAgSSB0aGVuPwogICAgU29tZSB3b3JkIHRoZXJlIHdhcywgd29yc2VyIHRoYW4gVHliYWx0J3MgZGVhdGgsCiAgICBUaGF0IG11cmRlcidkIG1lOiBJIHdvdWxkIGZvcmdldCBpdCBmYWluOwogICAgQnV0LCBPLCBpdCBwcmVzc2VzIHRvIG15IG1lbW9yeSwKICAgIExpa2UgZGFtbmVkIGd1aWx0eSBkZWVkcyB0byBzaW5uZXJzJyBtaW5kczoKICAgICdUeWJhbHQgaXMgZGVhZCwgYW5kIFJvbWVvLS1iYW5pc2hlZDsnCiAgICBUaGF0ICdiYW5pc2hlZCwnIHRoYXQgb25lIHdvcmQgJ2JhbmlzaGVkLCcKICAgIEhhdGggc2xhaW4gdGVuIHRob3VzYW5kIFR5YmFsdHMuIFR5YmFsdCdzIGRlYXRoCiAgICBXYXMgd29lIGVub3VnaCwgaWYgaXQgaGFkIGVuZGVkIHRoZXJlOgogICAgT3IsIGlmIHNvdXIgd29lIGRlbGlnaHRzIGluIGZlbGxvd3NoaXAKICAgIEFuZCBuZWVkbHkgd2lsbCBiZSByYW5rJ2Qgd2l0aCBvdGhlciBncmllZnMsCiAgICBXaHkgZm9sbG93J2Qgbm90LCB3aGVuIHNoZSBzYWlkICdUeWJhbHQncyBkZWFkLCcKICAgIFRoeSBmYXRoZXIsIG9yIHRoeSBtb3RoZXIsIG5heSwgb3IgYm90aCwKICAgIFdoaWNoIG1vZGVybiBsYW1lbnRhdGlvbnMgbWlnaHQgaGF2ZSBtb3ZlZD8KICAgIEJ1dCB3aXRoIGEgcmVhci13YXJkIGZvbGxvd2luZyBUeWJhbHQncyBkZWF0aCwKICAgICdSb21lbyBpcyBiYW5pc2hlZCwnIHRvIHNwZWFrIHRoYXQgd29yZCwKICAgIElzIGZhdGhlciwgbW90aGVyLCBUeWJhbHQsIFJvbWVvLCBKdWxpZXQsCiAgICBBbGwgc2xhaW4sIGFsbCBkZWFkLiAnUm9tZW8gaXMgYmFuaXNoZWQhJwogICAgVGhlcmUgaXMgbm8gZW5kLCBubyBsaW1pdCwgbWVhc3VyZSwgYm91bmQsCiAgICBJbiB0aGF0IHdvcmQncyBkZWF0aDsgbm8gd29yZHMgY2FuIHRoYXQgd29lIHNvdW5kLgogICAgV2hlcmUgaXMgbXkgZmF0aGVyLCBhbmQgbXkgbW90aGVyLCBudXJzZT8KCk51cnNlCgogICAgV2VlcGluZyBhbmQgd2FpbGluZyBvdmVyIFR5YmFsdCdzIGNvcnNlOgogICAgV2lsbCB5b3UgZ28gdG8gdGhlbT8gSSB3aWxsIGJyaW5nIHlvdSB0aGl0aGVyLgoKSlVMSUVUCgogICAgV2FzaCB0aGV5IGhpcyB3b3VuZHMgd2l0aCB0ZWFyczogbWluZSBzaGFsbCBiZSBzcGVudCwKICAgIFdoZW4gdGhlaXJzIGFyZSBkcnksIGZvciBSb21lbydzIGJhbmlzaG1lbnQuCiAgICBUYWtlIHVwIHRob3NlIGNvcmRzOiBwb29yIHJvcGVzLCB5b3UgYXJlIGJlZ3VpbGVkLAogICAgQm90aCB5b3UgYW5kIEk7IGZvciBSb21lbyBpcyBleGlsZWQ6CiAgICBIZSBtYWRlIHlvdSBmb3IgYSBoaWdod2F5IHRvIG15IGJlZDsKICAgIEJ1dCBJLCBhIG1haWQsIGRpZSBtYWlkZW4td2lkb3dlZC4KICAgIENvbWUsIGNvcmRzLCBjb21lLCBudXJzZTsgSSdsbCB0byBteSB3ZWRkaW5nLWJlZDsKICAgIEFuZCBkZWF0aCwgbm90IFJvbWVvLCB0YWtlIG15IG1haWRlbmhlYWQhCgpOdXJzZQoKICAgIEhpZSB0byB5b3VyIGNoYW1iZXI6IEknbGwgZmluZCBSb21lbwogICAgVG8gY29tZm9ydCB5b3U6IEkgd290IHdlbGwgd2hlcmUgaGUgaXMuCiAgICBIYXJrIHllLCB5b3VyIFJvbWVvIHdpbGwgYmUgaGVyZSBhdCBuaWdodDoKICAgIEknbGwgdG8gaGltOyBoZSBpcyBoaWQgYXQgTGF1cmVuY2UnIGNlbGwuCgpKVUxJRVQKCiAgICBPLCBmaW5kIGhpbSEgZ2l2ZSB0aGlzIHJpbmcgdG8gbXkgdHJ1ZSBrbmlnaHQsCiAgICBBbmQgYmlkIGhpbSBjb21lIHRvIHRha2UgaGlzIGxhc3QgZmFyZXdlbGwuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSAKCkZSSUFSIExBVVJFTkNFCgogICAgUm9tZW8sIGNvbWUgZm9ydGg7IGNvbWUgZm9ydGgsIHRob3UgZmVhcmZ1bCBtYW46CiAgICBBZmZsaWN0aW9uIGlzIGVuYW1vdXInZCBvZiB0aHkgcGFydHMsCiAgICBBbmQgdGhvdSBhcnQgd2VkZGVkIHRvIGNhbGFtaXR5LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEZhdGhlciwgd2hhdCBuZXdzPyB3aGF0IGlzIHRoZSBwcmluY2UncyBkb29tPwogICAgV2hhdCBzb3Jyb3cgY3JhdmVzIGFjcXVhaW50YW5jZSBhdCBteSBoYW5kLAogICAgVGhhdCBJIHlldCBrbm93IG5vdD8KCkZSSUFSIExBVVJFTkNFCgogICAgVG9vIGZhbWlsaWFyCiAgICBJcyBteSBkZWFyIHNvbiB3aXRoIHN1Y2ggc291ciBjb21wYW55OgogICAgSSBicmluZyB0aGVlIHRpZGluZ3Mgb2YgdGhlIHByaW5jZSdzIGRvb20uCgpST01FTwoKICAgIFdoYXQgbGVzcyB0aGFuIGRvb21zLWRheSBpcyB0aGUgcHJpbmNlJ3MgZG9vbT8KCkZSSUFSIExBVVJFTkNFCgogICAgQSBnZW50bGVyIGp1ZGdtZW50IHZhbmlzaCdkIGZyb20gaGlzIGxpcHMsCiAgICBOb3QgYm9keSdzIGRlYXRoLCBidXQgYm9keSdzIGJhbmlzaG1lbnQuCgpST01FTwoKICAgIEhhLCBiYW5pc2htZW50ISBiZSBtZXJjaWZ1bCwgc2F5ICdkZWF0aDsnCiAgICBGb3IgZXhpbGUgaGF0aCBtb3JlIHRlcnJvciBpbiBoaXMgbG9vaywKICAgIE11Y2ggbW9yZSB0aGFuIGRlYXRoOiBkbyBub3Qgc2F5ICdiYW5pc2htZW50LicKCkZSSUFSIExBVVJFTkNFCgogICAgSGVuY2UgZnJvbSBWZXJvbmEgYXJ0IHRob3UgYmFuaXNoZWQ6CiAgICBCZSBwYXRpZW50LCBmb3IgdGhlIHdvcmxkIGlzIGJyb2FkIGFuZCB3aWRlLgoKUk9NRU8KCiAgICBUaGVyZSBpcyBubyB3b3JsZCB3aXRob3V0IFZlcm9uYSB3YWxscywKICAgIEJ1dCBwdXJnYXRvcnksIHRvcnR1cmUsIGhlbGwgaXRzZWxmLgogICAgSGVuY2UtYmFuaXNoZWQgaXMgYmFuaXNoJ2QgZnJvbSB0aGUgd29ybGQsCiAgICBBbmQgd29ybGQncyBleGlsZSBpcyBkZWF0aDogdGhlbiBiYW5pc2hlZCwKICAgIElzIGRlYXRoIG1pcy10ZXJtJ2Q6IGNhbGxpbmcgZGVhdGggYmFuaXNobWVudCwKICAgIFRob3UgY3V0dCdzdCBteSBoZWFkIG9mZiB3aXRoIGEgZ29sZGVuIGF4ZSwKICAgIEFuZCBzbWlsZXN0IHVwb24gdGhlIHN0cm9rZSB0aGF0IG11cmRlcnMgbWUuCgpGUklBUiBMQVVSRU5DRQoKICAgIE8gZGVhZGx5IHNpbiEgTyBydWRlIHVudGhhbmtmdWxuZXNzIQogICAgVGh5IGZhdWx0IG91ciBsYXcgY2FsbHMgZGVhdGg7IGJ1dCB0aGUga2luZCBwcmluY2UsCiAgICBUYWtpbmcgdGh5IHBhcnQsIGhhdGggcnVzaCdkIGFzaWRlIHRoZSBsYXcsCiAgICBBbmQgdHVybidkIHRoYXQgYmxhY2sgd29yZCBkZWF0aCB0byBiYW5pc2htZW50OgogICAgVGhpcyBpcyBkZWFyIG1lcmN5LCBhbmQgdGhvdSBzZWVzdCBpdCBub3QuCgpST01FTwoKICAgICdUaXMgdG9ydHVyZSwgYW5kIG5vdCBtZXJjeTogaGVhdmVuIGlzIGhlcmUsCiAgICBXaGVyZSBKdWxpZXQgbGl2ZXM7IGFuZCBldmVyeSBjYXQgYW5kIGRvZwogICAgQW5kIGxpdHRsZSBtb3VzZSwgZXZlcnkgdW53b3J0aHkgdGhpbmcsCiAgICBMaXZlIGhlcmUgaW4gaGVhdmVuIGFuZCBtYXkgbG9vayBvbiBoZXI7CiAgICBCdXQgUm9tZW8gbWF5IG5vdDogbW9yZSB2YWxpZGl0eSwKICAgIE1vcmUgaG9ub3VyYWJsZSBzdGF0ZSwgbW9yZSBjb3VydHNoaXAgbGl2ZXMKICAgIEluIGNhcnJpb24tZmxpZXMgdGhhbiBSb21lbzogdGhleSBteSBzZWl6ZQogICAgT24gdGhlIHdoaXRlIHdvbmRlciBvZiBkZWFyIEp1bGlldCdzIGhhbmQKICAgIEFuZCBzdGVhbCBpbW1vcnRhbCBibGVzc2luZyBmcm9tIGhlciBsaXBzLAogICAgV2hvIGV2ZW4gaW4gcHVyZSBhbmQgdmVzdGFsIG1vZGVzdHksCiAgICBTdGlsbCBibHVzaCwgYXMgdGhpbmtpbmcgdGhlaXIgb3duIGtpc3NlcyBzaW47CiAgICBCdXQgUm9tZW8gbWF5IG5vdDsgaGUgaXMgYmFuaXNoZWQ6CiAgICBGbGllcyBtYXkgZG8gdGhpcywgYnV0IEkgZnJvbSB0aGlzIG11c3QgZmx5OgogICAgVGhleSBhcmUgZnJlZSBtZW4sIGJ1dCBJIGFtIGJhbmlzaGVkLgogICAgQW5kIHNheSdzdCB0aG91IHlldCB0aGF0IGV4aWxlIGlzIG5vdCBkZWF0aD8KICAgIEhhZHN0IHRob3Ugbm8gcG9pc29uIG1peCdkLCBubyBzaGFycC1ncm91bmQga25pZmUsCiAgICBObyBzdWRkZW4gbWVhbiBvZiBkZWF0aCwgdGhvdWdoIG5lJ2VyIHNvIG1lYW4sCiAgICBCdXQgJ2JhbmlzaGVkJyB0byBraWxsIG1lPy0tJ2JhbmlzaGVkJz8KICAgIE8gZnJpYXIsIHRoZSBkYW1uZWQgdXNlIHRoYXQgd29yZCBpbiBoZWxsOwogICAgSG93bGluZ3MgYXR0ZW5kIGl0OiBob3cgaGFzdCB0aG91IHRoZSBoZWFydCwKICAgIEJlaW5nIGEgZGl2aW5lLCBhIGdob3N0bHkgY29uZmVzc29yLAogICAgQSBzaW4tYWJzb2x2ZXIsIGFuZCBteSBmcmllbmQgcHJvZmVzcydkLAogICAgVG8gbWFuZ2xlIG1lIHdpdGggdGhhdCB3b3JkICdiYW5pc2hlZCcCgpGUklBUiBMQVVSRU5DRQoKICAgIFRob3UgZm9uZCBtYWQgbWFuLCBoZWFyIG1lIGJ1dCBzcGVhayBhIHdvcmQuCgpST01FTwoKICAgIE8sIHRob3Ugd2lsdCBzcGVhayBhZ2FpbiBvZiBiYW5pc2htZW50LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJJ2xsIGdpdmUgdGhlZSBhcm1vdXIgdG8ga2VlcCBvZmYgdGhhdCB3b3JkOgogICAgQWR2ZXJzaXR5J3Mgc3dlZXQgbWlsaywgcGhpbG9zb3BoeSwKICAgIFRvIGNvbWZvcnQgdGhlZSwgdGhvdWdoIHRob3UgYXJ0IGJhbmlzaGVkLgoKUk9NRU8KCiAgICBZZXQgJ2JhbmlzaGVkJz8gSGFuZyB1cCBwaGlsb3NvcGh5IQogICAgVW5sZXNzIHBoaWxvc29waHkgY2FuIG1ha2UgYSBKdWxpZXQsCiAgICBEaXNwbGFudCBhIHRvd24sIHJldmVyc2UgYSBwcmluY2UncyBkb29tLAogICAgSXQgaGVscHMgbm90LCBpdCBwcmV2YWlscyBub3Q6IHRhbGsgbm8gbW9yZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTywgdGhlbiBJIHNlZSB0aGF0IG1hZG1lbiBoYXZlIG5vIGVhcnMuCgpST01FTwoKICAgIEhvdyBzaG91bGQgdGhleSwgd2hlbiB0aGF0IHdpc2UgbWVuIGhhdmUgbm8gZXllcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTGV0IG1lIGRpc3B1dGUgd2l0aCB0aGVlIG9mIHRoeSBlc3RhdGUuCgpST01FTwoKICAgIFRob3UgY2Fuc3Qgbm90IHNwZWFrIG9mIHRoYXQgdGhvdSBkb3N0IG5vdCBmZWVsOgogICAgV2VydCB0aG91IGFzIHlvdW5nIGFzIEksIEp1bGlldCB0aHkgbG92ZSwKICAgIEFuIGhvdXIgYnV0IG1hcnJpZWQsIFR5YmFsdCBtdXJkZXJlZCwKICAgIERvdGluZyBsaWtlIG1lIGFuZCBsaWtlIG1lIGJhbmlzaGVkLAogICAgVGhlbiBtaWdodHN0IHRob3Ugc3BlYWssIHRoZW4gbWlnaHRzdCB0aG91IHRlYXIgdGh5IGhhaXIsCiAgICBBbmQgZmFsbCB1cG9uIHRoZSBncm91bmQsIGFzIEkgZG8gbm93LAogICAgVGFraW5nIHRoZSBtZWFzdXJlIG9mIGFuIHVubWFkZSBncmF2ZS4KCiAgICBLbm9ja2luZyB3aXRoaW4KCkZSSUFSIExBVVJFTkNFCgogICAgQXJpc2U7IG9uZSBrbm9ja3M7IGdvb2QgUm9tZW8sIGhpZGUgdGh5c2VsZi4KClJPTUVPCgogICAgTm90IEk7IHVubGVzcyB0aGUgYnJlYXRoIG9mIGhlYXJ0c2ljayBncm9hbnMsCiAgICBNaXN0LWxpa2UsIGluZm9sZCBtZSBmcm9tIHRoZSBzZWFyY2ggb2YgZXllcy4KCiAgICBLbm9ja2luZwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIYXJrLCBob3cgdGhleSBrbm9jayEgV2hvJ3MgdGhlcmUIFJvbWVvLCBhcmlzZTsKICAgIFRob3Ugd2lsdCBiZSB0YWtlbi4gU3RheSBhd2hpbGUhIFN0YW5kIHVwOwoKICAgIEtub2NraW5nCiAgICBSdW4gdG8gbXkgc3R1ZHkuIEJ5IGFuZCBieSEgR29kJ3Mgd2lsbCwKICAgIFdoYXQgc2ltcGxlbmVzcyBpcyB0aGlzISBJIGNvbWUsIEkgY29tZSEKCiAgICBLbm9ja2luZwogICAgV2hvIGtub2NrcyBzbyBoYXJkPyB3aGVuY2UgY29tZSB5b3UIHdoYXQncyB5b3VyIHdpbGwCgpOdXJzZQoKICAgIFtXaXRoaW5dIExldCBtZSBjb21lIGluLCBhbmQgeW91IHNoYWxsIGtub3cKICAgIG15IGVycmFuZDsKICAgIEkgY29tZSBmcm9tIExhZHkgSnVsaWV0LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXZWxjb21lLCB0aGVuLgoKICAgIEVudGVyIE51cnNlCgpOdXJzZQoKICAgIE8gaG9seSBmcmlhciwgTywgdGVsbCBtZSwgaG9seSBmcmlhciwKICAgIFdoZXJlIGlzIG15IGxhZHkncyBsb3JkLCB3aGVyZSdzIFJvbWVvPwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGVyZSBvbiB0aGUgZ3JvdW5kLCB3aXRoIGhpcyBvd24gdGVhcnMgbWFkZSBkcnVuay4KCk51cnNlCgogICAgTywgaGUgaXMgZXZlbiBpbiBteSBtaXN0cmVzcycgY2FzZSwKICAgIEp1c3QgaW4gaGVyIGNhc2UhIE8gd29mdWwgc3ltcGF0aHkhCiAgICBQaXRlb3VzIHByZWRpY2FtZW50ISBFdmVuIHNvIGxpZXMgc2hlLAogICAgQmx1YmJlcmluZyBhbmQgd2VlcGluZywgd2VlcGluZyBhbmQgYmx1YmJlcmluZy4KICAgIFN0YW5kIHVwLCBzdGFuZCB1cDsgc3RhbmQsIGFuZCB5b3UgYmUgYSBtYW46CiAgICBGb3IgSnVsaWV0J3Mgc2FrZSwgZm9yIGhlciBzYWtlLCByaXNlIGFuZCBzdGFuZDsKICAgIFdoeSBzaG91bGQgeW91IGZhbGwgaW50byBzbyBkZWVwIGFuIE8CgpST01FTwoKICAgIE51cnNlIQoKTnVyc2UKCiAgICBBaCBzaXIhIGFoIHNpciEgV2VsbCwgZGVhdGgncyB0aGUgZW5kIG9mIGFsbC4KClJPTUVPCgogICAgU3Bha2VzdCB0aG91IG9mIEp1bGlldD8gaG93IGlzIGl0IHdpdGggaGVyPwogICAgRG90aCBzaGUgbm90IHRoaW5rIG1lIGFuIG9sZCBtdXJkZXJlciwKICAgIE5vdyBJIGhhdmUgc3RhaW4nZCB0aGUgY2hpbGRob29kIG9mIG91ciBqb3kKICAgIFdpdGggYmxvb2QgcmVtb3ZlZCBidXQgbGl0dGxlIGZyb20gaGVyIG93bj8KICAgIFdoZXJlIGlzIHNoZT8gYW5kIGhvdyBkb3RoIHNoZT8gYW5kIHdoYXQgc2F5cwogICAgTXkgY29uY2VhbCdkIGxhZHkgdG8gb3VyIGNhbmNlbGwnZCBsb3ZlPwoKTnVyc2UKCiAgICBPLCBzaGUgc2F5cyBub3RoaW5nLCBzaXIsIGJ1dCB3ZWVwcyBhbmQgd2VlcHM7CiAgICBBbmQgbm93IGZhbGxzIG9uIGhlciBiZWQ7IGFuZCB0aGVuIHN0YXJ0cyB1cCwKICAgIEFuZCBUeWJhbHQgY2FsbHM7IGFuZCB0aGVuIG9uIFJvbWVvIGNyaWVzLAogICAgQW5kIHRoZW4gZG93biBmYWxscyBhZ2Fpbi4KClJPTUVPCgogICAgQXMgaWYgdGhhdCBuYW1lLAogICAgU2hvdCBmcm9tIHRoZSBkZWFkbHkgbGV2ZWwgb2YgYSBndW4sCiAgICBEaWQgbXVyZGVyIGhlcjsgYXMgdGhhdCBuYW1lJ3MgY3Vyc2VkIGhhbmQKICAgIE11cmRlcidkIGhlciBraW5zbWFuLiBPLCB0ZWxsIG1lLCBmcmlhciwgdGVsbCBtZSwKICAgIEluIHdoYXQgdmlsZSBwYXJ0IG9mIHRoaXMgYW5hdG9teQogICAgRG90aCBteSBuYW1lIGxvZGdlPyB0ZWxsIG1lLCB0aGF0IEkgbWF5IHNhY2sKICAgIFRoZSBoYXRlZnVsIG1hbnNpb24uCgogICAgRHJhd2luZyBoaXMgc3dvcmQKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZCB0aHkgZGVzcGVyYXRlIGhhbmQ6CiAgICBBcnQgdGhvdSBhIG1hbj8gdGh5IGZvcm0gY3JpZXMgb3V0IHRob3UgYXJ0OgogICAgVGh5IHRlYXJzIGFyZSB3b21hbmlzaDsgdGh5IHdpbGQgYWN0cyBkZW5vdGUKICAgIFRoZSB1bnJlYXNvbmFibGUgZnVyeSBvZiBhIGJlYXN0OgogICAgVW5zZWVtbHkgd29tYW4gaW4gYSBzZWVtaW5nIG1hbiEKICAgIE9yIGlsbC1iZXNlZW1pbmcgYmVhc3QgaW4gc2VlbWluZyBib3RoIQogICAgVGhvdSBoYXN0IGFtYXplZCBtZTogYnkgbXkgaG9seSBvcmRlciwKICAgIEkgdGhvdWdodCB0aHkgZGlzcG9zaXRpb24gYmV0dGVyIHRlbXBlcidkLgogICAgSGFzdCB0aG91IHNsYWluIFR5YmFsdD8gd2lsdCB0aG91IHNsYXkgdGh5c2VsZj8KICAgIEFuZCBzdGF5IHRoeSBsYWR5IHRvbyB0aGF0IGxpdmVzIGluIHRoZWUsCiAgICBCeSBkb2luZyBkYW1uZWQgaGF0ZSB1cG9uIHRoeXNlbGYCiAgICBXaHkgcmFpbCdzdCB0aG91IG9uIHRoeSBiaXJ0aCwgdGhlIGhlYXZlbiwgYW5kIGVhcnRoPwogICAgU2luY2UgYmlydGgsIGFuZCBoZWF2ZW4sIGFuZCBlYXJ0aCwgYWxsIHRocmVlIGRvIG1lZXQKICAgIEluIHRoZWUgYXQgb25jZTsgd2hpY2ggdGhvdSBhdCBvbmNlIHdvdWxkc3QgbG9zZS4KICAgIEZpZSwgZmllLCB0aG91IHNoYW1lc3QgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDsKICAgIFdoaWNoLCBsaWtlIGEgdXN1cmVyLCBhYm91bmQnc3QgaW4gYWxsLAogICAgQW5kIHVzZXN0IG5vbmUgaW4gdGhhdCB0cnVlIHVzZSBpbmRlZWQKICAgIFdoaWNoIHNob3VsZCBiZWRlY2sgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDoKICAgIFRoeSBub2JsZSBzaGFwZSBpcyBidXQgYSBmb3JtIG9mIHdheCwKICAgIERpZ3Jlc3NpbmcgZnJvbSB0aGUgdmFsb3VyIG9mIGEgbWFuOwogICAgVGh5IGRlYXIgbG92ZSBzd29ybiBidXQgaG9sbG93IHBlcmp1cnksCiAgICBLaWxsaW5nIHRoYXQgbG92ZSB3aGljaCB0aG91IGhhc3Qgdm93J2QgdG8gY2hlcmlzaDsKICAgIFRoeSB3aXQsIHRoYXQgb3JuYW1lbnQgdG8gc2hhcGUgYW5kIGxvdmUsCiAgICBNaXNzaGFwZW4gaW4gdGhlIGNvbmR1Y3Qgb2YgdGhlbSBib3RoLAogICAgTGlrZSBwb3dkZXIgaW4gYSBza2l0bGVzcyBzb2xkaWVyJ3MgZmxhc2ssCiAgICBJcyBzZXQgYWZpcmUgYnkgdGhpbmUgb3duIGlnbm9yYW5jZSwKICAgIEFuZCB0aG91IGRpc21lbWJlcidkIHdpdGggdGhpbmUgb3duIGRlZmVuY2UuCiAgICBXaGF0LCByb3VzZSB0aGVlLCBtYW4hIHRoeSBKdWxpZXQgaXMgYWxpdmUsCiAgICBGb3Igd2hvc2UgZGVhciBzYWtlIHRob3Ugd2FzdCBidXQgbGF0ZWx5IGRlYWQ7CiAgICBUaGVyZSBhcnQgdGhvdSBoYXBweTogVHliYWx0IHdvdWxkIGtpbGwgdGhlZSwKICAgIEJ1dCB0aG91IHNsZXcnc3QgVHliYWx0OyB0aGVyZSBhcmUgdGhvdSBoYXBweSB0b286CiAgICBUaGUgbGF3IHRoYXQgdGhyZWF0ZW4nZCBkZWF0aCBiZWNvbWVzIHRoeSBmcmllbmQKICAgIEFuZCB0dXJucyBpdCB0byBleGlsZTsgdGhlcmUgYXJ0IHRob3UgaGFwcHk6CiAgICBBIHBhY2sgb2YgYmxlc3NpbmdzIGxpZ2h0cyB1cCB1cG9uIHRoeSBiYWNrOwogICAgSGFwcGluZXNzIGNvdXJ0cyB0aGVlIGluIGhlciBiZXN0IGFycmF5OwogICAgQnV0LCBsaWtlIGEgbWlzYmVoYXZlZCBhbmQgc3VsbGVuIHdlbmNoLAogICAgVGhvdSBwb3V0J3N0IHVwb24gdGh5IGZvcnR1bmUgYW5kIHRoeSBsb3ZlOgogICAgVGFrZSBoZWVkLCB0YWtlIGhlZWQsIGZvciBzdWNoIGRpZSBtaXNlcmFibGUuCiAgICBHbywgZ2V0IHRoZWUgdG8gdGh5IGxvdmUsIGFzIHdhcyBkZWNyZWVkLAogICAgQXNjZW5kIGhlciBjaGFtYmVyLCBoZW5jZSBhbmQgY29tZm9ydCBoZXI6CiAgICBCdXQgbG9vayB0aG91IHN0YXkgbm90IHRpbGwgdGhlIHdhdGNoIGJlIHNldCwKICAgIEZvciB0aGVuIHRob3UgY2Fuc3Qgbm90IHBhc3MgdG8gTWFudHVhOwogICAgV2hlcmUgdGhvdSBzaGFsdCBsaXZlLCB0aWxsIHdlIGNhbiBmaW5kIGEgdGltZQogICAgVG8gYmxhemUgeW91ciBtYXJyaWFnZSwgcmVjb25jaWxlIHlvdXIgZnJpZW5kcywKICAgIEJlZyBwYXJkb24gb2YgdGhlIHByaW5jZSwgYW5kIGNhbGwgdGhlZSBiYWNrCiAgICBXaXRoIHR3ZW50eSBodW5kcmVkIHRob3VzYW5kIHRpbWVzIG1vcmUgam95CiAgICBUaGFuIHRob3Ugd2VudCdzdCBmb3J0aCBpbiBsYW1lbnRhdGlvbi4KICAgIEdvIGJlZm9yZSwgbnVyc2U6IGNvbW1lbmQgbWUgdG8gdGh5IGxhZHk7CiAgICBBbmQgYmlkIGhlciBoYXN0ZW4gYWxsIHRoZSBob3VzZSB0byBiZWQsCiAgICBXaGljaCBoZWF2eSBzb3Jyb3cgbWFrZXMgdGhlbSBhcHQgdW50bzoKICAgIFJvbWVvIGlzIGNvbWluZy4KCk51cnNlCgogICAgTyBMb3JkLCBJIGNvdWxkIGhhdmUgc3RheSdkIGhlcmUgYWxsIHRoZSBuaWdodAogICAgVG8gaGVhciBnb29kIGNvdW5zZWw6IE8sIHdoYXQgbGVhcm5pbmcgaXMhCiAgICBNeSBsb3JkLCBJJ2xsIHRlbGwgbXkgbGFkeSB5b3Ugd2lsbCBjb21lLgoKUk9NRU8KCiAgICBEbyBzbywgYW5kIGJpZCBteSBzd2VldCBwcmVwYXJlIHRvIGNoaWRlLgoKTnVyc2UKCiAgICBIZXJlLCBzaXIsIGEgcmluZyBzaGUgYmlkIG1lIGdpdmUgeW91LCBzaXI6CiAgICBIaWUgeW91LCBtYWtlIGhhc3RlLCBmb3IgaXQgZ3Jvd3MgdmVyeSBsYXRlLgoKICAgIEV4aXQKClJPTUVPCgogICAgSG93IHdlbGwgbXkgY29tZm9ydCBpcyByZXZpdmVkIGJ5IHRoaXMhCgpGUklBUiBMQVVSRU5DRQoKICAgIEdvIGhlbmNlOyBnb29kIG5pZ2h0OyBhbmQgaGVyZSBzdGFuZHMgYWxsIHlvdXIgc3RhdGU6CiAgICBFaXRoZXIgYmUgZ29uZSBiZWZvcmUgdGhlIHdhdGNoIGJlIHNldCwKICAgIE9yIGJ5IHRoZSBicmVhayBvZiBkYXkgZGlzZ3Vpc2VkIGZyb20gaGVuY2U6CiAgICBTb2pvdXJuIGluIE1hbnR1YTsgSSdsbCBmaW5kIG91dCB5b3VyIG1hbiwKICAgIEFuZCBoZSBzaGFsbCBzaWduaWZ5IGZyb20gdGltZSB0byB0aW1lCiAgICBFdmVyeSBnb29kIGhhcCB0byB5b3UgdGhhdCBjaGFuY2VzIGhlcmU6CiAgICBHaXZlIG1lIHRoeSBoYW5kOyAndGlzIGxhdGU6IGZhcmV3ZWxsOyBnb29kIG5pZ2h0LgoKUk9NRU8KCiAgICBCdXQgdGhhdCBhIGpveSBwYXN0IGpveSBjYWxscyBvdXQgb24gbWUsCiAgICBJdCB3ZXJlIGEgZ3JpZWYsIHNvIGJyaWVmIHRvIHBhcnQgd2l0aCB0aGVlOiBGYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHJvb20gaW4gQ2FwdWxldCdzIGhvdXNlLgoKICAgIEVudGVyIENBUFVMRVQsIExBRFkgQ0FQVUxFVCwgYW5kIFBBUklTIAoKQ0FQVUxFVAoKICAgIFRoaW5ncyBoYXZlIGZhbGwnbiBvdXQsIHNpciwgc28gdW5sdWNraWx5LAogICAgVGhhdCB3ZSBoYXZlIGhhZCBubyB0aW1lIHRvIG1vdmUgb3VyIGRhdWdodGVyOgogICAgTG9vayB5b3UsIHNoZSBsb3ZlZCBoZXIga2luc21hbiBUeWJhbHQgZGVhcmx5LAogICAgQW5kIHNvIGRpZCBJOi0tV2VsbCwgd2Ugd2VyZSBib3JuIHRvIGRpZS4KICAgICdUaXMgdmVyeSBsYXRlLCBzaGUnbGwgbm90IGNvbWUgZG93biB0by1uaWdodDoKICAgIEkgcHJvbWlzZSB5b3UsIGJ1dCBmb3IgeW91ciBjb21wYW55LAogICAgSSB3b3VsZCBoYXZlIGJlZW4gYS1iZWQgYW4gaG91ciBhZ28uCgpQQVJJUwoKICAgIFRoZXNlIHRpbWVzIG9mIHdvZSBhZmZvcmQgbm8gdGltZSB0byB3b28uCiAgICBNYWRhbSwgZ29vZCBuaWdodDogY29tbWVuZCBtZSB0byB5b3VyIGRhdWdodGVyLgoKTEFEWSBDQVBVTEVUCgogICAgSSB3aWxsLCBhbmQga25vdyBoZXIgbWluZCBlYXJseSB0by1tb3Jyb3c7CiAgICBUby1uaWdodCBzaGUgaXMgbWV3J2QgdXAgdG8gaGVyIGhlYXZpbmVzcy4KCkNBUFVMRVQKCiAgICBTaXIgUGFyaXMsIEkgd2lsbCBtYWtlIGEgZGVzcGVyYXRlIHRlbmRlcgogICAgT2YgbXkgY2hpbGQncyBsb3ZlOiBJIHRoaW5rIHNoZSB3aWxsIGJlIHJ1bGVkCiAgICBJbiBhbGwgcmVzcGVjdHMgYnkgbWU7IG5heSwgbW9yZSwgSSBkb3VidCBpdCBub3QuCiAgICBXaWZlLCBnbyB5b3UgdG8gaGVyIGVyZSB5b3UgZ28gdG8gYmVkOwogICAgQWNxdWFpbnQgaGVyIGhlcmUgb2YgbXkgc29uIFBhcmlzJyBsb3ZlOwogICAgQW5kIGJpZCBoZXIsIG1hcmsgeW91IG1lLCBvbiBXZWRuZXNkYXkgbmV4dC0tCiAgICBCdXQsIHNvZnQhIHdoYXQgZGF5IGlzIHRoaXMCgpQQVJJUwoKICAgIE1vbmRheSwgbXkgbG9yZCwKCkNBUFVMRVQKCiAgICBNb25kYXkhIGhhLCBoYSEgV2VsbCwgV2VkbmVzZGF5IGlzIHRvbyBzb29uLAogICAgTycgVGh1cnNkYXkgbGV0IGl0IGJlOiBvJyBUaHVyc2RheSwgdGVsbCBoZXIsCiAgICBTaGUgc2hhbGwgYmUgbWFycmllZCB0byB0aGlzIG5vYmxlIGVhcmwuCiAgICBXaWxsIHlvdSBiZSByZWFkeT8gZG8geW91IGxpa2UgdGhpcyBoYXN0ZT8KICAgIFdlJ2xsIGtlZXAgbm8gZ3JlYXQgYWRvLC0tYSBmcmllbmQgb3IgdHdvOwogICAgRm9yLCBoYXJrIHlvdSwgVHliYWx0IGJlaW5nIHNsYWluIHNvIGxhdGUsCiAgICBJdCBtYXkgYmUgdGhvdWdodCB3ZSBoZWxkIGhpbSBjYXJlbGVzc2x5LAogICAgQmVpbmcgb3VyIGtpbnNtYW4sIGlmIHdlIHJldmVsIG11Y2g6CiAgICBUaGVyZWZvcmUgd2UnbGwgaGF2ZSBzb21lIGhhbGYgYSBkb3plbiBmcmllbmRzLAogICAgQW5kIHRoZXJlIGFuIGVuZC4gQnV0IHdoYXQgc2F5IHlvdSB0byBUaHVyc2RheT8KClBBUklTCgogICAgTXkgbG9yZCwgSSB3b3VsZCB0aGF0IFRodXJzZGF5IHdlcmUgdG8tbW9ycm93LgoKQ0FQVUxFVAoKICAgIFdlbGwgZ2V0IHlvdSBnb25lOiBvJyBUaHVyc2RheSBiZSBpdCwgdGhlbi4KICAgIEdvIHlvdSB0byBKdWxpZXQgZXJlIHlvdSBnbyB0byBiZWQsCiAgICBQcmVwYXJlIGhlciwgd2lmZSwgYWdhaW5zdCB0aGlzIHdlZGRpbmctZGF5LgogICAgRmFyZXdlbGwsIG15IGxvcmQuIExpZ2h0IHRvIG15IGNoYW1iZXIsIGhvIQogICAgQWZvcmUgbWUhIGl0IGlzIHNvIHZlcnkgdmVyeSBsYXRlLAogICAgVGhhdCB3ZSBtYXkgY2FsbCBpdCBlYXJseSBieSBhbmQgYnkuCiAgICBHb29kIG5pZ2h0LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gYW5kIEpVTElFVCBhYm92ZSwgYXQgdGhlIHdpbmRvdyAKCkpVTElFVAoKICAgIFdpbHQgdGhvdSBiZSBnb25lPyBpdCBpcyBub3QgeWV0IG5lYXIgZGF5OgogICAgSXQgd2FzIHRoZSBuaWdodGluZ2FsZSwgYW5kIG5vdCB0aGUgbGFyaywKICAgIFRoYXQgcGllcmNlZCB0aGUgZmVhcmZ1bCBob2xsb3cgb2YgdGhpbmUgZWFyOwogICAgTmlnaHRseSBzaGUgc2luZ3Mgb24geW9uIHBvbWVncmFuYXRlLXRyZWU6CiAgICBCZWxpZXZlIG1lLCBsb3ZlLCBpdCB3YXMgdGhlIG5pZ2h0aW5nYWxlLgoKUk9NRU8KCiAgICBJdCB3YXMgdGhlIGxhcmssIHRoZSBoZXJhbGQgb2YgdGhlIG1vcm4sCiAgICBObyBuaWdodGluZ2FsZTogbG9vaywgbG92ZSwgd2hhdCBlbnZpb3VzIHN0cmVha3MKICAgIERvIGxhY2UgdGhlIHNldmVyaW5nIGNsb3VkcyBpbiB5b25kZXIgZWFzdDoKICAgIE5pZ2h0J3MgY2FuZGxlcyBhcmUgYnVybnQgb3V0LCBhbmQgam9jdW5kIGRheQogICAgU3RhbmRzIHRpcHRvZSBvbiB0aGUgbWlzdHkgbW91bnRhaW4gdG9wcy4KICAgIEkgbXVzdCBiZSBnb25lIGFuZCBsaXZlLCBvciBzdGF5IGFuZCBkaWUuCgpKVUxJRVQKCiAgICBZb24gbGlnaHQgaXMgbm90IGRheS1saWdodCwgSSBrbm93IGl0LCBJOgogICAgSXQgaXMgc29tZSBtZXRlb3IgdGhhdCB0aGUgc3VuIGV4aGFsZXMsCiAgICBUbyBiZSB0byB0aGVlIHRoaXMgbmlnaHQgYSB0b3JjaC1iZWFyZXIsCiAgICBBbmQgbGlnaHQgdGhlZSBvbiB0aHkgd2F5IHRvIE1hbnR1YToKICAgIFRoZXJlZm9yZSBzdGF5IHlldDsgdGhvdSBuZWVkJ3N0IG5vdCB0byBiZSBnb25lLgoKUk9NRU8KCiAgICBMZXQgbWUgYmUgdGEnZW4sIGxldCBtZSBiZSBwdXQgdG8gZGVhdGg7CiAgICBJIGFtIGNvbnRlbnQsIHNvIHRob3Ugd2lsdCBoYXZlIGl0IHNvLgogICAgSSdsbCBzYXkgeW9uIGdyZXkgaXMgbm90IHRoZSBtb3JuaW5nJ3MgZXllLAogICAgJ1RpcyBidXQgdGhlIHBhbGUgcmVmbGV4IG9mIEN5bnRoaWEncyBicm93OwogICAgTm9yIHRoYXQgaXMgbm90IHRoZSBsYXJrLCB3aG9zZSBub3RlcyBkbyBiZWF0CiAgICBUaGUgdmF1bHR5IGhlYXZlbiBzbyBoaWdoIGFib3ZlIG91ciBoZWFkczoKICAgIEkgaGF2ZSBtb3JlIGNhcmUgdG8gc3RheSB0aGFuIHdpbGwgdG8gZ286CiAgICBDb21lLCBkZWF0aCwgYW5kIHdlbGNvbWUhIEp1bGlldCB3aWxscyBpdCBzby4KICAgIEhvdyBpcyd0LCBteSBzb3VsPyBsZXQncyB0YWxrOyBpdCBpcyBub3QgZGF5LgoKSlVMSUVUCgogICAgSXQgaXMsIGl0IGlzOiBoaWUgaGVuY2UsIGJlIGdvbmUsIGF3YXkhCiAgICBJdCBpcyB0aGUgbGFyayB0aGF0IHNpbmdzIHNvIG91dCBvZiB0dW5lLAogICAgU3RyYWluaW5nIGhhcnNoIGRpc2NvcmRzIGFuZCB1bnBsZWFzaW5nIHNoYXJwcy4KICAgIFNvbWUgc2F5IHRoZSBsYXJrIG1ha2VzIHN3ZWV0IGRpdmlzaW9uOwogICAgVGhpcyBkb3RoIG5vdCBzbywgZm9yIHNoZSBkaXZpZGV0aCB1czoKICAgIFNvbWUgc2F5IHRoZSBsYXJrIGFuZCBsb2F0aGVkIHRvYWQgY2hhbmdlIGV5ZXMsCiAgICBPLCBub3cgSSB3b3VsZCB0aGV5IGhhZCBjaGFuZ2VkIHZvaWNlcyB0b28hCiAgICBTaW5jZSBhcm0gZnJvbSBhcm0gdGhhdCB2b2ljZSBkb3RoIHVzIGFmZnJheSwKICAgIEh1bnRpbmcgdGhlZSBoZW5jZSB3aXRoIGh1bnQnc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cmUgd2VlcGluZyBmb3IgeW91ciBjb3VzaW4ncyBkZWF0aD8KICAgIFdoYXQsIHdpbHQgdGhvdSB3YXNoIGhpbSBmcm9tIGhpcyBncmF2ZSB3aXRoIHRlYXJzPwogICAgQW4gaWYgdGhvdSBjb3VsZHN0LCB0aG91IGNvdWxkc3Qgbm90IG1ha2UgaGltIGxpdmU7CiAgICBUaGVyZWZvcmUsIGhhdmUgZG9uZTogc29tZSBncmllZiBzaG93cyBtdWNoIG9mIGxvdmU7CiAgICBCdXQgbXVjaCBvZiBncmllZiBzaG93cyBzdGlsbCBzb21lIHdhbnQgb2Ygd2l0LgoKSlVMSUVUCgogICAgWWV0IGxldCBtZSB3ZWVwIGZvciBzdWNoIGEgZmVlbGluZyBsb3NzLgoKTEFEWSBDQVBVTEVUCgogICAgU28gc2hhbGwgeW91IGZlZWwgdGhlIGxvc3MsIGJ1dCBub3QgdGhlIGZyaWVuZAogICAgV2hpY2ggeW91IHdlZXAgZm9yLgoKSlVMSUVUCgogICAgRmVlbGluZyBzbyB0aGUgbG9zcywKICAgIENhbm5vdCBjaG9vc2UgYnV0IGV2ZXIgd2VlcCB0aGUgZnJpZW5kLgoKTEFEWSBDQVBVTEVUCgogICAgV2VsbCwgZ2lybCwgdGhvdSB3ZWVwJ3N0IG5vdCBzbyBtdWNoIGZvciBoaXMgZGVhdGgsCiAgICBBcyB0aGF0IHRoZSB2aWxsYWluIGxpdmVzIHdoaWNoIHNsYXVnaHRlcidkIGhpbS4KCkpVTElFVAoKICAgIFdoYXQgdmlsbGFpbiBtYWRhbT8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoYXQgc2FtZSB2aWxsYWluLCBSb21lby4KCkpVTElFVAoKICAgIFtBc2lkZV0gVmlsbGFpbiBhbmQgaGUgYmUgbWFueSBtaWxlcyBhc3VuZGVyLi0tCiAgICBHb2QgUGFyZG9uIGhpbSEgSSBkbywgd2l0aCBhbGwgbXkgaGVhcnQ7CiAgICBBbmQgeWV0IG5vIG1hbiBsaWtlIGhlIGRvdGggZ3JpZXZlIG15IGhlYXJ0LgoKTEFEWSBDQVBVTEVUCgogICAgVGhhdCBpcywgYmVjYXVzZSB0aGUgdHJhaXRvciBtdXJkZXJlciBsaXZlcy4KCkpVTElFVAoKICAgIEF5LCBtYWRhbSwgZnJvbSB0aGUgcmVhY2ggb2YgdGhlc2UgbXkgaGFuZHM6CiAgICBXb3VsZCBub25lIGJ1dCBJIG1pZ2h0IHZlbmdlIG15IGNvdXNpbidzIGRlYXRoIQoKTEFEWSBDQVBVTEVUCgogICAgV2Ugd2lsbCBoYXZlIHZlbmdlYW5jZSBmb3IgaXQsIGZlYXIgdGhvdSBub3Q6CiAgICBUaGVuIHdlZXAgbm8gbW9yZS4gSSdsbCBzZW5kIHRvIG9uZSBpbiBNYW50dWEsCiAgICBXaGVyZSB0aGF0IHNhbWUgYmFuaXNoJ2QgcnVuYWdhdGUgZG90aCBsaXZlLAogICAgU2hhbGwgZ2l2ZSBoaW0gc3VjaCBhbiB1bmFjY3VzdG9tJ2QgZHJhbSwKICAgIFRoYXQgaGUgc2hhbGwgc29vbiBrZWVwIFR5YmFsdCBjb21wYW55OgogICAgQW5kIHRoZW4sIEkgaG9wZSwgdGhvdSB3aWx0IGJlIHNhdGlzZmllZC4KCkpVTElFVAoKICAgIEluZGVlZCwgSSBuZXZlciBzaGFsbCBiZSBzYXRpc2ZpZWQKICAgIFdpdGggUm9tZW8sIHRpbGwgSSBiZWhvbGQgaGltLS1kZWFkLS0KICAgIElzIG15IHBvb3IgaGVhcnQgZm9yIGEga2luc21hbiB2ZXgnZC4KICAgIE1hZGFtLCBpZiB5b3UgY291bGQgZmluZCBvdXQgYnV0IGEgbWFuCiAgICBUbyBiZWFyIGEgcG9pc29uLCBJIHdvdWxkIHRlbXBlciBpdDsKICAgIFRoYXQgUm9tZW8gc2hvdWxkLCB1cG9uIHJlY2VpcHQgdGhlcmVvZiwKICAgIFNvb24gc2xlZXAgaW4gcXVpZXQuIE8sIGhvdyBteSBoZWFydCBhYmhvcnMKICAgIFRvIGhlYXIgaGltIG5hbWVkLCBhbmQgY2Fubm90IGNvbWUgdG8gaGltLgogICAgVG8gd3JlYWsgdGhlIGxvdmUgSSBib3JlIG15IGNvdXNpbgogICAgVXBvbiBoaXMgYm9keSB0aGF0IHNsYXVnaHRlcidkIGhpbSEKCkxBRFkgQ0FQVUxFVAoKICAgIEZpbmQgdGhvdSB0aGUgbWVhbnMsIGFuZCBJJ2xsIGZpbmQgc3VjaCBhIG1hbi4KICAgIEJ1dCBub3cgSSdsbCB0ZWxsIHRoZWUgam95ZnVsIHRpZGluZ3MsIGdpcmwuCgpKVUxJRVQKCiAgICBBbmQgam95IGNvbWVzIHdlbGwgaW4gc3VjaCBhIG5lZWR5IHRpbWU6CiAgICBXaGF0IGFyZSB0aGV5LCBJIGJlc2VlY2ggeW91ciBsYWR5c2hpcD8KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHdlbGwsIHRob3UgaGFzdCBhIGNhcmVmdWwgZmF0aGVyLCBjaGlsZDsKICAgIE9uZSB3aG8sIHRvIHB1dCB0aGVlIGZyb20gdGh5IGhlYXZpbmVzcywKICAgIEhhdGggc29ydGVkIG91dCBhIHN1ZGRlbiBkYXkgb2Ygam95LAogICAgVGhhdCB0aG91IGV4cGVjdCdzdCBub3Qgbm9yIEkgbG9vaydkIG5vdCBmb3IuCgpKVUxJRVQKCiAgICBNYWRhbSwgaW4gaGFwcHkgdGltZSwgd2hhdCBkYXkgaXMgdGhhdD8KCkxBRFkgQ0FQVUxFVAoKICAgIE1hcnJ5LCBteSBjaGlsZCwgZWFybHkgbmV4dCBUaHVyc2RheSBtb3JuLAogICAgVGhlIGdhbGxhbnQsIHlvdW5nIGFuZCBub2JsZSBnZW50bGVtYW4sCiAgICBUaGUgQ291bnR5IFBhcmlzLCBhdCBTYWludCBQZXRlcidzIENodXJjaCwKICAgIFNoYWxsIGhhcHBpbHkgbWFrZSB0aGVlIHRoZXJlIGEgam95ZnVsIGJyaWRlLgoKSlVMSUVUCgogICAgTm93LCBieSBTYWludCBQZXRlcidzIENodXJjaCBhbmQgUGV0ZXIgdG9vLAogICAgSGUgc2hhbGwgbm90IG1ha2UgbWUgdGhlcmUgYSBqb3lmdWwgYnJpZGUuCiAgICBJIHdvbmRlciBhdCB0aGlzIGhhc3RlOyB0aGF0IEkgbXVzdCB3ZWQKICAgIEVyZSBoZSwgdGhhdCBzaG91bGQgYmUgaHVzYmFuZCwgY29tZXMgdG8gd29vLgogICAgSSBwcmF5IHlvdSwgdGVsbCBteSBsb3JkIGFuZCBmYXRoZXIsIG1hZGFtLAogICAgSSB3aWxsIG5vdCBtYXJyeSB5ZXQ7IGFuZCwgd2hlbiBJIGRvLCBJIHN3ZWFyLAogICAgSXQgc2hhbGwgYmUgUm9tZW8sIHdob20geW91IGtub3cgSSBoYXRlLAogICAgUmF0aGVyIHRoYW4gUGFyaXMuIFRoZXNlIGFyZSBuZXdzIGluZGVlZCEKCkxBRFkgQ0FQVUxFVAoKICAgIEhlcmUgY29tZXMgeW91ciBmYXRoZXI7IHRlbGwgaGltIHNvIHlvdXJzZWxmLAogICAgQW5kIHNlZSBob3cgaGUgd2lsbCB0YWtlIGl0IGF0IHlvdXIgaGFuZHMuCgogICAgRW50ZXIgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBXaGVuIHRoZSBzdW4gc2V0cywgdGhlIGFpciBkb3RoIGRyaXp6bGUgZGV3OwogICAgQnV0IGZvciB0aGUgc3Vuc2V0IG9mIG15IGJyb3RoZXIncyBzb24KICAgIEl0IHJhaW5zIGRvd25yaWdodC4KICAgIEhvdyBub3chIGEgY29uZHVpdCwgZ2lybD8gd2hhdCwgc3RpbGwgaW4gdGVhcnMCiAgICBFdmVybW9yZSBzaG93ZXJpbmcIEluIG9uZSBsaXR0bGUgYm9keQogICAgVGhvdSBjb3VudGVyZmVpdCdzdCBhIGJhcmssIGEgc2VhLCBhIHdpbmQ7CiAgICBGb3Igc3RpbGwgdGh5IGV5ZXMsIHdoaWNoIEkgbWF5IGNhbGwgdGhlIHNlYSwKICAgIERvIGViYiBhbmQgZmxvdyB3aXRoIHRlYXJzOyB0aGUgYmFyayB0aHkgYm9keSBpcywKICAgIFNhaWxpbmcgaW4gdGhpcyBzYWx0IGZsb29kOyB0aGUgd2luZHMsIHRoeSBzaWdoczsKICAgIFdobywgcmFnaW5nIHdpdGggdGh5IHRlYXJzLCBhbmQgdGhleSB3aXRoIHRoZW0sCiAgICBXaXRob3V0IGEgc3VkZGVuIGNhbG0sIHdpbGwgb3ZlcnNldAogICAgVGh5IHRlbXBlc3QtdG9zc2VkIGJvZHkuIEhvdyBub3csIHdpZmUhCiAgICBIYXZlIHlvdSBkZWxpdmVyJ2QgdG8gaGVyIG91ciBkZWNyZWUCgpMQURZIENBUFVMRVQKCiAgICBBeSwgc2lyOyBidXQgc2hlIHdpbGwgbm9uZSwgc2hlIGdpdmVzIHlvdSB0aGFua3MuCiAgICBJIHdvdWxkIHRoZSBmb29sIHdlcmUgbWFycmllZCB0byBoZXIgZ3JhdmUhCgpDQVBVTEVUCgogICAgU29mdCEgdGFrZSBtZSB3aXRoIHlvdSwgdGFrZSBtZSB3aXRoIHlvdSwgd2lmZS4KICAgIEhvdyEgd2lsbCBzaGUgbm9uZT8gZG90aCBzaGUgbm90IGdpdmUgdXMgdGhhbmtzPwogICAgSXMgc2hlIG5vdCBwcm91ZD8gZG90aCBzaGUgbm90IGNvdW50IGhlciBibGVzdCwKICAgIFVud29ydGh5IGFzIHNoZSBpcywgdGhhdCB3ZSBoYXZlIHdyb3VnaHQKICAgIFNvIHdvcnRoeSBhIGdlbnRsZW1hbiB0byBiZSBoZXIgYnJpZGVncm9vbT8KCkpVTElFVAoKICAgIE5vdCBwcm91ZCwgeW91IGhhdmU7IGJ1dCB0aGFua2Z1bCwgdGhhdCB5b3UgaGF2ZToKICAgIFByb3VkIGNhbiBJIG5ldmVyIGJlIG9mIHdoYXQgSSBoYXRlOwogICAgQnV0IHRoYW5rZnVsIGV2ZW4gZm9yIGhhdGUsIHRoYXQgaXMgbWVhbnQgbG92ZS4KCkNBUFVMRVQKCiAgICBIb3cgbm93LCBob3cgbm93LCBjaG9wLWxvZ2ljISBXaGF0IGlzIHRoaXMCiAgICAnUHJvdWQsJyBhbmQgJ0kgdGhhbmsgeW91LCcgYW5kICdJIHRoYW5rIHlvdSBub3Q7JwogICAgQW5kIHlldCAnbm90IHByb3VkLCcgbWlzdHJlc3MgbWluaW9uLCB5b3UsCiAgICBUaGFuayBtZSBubyB0aGFua2luZ3MsIG5vciwgcHJvdWQgbWUgbm8gcHJvdWRzLAogICAgQnV0IGZldHRsZSB5b3VyIGZpbmUgam9pbnRzICdnYWluc3QgVGh1cnNkYXkgbmV4dCwKICAgIFRvIGdvIHdpdGggUGFyaXMgdG8gU2FpbnQgUGV0ZXIncyBDaHVyY2gsCiAgICBPciBJIHdpbGwgZHJhZyB0aGVlIG9uIGEgaHVyZGxlIHRoaXRoZXIuCiAgICBPdXQsIHlvdSBncmVlbi1zaWNrbmVzcyBjYXJyaW9uISBvdXQsIHlvdSBiYWdnYWdlIQogICAgWW91IHRhbGxvdy1mYWNlIQoKTEFEWSBDQVBVTEVUCgogICAgRmllLCBmaWUhIHdoYXQsIGFyZSB5b3UgbWFkPwoKSlVMSUVUCgogICAgR29vZCBmYXRoZXIsIEkgYmVzZWVjaCB5b3Ugb24gbXkga25lZXMsCiAgICBIZWFyIG1lIHdpdGggcGF0aWVuY2UgYnV0IHRvIHNwZWFrIGEgd29yZC4KCkNBUFVMRVQKCiAgICBIYW5nIHRoZWUsIHlvdW5nIGJhZ2dhZ2UhIGRpc29iZWRpZW50IHdyZXRjaCEKICAgIEkgdGVsbCB0aGVlIHdoYXQ6IGdldCB0aGVlIHRvIGNodXJjaCBvJyBUaHVyc2RheSwKICAgIE9yIG5ldmVyIGFmdGVyIGxvb2sgbWUgaW4gdGhlIGZhY2U6CiAgICBTcGVhayBub3QsIHJlcGx5IG5vdCwgZG8gbm90IGFuc3dlciBtZTsKICAgIE15IGZpbmdlcnMgaXRjaC4gV2lmZSwgd2Ugc2NhcmNlIHRob3VnaHQgdXMgYmxlc3QKICAgIFRoYXQgR29kIGhhZCBsZW50IHVzIGJ1dCB0aGlzIG9ubHkgY2hpbGQ7CiAgICBCdXQgbm93IEkgc2VlIHRoaXMgb25lIGlzIG9uZSB0b28gbXVjaCwKICAgIEFuZCB0aGF0IHdlIGhhdmUgYSBjdXJzZSBpbiBoYXZpbmcgaGVyOgogICAgT3V0IG9uIGhlciwgaGlsZGluZyEKCk51cnNlCgogICAgR29kIGluIGhlYXZlbiBibGVzcyBoZXIhCiAgICBZb3UgYXJlIHRvIGJsYW1lLCBteSBsb3JkLCB0byByYXRlIGhlciBzby4KCkNBUFVMRVQKCiAgICBBbmQgd2h5LCBteSBsYWR5IHdpc2RvbT8gaG9sZCB5b3VyIHRvbmd1ZSwKICAgIEdvb2QgcHJ1ZGVuY2U7IHNtYXR0ZXIgd2l0aCB5b3VyIGdvc3NpcHMsIGdvLgoKTnVyc2UKCiAgICBJIHNwZWFrIG5vIHRyZWFzb24uCgpDQVBVTEVUCgogICAgTywgR29kIHllIGdvZC1kZW4uCgpOdXJzZQoKICAgIE1heSBub3Qgb25lIHNwZWFrPwoKQ0FQVUxFVAoKICAgIFBlYWNlLCB5b3UgbXVtYmxpbmcgZm9vbCEKICAgIFV0dGVyIHlvdXIgZ3Jhdml0eSBvJ2VyIGEgZ29zc2lwJ3MgYm93bDsKICAgIEZvciBoZXJlIHdlIG5lZWQgaXQgbm90LgoKTEFEWSBDQVBVTEVUCgogICAgWW91IGFyZSB0b28gaG90LgoKQ0FQVUxFVAoKICAgIEdvZCdzIGJyZWFkISBpdCBtYWtlcyBtZSBtYWQ6CiAgICBEYXksIG5pZ2h0LCBob3VyLCB0aWRlLCB0aW1lLCB3b3JrLCBwbGF5LAogICAgQWxvbmUsIGluIGNvbXBhbnksIHN0aWxsIG15IGNhcmUgaGF0aCBiZWVuCiAgICBUbyBoYXZlIGhlciBtYXRjaCdkOiBhbmQgaGF2aW5nIG5vdyBwcm92aWRlZAogICAgQSBnZW50bGVtYW4gb2Ygbm9ibGUgcGFyZW50YWdlLAogICAgT2YgZmFpciBkZW1lc25lcywgeW91dGhmdWwsIGFuZCBub2JseSB0cmFpbidkLAogICAgU3R1ZmYnZCwgYXMgdGhleSBzYXksIHdpdGggaG9ub3VyYWJsZSBwYXJ0cywKICAgIFByb3BvcnRpb24nZCBhcyBvbmUncyB0aG91Z2h0IHdvdWxkIHdpc2ggYSBtYW47CiAgICBBbmQgdGhlbiB0byBoYXZlIGEgd3JldGNoZWQgcHVsaW5nIGZvb2wsCiAgICBBIHdoaW5pbmcgbWFtbWV0LCBpbiBoZXIgZm9ydHVuZSdzIHRlbmRlciwKICAgIFRvIGFuc3dlciAnSSdsbCBub3Qgd2VkOyBJIGNhbm5vdCBsb3ZlLAogICAgSSBhbSB0b28geW91bmc7IEkgcHJheSB5b3UsIHBhcmRvbiBtZS4nCiAgICBCdXQsIGFzIHlvdSB3aWxsIG5vdCB3ZWQsIEknbGwgcGFyZG9uIHlvdToKICAgIEdyYXplIHdoZXJlIHlvdSB3aWxsIHlvdSBzaGFsbCBub3QgaG91c2Ugd2l0aCBtZToKICAgIExvb2sgdG8ndCwgdGhpbmsgb24ndCwgSSBkbyBub3QgdXNlIHRvIGplc3QuCiAgICBUaHVyc2RheSBpcyBuZWFyOyBsYXkgaGFuZCBvbiBoZWFydCwgYWR2aXNlOgogICAgQW4geW91IGJlIG1pbmUsIEknbGwgZ2l2ZSB5b3UgdG8gbXkgZnJpZW5kOwogICAgQW5kIHlvdSBiZSBub3QsIGhhbmcsIGJlZywgc3RhcnZlLCBkaWUgaW4KICAgIHRoZSBzdHJlZXRzLAogICAgRm9yLCBieSBteSBzb3VsLCBJJ2xsIG5lJ2VyIGFja25vd2xlZGdlIHRoZWUsCiAgICBOb3Igd2hhdCBpcyBtaW5lIHNoYWxsIG5ldmVyIGRvIHRoZWUgZ29vZDoKICAgIFRydXN0IHRvJ3QsIGJldGhpbmsgeW91OyBJJ2xsIG5vdCBiZSBmb3Jzd29ybi4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBJcyB0aGVyZSBubyBwaXR5IHNpdHRpbmcgaW4gdGhlIGNsb3VkcywKICAgIFRoYXQgc2VlcyBpbnRvIHRoZSBib3R0b20gb2YgbXkgZ3JpZWYCiAgICBPLCBzd2VldCBteSBtb3RoZXIsIGNhc3QgbWUgbm90IGF3YXkhCiAgICBEZWxheSB0aGlzIG1hcnJpYWdlIGZvciBhIG1vbnRoLCBhIHdlZWs7CiAgICBPciwgaWYgeW91IGRvIG5vdCwgbWFrZSB0aGUgYnJpZGFsIGJlZAogICAgSW4gdGhhdCBkaW0gbW9udW1lbnQgd2hlcmUgVHliYWx0IGxpZXMuCgpMQURZIENBUFVMRVQKCiAgICBUYWxrIG5vdCB0byBtZSwgZm9yIEknbGwgbm90IHNwZWFrIGEgd29yZDoKICAgIERvIGFzIHRob3Ugd2lsdCwgZm9yIEkgaGF2ZSBkb25lIHdpdGggdGhlZS4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIEdvZCEtLU8gbnVyc2UsIGhvdyBzaGFsbCB0aGlzIGJlIHByZXZlbnRlZD8KICAgIE15IGh1c2JhbmQgaXMgb24gZWFydGgsIG15IGZhaXRoIGluIGhlYXZlbjsKICAgIEhvdyBzaGFsbCB0aGF0IGZhaXRoIHJldHVybiBhZ2FpbiB0byBlYXJ0aCwKICAgIFVubGVzcyB0aGF0IGh1c2JhbmQgc2VuZCBpdCBtZSBmcm9tIGhlYXZlbgogICAgQnkgbGVhdmluZyBlYXJ0aD8gY29tZm9ydCBtZSwgY291bnNlbCBtZS4KICAgIEFsYWNrLCBhbGFjaywgdGhhdCBoZWF2ZW4gc2hvdWxkIHByYWN0aXNlIHN0cmF0YWdlbXMKICAgIFVwb24gc28gc29mdCBhIHN1YmplY3QgYXMgbXlzZWxmIQogICAgV2hhdCBzYXknc3QgdGhvdT8gaGFzdCB0aG91IG5vdCBhIHdvcmQgb2Ygam95PwogICAgU29tZSBjb21mb3J0LCBudXJzZS4KCk51cnNlCgogICAgRmFpdGgsIGhlcmUgaXQgaXMuCiAgICBSb21lbyBpcyBiYW5pc2gnZDsgYW5kIGFsbCB0aGUgd29ybGQgdG8gbm90aGluZywKICAgIFRoYXQgaGUgZGFyZXMgbmUnZXIgY29tZSBiYWNrIHRvIGNoYWxsZW5nZSB5b3U7CiAgICBPciwgaWYgaGUgZG8sIGl0IG5lZWRzIG11c3QgYmUgYnkgc3RlYWx0aC4KICAgIFRoZW4sIHNpbmNlIHRoZSBjYXNlIHNvIHN0YW5kcyBhcyBub3cgaXQgZG90aCwKICAgIEkgdGhpbmsgaXQgYmVzdCB5b3UgbWFycmllZCB3aXRoIHRoZSBjb3VudHkuCiAgICBPLCBoZSdzIGEgbG92ZWx5IGdlbnRsZW1hbiEKICAgIFJvbWVvJ3MgYSBkaXNoY2xvdXQgdG8gaGltOiBhbiBlYWdsZSwgbWFkYW0sCiAgICBIYXRoIG5vdCBzbyBncmVlbiwgc28gcXVpY2ssIHNvIGZhaXIgYW4gZXllCiAgICBBcyBQYXJpcyBoYXRoLiBCZXNocmV3IG15IHZlcnkgaGVhcnQsCiAgICBJIHRoaW5rIHlvdSBhcmUgaGFwcHkgaW4gdGhpcyBzZWNvbmQgbWF0Y2gsCiAgICBGb3IgaXQgZXhjZWxzIHlvdXIgZmlyc3Q6IG9yIGlmIGl0IGRpZCBub3QsCiAgICBZb3VyIGZpcnN0IGlzIGRlYWQ7IG9yICd0d2VyZSBhcyBnb29kIGhlIHdlcmUsCiAgICBBcyBsaXZpbmcgaGVyZSBhbmQgeW91IG5vIHVzZSBvZiBoaW0uCgpKVUxJRVQKCiAgICBTcGVha2VzdCB0aG91IGZyb20gdGh5IGhlYXJ0PwoKTnVyc2UKCiAgICBBbmQgZnJvbSBteSBzb3VsIHRvbzsKICAgIE9yIGVsc2UgYmVzaHJldyB0aGVtIGJvdGguCgpKVUxJRVQKCiAgICBBbWVuIQoKTnVyc2UKCiAgICBXaGF0PwoKSlVMSUVUCgogICAgV2VsbCwgdGhvdSBoYXN0IGNvbWZvcnRlZCBtZSBtYXJ2ZWxsb3VzIG11Y2guCiAgICBHbyBpbjogYW5kIHRlbGwgbXkgbGFkeSBJIGFtIGdvbmUsCiAgICBIYXZpbmcgZGlzcGxlYXNlZCBteSBmYXRoZXIsIHRvIExhdXJlbmNlJyBjZWxsLAogICAgVG8gbWFrZSBjb25mZXNzaW9uIGFuZCB0byBiZSBhYnNvbHZlZC4KCk51cnNlCgogICAgTWFycnksIEkgd2lsbDsgYW5kIHRoaXMgaXMgd2lzZWx5IGRvbmUuCgogICAgRXhpdAoKSlVMSUVUCgogICAgQW5jaWVudCBkYW1uYXRpb24hIE8gbW9zdCB3aWNrZWQgZmllbmQhCiAgICBJcyBpdCBtb3JlIHNpbiB0byB3aXNoIG1lIHRodXMgZm9yc3dvcm4sCiAgICBPciB0byBkaXNwcmFpc2UgbXkgbG9yZCB3aXRoIHRoYXQgc2FtZSB0b25ndWUKICAgIFdoaWNoIHNoZSBoYXRoIHByYWlzZWQgaGltIHdpdGggYWJvdmUgY29tcGFyZQogICAgU28gbWFueSB0aG91c2FuZCB0aW1lcz8gR28sIGNvdW5zZWxsb3I7CiAgICBUaG91IGFuZCBteSBib3NvbSBoZW5jZWZvcnRoIHNoYWxsIGJlIHR3YWluLgogICAgSSdsbCB0byB0aGUgZnJpYXIsIHRvIGtub3cgaGlzIHJlbWVkeToKICAgIElmIGFsbCBlbHNlIGZhaWwsIG15c2VsZiBoYXZlIHBvd2VyIHRvIGRpZS4KCiAgICBFeGl0CgpBQ1QgSVYKU0NFTkUgSS4gRnJpYXIgTGF1cmVuY2UncyBjZWxsLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUyAKCkZSSUFSIExBVVJFTkNFCgogICAgT24gVGh1cnNkYXksIHNpcj8gdGhlIHRpbWUgaXMgdmVyeSBzaG9ydC4KClBBUklTCgogICAgTXkgZmF0aGVyIENhcHVsZXQgd2lsbCBoYXZlIGl0IHNvOwogICAgQW5kIEkgYW0gbm90aGluZyBzbG93IHRvIHNsYWNrIGhpcyBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgWW91IHNheSB5b3UgZG8gbm90IGtub3cgdGhlIGxhZHkncyBtaW5kOgogICAgVW5ldmVuIGlzIHRoZSBjb3Vyc2UsIEkgbGlrZSBpdCBub3QuCgpQQVJJUwoKICAgIEltbW9kZXJhdGVseSBzaGUgd2VlcHMgZm9yIFR5YmFsdCdzIGRlYXRoLAogICAgQW5kIHRoZXJlZm9yZSBoYXZlIEkgbGl0dGxlIHRhbGsnZCBvZiBsb3ZlOwogICAgRm9yIFZlbnVzIHNtaWxlcyBub3QgaW4gYSBob3VzZSBvZiB0ZWFycy4KICAgIE5vdywgc2lyLCBoZXIgZmF0aGVyIGNvdW50cyBpdCBkYW5nZXJvdXMKICAgIFRoYXQgc2hlIGRvdGggZ2l2ZSBoZXIgc29ycm93IHNvIG11Y2ggc3dheSwKICAgIEFuZCBpbiBoaXMgd2lzZG9tIGhhc3RlcyBvdXIgbWFycmlhZ2UsCiAgICBUbyBzdG9wIHRoZSBpbnVuZGF0aW9uIG9mIGhlciB0ZWFyczsKICAgIFdoaWNoLCB0b28gbXVjaCBtaW5kZWQgYnkgaGVyc2VsZiBhbG9uZSwKICAgIE1heSBiZSBwdXQgZnJvbSBoZXIgYnkgc29jaWV0eToKICAgIE5vdyBkbyB5b3Uga25vdyB0aGUgcmVhc29uIG9mIHRoaXMgaGFzdGUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFtBc2lkZV0gSSB3b3VsZCBJIGtuZXcgbm90IHdoeSBpdCBzaG91bGQgYmUgc2xvdydkLgogICAgTG9vaywgc2lyLCBoZXJlIGNvbWVzIHRoZSBsYWR5IHRvd2FyZHMgbXkgY2VsbC4KCiAgICBFbnRlciBKVUxJRVQKClBBUklTCgogICAgSGFwcGlseSBtZXQsIG15IGxhZHkgYW5kIG15IHdpZmUhCgpKVUxJRVQKCiAgICBUaGF0IG1heSBiZSwgc2lyLCB3aGVuIEkgbWF5IGJlIGEgd2lmZS4KClBBUklTCgogICAgVGhhdCBtYXkgYmUgbXVzdCBiZSwgbG92ZSwgb24gVGh1cnNkYXkgbmV4dC4KCkpVTElFVAoKICAgIFdoYXQgbXVzdCBiZSBzaGFsbCBiZS4KCkZSSUFSIExBVVJFTkNFCgogICAgVGhhdCdzIGEgY2VydGFpbiB0ZXh0LgoKUEFSSVMKCiAgICBDb21lIHlvdSB0byBtYWtlIGNvbmZlc3Npb24gdG8gdGhpcyBmYXRoZXICgpKVUxJRVQKCiAgICBUbyBhbnN3ZXIgdGhhdCwgSSBzaG91bGQgY29uZmVzcyB0byB5b3UuCgpQQVJJUwoKICAgIERvIG5vdCBkZW55IHRvIGhpbSB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSSB3aWxsIGNvbmZlc3MgdG8geW91IHRoYXQgSSBsb3ZlIGhpbS4KClBBUklTCgogICAgU28gd2lsbCB5ZSwgSSBhbSBzdXJlLCB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSWYgSSBkbyBzbywgaXQgd2lsbCBiZSBvZiBtb3JlIHByaWNlLAogICAgQmVpbmcgc3Bva2UgYmVoaW5kIHlvdXIgYmFjaywgdGhhbiB0byB5b3VyIGZhY2UuCgpQQVJJUwoKICAgIFBvb3Igc291bCwgdGh5IGZhY2UgaXMgbXVjaCBhYnVzZWQgd2l0aCB0ZWFycy4KCkpVTElFVAoKICAgIFRoZSB0ZWFycyBoYXZlIGdvdCBzbWFsbCB2aWN0b3J5IGJ5IHRoYXQ7CiAgICBGb3IgaXQgd2FzIGJhZCBlbm91Z2ggYmVmb3JlIHRoZWlyIHNwaXRlLgoKUEFSSVMKCiAgICBUaG91IHdyb25nJ3N0IGl0LCBtb3JlIHRoYW4gdGVhcnMsIHdpdGggdGhhdCByZXBvcnQuCgpKVUxJRVQKCiAgICBUaGF0IGlzIG5vIHNsYW5kZXIsIHNpciwgd2hpY2ggaXMgYSB0cnV0aDsKICAgIEFuZCB3aGF0IEkgc3Bha2UsIEkgc3Bha2UgaXQgdG8gbXkgZmFjZS4KClBBUklTCgogICAgVGh5IGZhY2UgaXMgbWluZSwgYW5kIHRob3UgaGFzdCBzbGFuZGVyJ2QgaXQuCgpKVUxJRVQKCiAgICBJdCBtYXkgYmUgc28sIGZvciBpdCBpcyBub3QgbWluZSBvd24uCiAgICBBcmUgeW91IGF0IGxlaXN1cmUsIGhvbHkgZmF0aGVyLCBub3c7CiAgICBPciBzaGFsbCBJIGNvbWUgdG8geW91IGF0IGV2ZW5pbmcgbWFzcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTXkgbGVpc3VyZSBzZXJ2ZXMgbWUsIHBlbnNpdmUgZGF1Z2h0ZXIsIG5vdy4KICAgIE15IGxvcmQsIHdlIG11c3QgZW50cmVhdCB0aGUgdGltZSBhbG9uZS4KClBBUklTCgogICAgR29kIHNoaWVsZCBJIHNob3VsZCBkaXN0dXJiIGRldm90aW9uIQogICAgSnVsaWV0LCBvbiBUaHVyc2RheSBlYXJseSB3aWxsIEkgcm91c2UgeWU6CiAgICBUaWxsIHRoZW4sIGFkaWV1OyBhbmQga2VlcCB0aGlzIGhvbHkga2lzcy4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIHNodXQgdGhlIGRvb3IhIGFuZCB3aGVuIHRob3UgaGFzdCBkb25lIHNvLAogICAgQ29tZSB3ZWVwIHdpdGggbWU7IHBhc3QgaG9wZSwgcGFzdCBjdXJlLCBwYXN0IGhlbHAhCgpGUklBUiBMQVVSRU5DRQoKICAgIEFoLCBKdWxpZXQsIEkgYWxyZWFkeSBrbm93IHRoeSBncmllZjsKICAgIEl0IHN0cmFpbnMgbWUgcGFzdCB0aGUgY29tcGFzcyBvZiBteSB3aXRzOgogICAgSSBoZWFyIHRob3UgbXVzdCwgYW5kIG5vdGhpbmcgbWF5IHByb3JvZ3VlIGl0LAogICAgT24gVGh1cnNkYXkgbmV4dCBiZSBtYXJyaWVkIHRvIHRoaXMgY291bnR5LgoKSlVMSUVUCgogICAgVGVsbCBtZSBub3QsIGZyaWFyLCB0aGF0IHRob3UgaGVhcidzdCBvZiB0aGlzLAogICAgVW5sZXNzIHRob3UgdGVsbCBtZSBob3cgSSBtYXkgcHJldmVudCBpdDoKICAgIElmLCBpbiB0aHkgd2lzZG9tLCB0aG91IGNhbnN0IGdpdmUgbm8gaGVscCwKICAgIERvIHRob3UgYnV0IGNhbGwgbXkgcmVzb2x1dGlvbiB3aXNlLAogICAgQW5kIHdpdGggdGhpcyBrbmlmZSBJJ2xsIGhlbHAgaXQgcHJlc2VudGx5LgogICAgR29kIGpvaW4nZCBteSBoZWFydCBhbmQgUm9tZW8ncywgdGhvdSBvdXIgaGFuZHM7CiAgICBBbmQgZXJlIHRoaXMgaGFuZCwgYnkgdGhlZSB0byBSb21lbyBzZWFsJ2QsCiAgICBTaGFsbCBiZSB0aGUgbGFiZWwgdG8gYW5vdGhlciBkZWVkLAogICAgT3IgbXkgdHJ1ZSBoZWFydCB3aXRoIHRyZWFjaGVyb3VzIHJldm9sdAogICAgVHVybiB0byBhbm90aGVyLCB0aGlzIHNoYWxsIHNsYXkgdGhlbSBib3RoOgogICAgVGhlcmVmb3JlLCBvdXQgb2YgdGh5IGxvbmctZXhwZXJpZW5jZWQgdGltZSwKICAgIEdpdmUgbWUgc29tZSBwcmVzZW50IGNvdW5zZWwsIG9yLCBiZWhvbGQsCiAgICAnVHdpeHQgbXkgZXh0cmVtZXMgYW5kIG1lIHRoaXMgYmxvb2R5IGtuaWZlCiAgICBTaGFsbCBwbGF5IHRoZSB1bXBpcmUsIGFyYml0cmF0aW5nIHRoYXQKICAgIFdoaWNoIHRoZSBjb21taXNzaW9uIG9mIHRoeSB5ZWFycyBhbmQgYXJ0CiAgICBDb3VsZCB0byBubyBpc3N1ZSBvZiB0cnVlIGhvbm91ciBicmluZy4KICAgIEJlIG5vdCBzbyBsb25nIHRvIHNwZWFrOyBJIGxvbmcgdG8gZGllLAogICAgSWYgd2hhdCB0aG91IHNwZWFrJ3N0IHNwZWFrIG5vdCBvZiByZW1lZHkuCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvbGQsIGRhdWdodGVyOiBJIGRvIHNweSBhIGtpbmQgb2YgaG9wZSwKICAgIFdoaWNoIGNyYXZlcyBhcyBkZXNwZXJhdGUgYW4gZXhlY3V0aW9uLgogICAgQXMgdGhhdCBpcyBkZXNwZXJhdGUgd2hpY2ggd2Ugd291bGQgcHJldmVudC4KICAgIElmLCByYXRoZXIgdGhhbiB0byBtYXJyeSBDb3VudHkgUGFyaXMsCiAgICBUaG91IGhhc3QgdGhlIHN0cmVuZ3RoIG9mIHdpbGwgdG8gc2xheSB0aHlzZWxmLAogICAgVGhlbiBpcyBpdCBsaWtlbHkgdGhvdSB3aWx0IHVuZGVydGFrZQogICAgQSB0aGluZyBsaWtlIGRlYXRoIHRvIGNoaWRlIGF3YXkgdGhpcyBzaGFtZSwKICAgIFRoYXQgY29wZXN0IHdpdGggZGVhdGggaGltc2VsZiB0byBzY2FwZSBmcm9tIGl0OgogICAgQW5kLCBpZiB0aG91IGRhcmVzdCwgSSdsbCBnaXZlIHRoZWUgcmVtZWR5LgoKSlVMSUVUCgogICAgTywgYmlkIG1lIGxlYXAsIHJhdGhlciB0aGFuIG1hcnJ5IFBhcmlzLAogICAgRnJvbSBvZmYgdGhlIGJhdHRsZW1lbnRzIG9mIHlvbmRlciB0b3dlcjsKICAgIE9yIHdhbGsgaW4gdGhpZXZpc2ggd2F5czsgb3IgYmlkIG1lIGx1cmsKICAgIFdoZXJlIHNlcnBlbnRzIGFyZTsgY2hhaW4gbWUgd2l0aCByb2FyaW5nIGJlYXJzOwogICAgT3Igc2h1dCBtZSBuaWdodGx5IGluIGEgY2hhcm5lbC1ob3VzZSwKICAgIE8nZXItY292ZXInZCBxdWl0ZSB3aXRoIGRlYWQgbWVuJ3MgcmF0dGxpbmcgYm9uZXMsCiAgICBXaXRoIHJlZWt5IHNoYW5rcyBhbmQgeWVsbG93IGNoYXBsZXNzIHNrdWxsczsKICAgIE9yIGJpZCBtZSBnbyBpbnRvIGEgbmV3LW1hZGUgZ3JhdmUKICAgIEFuZCBoaWRlIG1lIHdpdGggYSBkZWFkIG1hbiBpbiBoaXMgc2hyb3VkOwogICAgVGhpbmdzIHRoYXQsIHRvIGhlYXIgdGhlbSB0b2xkLCBoYXZlIG1hZGUgbWUgdHJlbWJsZTsKICAgIEFuZCBJIHdpbGwgZG8gaXQgd2l0aG91dCBmZWFyIG9yIGRvdWJ0LAogICAgVG8gbGl2ZSBhbiB1bnN0YWluJ2Qgd2lmZSB0byBteSBzd2VldCBsb3ZlLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIb2xkLCB0aGVuOyBnbyBob21lLCBiZSBtZXJyeSwgZ2l2ZSBjb25zZW50CiAgICBUbyBtYXJyeSBQYXJpczogV2VkbmVzZGF5IGlzIHRvLW1vcnJvdzoKICAgIFRvLW1vcnJvdyBuaWdodCBsb29rIHRoYXQgdGhvdSBsaWUgYWxvbmU7CiAgICBMZXQgbm90IHRoeSBudXJzZSBsaWUgd2l0aCB0aGVlIGluIHRoeSBjaGFtYmVyOgogICAgVGFrZSB0aG91IHRoaXMgdmlhbCwgYmVpbmcgdGhlbiBpbiBiZWQsCiAgICBBbmQgdGhpcyBkaXN0aWxsZWQgbGlxdW9yIGRyaW5rIHRob3Ugb2ZmOwogICAgV2hlbiBwcmVzZW50bHkgdGhyb3VnaCBhbGwgdGh5IHZlaW5zIHNoYWxsIHJ1bgogICAgQSBjb2xkIGFuZCBkcm93c3kgaHVtb3VyLCBmb3Igbm8gcHVsc2UKICAgIFNoYWxsIGtlZXAgaGlzIG5hdGl2ZSBwcm9ncmVzcywgYnV0IHN1cmNlYXNlOgogICAgTm8gd2FybXRoLCBubyBicmVhdGgsIHNoYWxsIHRlc3RpZnkgdGhvdSBsaXZlc3Q7CiAgICBUaGUgcm9zZXMgaW4gdGh5IGxpcHMgYW5kIGNoZWVrcyBzaGFsbCBmYWRlCiAgICBUbyBwYWx5IGFzaGVzLCB0aHkgZXllcycgd2luZG93cyBmYWxsLAogICAgTGlrZSBkZWF0aCwgd2hlbiBoZSBzaHV0cyB1cCB0aGUgZGF5IG9mIGxpZmU7CiAgICBFYWNoIHBhcnQsIGRlcHJpdmVkIG9mIHN1cHBsZSBnb3Zlcm5tZW50LAogICAgU2hhbGwsIHN0aWZmIGFuZCBzdGFyayBhbmQgY29sZCwgYXBwZWFyIGxpa2UgZGVhdGg6CiAgICBBbmQgaW4gdGhpcyBib3Jyb3cnZCBsaWtlbmVzcyBvZiBzaHJ1bmsgZGVhdGgKICAgIFRob3Ugc2hhbHQgY29udGludWUgdHdvIGFuZCBmb3J0eSBob3VycywKICAgIEFuZCB0aGVuIGF3YWtlIGFzIGZyb20gYSBwbGVhc2FudCBzbGVlcC4KICAgIE5vdywgd2hlbiB0aGUgYnJpZGVncm9vbSBpbiB0aGUgbW9ybmluZyBjb21lcwogICAgVG8gcm91c2UgdGhlZSBmcm9tIHRoeSBiZWQsIHRoZXJlIGFydCB0aG91IGRlYWQ6CiAgICBUaGVuLCBhcyB0aGUgbWFubmVyIG9mIG91ciBjb3VudHJ5IGlzLAogICAgSW4gdGh5IGJlc3Qgcm9iZXMgdW5jb3ZlcidkIG9uIHRoZSBiaWVyCiAgICBUaG91IHNoYWx0IGJlIGJvcm5lIHRvIHRoYXQgc2FtZSBhbmNpZW50IHZhdWx0CiAgICBXaGVyZSBhbGwgdGhlIGtpbmRyZWQgb2YgdGhlIENhcHVsZXRzIGxpZS4KICAgIEluIHRoZSBtZWFuIHRpbWUsIGFnYWluc3QgdGhvdSBzaGFsdCBhd2FrZSwKICAgIFNoYWxsIFJvbWVvIGJ5IG15IGxldHRlcnMga25vdyBvdXIgZHJpZnQsCiAgICBBbmQgaGl0aGVyIHNoYWxsIGhlIGNvbWU6IGFuZCBoZSBhbmQgSQogICAgV2lsbCB3YXRjaCB0aHkgd2FraW5nLCBhbmQgdGhhdCB2ZXJ5IG5pZ2h0CiAgICBTaGFsbCBSb21lbyBiZWFyIHRoZWUgaGVuY2UgdG8gTWFudHVhLgogICAgQW5kIHRoaXMgc2hhbGwgZnJlZSB0aGVlIGZyb20gdGhpcyBwcmVzZW50IHNoYW1lOwogICAgSWYgbm8gaW5jb25zdGFudCB0b3ksIG5vciB3b21hbmlzaCBmZWFyLAogICAgQWJhdGUgdGh5IHZhbG91ciBpbiB0aGUgYWN0aW5nIGl0LgoKSlVMSUVUCgogICAgR2l2ZSBtZSwgZ2l2ZSBtZSEgTywgdGVsbCBub3QgbWUgb2YgZmVhciEKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZDsgZ2V0IHlvdSBnb25lLCBiZSBzdHJvbmcgYW5kIHByb3NwZXJvdXMKICAgIEluIHRoaXMgcmVzb2x2ZTogSSdsbCBzZW5kIGEgZnJpYXIgd2l0aCBzcGVlZAogICAgVG8gTWFudHVhLCB3aXRoIG15IGxldHRlcnMgdG8gdGh5IGxvcmQuCgpKVUxJRVQKCiAgICBMb3ZlIGdpdmUgbWUgc3RyZW5ndGghIGFuZCBzdHJlbmd0aCBzaGFsbCBoZWxwIGFmZm9yZC4KICAgIEZhcmV3ZWxsLCBkZWFyIGZhdGhlciEKCiAgICBFeGV1bnQKClNDRU5FIElJLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIE51cnNlLCBhbmQgdHdvIFNlcnZpbmdtZW4gCgpDQVBVTEVUCgogICAgU28gbWFueSBndWVzdHMgaW52aXRlIGFzIGhlcmUgYXJlIHdyaXQuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGdvIGhpcmUgbWUgdHdlbnR5IGN1bm5pbmcgY29va3MuCgpTZWNvbmQgU2VydmFudAoKICAgIFlvdSBzaGFsbCBoYXZlIG5vbmUgaWxsLCBzaXI7IGZvciBJJ2xsIHRyeSBpZiB0aGV5CiAgICBjYW4gbGljayB0aGVpciBmaW5nZXJzLgoKQ0FQVUxFVAoKICAgIEhvdyBjYW5zdCB0aG91IHRyeSB0aGVtIHNvPwoKU2Vjb25kIFNlcnZhbnQKCiAgICBNYXJyeSwgc2lyLCAndGlzIGFuIGlsbCBjb29rIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBvd24gZmluZ2VyczogdGhlcmVmb3JlIGhlIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBmaW5nZXJzIGdvZXMgbm90IHdpdGggbWUuCgpDQVBVTEVUCgogICAgR28sIGJlIGdvbmUuCgogICAgRXhpdCBTZWNvbmQgU2VydmFudAogICAgV2Ugc2hhbGwgYmUgbXVjaCB1bmZ1cm5pc2hlZCBmb3IgdGhpcyB0aW1lLgogICAgV2hhdCwgaXMgbXkgZGF1Z2h0ZXIgZ29uZSB0byBGcmlhciBMYXVyZW5jZT8KCk51cnNlCgogICAgQXksIGZvcnNvb3RoLgoKQ0FQVUxFVAoKICAgIFdlbGwsIGhlIG1heSBjaGFuY2UgdG8gZG8gc29tZSBnb29kIG9uIGhlcjoKICAgIEEgcGVldmlzaCBzZWxmLXdpbGwnZCBoYXJsb3RyeSBpdCBpcy4KCk51cnNlCgogICAgU2VlIHdoZXJlIHNoZSBjb21lcyBmcm9tIHNocmlmdCB3aXRoIG1lcnJ5IGxvb2suCgogICAgRW50ZXIgSlVMSUVUCgpDQVBVTEVUCgogICAgSG93IG5vdywgbXkgaGVhZHN0cm9uZyEgd2hlcmUgaGF2ZSB5b3UgYmVlbiBnYWRkaW5nPwoKSlVMSUVUCgogICAgV2hlcmUgSSBoYXZlIGxlYXJuJ2QgbWUgdG8gcmVwZW50IHRoZSBzaW4KICAgIE9mIGRpc29iZWRpZW50IG9wcG9zaXRpb24KICAgIFRvIHlvdSBhbmQgeW91ciBiZWhlc3RzLCBhbmQgYW0gZW5qb2luJ2QKICAgIEJ5IGhvbHkgTGF1cmVuY2UgdG8gZmFsbCBwcm9zdHJhdGUgaGVyZSwKICAgIEFuZCBiZWcgeW91ciBwYXJkb246IHBhcmRvbiwgSSBiZXNlZWNoIHlvdSEKICAgIEhlbmNlZm9yd2FyZCBJIGFtIGV2ZXIgcnVsZWQgYnkgeW91LgoKQ0FQVUxFVAoKICAgIFNlbmQgZm9yIHRoZSBjb3VudHk7IGdvIHRlbGwgaGltIG9mIHRoaXM6CiAgICBJJ2xsIGhhdmUgdGhpcyBrbm90IGtuaXQgdXAgdG8tbW9ycm93IG1vcm5pbmcuCgpKVUxJRVQKCiAgICBJIG1ldCB0aGUgeW91dGhmdWwgbG9yZCBhdCBMYXVyZW5jZScgY2VsbDsKICAgIEFuZCBnYXZlIGhpbSB3aGF0IGJlY29tZWQgbG92ZSBJIG1pZ2h0LAogICAgTm90IHN0ZXAgbydlciB0aGUgYm91bmRzIG9mIG1vZGVzdHkuCgpDQVBVTEVUCgogICAgV2h5LCBJIGFtIGdsYWQgb24ndDsgdGhpcyBpcyB3ZWxsOiBzdGFuZCB1cDoKICAgIFRoaXMgaXMgYXMndCBzaG91bGQgYmUuIExldCBtZSBzZWUgdGhlIGNvdW50eTsKICAgIEF5LCBtYXJyeSwgZ28sIEkgc2F5LCBhbmQgZmV0Y2ggaGltIGhpdGhlci4KICAgIE5vdywgYWZvcmUgR29kISB0aGlzIHJldmVyZW5kIGhvbHkgZnJpYXIsCiAgICBPdXIgd2hvbGUgY2l0eSBpcyBtdWNoIGJvdW5kIHRvIGhpbS4KCkpVTElFVAoKICAgIE51cnNlLCB3aWxsIHlvdSBnbyB3aXRoIG1lIGludG8gbXkgY2xvc2V0LAogICAgVG8gaGVscCBtZSBzb3J0IHN1Y2ggbmVlZGZ1bCBvcm5hbWVudHMKICAgIEFzIHlvdSB0aGluayBmaXQgdG8gZnVybmlzaCBtZSB0by1tb3Jyb3cCgpMQURZIENBUFVMRVQKCiAgICBObywgbm90IHRpbGwgVGh1cnNkYXk7IHRoZXJlIGlzIHRpbWUgZW5vdWdoLgoKQ0FQVUxFVAoKICAgIEdvLCBudXJzZSwgZ28gd2l0aCBoZXI6IHdlJ2xsIHRvIGNodXJjaCB0by1tb3Jyb3cuCgogICAgRXhldW50IEpVTElFVCBhbmQgTnVyc2UKCkxBRFkgQ0FQVUxFVAoKICAgIFdlIHNoYWxsIGJlIHNob3J0IGluIG91ciBwcm92aXNpb246CiAgICAnVGlzIG5vdyBuZWFyIG5pZ2h0LgoKQ0FQVUxFVAoKICAgIFR1c2gsIEkgd2lsbCBzdGlyIGFib3V0LAogICAgQW5kIGFsbCB0aGluZ3Mgc2hhbGwgYmUgd2VsbCwgSSB3YXJyYW50IHRoZWUsIHdpZmU6CiAgICBHbyB0aG91IHRvIEp1bGlldCwgaGVscCB0byBkZWNrIHVwIGhlcjsKICAgIEknbGwgbm90IHRvIGJlZCB0by1uaWdodDsgbGV0IG1lIGFsb25lOwogICAgSSdsbCBwbGF5IHRoZSBob3VzZXdpZmUgZm9yIHRoaXMgb25jZS4gV2hhdCwgaG8hCiAgICBUaGV5IGFyZSBhbGwgZm9ydGguIFdlbGwsIEkgd2lsbCB3YWxrIG15c2VsZgogICAgVG8gQ291bnR5IFBhcmlzLCB0byBwcmVwYXJlIGhpbSB1cAogICAgQWdhaW5zdCB0by1tb3Jyb3c6IG15IGhlYXJ0IGlzIHdvbmRyb3VzIGxpZ2h0LAogICAgU2luY2UgdGhpcyBzYW1lIHdheXdhcmQgZ2lybCBpcyBzbyByZWNsYWltJ2QuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEp1bGlldCdzIGNoYW1iZXIuCgogICAgRW50ZXIgSlVMSUVUIGFuZCBOdXJzZSAKCkpVTElFVAoKICAgIEF5LCB0aG9zZSBhdHRpcmVzIGFyZSBiZXN0OiBidXQsIGdlbnRsZSBudXJzZSwKICAgIEkgcHJheSB0aGVlLCBsZWF2ZSBtZSB0byBteSBzZWxmIHRvLW5pZ2h0LAogICAgRm9yIEkgaGF2ZSBuZWVkIG9mIG1hbnkgb3Jpc29ucwogICAgVG8gbW92ZSB0aGUgaGVhdmVucyB0byBzbWlsZSB1cG9uIG15IHN0YXRlLAogICAgV2hpY2gsIHdlbGwgdGhvdSBrbm93J3N0LCBpcyBjcm9zcywgYW5kIGZ1bGwgb2Ygc2luLgoKICAgIEVudGVyIExBRFkgQ0FQVUxFVAoKTEFEWSBDQVBVTEVUCgogICAgV2hhdCwgYXJlIHlvdSBidXN5LCBobz8gbmVlZCB5b3UgbXkgaGVscD8KCkpVTElFVAoKICAgIE5vLCBtYWRhbTsgd2UgaGF2ZSBjdWxsJ2Qgc3VjaCBuZWNlc3NhcmllcwogICAgQXMgYXJlIGJlaG92ZWZ1bCBmb3Igb3VyIHN0YXRlIHRvLW1vcnJvdzoKICAgIFNvIHBsZWFzZSB5b3UsIGxldCBtZSBub3cgYmUgbGVmdCBhbG9uZSwKICAgIEFuZCBsZXQgdGhlIG51cnNlIHRoaXMgbmlnaHQgc2l0IHVwIHdpdGggeW91OwogICAgRm9yLCBJIGFtIHN1cmUsIHlvdSBoYXZlIHlvdXIgaGFuZHMgZnVsbCBhbGwsCiAgICBJbiB0aGlzIHNvIHN1ZGRlbiBidXNpbmVzcy4KCkxBRFkgQ0FQVUxFVAoKICAgIEdvb2QgbmlnaHQ6CiAgICBHZXQgdGhlZSB0byBiZWQsIGFuZCByZXN0OyBmb3IgdGhvdSBoYXN0IG5lZWQuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkpVTElFVAoKICAgIEZhcmV3ZWxsISBHb2Qga25vd3Mgd2hlbiB3ZSBzaGFsbCBtZWV0IGFnYWluLgogICAgSSBoYXZlIGEgZmFpbnQgY29sZCBmZWFyIHRocmlsbHMgdGhyb3VnaCBteSB2ZWlucywKICAgIFRoYXQgYWxtb3N0IGZyZWV6ZXMgdXAgdGhlIGhlYXQgb2YgbGlmZToKICAgIEknbGwgY2FsbCB0aGVtIGJhY2sgYWdhaW4gdG8gY29tZm9ydCBtZToKICAgIE51cnNlISBXaGF0IHNob3VsZCBzaGUgZG8gaGVyZT8KICAgIE15IGRpc21hbCBzY2VuZSBJIG5lZWRzIG11c3QgYWN0IGFsb25lLgogICAgQ29tZSwgdmlhbC4KICAgIFdoYXQgaWYgdGhpcyBtaXh0dXJlIGRvIG5vdCB3b3JrIGF0IGFsbD8KICAgIFNoYWxsIEkgYmUgbWFycmllZCB0aGVuIHRvLW1vcnJvdyBtb3JuaW5nPwogICAgTm8sIG5vOiB0aGlzIHNoYWxsIGZvcmJpZCBpdDogbGllIHRob3UgdGhlcmUuCgogICAgTGF5aW5nIGRvd24gaGVyIGRhZ2dlcgogICAgV2hhdCBpZiBpdCBiZSBhIHBvaXNvbiwgd2hpY2ggdGhlIGZyaWFyCiAgICBTdWJ0bHkgaGF0aCBtaW5pc3RlcidkIHRvIGhhdmUgbWUgZGVhZCwKICAgIExlc3QgaW4gdGhpcyBtYXJyaWFnZSBoZSBzaG91bGQgYmUgZGlzaG9ub3VyJ2QsCiAgICBCZWNhdXNlIGhlIG1hcnJpZWQgbWUgYmVmb3JlIHRvIFJvbWVvPwogICAgSSBmZWFyIGl0IGlzOiBhbmQgeWV0LCBtZXRoaW5rcywgaXQgc2hvdWxkIG5vdCwKICAgIEZvciBoZSBoYXRoIHN0aWxsIGJlZW4gdHJpZWQgYSBob2x5IG1hbi4KICAgIEhvdyBpZiwgd2hlbiBJIGFtIGxhaWQgaW50byB0aGUgdG9tYiwKICAgIEkgd2FrZSBiZWZvcmUgdGhlIHRpbWUgdGhhdCBSb21lbwogICAgQ29tZSB0byByZWRlZW0gbWUIHRoZXJlJ3MgYSBmZWFyZnVsIHBvaW50IQogICAgU2hhbGwgSSBub3QsIHRoZW4sIGJlIHN0aWZsZWQgaW4gdGhlIHZhdWx0LAogICAgVG8gd2hvc2UgZm91bCBtb3V0aCBubyBoZWFsdGhzb21lIGFpciBicmVhdGhlcyBpbiwKICAgIEFuZCB0aGVyZSBkaWUgc3RyYW5nbGVkIGVyZSBteSBSb21lbyBjb21lcz8KICAgIE9yLCBpZiBJIGxpdmUsIGlzIGl0IG5vdCB2ZXJ5IGxpa2UsCiAgICBUaGUgaG9ycmlibGUgY29uY2VpdCBvZiBkZWF0aCBhbmQgbmlnaHQsCiAgICBUb2dldGhlciB3aXRoIHRoZSB0ZXJyb3Igb2YgdGhlIHBsYWNlLC0tCiAgICBBcyBpbiBhIHZhdWx0LCBhbiBhbmNpZW50IHJlY2VwdGFjbGUsCiAgICBXaGVyZSwgZm9yIHRoZXNlIG1hbnkgaHVuZHJlZCB5ZWFycywgdGhlIGJvbmVzCiAgICBPZiBhbGwgbXkgYnVyaWVkIGFuY2VzdG9ycyBhcmUgcGFja2VkOgogICAgV2hlcmUgYmxvb2R5IFR5YmFsdCwgeWV0IGJ1dCBncmVlbiBpbiBlYXJ0aCwKICAgIExpZXMgZmVzdGVyaW5nIGluIGhpcyBzaHJvdWQ7IHdoZXJlLCBhcyB0aGV5IHNheSwKICAgIEF0IHNvbWUgaG91cnMgaW4gdGhlIG5pZ2h0IHNwaXJpdHMgcmVzb3J0Oy0tCiAgICBBbGFjaywgYWxhY2ssIGlzIGl0IG5vdCBsaWtlIHRoYXQgSSwKICAgIFNvIGVhcmx5IHdha2luZywgd2hhdCB3aXRoIGxvYXRoc29tZSBzbWVsbHMsCiAgICBBbmQgc2hyaWVrcyBsaWtlIG1hbmRyYWtlcycgdG9ybiBvdXQgb2YgdGhlIGVhcnRoLAogICAgVGhhdCBsaXZpbmcgbW9ydGFscywgaGVhcmluZyB0aGVtLCBydW4gbWFkOi0tCiAgICBPLCBpZiBJIHdha2UsIHNoYWxsIEkgbm90IGJlIGRpc3RyYXVnaHQsCiAgICBFbnZpcm9uZWQgd2l0aCBhbGwgdGhlc2UgaGlkZW91cyBmZWFycz8KICAgIEFuZCBtYWRseSBwbGF5IHdpdGggbXkgZm9yZWZhdGhlcidzIGpvaW50cz8KICAgIEFuZCBwbHVjayB0aGUgbWFuZ2xlZCBUeWJhbHQgZnJvbSBoaXMgc2hyb3VkPwogICAgQW5kLCBpbiB0aGlzIHJhZ2UsIHdpdGggc29tZSBncmVhdCBraW5zbWFuJ3MgYm9uZSwKICAgIEFzIHdpdGggYSBjbHViLCBkYXNoIG91dCBteSBkZXNwZXJhdGUgYnJhaW5zPwogICAgTywgbG9vayEgbWV0aGlua3MgSSBzZWUgbXkgY291c2luJ3MgZ2hvc3QKICAgIFNlZWtpbmcgb3V0IFJvbWVvLCB0aGF0IGRpZCBzcGl0IGhpcyBib2R5CiAgICBVcG9uIGEgcmFwaWVyJ3MgcG9pbnQ6IHN0YXksIFR5YmFsdCwgc3RheSEKICAgIFJvbWVvLCBJIGNvbWUhIHRoaXMgZG8gSSBkcmluayB0byB0aGVlLgoKICAgIFNoZSBmYWxscyB1cG9uIGhlciBiZWQsIHdpdGhpbiB0aGUgY3VydGFpbnMKClNDRU5FIElWLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgSG9sZCwgdGFrZSB0aGVzZSBrZXlzLCBhbmQgZmV0Y2ggbW9yZSBzcGljZXMsIG51cnNlLgoKTnVyc2UKCiAgICBUaGV5IGNhbGwgZm9yIGRhdGVzIGFuZCBxdWluY2VzIGluIHRoZSBwYXN0cnkuCgogICAgRW50ZXIgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIENvbWUsIHN0aXIsIHN0aXIsIHN0aXIhIHRoZSBzZWNvbmQgY29jayBoYXRoIGNyb3cnZCwKICAgIFRoZSBjdXJmZXctYmVsbCBoYXRoIHJ1bmcsICd0aXMgdGhyZWUgbydjbG9jazoKICAgIExvb2sgdG8gdGhlIGJha2VkIG1lYXRzLCBnb29kIEFuZ2VsaWNhOgogICAgU3BhcmUgbm90IGZvciB0aGUgY29zdC4KCk51cnNlCgogICAgR28sIHlvdSBjb3QtcXVlYW4sIGdvLAogICAgR2V0IHlvdSB0byBiZWQ7IGZhaXRoLCBZb3UnbGwgYmUgc2ljayB0by1tb3Jyb3cKICAgIEZvciB0aGlzIG5pZ2h0J3Mgd2F0Y2hpbmcuCgpDQVBVTEVUCgogICAgTm8sIG5vdCBhIHdoaXQ6IHdoYXQhIEkgaGF2ZSB3YXRjaCdkIGVyZSBub3cKICAgIEFsbCBuaWdodCBmb3IgbGVzc2VyIGNhdXNlLCBhbmQgbmUnZXIgYmVlbiBzaWNrLgoKTEFEWSBDQVBVTEVUCgogICAgQXksIHlvdSBoYXZlIGJlZW4gYSBtb3VzZS1odW50IGluIHlvdXIgdGltZTsKICAgIEJ1dCBJIHdpbGwgd2F0Y2ggeW91IGZyb20gc3VjaCB3YXRjaGluZyBub3cuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBBIGplYWxvdXMgaG9vZCwgYSBqZWFsb3VzIGhvb2QhCgogICAgRW50ZXIgdGhyZWUgb3IgZm91ciBTZXJ2aW5nbWVuLCB3aXRoIHNwaXRzLCBsb2dzLCBhbmQgYmFza2V0cwogICAgTm93LCBmZWxsb3csCiAgICBXaGF0J3MgdGhlcmUCgpGaXJzdCBTZXJ2YW50CgogICAgVGhpbmdzIGZvciB0aGUgY29vaywgc2lyOyBidXQgSSBrbm93IG5vdCB3aGF0LgoKQ0FQVUxFVAoKICAgIE1ha2UgaGFzdGUsIG1ha2UgaGFzdGUuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGZldGNoIGRyaWVyIGxvZ3M6CiAgICBDYWxsIFBldGVyLCBoZSB3aWxsIHNob3cgdGhlZSB3aGVyZSB0aGV5IGFyZS4KClNlY29uZCBTZXJ2YW50CgogICAgSSBoYXZlIGEgaGVhZCwgc2lyLCB0aGF0IHdpbGwgZmluZCBvdXQgbG9ncywKICAgIEFuZCBuZXZlciB0cm91YmxlIFBldGVyIGZvciB0aGUgbWF0dGVyLgoKICAgIEV4aXQKCkNBUFVMRVQKCiAgICBNYXNzLCBhbmQgd2VsbCBzYWlkOyBhIG1lcnJ5IHdob3Jlc29uLCBoYSEKICAgIFRob3Ugc2hhbHQgYmUgbG9nZ2VyLWhlYWQuIEdvb2QgZmFpdGgsICd0aXMgZGF5OgogICAgVGhlIGNvdW50eSB3aWxsIGJlIGhlcmUgd2l0aCBtdXNpYyBzdHJhaWdodCwKICAgIEZvciBzbyBoZSBzYWlkIGhlIHdvdWxkOiBJIGhlYXIgaGltIG5lYXIuCgogICAgTXVzaWMgd2l0aGluCiAgICBOdXJzZSEgV2lmZSEgV2hhdCwgaG8hIFdoYXQsIG51cnNlLCBJIHNheSEKCiAgICBSZS1lbnRlciBOdXJzZQogICAgR28gd2FrZW4gSnVsaWV0LCBnbyBhbmQgdHJpbSBoZXIgdXA7CiAgICBJJ2xsIGdvIGFuZCBjaGF0IHdpdGggUGFyaXM6IGhpZSwgbWFrZSBoYXN0ZSwKICAgIE1ha2UgaGFzdGU7IHRoZSBicmlkZWdyb29tIGhlIGlzIGNvbWUgYWxyZWFkeToKICAgIE1ha2UgaGFzdGUsIEkgc2F5LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gSnVsaWV0J3MgY2hhbWJlci4KCiAgICBFbnRlciBOdXJzZSAKCk51cnNlCgogICAgTWlzdHJlc3MhIHdoYXQsIG1pc3RyZXNzISBKdWxpZXQhIGZhc3QsIEkgd2FycmFudCBoZXIsIHNoZToKICAgIFdoeSwgbGFtYiEgd2h5LCBsYWR5ISBmaWUsIHlvdSBzbHVnLWEtYmVkIQogICAgV2h5LCBsb3ZlLCBJIHNheSEgbWFkYW0hIHN3ZWV0LWhlYXJ0ISB3aHksIGJyaWRlIQogICAgV2hhdCwgbm90IGEgd29yZD8geW91IHRha2UgeW91ciBwZW5ueXdvcnRocyBub3c7CiAgICBTbGVlcCBmb3IgYSB3ZWVrOyBmb3IgdGhlIG5leHQgbmlnaHQsIEkgd2FycmFudCwKICAgIFRoZSBDb3VudHkgUGFyaXMgaGF0aCBzZXQgdXAgaGlzIHJlc3QsCiAgICBUaGF0IHlvdSBzaGFsbCByZXN0IGJ1dCBsaXR0bGUuIEdvZCBmb3JnaXZlIG1lLAogICAgTWFycnksIGFuZCBhbWVuLCBob3cgc291bmQgaXMgc2hlIGFzbGVlcCEKICAgIEkgbXVzdCBuZWVkcyB3YWtlIGhlci4gTWFkYW0sIG1hZGFtLCBtYWRhbSEKICAgIEF5LCBsZXQgdGhlIGNvdW50eSB0YWtlIHlvdSBpbiB5b3VyIGJlZDsKICAgIEhlJ2xsIGZyaWdodCB5b3UgdXAsIGknIGZhaXRoLiBXaWxsIGl0IG5vdCBiZT8KCiAgICBVbmRyYXdzIHRoZSBjdXJ0YWlucwogICAgV2hhdCwgZHJlc3MnZCEgYW5kIGluIHlvdXIgY2xvdGhlcyEgYW5kIGRvd24gYWdhaW4hCiAgICBJIG11c3QgbmVlZHMgd2FrZSB5b3U7IExhZHkhIGxhZHkhIGxhZHkhCiAgICBBbGFzLCBhbGFzISBIZWxwLCBoZWxwISBteSBsYWR5J3MgZGVhZCEKICAgIE8sIHdlbGwtYS1kYXksIHRoYXQgZXZlciBJIHdhcyBib3JuIQogICAgU29tZSBhcXVhIHZpdGFlLCBobyEgTXkgbG9yZCEgbXkgbGFkeSEKCiAgICBFbnRlciBMQURZIENBUFVMRVQKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgaGVyZT8KCk51cnNlCgogICAgTyBsYW1lbnRhYmxlIGRheSEKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgaXMgdGhlIG1hdHRlcj8KCk51cnNlCgogICAgTG9vaywgbG9vayEgTyBoZWF2eSBkYXkhCgpMQURZIENBUFVMRVQKCiAgICBPIG1lLCBPIG1lISBNeSBjaGlsZCwgbXkgb25seSBsaWZlLAogICAgUmV2aXZlLCBsb29rIHVwLCBvciBJIHdpbGwgZGllIHdpdGggdGhlZSEKICAgIEhlbHAsIGhlbHAhIENhbGwgaGVscC4KCiAgICBFbnRlciBDQVBVTEVUCgpDQVBVTEVUCgogICAgRm9yIHNoYW1lLCBicmluZyBKdWxpZXQgZm9ydGg7IGhlciBsb3JkIGlzIGNvbWUuCgpOdXJzZQoKICAgIFNoZSdzIGRlYWQsIGRlY2Vhc2VkLCBzaGUncyBkZWFkOyBhbGFjayB0aGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgQWxhY2sgdGhlIGRheSwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCEKCkNBUFVMRVQKCiAgICBIYSEgbGV0IG1lIHNlZSBoZXI6IG91dCwgYWxhcyEgc2hlJ3MgY29sZDoKICAgIEhlciBibG9vZCBpcyBzZXR0bGVkLCBhbmQgaGVyIGpvaW50cyBhcmUgc3RpZmY7CiAgICBMaWZlIGFuZCB0aGVzZSBsaXBzIGhhdmUgbG9uZyBiZWVuIHNlcGFyYXRlZDoKICAgIERlYXRoIGxpZXMgb24gaGVyIGxpa2UgYW4gdW50aW1lbHkgZnJvc3QKICAgIFVwb24gdGhlIHN3ZWV0ZXN0IGZsb3dlciBvZiBhbGwgdGhlIGZpZWxkLgoKTnVyc2UKCiAgICBPIGxhbWVudGFibGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgTyB3b2Z1bCB0aW1lIQoKQ0FQVUxFVAoKICAgIERlYXRoLCB0aGF0IGhhdGggdGEnZW4gaGVyIGhlbmNlIHRvIG1ha2UgbWUgd2FpbCwKICAgIFRpZXMgdXAgbXkgdG9uZ3VlLCBhbmQgd2lsbCBub3QgbGV0IG1lIHNwZWFrLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUywgd2l0aCBNdXNpY2lhbnMKCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgaXMgdGhlIGJyaWRlIHJlYWR5IHRvIGdvIHRvIGNodXJjaD8KCkNBUFVMRVQKCiAgICBSZWFkeSB0byBnbywgYnV0IG5ldmVyIHRvIHJldHVybi4KICAgIE8gc29uISB0aGUgbmlnaHQgYmVmb3JlIHRoeSB3ZWRkaW5nLWRheQogICAgSGF0aCBEZWF0aCBsYWluIHdpdGggdGh5IHdpZmUuIFRoZXJlIHNoZSBsaWVzLAogICAgRmxvd2VyIGFzIHNoZSB3YXMsIGRlZmxvd2VyZWQgYnkgaGltLgogICAgRGVhdGggaXMgbXkgc29uLWluLWxhdywgRGVhdGggaXMgbXkgaGVpcjsKICAgIE15IGRhdWdodGVyIGhlIGhhdGggd2VkZGVkOiBJIHdpbGwgZGllLAogICAgQW5kIGxlYXZlIGhpbSBhbGw7IGxpZmUsIGxpdmluZywgYWxsIGlzIERlYXRoJ3MuCgpQQVJJUwoKICAgIEhhdmUgSSB0aG91Z2h0IGxvbmcgdG8gc2VlIHRoaXMgbW9ybmluZydzIGZhY2UsCiAgICBBbmQgZG90aCBpdCBnaXZlIG1lIHN1Y2ggYSBzaWdodCBhcyB0aGlzPwoKTEFEWSBDQVBVTEVUCgogICAgQWNjdXJzZWQsIHVuaGFwcHksIHdyZXRjaGVkLCBoYXRlZnVsIGRheSEKICAgIE1vc3QgbWlzZXJhYmxlIGhvdXIgdGhhdCBlJ2VyIHRpbWUgc2F3CiAgICBJbiBsYXN0aW5nIGxhYm91ciBvZiBoaXMgcGlsZ3JpbWFnZSEKICAgIEJ1dCBvbmUsIHBvb3Igb25lLCBvbmUgcG9vciBhbmQgbG92aW5nIGNoaWxkLAogICAgQnV0IG9uZSB0aGluZyB0byByZWpvaWNlIGFuZCBzb2xhY2UgaW4sCiAgICBBbmQgY3J1ZWwgZGVhdGggaGF0aCBjYXRjaCdkIGl0IGZyb20gbXkgc2lnaHQhCgpOdXJzZQoKICAgIE8gd29lISBPIHdvZnVsLCB3b2Z1bCwgd29mdWwgZGF5IQogICAgTW9zdCBsYW1lbnRhYmxlIGRheSwgbW9zdCB3b2Z1bCBkYXksCiAgICBUaGF0IGV2ZXIsIGV2ZXIsIEkgZGlkIHlldCBiZWhvbGQhCiAgICBPIGRheSEgTyBkYXkhIE8gZGF5ISBPIGhhdGVmdWwgZGF5IQogICAgTmV2ZXIgd2FzIHNlZW4gc28gYmxhY2sgYSBkYXkgYXMgdGhpczoKICAgIE8gd29mdWwgZGF5LCBPIHdvZnVsIGRheSEKClBBUklTCgogICAgQmVndWlsZWQsIGRpdm9yY2VkLCB3cm9uZ2VkLCBzcGl0ZWQsIHNsYWluIQogICAgTW9zdCBkZXRlc3RhYmxlIGRlYXRoLCBieSB0aGVlIGJlZ3VpbCdkLAogICAgQnkgY3J1ZWwgY3J1ZWwgdGhlZSBxdWl0ZSBvdmVydGhyb3duIQogICAgTyBsb3ZlISBPIGxpZmUhIG5vdCBsaWZlLCBidXQgbG92ZSBpbiBkZWF0aCEKCkNBUFVMRVQKCiAgICBEZXNwaXNlZCwgZGlzdHJlc3NlZCwgaGF0ZWQsIG1hcnR5cidkLCBraWxsJ2QhCiAgICBVbmNvbWZvcnRhYmxlIHRpbWUsIHdoeSBjYW1lc3QgdGhvdSBub3cKICAgIFRvIG11cmRlciwgbXVyZGVyIG91ciBzb2xlbW5pdHkCiAgICBPIGNoaWxkISBPIGNoaWxkISBteSBzb3VsLCBhbmQgbm90IG15IGNoaWxkIQogICAgRGVhZCBhcnQgdGhvdSEgQWxhY2shIG15IGNoaWxkIGlzIGRlYWQ7CiAgICBBbmQgd2l0aCBteSBjaGlsZCBteSBqb3lzIGFyZSBidXJpZWQuCgpGUklBUiBMQVVSRU5DRQoKICAgIFBlYWNlLCBobywgZm9yIHNoYW1lISBjb25mdXNpb24ncyBjdXJlIGxpdmVzIG5vdAogICAgSW4gdGhlc2UgY29uZnVzaW9ucy4gSGVhdmVuIGFuZCB5b3Vyc2VsZgogICAgSGFkIHBhcnQgaW4gdGhpcyBmYWlyIG1haWQ7IG5vdyBoZWF2ZW4gaGF0aCBhbGwsCiAgICBBbmQgYWxsIHRoZSBiZXR0ZXIgaXMgaXQgZm9yIHRoZSBtYWlkOgogICAgWW91ciBwYXJ0IGluIGhlciB5b3UgY291bGQgbm90IGtlZXAgZnJvbSBkZWF0aCwKICAgIEJ1dCBoZWF2ZW4ga2VlcHMgaGlzIHBhcnQgaW4gZXRlcm5hbCBsaWZlLgogICAgVGhlIG1vc3QgeW91IHNvdWdodCB3YXMgaGVyIHByb21vdGlvbjsKICAgIEZvciAndHdhcyB5b3VyIGhlYXZlbiBzaGUgc2hvdWxkIGJlIGFkdmFuY2VkOgogICAgQW5kIHdlZXAgeWUgbm93LCBzZWVpbmcgc2hlIGlzIGFkdmFuY2VkCiAgICBBYm92ZSB0aGUgY2xvdWRzLCBhcyBoaWdoIGFzIGhlYXZlbiBpdHNlbGYCiAgICBPLCBpbiB0aGlzIGxvdmUsIHlvdSBsb3ZlIHlvdXIgY2hpbGQgc28gaWxsLAogICAgVGhhdCB5b3UgcnVuIG1hZCwgc2VlaW5nIHRoYXQgc2hlIGlzIHdlbGw6CiAgICBTaGUncyBub3Qgd2VsbCBtYXJyaWVkIHRoYXQgbGl2ZXMgbWFycmllZCBsb25nOwogICAgQnV0IHNoZSdzIGJlc3QgbWFycmllZCB0aGF0IGRpZXMgbWFycmllZCB5b3VuZy4KICAgIERyeSB1cCB5b3VyIHRlYXJzLCBhbmQgc3RpY2sgeW91ciByb3NlbWFyeQogICAgT24gdGhpcyBmYWlyIGNvcnNlOyBhbmQsIGFzIHRoZSBjdXN0b20gaXMsCiAgICBJbiBhbGwgaGVyIGJlc3QgYXJyYXkgYmVhciBoZXIgdG8gY2h1cmNoOgogICAgRm9yIHRob3VnaCBmb25kIG5hdHVyZSBiaWRzIHVzIGFuIGxhbWVudCwKICAgIFlldCBuYXR1cmUncyB0ZWFycyBhcmUgcmVhc29uJ3MgbWVycmltZW50LgoKQ0FQVUxFVAoKICAgIEFsbCB0aGluZ3MgdGhhdCB3ZSBvcmRhaW5lZCBmZXN0aXZhbCwKICAgIFR1cm4gZnJvbSB0aGVpciBvZmZpY2UgdG8gYmxhY2sgZnVuZXJhbDsKICAgIE91ciBpbnN0cnVtZW50cyB0byBtZWxhbmNob2x5IGJlbGxzLAogICAgT3VyIHdlZGRpbmcgY2hlZXIgdG8gYSBzYWQgYnVyaWFsIGZlYXN0LAogICAgT3VyIHNvbGVtbiBoeW1ucyB0byBzdWxsZW4gZGlyZ2VzIGNoYW5nZSwKICAgIE91ciBicmlkYWwgZmxvd2VycyBzZXJ2ZSBmb3IgYSBidXJpZWQgY29yc2UsCiAgICBBbmQgYWxsIHRoaW5ncyBjaGFuZ2UgdGhlbSB0byB0aGUgY29udHJhcnkuCgpGUklBUiBMQVVSRU5DRQoKICAgIFNpciwgZ28geW91IGluOyBhbmQsIG1hZGFtLCBnbyB3aXRoIGhpbTsKICAgIEFuZCBnbywgU2lyIFBhcmlzOyBldmVyeSBvbmUgcHJlcGFyZQogICAgVG8gZm9sbG93IHRoaXMgZmFpciBjb3JzZSB1bnRvIGhlciBncmF2ZToKICAgIFRoZSBoZWF2ZW5zIGRvIGxvdXIgdXBvbiB5b3UgZm9yIHNvbWUgaWxsOwogICAgTW92ZSB0aGVtIG5vIG1vcmUgYnkgY3Jvc3NpbmcgdGhlaXIgaGlnaCB3aWxsLgoKICAgIEV4ZXVudCBDQVBVTEVULCBMQURZIENBUFVMRVQsIFBBUklTLCBhbmQgRlJJQVIgTEFVUkVOQ0UKCkZpcnN0IE11c2ljaWFuCgogICAgRmFpdGgsIHdlIG1heSBwdXQgdXAgb3VyIHBpcGVzLCBhbmQgYmUgZ29uZS4KCk51cnNlCgogICAgSG9uZXN0IGdvb2RmZWxsb3dzLCBhaCwgcHV0IHVwLCBwdXQgdXA7CiAgICBGb3IsIHdlbGwgeW91IGtub3csIHRoaXMgaXMgYSBwaXRpZnVsIGNhc2UuCgogICAgRXhpdAoKRmlyc3QgTXVzaWNpYW4KCiAgICBBeSwgYnkgbXkgdHJvdGgsIHRoZSBjYXNlIG1heSBiZSBhbWVuZGVkLgoKICAgIEVudGVyIFBFVEVSCgpQRVRFUgoKICAgIE11c2ljaWFucywgTywgbXVzaWNpYW5zLCAnSGVhcnQncyBlYXNlLCBIZWFydCdzCiAgICBlYXNlOicgTywgYW4geW91IHdpbGwgaGF2ZSBtZSBsaXZlLCBwbGF5ICdIZWFydCdzIGVhc2UuJwoKRmlyc3QgTXVzaWNpYW4KCiAgICBXaHkgJ0hlYXJ0J3MgZWFzZT8nCgpQRVRFUgoKICAgIE8sIG11c2ljaWFucywgYmVjYXVzZSBteSBoZWFydCBpdHNlbGYgcGxheXMgJ015CiAgICBoZWFydCBpcyBmdWxsIG9mIHdvZTonIE8sIHBsYXkgbWUgc29tZSBtZXJyeSBkdW1wLAogICAgdG8gY29tZm9ydCBtZS4KCkZpcnN0IE11c2ljaWFuCgogICAgTm90IGEgZHVtcCB3ZTsgJ3RpcyBubyB0aW1lIHRvIHBsYXkgbm93LgoKUEVURVIKCiAgICBZb3Ugd2lsbCBub3QsIHRoZW4CgpGaXJzdCBNdXNp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Rocm9uZTsKICAgIEFuZCBhbGwgdGhpcyBkYXkgYW4gdW5hY2N1c3RvbSdkIHNwaXJpdAogICAgTGlmdHMgbWUgYWJvdmUgdGhlIGdyb3VuZCB3aXRoIGNoZWVyZnVsIHRob3VnaHRzLgogICAgSSBkcmVhbXQgbXkgbGFkeSBjYW1lIGFuZCBmb3VuZCBtZSBkZWFkLS0KICAgIFN0cmFuZ2UgZHJlYW0sIHRoYXQgZ2l2ZXMgYSBkZWFkIG1hbiBsZWF2ZQogICAgdG8gdGhpbmshLS0KICAgIEFuZCBicmVhdGhlZCBzdWNoIGxpZmUgd2l0aCBraXNzZXMgaW4gbXkgbGlwcywKICAgIFRoYXQgSSByZXZpdmVkLCBhbmQgd2FzIGFuIGVtcGVyb3IuCiAgICBBaCBtZSEgaG93IHN3ZWV0IGlzIGxvdmUgaXRzZWxmIHBvc3Nlc3MnZCwKICAgIFdoZW4gYnV0IGxvdmUncyBzaGFkb3dzIGFyZSBzbyByaWNoIGluIGpveSEKCiAgICBFbnRlciBCQUxUSEFTQVIsIGJvb3RlZAogICAgTmV3cyBmcm9tIFZlcm9uYSEtLUhvdyBub3csIEJhbHRoYXNhciEKICAgIERvc3QgdGhvdSBub3QgYnJpbmcgbWUgbGV0dGVycyBmcm9tIHRoZSBmcmlhcj8KICAgIEhvdyBkb3RoIG15IGxhZHkIElzIG15IGZhdGhlciB3ZWxsPwogICAgSG93IGZhcmVzIG15IEp1bGlldD8gdGhhdCBJIGFzayBhZ2FpbjsKICAgIEZvciBub3RoaW5nIGNhbiBiZSBpbGwsIGlmIHNoZSBiZSB3ZWxsLgoKQkFMVEhBU0FSCgogICAgVGhlbiBzaGUgaXMgd2VsbCwgYW5kIG5vdGhpbmcgY2FuIGJlIGlsbDoKICAgIEhlciBib2R5IHNsZWVwcyBpbiBDYXBlbCdzIG1vbnVtZW50LAogICAgQW5kIGhlciBpbW1vcnRhbCBwYXJ0IHdpdGggYW5nZWxzIGxpdmVzLgogICAgSSBzYXcgaGVyIGxhaWQgbG93IGluIGhlciBraW5kcmVkJ3MgdmF1bHQsCiAgICBBbmQgcHJlc2VudGx5IHRvb2sgcG9zdCB0byB0ZWxsIGl0IHlvdToKICAgIE8sIHBhcmRvbiBtZSBmb3IgYnJpbmdpbmcgdGhlc2UgaWxsIG5ld3MsCiAgICBTaW5jZSB5b3UgZGlkIGxlYXZlIGl0IGZvciBteSBvZmZpY2UsIHNpci4KClJPTUVPCgogICAgSXMgaXQgZXZlbiBzbz8gdGhlbiBJIGRlZnkgeW91LCBzdGFycyEKICAgIFRob3Uga25vdydzdCBteSBsb2RnaW5nOiBnZXQgbWUgaW5rIGFuZCBwYXBlciwKICAgIEFuZCBoaXJlIHBvc3QtaG9yc2VzOyBJIHdpbGwgaGVuY2UgdG8tbmlnaHQuCgpCQUxUSEFTQVIKCiAgICBJIGRvIGJlc2VlY2ggeW91LCBzaXIsIGhhdmUgcGF0aWVuY2U6CiAgICBZb3VyIGxvb2tzIGFyZSBwYWxlIGFuZCB3aWxkLCBhbmQgZG8gaW1wb3J0CiAgICBTb21lIG1pc2FkdmVudHVyZS4KClJPTUVPCgogICAgVHVzaCwgdGhvdSBhcnQgZGVjZWl2ZWQ6CiAgICBMZWF2ZSBtZSwgYW5kIGRvIHRoZSB0aGluZyBJIGJpZCB0aGVlIGRvLgogICAgSGFzdCB0aG91IG5vIGxldHRlcnMgdG8gbWUgZnJvbSB0aGUgZnJpYXICgpCQUxUSEFTQVIKCiAgICBObywgbXkgZ29vZCBsb3JkLgoKUk9NRU8KCiAgICBObyBtYXR0ZXI6IGdldCB0aGVlIGdvbmUsCiAgICBBbmQgaGlyZSB0aG9zZSBob3JzZXM7IEknbGwgYmUgd2l0aCB0aGVlIHN0cmFpZ2h0LgoKICAgIEV4aXQgQkFMVEhBU0FSCiAgICBXZWxsLCBKdWxpZXQsIEkgd2lsbCBsaWUgd2l0aCB0aGVlIHRvLW5pZ2h0LgogICAgTGV0J3Mgc2VlIGZvciBtZWFuczogTyBtaXNjaGllZiwgdGhvdSBhcnQgc3dpZnQKICAgIFRvIGVudGVyIGluIHRoZSB0aG91Z2h0cyBvZiBkZXNwZXJhdGUgbWVuIQogICAgSSBkbyByZW1lbWJlciBhbiBhcG90aGVjYXJ5LC0tCiAgICBBbmQgaGVyZWFib3V0cyBoZSBkd2VsbHMsLS13aGljaCBsYXRlIEkgbm90ZWQKICAgIEluIHRhdHRlcidkIHdlZWRzLCB3aXRoIG92ZXJ3aGVsbWluZyBicm93cywKICAgIEN1bGxpbmcgb2Ygc2ltcGxlczsgbWVhZ3JlIHdlcmUgaGlzIGxvb2tzLAogICAgU2hhcnAgbWlzZXJ5IGhhZCB3b3JuIGhpbSB0byB0aGUgYm9uZXM6CiAgICBBbmQgaW4gaGlzIG5lZWR5IHNob3AgYSB0b3J0b2lzZSBodW5nLAogICAgQW4gYWxsaWdhdG9yIHN0dWZmJ2QsIGFuZCBvdGhlciBza2lucwogICAgT2YgaWxsLXNoYXBlZCBmaXNoZXM7IGFuZCBhYm91dCBoaXMgc2hlbHZlcwogICAgQSBiZWdnYXJseSBhY2NvdW50IG9mIGVtcHR5IGJveGVzLAogICAgR3JlZW4gZWFydGhlbiBwb3RzLCBibGFkZGVycyBhbmQgbXVzdHkgc2VlZHMsCiAgICBSZW1uYW50cyBvZiBwYWNrdGhyZWFkIGFuZCBvbGQgY2FrZXMgb2Ygcm9zZXMsCiAgICBXZXJlIHRoaW5seSBzY2F0dGVyJ2QsIHRvIG1ha2UgdXAgYSBzaG93LgogICAgTm90aW5nIHRoaXMgcGVudXJ5LCB0byBteXNlbGYgSSBzYWlkCiAgICAnQW4gaWYgYSBtYW4gZGlkIG5lZWQgYSBwb2lzb24gbm93LAogICAgV2hvc2Ugc2FsZSBpcyBwcmVzZW50IGRlYXRoIGluIE1hbnR1YSwKICAgIEhlcmUgbGl2ZXMgYSBjYWl0aWZmIHdyZXRjaCB3b3VsZCBzZWxsIGl0IGhpbS4nCiAgICBPLCB0aGlzIHNhbWUgdGhvdWdodCBkaWQgYnV0IGZvcmVydW4gbXkgbmVlZDsKICAgIEFuZCB0aGlzIHNhbWUgbmVlZHkgbWFuIG11c3Qgc2VsbCBpdCBtZS4KICAgIEFzIEkgcmVtZW1iZXIsIHRoaXMgc2hvdWxkIGJlIHRoZSBob3VzZS4KICAgIEJlaW5nIGhvbGlkYXksIHRoZSBiZWdnYXIncyBzaG9wIGlzIHNodXQuCiAgICBXaGF0LCBobyEgYXBvdGhlY2FyeSEKCiAgICBFbnRlciBBcG90aGVjYXJ5CgpBcG90aGVjYXJ5CgogICAgV2hvIGNhbGxzIHNvIGxvdWQCgpST01FTwoKICAgIENvbWUgaGl0aGVyLCBtYW4uIEkgc2VlIHRoYXQgdGhvdSBhcnQgcG9vcjoKICAgIEhvbGQsIHRoZXJlIGlzIGZvcnR5IGR1Y2F0czogbGV0IG1lIGhhdmUKICAgIEEgZHJhbSBvZiBwb2lzb24sIHN1Y2ggc29vbi1zcGVlZGluZyBnZWFyCiAgICBBcyB3aWxsIGRpc3BlcnNlIGl0c2VsZiB0aHJvdWdoIGFsbCB0aGUgdmVpbnMKICAgIFRoYXQgdGhlIGxpZmUtd2VhcnkgdGFrZXIgbWF5IGZhbGwgZGVhZAogICAgQW5kIHRoYXQgdGhlIHRydW5rIG1heSBiZSBkaXNjaGFyZ2VkIG9mIGJyZWF0aAogICAgQXMgdmlvbGVudGx5IGFzIGhhc3R5IHBvd2RlciBmaXJlZAogICAgRG90aCBodXJyeSBmcm9tIHRoZSBmYXRhbCBjYW5ub24ncyB3b21iLgoKQXBvdGhlY2FyeQoKICAgIFN1Y2ggbW9ydGFsIGRydWdzIEkgaGF2ZTsgYnV0IE1hbnR1YSdzIGxhdwogICAgSXMgZGVhdGggdG8gYW55IGhlIHRoYXQgdXR0ZXJzIHRoZW0uCgpST01FTwoKICAgIEFydCB0aG91IHNvIGJhcmUgYW5kIGZ1bGwgb2Ygd3JldGNoZWRuZXNzLAogICAgQW5kIGZlYXInc3QgdG8gZGllPyBmYW1pbmUgaXMgaW4gdGh5IGNoZWVrcywKICAgIE5lZWQgYW5kIG9wcHJlc3Npb24gc3RhcnZldGggaW4gdGhpbmUgZXllcywKICAgIENvbnRlbXB0IGFuZCBiZWdnYXJ5IGhhbmdzIHVwb24gdGh5IGJhY2s7CiAgICBUaGUgd29ybGQgaXMgbm90IHRoeSBmcmllbmQgbm9yIHRoZSB3b3JsZCdzIGxhdzsKICAgIFRoZSB3b3JsZCBhZmZvcmRzIG5vIGxhdyB0byBtYWtlIHRoZWUgcmljaDsKICAgIFRoZW4gYmUgbm90IHBvb3IsIGJ1dCBicmVhayBpdCwgYW5kIHRha2UgdGhpcy4KCkFwb3RoZWNhcnkKCiAgICBNeSBwb3ZlcnR5LCBidXQgbm90IG15IHdpbGwsIGNvbnNlbnRzLgoKUk9NRU8KCiAgICBJIHBheSB0aHkgcG92ZXJ0eSwgYW5kIG5vdCB0aHkgd2lsbC4KCkFwb3RoZWNhcnkKCiAgICBQdXQgdGhpcyBpbiBhbnkgbGlxdWlkIHRoaW5nIHlvdSB3aWxsLAogICAgQW5kIGRyaW5rIGl0IG9mZjsgYW5kLCBpZiB5b3UgaGFkIHRoZSBzdHJlbmd0aAogICAgT2YgdHdlbnR5IG1lbiwgaXQgd291bGQgZGlzcGF0Y2ggeW91IHN0cmFpZ2h0LgoKUk9NRU8KCiAgICBUaGVyZSBpcyB0aHkgZ29sZCwgd29yc2UgcG9pc29uIHRvIG1lbidzIHNvdWxzLAogICAgRG9pbmcgbW9yZSBtdXJkZXJzIGluIHRoaXMgbG9hdGhzb21lIHdvcmxkLAogICAgVGhhbiB0aGVzZSBwb29yIGNvbXBvdW5kcyB0aGF0IHRob3UgbWF5c3Qgbm90IHNlbGwuCiAgICBJIHNlbGwgdGhlZSBwb2lzb247IHRob3UgaGFzdCBzb2xkIG1lIG5vbmUuCiAgICBGYXJld2VsbDogYnV5IGZvb2QsIGFuZCBnZXQgdGh5c2VsZiBpbiBmbGVzaC4KICAgIENvbWUsIGNvcmRpYWwgYW5kIG5vdCBwb2lzb24sIGdvIHdpdGggbWUKICAgIFRvIEp1bGlldCdzIGdyYXZlOyBmb3IgdGhlcmUgbXVzdCBJIHVzZSB0aGVlLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBKT0hOIAoKRlJJQVIgSk9ITgoKICAgIEhvbHkgRnJhbmNpc2NhbiBmcmlhciEgYnJvdGhlciwgaG8hCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UKCkZSSUFSIExBVVJFTkNFCgogICAgVGhpcyBzYW1lIHNob3VsZCBiZSB0aGUgdm9pY2Ugb2YgRnJpYXIgSm9obi4KICAgIFdlbGNvbWUgZnJvbSBNYW50dWE6IHdoYXQgc2F5cyBSb21lbz8KICAgIE9yLCBpZiBoaXMgbWluZCBiZSB3cml0LCBnaXZlIG1lIGhpcyBsZXR0ZXIuCgpGUklBUiBKT0hOCgogICAgR29pbmcgdG8gZmluZCBhIGJhcmUtZm9vdCBicm90aGVyIG91dAogICAgT25lIG9mIG91ciBvcmRlciwgdG8gYXNzb2NpYXRlIG1lLAogICAgSGVyZSBpbiB0aGlzIGNpdHkgdmlzaXRpbmcgdGhlIHNpY2ssCiAgICBBbmQgZmluZGluZyBoaW0sIHRoZSBzZWFyY2hlcnMgb2YgdGhlIHRvd24sCiAgICBTdXNwZWN0aW5nIHRoYXQgd2UgYm90aCB3ZXJlIGluIGEgaG91c2UKICAgIFdoZXJlIHRoZSBpbmZlY3Rpb3VzIHBlc3RpbGVuY2UgZGlkIHJlaWduLAogICAgU2VhbCdkIHVwIHRoZSBkb29ycywgYW5kIHdvdWxkIG5vdCBsZXQgdXMgZm9ydGg7CiAgICBTbyB0aGF0IG15IHNwZWVkIHRvIE1hbnR1YSB0aGVyZSB3YXMgc3RheSdkLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXaG8gYmFyZSBteSBsZXR0ZXIsIHRoZW4sIHRvIFJvbWVvPwoKRlJJQVIgSk9ITgoKICAgIEkgY291bGQgbm90IHNlbmQgaXQsLS1oZXJlIGl0IGlzIGFnYWluLC0tCiAgICBOb3IgZ2V0IGEgbWVzc2VuZ2VyIHRvIGJyaW5nIGl0IHRoZWUsCiAgICBTbyBmZWFyZnVsIHdlcmUgdGhleSBvZiBpbmZlY3Rpb24uCgpGUklBUiBMQVVSRU5DRQoKICAgIFVuaGFwcHkgZm9ydHVuZSEgYnkgbXkgYnJvdGhlcmhvb2QsCiAgICBUaGUgbGV0dGVyIHdhcyBub3QgbmljZSBidXQgZnVsbCBvZiBjaGFyZ2UKICAgIE9mIGRlYXIgaW1wb3J0LCBhbmQgdGhlIG5lZ2xlY3RpbmcgaXQKICAgIE1heSBkbyBtdWNoIGRhbmdlci4gRnJpYXIgSm9obiwgZ28gaGVuY2U7CiAgICBHZXQgbWUgYW4gaXJvbiBjcm93LCBhbmQgYnJpbmcgaXQgc3RyYWlnaHQKICAgIFVudG8gbXkgY2VsbC4KCkZSSUFSIEpPSE4KCiAgICBCcm90aGVyLCBJJ2xsIGdvIGFuZCBicmluZyBpdCB0aGVlLgoKICAgIEV4aXQKCkZSSUFSIExBVVJFTkNFCgogICAgTm93IG11c3QgSSB0byB0aGUgbW9udW1lbnQgYWxvbmU7CiAgICBXaXRoaW4gdGhyZWUgaG91cnMgd2lsbCBmYWlyIEp1bGlldCB3YWtlOgogICAgU2hlIHdpbGwgYmVzaHJldyBtZSBtdWNoIHRoYXQgUm9tZW8KICAgIEhhdGggaGFkIG5vIG5vdGljZSBvZiB0aGVzZSBhY2NpZGVudHM7CiAgICBCdXQgSSB3aWxsIHdyaXRlIGFnYWluIHRvIE1hbnR1YSwKICAgIEFuZCBrZWVwIGhlciBhdCBteSBjZWxsIHRpbGwgUm9tZW8gY29tZTsKICAgIFBvb3IgbGl2aW5nIGNvcnNlLCBjbG9zZWQgaW4gYSBkZWFkIG1hbidzIHRvbWIhCgogICAgRXhpdAoKU0NFTkUgSUlJLiBBIGNodXJjaHlhcmQ7IGluIGl0IGEgdG9tYiBiZWxvbmdpbmcgdG8gdGhlIENhcHVsZXRzLgoKICAgIEVudGVyIFBBUklTLCBhbmQgaGlzIFBhZ2UgYmVhcmluZyBmbG93ZXJzIGFuZCBhIHRvcmNoIAoKUEFSSVMKCiAgICBHaXZlIG1lIHRoeSB0b3JjaCwgYm95OiBoZW5jZSwgYW5kIHN0YW5kIGFsb29mOgogICAgWWV0IHB1dCBpdCBvdXQsIGZvciBJIHdvdWxkIG5vdCBiZSBzZWVuLgogICAgVW5kZXIgeW9uZCB5ZXctdHJlZXMgbGF5IHRoZWUgYWxsIGFsb25nLAogICAgSG9sZGluZyB0aGluZSBlYXIgY2xvc2UgdG8gdGhlIGhvbGxvdyBncm91bmQ7CiAgICBTbyBzaGFsbCBubyBmb290IHVwb24gdGhlIGNodXJjaHlhcmQgdHJlYWQsCiAgICBCZWluZyBsb29zZSwgdW5maXJtLCB3aXRoIGRpZ2dpbmcgdXAgb2YgZ3JhdmVzLAogICAgQnV0IHRob3Ugc2hhbHQgaGVhciBpdDogd2hpc3RsZSB0aGVuIHRvIG1lLAogICAgQXMgc2lnbmFsIHRoYXQgdGhvdSBoZWFyJ3N0IHNvbWV0aGluZyBhcHByb2FjaC4KICAgIEdpdmUgbWUgdGhvc2UgZmxvd2Vycy4gRG8gYXMgSSBiaWQgdGhlZSwgZ28uCgpQQUdFCgogICAgW0FzaWRlXSBJIGFtIGFsbW9zdCBhZnJhaWQgdG8gc3RhbmQgYWxvbmUKICAgIEhlcmUgaW4gdGhlIGNodXJjaHlhcmQ7IHlldCBJIHdpbGwgYWR2ZW50dXJlLgoKICAgIFJldGlyZXMKClBBUklTCgogICAgU3dlZXQgZmxvd2VyLCB3aXRoIGZsb3dlcnMgdGh5IGJyaWRhbCBiZWQgSSBzdHJldywtLQogICAgTyB3b2UhIHRoeSBjYW5vcHkgaXMgZHVzdCBhbmQgc3RvbmVzOy0tCiAgICBXaGljaCB3aXRoIHN3ZWV0IHdhdGVyIG5pZ2h0bHkgSSB3aWxsIGRldywKICAgIE9yLCB3YW50aW5nIHRoYXQsIHdpdGggdGVhcnMgZGlzdGlsbCdkIGJ5IG1vYW5zOgogICAgVGhlIG9ic2VxdWllcyB0aGF0IEkgZm9yIHRoZWUgd2lsbCBrZWVwCiAgICBOaWdodGx5IHNoYWxsIGJlIHRvIHN0cmV3IHRoeSBncmF2ZSBhbmQgd2VlcC4KCiAgICBUaGUgUGFnZSB3aGlzdGxlcwogICAgVGhlIGJveSBnaXZlcyB3YXJuaW5nIHNvbWV0aGluZyBkb3RoIGFwcHJvYWNoLgogICAgV2hhdCBjdXJzZWQgZm9vdCB3YW5kZXJzIHRoaXMgd2F5IHRvLW5pZ2h0LAogICAgVG8gY3Jvc3MgbXkgb2JzZXF1aWVzIGFuZCB0cnVlIGxvdmUncyByaXRlPwogICAgV2hhdCB3aXRoIGEgdG9yY2ghIG11ZmZsZSBtZSwgbmlnaHQsIGF3aGlsZS4KCiAgICBSZXRpcmVzCgogICAgRW50ZXIgUk9NRU8gYW5kIEJBTFRIQVNBUiwgd2l0aCBhIHRvcmNoLCBtYXR0b2NrLCAmIGMKClJPTUVPCgogICAgR2l2ZSBtZSB0aGF0IG1hdHRvY2sgYW5kIHRoZSB3cmVuY2hpbmcgaXJvbi4KICAgIEhvbGQsIHRha2UgdGhpcyBsZXR0ZXI7IGVhcmx5IGluIHRoZSBtb3JuaW5nCiAgICBTZWUgdGhvdSBkZWxpdmVyIGl0IHRvIG15IGxvcmQgYW5kIGZhdGhlci4KICAgIEdpdmUgbWUgdGhlIGxpZ2h0OiB1cG9uIHRoeSBsaWZlLCBJIGNoYXJnZSB0aGVlLAogICAgV2hhdGUnZXIgdGhvdSBoZWFyJ3N0IG9yIHNlZXN0LCBzdGFuZCBhbGwgYWxvb2YsCiAgICBBbmQgZG8gbm90IGludGVycnVwdCBtZSBpbiBteSBjb3Vyc2UuCiAgICBXaHkgSSBkZXNjZW5kIGludG8gdGhpcyBiZWQgb2YgZGVhdGgsCiAgICBJcyBwYXJ0bHkgdG8gYmVob2xkIG15IGxhZHkncyBmYWNlOwogICAgQnV0IGNoaWVmbHkgdG8gdGFrZSB0aGVuY2UgZnJvbSBoZXIgZGVhZCBmaW5nZXIKICAgIEEgcHJlY2lvdXMgcmluZywgYSByaW5nIHRoYXQgSSBtdXN0IHVzZQogICAgSW4gZGVhciBlbXBsb3ltZW50OiB0aGVyZWZvcmUgaGVuY2UsIGJlIGdvbmU6CiAgICBCdXQgaWYgdGhvdSwgamVhbG91cywgZG9zdCByZXR1cm4gdG8gcHJ5CiAgICBJbiB3aGF0IEkgZnVydGhlciBzaGFsbCBpbnRlbmQgdG8gZG8sCiAgICBCeSBoZWF2ZW4sIEkgd2lsbCB0ZWFyIHRoZWUgam9pbnQgYnkgam9pbnQKICAgIEFuZCBzdHJldyB0aGlzIGh1bmdyeSBjaHVyY2h5YXJkIHdpdGggdGh5IGxpbWJzOgogICAgVGhlIHRpbWUgYW5kIG15IGludGVudHMgYXJlIHNhdmFnZS13aWxkLAogICAgTW9yZSBmaWVyY2UgYW5kIG1vcmUgaW5leG9yYWJsZSBmYXIKICAgIFRoYW4gZW1wdHkgdGlnZXJzIG9yIHRoZSByb2FyaW5nIHNlYS4KCkJBTFRIQVNBUgoKICAgIEkgd2lsbCBiZSBnb25lLCBzaXIsIGFuZCBub3QgdHJvdWJsZSB5b3UuCgpST01FTwoKICAgIFNvIHNoYWx0IHRob3Ugc2hvdyBtZSBmcmllbmRzaGlwLiBUYWtlIHRob3UgdGhhdDoKICAgIExpdmUsIGFuZCBiZSBwcm9zcGVyb3VzOiBhbmQgZmFyZXdlbGwsIGdvb2QgZmVsbG93LgoKQkFMVEhBU0FSCgogICAgW0FzaWRlXSBGb3IgYWxsIHRoaXMgc2FtZSwgSSdsbCBoaWRlIG1lIGhlcmVhYm91dDoKICAgIEhpcyBsb29rcyBJIGZlYXIsIGFuZCBoaXMgaW50ZW50cyBJIGRvdWJ0LgoKICAgIFJldGlyZXMKClJPTUVPCgogICAgVGhvdSBkZXRlc3RhYmxlIG1hdywgdGhvdSB3b21iIG9mIGRlYXRoLAogICAgR29yZ2VkIHdpdGggdGhlIGRlYXJlc3QgbW9yc2VsIG9mIHRoZSBlYXJ0aCwKICAgIFRodXMgSSBlbmZvcmNlIHRoeSByb3R0ZW4gamF3cyB0byBvcGVuLAogICAgQW5kLCBpbiBkZXNwaXRlLCBJJ2xsIGNyYW0gdGhlZSB3aXRoIG1vcmUgZm9vZCEKCiAgICBPcGVucyB0aGUgdG9tYgoKUEFSSVMKCiAgICBUaGlzIGlzIHRoYXQgYmFuaXNoJ2QgaGF1Z2h0eSBNb250YWd1ZSwKICAgIFRoYXQgbXVyZGVyJ2QgbXkgbG92ZSdzIGNvdXNpbiwgd2l0aCB3aGljaCBncmllZiwKICAgIEl0IGlzIHN1cHBvc2VkLCB0aGUgZmFpciBjcmVhdHVyZSBkaWVkOwogICAgQW5kIGhlcmUgaXMgY29tZSB0byBkbyBzb21lIHZpbGxhbm91cyBzaGFtZQogICAgVG8gdGhlIGRlYWQgYm9kaWVzOiBJIHdpbGwgYXBwcmVoZW5kIGhpbS4KCiAgICBDb21lcyBmb3J3YXJkCiAgICBTdG9wIHRoeSB1bmhhbGxvdydkIHRvaWwsIHZpbGUgTW9udGFndWUhCiAgICBDYW4gdmVuZ2VhbmNlIGJlIHB1cnN1ZWQgZnVydGhlciB0aGFuIGRlYXRoPwogICAgQ29uZGVtbmVkIHZpbGxhaW4sIEkgZG8gYXBwcmVoZW5kIHRoZWU6CiAgICBPYmV5LCBhbmQgZ28gd2l0aCBtZTsgZm9yIHRob3UgbXVzdCBkaWUuCgpST01FTwoKICAgIEkgbXVzdCBpbmRlZWQ7IGFuZCB0aGVyZWZvcmUgY2FtZSBJIGhpdGhlci4KICAgIEdvb2QgZ2VudGxlIHlvdXRoLCB0ZW1wdCBub3QgYSBkZXNwZXJhdGUgbWFuOwogICAgRmx5IGhlbmNlLCBhbmQgbGVhdmUgbWU6IHRoaW5rIHVwb24gdGhlc2UgZ29uZTsKICAgIExldCB0aGVtIGFmZnJpZ2h0IHRoZWUuIEkgYmVzZWVjaCB0aGVlLCB5b3V0aCwKICAgIFB1dCBub3QgYW5vdGhlciBzaW4gdXBvbiBteSBoZWFkLAogICAgQnkgdXJnaW5nIG1lIHRvIGZ1cnk6IE8sIGJlIGdvbmUhCiAgICBCeSBoZWF2ZW4sIEkgbG92ZSB0aGVlIGJldHRlciB0aGFuIG15c2VsZjsKICAgIEZvciBJIGNvbWUgaGl0aGVyIGFybSdkIGFnYWluc3QgbXlzZWxmOgogICAgU3RheSBub3QsIGJlIGdvbmU7IGxpdmUsIGFuZCBoZXJlYWZ0ZXIgc2F5LAogICAgQSBtYWRtYW4ncyBtZXJjeSBiYWRlIHRoZWUgcnVuIGF3YXkuCgpQQVJJUwoKICAgIEkgZG8gZGVmeSB0aHkgY29uanVyYXRpb25zLAogICAgQW5kIGFwcHJlaGVuZCB0aGVlIGZvciBhIGZlbG9uIGhlcmUuCgpST01FTwoKICAgIFdpbHQgdGhvdSBwcm92b2tlIG1lPyB0aGVuIGhhdmUgYXQgdGhlZSwgYm95IQoKICAgIFRoZXkgZmlnaHQKClBBR0UKCiAgICBPIExvcmQsIHRoZXkgZmlnaHQhIEkgd2lsbCBnbyBjYWxsIHRoZSB3YXRjaC4KCiAgICBFeGl0CgpQQVJJUwoKICAgIE8sIEkgYW0gc2xhaW4hCgogICAgRmFsbHMKICAgIElmIHRob3UgYmUgbWVyY2lmdWwsCiAgICBPcGVuIHRoZSB0b21iLCBsYXkgbWUgd2l0aCBKdWxpZXQuCgogICAgRGllcwoKUk9NRU8KCiAgICBJbiBmYWl0aCwgSSB3aWxsLiBMZXQgbWUgcGVydXNlIHRoaXMgZmFjZS4KICAgIE1lcmN1dGlvJ3Mga2luc21hbiwgbm9ibGUgQ291bnR5IFBhcmlzIQogICAgV2hhdCBzYWlkIG15IG1hbiwgd2hlbiBteSBiZXRvc3NlZCBzb3VsCiAgICBEaWQgbm90IGF0dGVuZCBoaW0gYXMgd2Ugcm9kZT8gSSB0aGluawogICAgSGUgdG9sZCBtZSBQYXJpcyBzaG91bGQgaGF2ZSBtYXJyaWVkIEp1bGlldDoKICAgIFNhaWQgaGUgbm90IHNvPyBvciBkaWQgSSBkcmVhbSBpdCBzbz8KICAgIE9yIGFtIEkgbWFkLCBoZWFyaW5nIGhpbSB0YWxrIG9mIEp1bGlldCwKICAgIFRvIHRoaW5rIGl0IHdhcyBzbz8gTywgZ2l2ZSBtZSB0aHkgaGFuZCwKICAgIE9uZSB3cml0IHdpdGggbWUgaW4gc291ciBtaXNmb3J0dW5lJ3MgYm9vayEKICAgIEknbGwgYnVyeSB0aGVlIGluIGEgdHJpdW1waGFudCBncmF2ZTsKICAgIEEgZ3JhdmUIE8gbm8hIGEgbGFudGVybiwgc2xhdWdodGVyJ2QgeW91dGgsCiAgICBGb3IgaGVyZSBsaWVzIEp1bGlldCwgYW5kIGhlciBiZWF1dHkgbWFrZXMKICAgIFRoaXMgdmF1bHQgYSBmZWFzdGluZyBwcmVzZW5jZSBmdWxsIG9mIGxpZ2h0LgogICAgRGVhdGgsIGxpZSB0aG91IHRoZXJlLCBieSBhIGRlYWQgbWFuIGludGVycidkLgoKICAgIExheWluZyBQQVJJUyBpbiB0aGUgdG9tYgogICAgSG93IG9mdCB3aGVuIG1lbiBhcmUgYXQgdGhlIHBvaW50IG9mIGRlYXRoCiAgICBIYXZlIHRoZXkgYmVlbiBtZXJyeSEgd2hpY2ggdGhlaXIga2VlcGVycyBjYWxsCiAgICBBIGxpZ2h0bmluZyBiZWZvcmUgZGVhdGg6IE8sIGhvdyBtYXkgSQogICAgQ2FsbCB0aGlzIGEgbGlnaHRuaW5nPyBPIG15IGxvdmUhIG15IHdpZmUhCiAgICBEZWF0aCwgdGhhdCBoYXRoIHN1Y2snZCB0aGUgaG9uZXkgb2YgdGh5IGJyZWF0aCwKICAgIEhhdGggaGFkIG5vIHBvd2VyIHlldCB1cG9uIHRoeSBiZWF1dHk6CiAgICBUaG91IGFydCBub3QgY29ucXVlcidkOyBiZWF1dHkncyBlbnNpZ24geWV0CiAgICBJcyBjcmltc29uIGluIHRoeSBsaXBzIGFuZCBpbiB0aHkgY2hlZWtzLAogICAgQW5kIGRlYXRoJ3MgcGFsZSBmbGFnIGlzIG5vdCBhZHZhbmNlZCB0aGVyZS4KICAgIFR5YmFsdCwgbGllc3QgdGhvdSB0aGVyZSBpbiB0aHkgYmxvb2R5IHNoZWV0PwogICAgTywgd2hhdCBtb3JlIGZhdm91ciBjYW4gSSBkbyB0byB0aGVlLAogICAgVGhhbiB3aXRoIHRoYXQgaGFuZCB0aGF0IGN1dCB0aHkgeW91dGggaW4gdHdhaW4KICAgIFRvIHN1bmRlciBoaXMgdGhhdCB3YXMgdGhpbmUgZW5lbXkCiAgICBGb3JnaXZlIG1lLCBjb3VzaW4hIEFoLCBkZWFyIEp1bGlldCwKICAgIFdoeSBhcnQgdGhvdSB5ZXQgc28gZmFpcj8gc2hhbGwgSSBiZWxpZXZlCiAgICBUaGF0IHVuc3Vic3RhbnRpYWwgZGVhdGggaXMgYW1vcm91cywKICAgIEFuZCB0aGF0IHRoZSBsZWFuIGFiaG9ycmVkIG1vbnN0ZXIga2VlcHMKICAgIFRoZWUgaGVyZSBpbiBkYXJrIHRvIGJlIGhpcyBwYXJhbW91cj8KICAgIEZvciBmZWFyIG9mIHRoYXQsIEkgc3RpbGwgd2lsbCBzdGF5IHdpdGggdGhlZTsKICAgIEFuZCBuZXZlciBmcm9tIHRoaXMgcGFsYWNlIG9mIGRpbSBuaWdodAogICAgRGVwYXJ0IGFnYWluOiBoZXJlLCBoZXJlIHdpbGwgSSByZW1haW4KICAgIFdpdGggd29ybXMgdGhhdCBhcmUgdGh5IGNoYW1iZXItbWFpZHM7IE8sIGhlcmUKICAgIFdpbGwgSSBzZXQgdXAgbXkgZXZlcmxhc3RpbmcgcmVzdCwKICAgIEFuZCBzaGFrZSB0aGUgeW9rZSBvZiBpbmF1c3BpY2lvdXMgc3RhcnMKICAgIEZyb20gdGhpcyB3b3JsZC13ZWFyaWVkIGZsZXNoLiBFeWVzLCBsb29rIHlvdXIgbGFzdCEKICAgIEFybXMsIHRha2UgeW91ciBsYXN0IGVtYnJhY2UhIGFuZCwgbGlwcywgTyB5b3UKICAgIFRoZSBkb29ycyBvZiBicmVhdGgsIHNlYWwgd2l0aCBhIHJpZ2h0ZW91cyBraXNzCiAgICBBIGRhdGVsZXNzIGJhcmdhaW4gdG8gZW5ncm9zc2luZyBkZWF0aCEKICAgIENvbWUsIGJpdHRlciBjb25kdWN0LCBjb21lLCB1bnNhdm91cnkgZ3VpZGUhCiAgICBUaG91IGRlc3BlcmF0ZSBwaWxvdCwgbm93IGF0IG9uY2UgcnVuIG9uCiAgICBUaGUgZGFzaGluZyByb2NrcyB0aHkgc2VhLXNpY2sgd2VhcnkgYmFyayEKICAgIEhlcmUncyB0byBteSBsb3ZlIQoKICAgIERyaW5rcwogICAgTyB0cnVlIGFwb3RoZWNhcnkhCiAgICBUaHkgZHJ1Z3MgYXJlIHF1aWNrLiBUaHVzIHdpdGggYSBraXNzIEkgZGllLgoKICAgIERpZXMKCiAgICBFbnRlciwgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgY2h1cmNoeWFyZCwgRlJJQVIgTEFVUkVOQ0UsIHdpdGggYSBsYW50ZXJuLCBjcm93LCBhbmQgc3BhZGUKCkZSSUFSIExBVVJFTkNFCgogICAgU2FpbnQgRnJhbmNpcyBiZSBteSBzcGVlZCEgaG93IG9mdCB0by1uaWdodAogICAgSGF2ZSBteSBvbGQgZmVldCBzdHVtYmxlZCBhdCBncmF2ZXMhIFdobydzIHRoZXJlPwoKQkFMVEhBU0FSCgogICAgSGVyZSdzIG9uZSwgYSBmcmllbmQsIGFuZCBvbmUgdGhhdCBrbm93cyB5b3Ugd2VsbC4KCkZSSUFSIExBVVJFTkNFCgogICAgQmxpc3MgYmUgdXBvbiB5b3UhIFRlbGwgbWUsIGdvb2QgbXkgZnJpZW5kLAogICAgV2hhdCB0b3JjaCBpcyB5b25kLCB0aGF0IHZhaW5seSBsZW5kcyBoaXMgbGlnaHQKICAgIFRvIGdydWJzIGFuZCBleWVsZXNzIHNrdWxscz8gYXMgSSBkaXNjZXJuLAogICAgSXQgYnVybmV0aCBpbiB0aGUgQ2FwZWwncyBtb251bWVudC4KCkJBTFRIQVNBUgoKICAgIEl0IGRvdGggc28sIGhvbHkgc2lyOyBhbmQgdGhlcmUncyBteSBtYXN0ZXIsCiAgICBPbmUgdGhhdCB5b3UgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2hvIGlzIGl0PwoKQkFMVEhBU0FSCgogICAgUm9tZW8uCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvdyBsb25nIGhhdGggaGUgYmVlbiB0aGVyZT8KCkJBTFRIQVNBUgoKICAgIEZ1bGwgaGFsZiBhbiBob3VyLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHbyB3aXRoIG1lIHRvIHRoZSB2YXVsdC4KCkJBTFRIQVNBUgoKICAgIEkgZGFyZSBub3QsIHNpcgogICAgTXkgbWFzdGVyIGtub3dzIG5vdCBidXQgSSBhbSB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CwgYm95OiB3aGljaCB3YXkCgpKVUxJRVQKCiAgICBZZWEsIG5vaXNlPyB0aGVuIEknbGwgYmUgYnJpZWYuIE8gaGFwcHkgZGFnZ2VyIQoKICAgIFNuYXRjaGluZyBST01FTydzIGRhZ2dlcgogICAgVGhpcyBpcyB0aHkgc2hlYXRoOwoKICAgIFN0YWJzIGhlcnNlbGYKICAgIHRoZXJlIHJ1c3QsIGFuZCBsZXQgbWUgZGllLgoKICAgIEZhbGxzIG9uIFJPTUVPJ3MgYm9keSwgYW5kIGRpZXMKCiAgICBFbnRlciBXYXRjaCwgd2l0aCB0aGUgUGFnZSBvZiBQQVJJUwoKUEFHRQoKICAgIFRoaXMgaXMgdGhlIHBsYWNlOyB0aGVyZSwgd2hlcmUgdGhlIHRvcmNoIGRvdGggYnVybi4KCkZpcnN0IFdhdGNobWFuCgogICAgVGhlIGdyb3VuZCBpcyBibG9vZHk7IHNlYXJjaCBhYm91dCB0aGUgY2h1cmNoeWFyZDoKICAgIEdvLCBzb21lIG9mIHlvdSwgd2hvZSdlciB5b3UgZmluZCBhdHRhY2guCiAgICBQaXRpZnVsIHNpZ2h0ISBoZXJlIGxpZXMgdGhlIGNvdW50eSBzbGFpbiwKICAgIEFuZCBKdWxpZXQgYmxlZWRpbmcsIHdhcm0sIGFuZCBuZXdseSBkZWFkLAogICAgV2hvIGhlcmUgaGF0aCBsYWluIHRoZXNlIHR3byBkYXlzIGJ1cmllZC4KICAgIEdvLCB0ZWxsIHRoZSBwcmluY2U6IHJ1biB0byB0aGUgQ2FwdWxldHM6CiAgICBSYWlzZSB1cCB0aGUgTW9udGFndWVzOiBzb21lIG90aGVycyBzZWFyY2g6CiAgICBXZSBzZWUgdGhlIGdyb3VuZCB3aGVyZW9uIHRoZXNlIHdvZXMgZG8gbGllOwogICAgQnV0IHRoZSB0cnVlIGdyb3VuZCBvZiBhbGwgdGhlc2UgcGl0ZW91cyB3b2VzCiAgICBXZSBjYW5ub3Qgd2l0aG91dCBjaXJjdW1zdGFuY2UgZGVzY3J5LgoKICAgIFJlLWVudGVyIHNvbWUgb2YgdGhlIFdhdGNoLCB3aXRoIEJBTFRIQVNBUgoKU2Vjb25kIFdhdGNobWFuCgogICAgSGVyZSdzIFJvbWVvJ3MgbWFuOyB3ZSBmb3VuZCBoaW0gaW4gdGhlIGNodXJjaHlhcmQuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhvbGQgaGltIGluIHNhZmV0eSwgdGlsbCB0aGUgcHJpbmNlIGNvbWUgaGl0aGVyLgoKICAgIFJlLWVudGVyIG90aGVycyBvZiB0aGUgV2F0Y2gsIHdpdGggRlJJQVIgTEFVUkVOQ0UKClRoaXJkIFdhdGNobWFuCgogICAgSGVyZSBpcyBhIGZyaWFyLCB0aGF0IHRyZW1ibGVzLCBzaWdocyBhbmQgd2VlcHM6CiAgICBXZSB0b29rIHRoaXMgbWF0dG9jayBhbmQgdGhpcyBzcGFkZSBmcm9tIGhpbSwKICAgIEFzIGhlIHdhcyBjb21pbmcgZnJvbSB0aGlzIGNodXJjaHlhcmQgc2lkZS4KCkZpcnN0IFdhdGNobWFuCgogICAgQSBncmVhdCBzdXNwaWNpb246IHN0YXkgdGhlIGZyaWFyIHRvby4KCiAgICBFbnRlciB0aGUgUFJJTkNFIGFuZCBBdHRlbmRhbnRzCgpQUklOQ0UKCiAgICBXaGF0IG1pc2FkdmVudHVyZSBpcyBzbyBlYXJseSB1cCwKICAgIFRoYXQgY2FsbHMgb3VyIHBlcnNvbiBmcm9tIG91ciBtb3JuaW5nJ3MgcmVzdD8KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIGFuZCBvdGhlcnMKCkNBUFVMRVQKCiAgICBXaGF0IHNob3VsZCBpdCBiZSwgdGhhdCB0aGV5IHNvIHNocmllayBhYnJvYWQCgpMQURZIENBUFVMRVQKCiAgICBUaGUgcGVvcGxlIGluIHRoZSBzdHJlZXQgY3J5IFJvbWVvLAogICAgU29tZSBKdWxpZXQsIGFuZCBzb21lIFBhcmlzOyBhbmQgYWxsIHJ1biwKICAgIFdpdGggb3BlbiBvdXRjcnkgdG93YXJkIG91ciBtb251bWVudC4KClBSSU5DRQoKICAgIFdoYXQgZmVhciBpcyB0aGlzIHdoaWNoIHN0YXJ0bGVzIGluIG91ciBlYXJzPwoKRmlyc3QgV2F0Y2htYW4KCiAgICBTb3ZlcmVpZ24sIGhlcmUgbGllcyB0aGUgQ291bnR5IFBhcmlzIHNsYWluOwogICAgQW5kIFJvbWVvIGRlYWQ7IGFuZCBKdWxpZXQsIGRlYWQgYmVmb3JlLAogICAgV2FybSBhbmQgbmV3IGtpbGwnZC4KClBSSU5DRQoKICAgIFNlYXJjaCwgc2VlaywgYW5kIGtub3cgaG93IHRoaXMgZm91bCBtdXJkZXIgY29tZXMuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhlcmUgaXMgYSBmcmlhciwgYW5kIHNsYXVnaHRlcidkIFJvbWVvJ3MgbWFuOwogICAgV2l0aCBpbnN0cnVtZW50cyB1cG9uIHRoZW0sIGZpdCB0byBvcGVuCiAgICBUaGVzZSBkZWFkIG1lbidzIHRvbWJzLgoKQ0FQVUxFVAoKICAgIE8gaGVhdmVucyEgTyB3aWZlLCBsb29rIGhvdyBvdXIgZGF1Z2h0ZXIgYmxlZWRzIQogICAgVGhpcyBkYWdnZXIgaGF0aCBtaXN0YSdlbi0tZm9yLCBsbywgaGlzIGhvdXNlCiAgICBJcyBlbXB0eSBvbiB0aGUgYmFjayBvZiBNb250YWd1ZSwtLQogICAgQW5kIGl0IG1pcy1zaGVhdGhlZCBpbiBteSBkYXVnaHRlcidzIGJvc29tIQoKTEFEWSBDQVBVTEVUCgogICAgTyBtZSEgdGhpcyBzaWdodCBvZiBkZWF0aCBpcyBhcyBhIGJlbGwsCiAgICBUaGF0IHdhcm5zIG15IG9sZCBhZ2UgdG8gYSBzZXB1bGNocmUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIG90aGVycwoKUFJJTkNFCgogICAgQ29tZSwgTW9udGFndWU7IGZvciB0aG91IGFydCBlYXJseSB1cCwKICAgIFRvIHNlZSB0aHkgc29uIGFuZCBoZWlyIG1vcmUgZWFybHkgZG93bi4KCk1PTlRBR1VFCgogICAgQWxhcywgbXkgbGllZ2UsIG15IHdpZmUgaXMgZGVhZCB0by1uaWdodDsKICAgIEdyaWVmIG9mIG15IHNvbidzIGV4aWxlIGhhdGggc3RvcHAnZCBoZXIgYnJlYXRoOgogICAgV2hhdCBmdXJ0aGVyIHdvZSBjb25zcGlyZXMgYWdhaW5zdCBtaW5lIGFnZT8KClBSSU5DRQoKICAgIExvb2ssIGFuZCB0aG91IHNoYWx0IHNlZS4KCk1PTlRBR1VFCgogICAgTyB0aG91IHVudGF1Z2h0ISB3aGF0IG1hbm5lcnMgaXMgaW4gdGhpcz8KICAgIFRvIHByZXNzIGJlZm9yZSB0aHkgZmF0aGVyIHRvIGEgZ3JhdmUCgpQUklOQ0UKCiAgICBTZWFsIHVwIHRoZSBtb3V0aCBvZiBvdXRyYWdlIGZvciBhIHdoaWxlLAogICAgVGlsbCB3ZSBjYW4gY2xlYXIgdGhlc2UgYW1iaWd1aXRpZXMsCiAgICBBbmQga25vdyB0aGVpciBzcHJpbmcsIHRoZWlyIGhlYWQsIHRoZWlyCiAgICB0cnVlIGRlc2NlbnQ7CiAgICBBbmQgdGhlbiB3aWxsIEkgYmUgZ2VuZXJhbCBvZiB5b3VyIHdvZXMsCiAgICBBbmQgbGVhZCB5b3UgZXZlbiB0byBkZWF0aDogbWVhbnRpbWUgZm9yYmVhciwKICAgIEFuZCBsZXQgbWlzY2hhbmNlIGJlIHNsYXZlIHRvIHBhdGllbmNlLgogICAgQnJpbmcgZm9ydGggdGhlIHBhcnRpZXMgb2Ygc3VzcGljaW9uLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJIGFtIHRoZSBncmVhdGVzdCwgYWJsZSB0byBkbyBsZWFzdCwKICAgIFlldCBtb3N0IHN1c3BlY3RlZCwgYXMgdGhlIHRpbWUgYW5kIHBsYWNlCiAgICBEb3RoIG1ha2UgYWdhaW5zdCBtZSBvZiB0aGlzIGRpcmVmdWwgbXVyZGVyOwogICAgQW5kIGhlcmUgSSBzdGFuZCwgYm90aCB0byBpbXBlYWNoIGFuZCBwdXJnZQogICAgTXlzZWxmIGNvbmRlbW5lZCBhbmQgbXlzZWxmIGV4Y3VzZWQuCgpQUklOQ0UKCiAgICBUaGVuIHNheSBhdCBvbmNlIHdoYXQgdGhvdSBkb3N0IGtub3cgaW4gdGhpcy4KCkZSSUFSIExBVVJFTkNFCgogICAgSSB3aWxsIGJlIGJyaWVmLCBmb3IgbXkgc2hvcnQgZGF0ZSBvZiBicmVhdGgKICAgIElzIG5vdCBzbyBsb25nIGFzIGlzIGEgdGVkaW91cyB0YWxlLgogICAgUm9tZW8sIHRoZXJlIGRlYWQsIHdhcyBodXNiYW5kIHRvIHRoYXQgSnVsaWV0OwogICAgQW5kIHNoZSwgdGhlcmUgZGVhZCwgdGhhdCBSb21lbydzIGZhaXRoZnVsIHdpZmU6CiAgICBJIG1hcnJpZWQgdGhlbTsgYW5kIHRoZWlyIHN0b2wnbiBtYXJyaWFnZS1kYXkKICAgIFdhcyBUeWJhbHQncyBkb29tcy1kYXksIHdob3NlIHVudGltZWx5IGRlYXRoCiAgICBCYW5pc2gnZCB0aGUgbmV3LW1hZGUgYnJpZGVncm9vbSBmcm9tIHRoZSBjaXR5LAogICAgRm9yIHdob20sIGFuZCBub3QgZm9yIFR5YmFsdCwgSnVsaWV0IHBpbmVkLgogICAgWW91LCB0byByZW1vdmUgdGhhdCBzaWVnZSBvZiBncmllZiBmcm9tIGhlciwKICAgIEJldHJvdGgnZCBhbmQgd291bGQgaGF2ZSBtYXJyaWVkIGhlciBwZXJmb3JjZQogICAgVG8gQ291bnR5IFBhcmlzOiB0aGVuIGNvbWVzIHNoZSB0byBtZSwKICAgIEFuZCwgd2l0aCB3aWxkIGxvb2tzLCBiaWQgbWUgZGV2aXNlIHNvbWUgbWVhbgogICAgVG8gcmlkIGhlciBmcm9tIHRoaXMgc2Vjb25kIG1hcnJpYWdlLAogICAgT3IgaW4gbXkgY2VsbCB0aGVyZSB3b3VsZCBzaGUga2lsbCBoZXJzZWxmLgogICAgVGhlbiBnYXZlIEkgaGVyLCBzbyB0dXRvcidkIGJ5IG15IGFydCwKICAgIEEgc2xlZXBpbmcgcG90aW9uOyB3aGljaCBzbyB0b29rIGVmZmVjdAogICAgQXMgSSBpbnRlbmRlZCwgZm9yIGl0IHdyb3VnaHQgb24gaGVyCiAgICBUaGUgZm9ybSBvZiBkZWF0aDogbWVhbnRpbWUgSSB3cml0IHRvIFJvbWVvLAogICAgVGhhdCBoZSBzaG91bGQgaGl0aGVyIGNvbWUgYXMgdGhpcyBkaXJlIG5pZ2h0LAogICAgVG8gaGVscCB0byB0YWtlIGhlciBmcm9tIGhlciBib3Jyb3cnZCBncmF2ZSwKICAgIEJlaW5nIHRoZSB0aW1lIHRoZSBwb3Rpb24ncyBmb3JjZSBzaG91bGQgY2Vhc2UuCiAgICBCdXQgaGUgd2hpY2ggYm9yZSBteSBsZXR0ZXIsIEZyaWFyIEpvaG4sCiAgICBXYXMgc3RheSdkIGJ5IGFjY2lkZW50LCBhbmQgeWVzdGVybmlnaHQKICAgIFJldHVybidkIG15IGxldHRlciBiYWNrLiBUaGVuIGFsbCBhbG9uZQogICAgQXQgdGhlIHByZWZpeGVkIGhvdXIgb2YgaGVyIHdha2luZywKICAgIENhbWUgSSB0byB0YWtlIGhlciBmcm9tIGhlciBraW5kcmVkJ3MgdmF1bHQ7CiAgICBNZWFuaW5nIHRvIGtlZXAgaGVyIGNsb3NlbHkgYXQgbXkgY2VsbCwKICAgIFRpbGwgSSBjb252ZW5pZW50bHkgY291bGQgc2VuZCB0byBSb21lbzoKICAgIEJ1dCB3aGVuIEkgY2FtZSwgc29tZSBtaW51dGUgZXJlIHRoZSB0aW1lCiAgICBPZiBoZXIgYXdha2luZywgaGVyZSB1bnRpbWVseSBsYXkKICAgIFRoZSBub2JsZSBQYXJpcyBhbmQgdHJ1ZSBSb21lbyBkZWFkLgogICAgU2hlIHdha2VzOyBhbmQgSSBlbnRyZWF0ZWQgaGVyIGNvbWUgZm9ydGgsCiAgICBBbmQgYmVhciB0aGlzIHdvcmsgb2YgaGVhdmVuIHdpdGggcGF0aWVuY2U6CiAgICBCdXQgdGhlbiBhIG5vaXNlIGRpZCBzY2FyZSBtZSBmcm9tIHRoZSB0b21iOwogICAgQW5kIHNoZSwgdG9vIGRlc3BlcmF0ZSwgd291bGQgbm90IGdvIHdpdGggbWUsCiAgICBCdXQsIGFzIGl0IHNlZW1zLCBkaWQgdmlvbGVuY2Ugb24gaGVyc2VsZi4KICAgIEFsbCB0aGlzIEkga25vdzsgYW5kIHRvIHRoZSBtYXJyaWFnZQogICAgSGVyIG51cnNlIGlzIHByaXZ5OiBhbmQsIGlmIGF1Z2h0IGluIHRoaXMKICAgIE1pc2NhcnJpZWQgYnkgbXkgZmF1bHQsIGxldCBteSBvbGQgbGlmZQogICAgQmUgc2FjcmlmaWNlZCwgc29tZSBob3VyIGJlZm9yZSBoaXMgdGltZSwKICAgIFVudG8gdGhlIHJpZ291ciBvZiBzZXZlcmVzdCBsYXcuCgpQUklOQ0UKCiAgICBXZSBzdGlsbCBoYXZlIGtub3duIHRoZWUgZm9yIGEgaG9seSBtYW4uCiAgICBXaGVyZSdzIFJvbWVvJ3MgbWFuPyB3aGF0IGNhbiBoZSBzYXkgaW4gdGhpcz8KCkJBTFRIQVNBUgoKICAgIEkgYnJvdWdodCBteSBtYXN0ZXIgbmV3cyBvZiBKdWxpZXQncyBkZWF0aDsKICAgIEFuZCB0aGVuIGluIHBvc3QgaGUgY2FtZSBmcm9tIE1hbnR1YQogICAgVG8gdGhpcyBzYW1lIHBsYWNlLCB0byB0aGlzIHNhbWUgbW9udW1lbnQuCiAgICBUaGlzIGxldHRlciBoZSBlYXJseSBiaWQgbWUgZ2l2ZSBoaXMgZmF0aGVyLAogICAgQW5kIHRocmVhdGVuZWQgbWUgd2l0aCBkZWF0aCwgZ29pbmcgaW4gdGhlIHZhdWx0LAogICAgSSBkZXBhcnRlZCBub3QgYW5kIGxlZnQgaGltIHRoZXJlLgoKUFJJTkNFCgogICAgR2l2ZSBtZSB0aGUgbGV0dGVyOyBJIHdpbGwgbG9vayBvbiBpdC4KICAgIFdoZXJlIGlzIHRoZSBjb3VudHkncyBwYWdlLCB0aGF0IHJhaXNlZCB0aGUgd2F0Y2gCiAgICBTaXJyYWgsIHdoYXQgbWFkZSB5b3VyIG1hc3RlciBpbiB0aGlzIHBsYWNlPwoKUEFHRQoKICAgIEhlIGNhbWUgd2l0aCBmbG93ZXJzIHRvIHN0cmV3IGhpcyBsYWR5J3MgZ3JhdmU7CiAgICBBbmQgYmlkIG1lIHN0YW5kIGFsb29mLCBhbmQgc28gSSBkaWQ6CiAgICBBbm9uIGNvbWVzIG9uZSB3aXRoIGxpZ2h0IHRvIG9wZSB0aGUgdG9tYjsKICAgIEFuZCBieSBhbmQgYnkgbXkgbWFzdGVyIGRyZXcgb24gaGltOwogICAgQW5kIHRoZW4gSSByYW4gYXdheSB0byBjYWxsIHRoZSB3YXRjaC4KClBSSU5DRQoKICAgIFRoaXMgbGV0dGVyIGRvdGggbWFrZSBnb29kIHRoZSBmcmlhcidzIHdvcmRzLAogICAgVGhlaXIgY291cnNlIG9mIGxvdmUsIHRoZSB0aWRpbmdzIG9mIGhlciBkZWF0aDoKICAgIEFuZCBoZXJlIGhlIHdyaXRlcyB0aGF0IGhlIGRpZCBidXkgYSBwb2lzb24KICAgIE9mIGEgcG9vciAncG90aGVjYXJ5LCBhbmQgdGhlcmV3aXRoYWwKICAgIENhbWUgdG8gdGhpcyB2YXVsdCB0byBkaWUsIGFuZCBsaWUgd2l0aCBKdWxpZXQuCiAgICBXaGVyZSBiZSB0aGVzZSBlbmVtaWVzPyBDYXB1bGV0ISBNb250YWd1ZSEKICAgIFNlZSwgd2hhdCBhIHNjb3VyZ2UgaXMgbGFpZCB1cG9uIHlvdXIgaGF0ZSwKICAgIFRoYXQgaGVhdmVuIGZpbmRzIG1lYW5zIHRvIGtpbGwgeW91ciBqb3lzIHdpdGggbG92ZS4KICAgIEFuZCBJIGZvciB3aW5raW5nIGF0IHlvdXIgZGlzY29yZHMgdG9vCiAgICBIYXZlIGxvc3QgYSBicmFjZSBvZiBraW5zbWVuOiBhbGwgYXJlIHB1bmlzaCdkLgoKQ0FQVUxFVAoKICAgIE8gYnJvdGhlciBNb250YWd1ZSwgZ2l2ZSBtZSB0aHkgaGFuZDoKICAgIFRoaXMgaXMgbXkgZGF1Z2h0ZXIncyBqb2ludHVyZSwgZm9yIG5vIG1vcmUKICAgIENhbiBJIGRlbWFuZC4KCk1PTlRBR1VFCgogICAgQnV0IEkgY2FuIGdpdmUgdGhlZSBtb3JlOgogICAgRm9yIEkgd2lsbCByYWlzZSBoZXIgc3RhdHVlIGluIHB1cmUgZ29sZDsKICAgIFRoYXQgd2hpbGUgVmVyb25hIGJ5IHRoYXQgbmFtZSBpcyBrbm93biwKICAgIFRoZXJlIHNoYWxsIG5vIGZpZ3VyZSBhdCBzdWNoIHJhdGUgYmUgc2V0CiAgICBBcyB0aGF0IG9mIHRydWUgYW5kIGZhaXRoZnVsIEp1bGlldC4KCkNBUFVMRVQKCiAgICBBcyByaWNoIHNoYWxsIFJvbWVvJ3MgYnkgaGlzIGxhZHkncyBsaWU7CiAgICBQb29yIHNhY3JpZmljZXMgb2Ygb3VyIGVubWl0eSEKClBSSU5DRQoKICAgIEEgZ2xvb21pbmcgcGVhY2UgdGhpcyBtb3JuaW5nIHdpdGggaXQgYnJpbmdzOwogICAgVGhlIHN1biwgZm9yIHNvcnJvdywgd2lsbCBub3Qgc2hvdyBoaXMgaGVhZDoKICAgIEdvIGhlbmNlLCB0byBoYXZlIG1vcmUgdGFsayBvZiB0aGVzZSBzYWQgdGhpbmdzOwogICAgU29tZSBzaGFsbCBiZSBwYXJkb24nZCwgYW5kIHNvbWUgcHVuaXNoZWQ6CiAgICBGb3IgbmV2ZXIgd2FzIGEgc3Rvcnkgb2YgbW9yZSB3b2UKICAgIFRoYW4gdGhpcyBvZiBKdWxpZXQgYW5kIGhlciBSb21lby4KCiAgICBFeGV1bnQK

Chuck Cartledge
Chuck Cartledge
Chuck Cartledge

httpantonio-ferraroeupnword-clouds-in-r-packages-wordcloud2-and-tmrm(list=ls())library(wordcloud2)library(NLP)library(tm)library(RCurl) Necessary steps 1 Use imagesgooglecom to find an outline of the shape to fill (tmpusapng) 2 Use gimp to fill the outline with black 3 Use a command like wordcloud2(TDMasDF size = 20 figPath=tmpusapng backgroundColor = white fontFamily=Loma) to populate shape 4 Result is a web page with javascript embedded to create image and allow mouse overs Clean corpuscleanCorpus lt- function(corpus) corpustmp lt- tm_map(corpus removePunctuation) corpustmp lt- tm_map(corpustmpstripWhitespace) corpustmp lt- tm_map(corpustmptolower) corpustmp lt- tm_map(corpustmp PlainTextDocument) corpustmp lt- tm_map(corpustmpremoveWords stopwords(english)) return(corpustmp) Build TDMgenerateTDM lt- function(path) sdir lt-path scor lt-Corpus(DirSource(directory = sdir encoding= UTF-8)) scorcl lt- cleanCorpus(scor) stdm lt- TermDocumentMatrix(scorcl) stdminitData lt- function(path) if (direxists(path) == FALSE) If the directory does not exist create and populate with dummy data dummyDataFile lt- romeoAndJulietbase64 fileName lt- sprintf(sdummyDatatxt path) print(sprintf(Creating and populating the file s with dummy data fileName)) dircreate(path recursive = TRUE) write(base64( paste( readLines(dummyDataFile) collapse=) encode=FALSE) file=fileName) main lt- function() options(stringsAsFactors = FALSE) The working directory pathName lt- Text initData(pathName) Get the Term Document Matrix TDM lt- generateTDM(pathName) Do I need a matrix or a DF We will see TDMasMatrix lt- asmatrix(TDM) TDMasDFlt-dataframe(TDMasMatrix) TDMasDF$words lt-rownames(TDMasDF) Column headers colnames(TDMasDF) lt- c(freq word) TDMasDFlt-TDMasDF[ c(word freq)] TDMasDF lt- TDMasDF[order(TDMasDF$freqdecreasing=TRUE)] The results a lt- wordcloud2(TDMasDF size = 03 shape=star backgroundColor = black fontFamily=Loma) print(a) a lt- letterCloud(TDMasDF word=USA size = 03 fontFamily=Loma backgroundColor = black) print(a) a lt- wordcloud2(TDMasDF size = 13 figPath=heartpng backgroundColor = white fontFamily=Loma color=red) print(a) TDMasDF$freq lt- log(TDMasDF$freq) a lt- wordcloud2(TDMasDF size = 12 figPath=usapng backgroundColor = white shuffle=FALSE minRotation = 0 maxRotation = 2pi) print(a) print(The program has ended)main()

Chuck Cartledge
Page 4: Creating Shaped Wordclouds Using R - clc-ent.comThe wordcloud2 function behaves slightly di erently than most of the other R plot func-tions that I’ve used. The result from both

Figure 2 A more interesting word cloud based on Romeo and Juliette The image wascreated using wordcloud2 function in the wordcloud2 library and the text from ldquoRomeo andJulietrdquo

3

Figure 3 An empty word cloud figure

4

Figure 4 A filled word cloud figure

5

Figure 5 A filled USA word cloud figure

The wordcloud2 function behaves slightly differently than most of the other R plot func-tions that Irsquove used The result from both wordcloud2 and letterCloud is not displayablewithin R These functions actually create an HTML page in a temporary directory with em-bedded JavaScript that performs the placement of the words within the shape and providesa level of interaction after the page is displayed R ldquounderstandsrdquo that the product fromthese functions is an HTML widget and starts up the default browser to show the page Thepage and its sub-directories are removed when R ends

The fact that the page uses JavaScript introduces some interesting aspects Buried in theJavaScript used by the page to place the words in the cloud are a plethora of Mathrandom()calls The JavaScript specification says that the Mathrandom() function has to return avalue greater than or equal to 0 and less than 1 which is reasonable for a random functionThe specification also says that the implementation of the random function is up to theJavaScript application and does not specify how the numbers are to be generated Meaningthat the same HTML page being viewed by two different browsers may generate two differentsequences of random numbers Most random number generators have the capability of settinga seed value so that a repeatable sequence can be generated JavaScript does not supportthe idea of a random number seed The HTML page and collection of directories can bemoved to a server where they are available for use and support

All of this means that each loading and viewing of the page will generate a different

1Available fromhttpsgithubcomLchiffonwordcloud2

6

image and there is no practical way to ldquoget backrdquo to an image that was goodIn the Files section (see Section A on page 9) is an R script and support files to work

with The R script was used to create various images (see Figure 6 on the following page)

3 Conclusion

The wordcloud2 library enables you to create word clouds of arbitrary shape inside an HTMLusing JavaScript to position and orient each word Each HTML page and its associatedlibrary files are placed in individual directories that are removed when the creating R processterminates Pages and files can be moved or copied for safe keeping if desired Because thepages use the Mathrandom() JavaScript function each time the page is loaded words willbe positioned differently in the cloud If the desired shape has an internal hole then it ispossible that some words may not be placed in the cloud

wordcloud2 allows you to create word clouds to support your data visualization needs

7

(a) A heart

(b) The letters ldquoUSArdquo

(c) A star

(d) The USA

Figure 6 A collection of sample word clouds These images were created with the attachedR script

8

A Misc files

The files used to create all these figures are attached to this report They are

1 romeoAndJulietbase64 ndash default text used to demonstrate the software

2 heartpng ndash a heart shape with a hole

3 usapng ndash an outline of the continental United States

4 wordCloudR ndash an R script to demonstrate making word clouds

9

ClJvbWVvIGFuZCBKdWxpZXQKU2hha2VzcGVhcmUgaG9tZXBhZ2UgfCBSb21lbyBhbmQgSnVsaWV0IHwgRW50aXJlIHBsYXkKQUNUIEkKUFJPTE9HVUUKCiAgICBUd28gaG91c2Vob2xkcywgYm90aCBhbGlrZSBpbiBkaWduaXR5LAogICAgSW4gZmFpciBWZXJvbmEsIHdoZXJlIHdlIGxheSBvdXIgc2NlbmUsCiAgICBGcm9tIGFuY2llbnQgZ3J1ZGdlIGJyZWFrIHRvIG5ldyBtdXRpbnksCiAgICBXaGVyZSBjaXZpbCBibG9vZCBtYWtlcyBjaXZpbCBoYW5kcyB1bmNsZWFuLgogICAgRnJvbSBmb3J0aCB0aGUgZmF0YWwgbG9pbnMgb2YgdGhlc2UgdHdvIGZvZXMKICAgIEEgcGFpciBvZiBzdGFyLWNyb3NzJ2QgbG92ZXJzIHRha2UgdGhlaXIgbGlmZTsKICAgIFdob3NlIG1pc2FkdmVudHVyZWQgcGl0ZW91cyBvdmVydGhyb3dzCiAgICBEbyB3aXRoIHRoZWlyIGRlYXRoIGJ1cnkgdGhlaXIgcGFyZW50cycgc3RyaWZlLgogICAgVGhlIGZlYXJmdWwgcGFzc2FnZSBvZiB0aGVpciBkZWF0aC1tYXJrJ2QgbG92ZSwKICAgIEFuZCB0aGUgY29udGludWFuY2Ugb2YgdGhlaXIgcGFyZW50cycgcmFnZSwKICAgIFdoaWNoLCBidXQgdGhlaXIgY2hpbGRyZW4ncyBlbmQsIG5vdWdodCBjb3VsZCByZW1vdmUsCiAgICBJcyBub3cgdGhlIHR3byBob3VycycgdHJhZmZpYyBvZiBvdXIgc3RhZ2U7CiAgICBUaGUgd2hpY2ggaWYgeW91IHdpdGggcGF0aWVudCBlYXJzIGF0dGVuZCwKICAgIFdoYXQgaGVyZSBzaGFsbCBtaXNzLCBvdXIgdG9pbCBzaGFsbCBzdHJpdmUgdG8gbWVuZC4KClNDRU5FIEkuIFZlcm9uYS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgU0FNUFNPTiBhbmQgR1JFR09SWSwgb2YgdGhlIGhvdXNlIG9mIENhcHVsZXQsIGFybWVkIHdpdGggc3dvcmRzIGFuZCBidWNrbGVycyAKClNBTVBTT04KCiAgICBHcmVnb3J5LCBvJyBteSB3b3JkLCB3ZSdsbCBub3QgY2FycnkgY29hbHMuCgpHUkVHT1JZCgogICAgTm8sIGZvciB0aGVuIHdlIHNob3VsZCBiZSBjb2xsaWVycy4KClNBTVBTT04KCiAgICBJIG1lYW4sIGFuIHdlIGJlIGluIGNob2xlciwgd2UnbGwgZHJhdy4KCkdSRUdPUlkKCiAgICBBeSwgd2hpbGUgeW91IGxpdmUsIGRyYXcgeW91ciBuZWNrIG91dCBvJyB0aGUgY29sbGFyLgoKU0FNUFNPTgoKICAgIEkgc3RyaWtlIHF1aWNrbHksIGJlaW5nIG1vdmVkLgoKR1JFR09SWQoKICAgIEJ1dCB0aG91IGFydCBub3QgcXVpY2tseSBtb3ZlZCB0byBzdHJpa2UuCgpTQU1QU09OCgogICAgQSBkb2cgb2YgdGhlIGhvdXNlIG9mIE1vbnRhZ3VlIG1vdmVzIG1lLgoKR1JFR09SWQoKICAgIFRvIG1vdmUgaXMgdG8gc3RpcjsgYW5kIHRvIGJlIHZhbGlhbnQgaXMgdG8gc3RhbmQ6CiAgICB0aGVyZWZvcmUsIGlmIHRob3UgYXJ0IG1vdmVkLCB0aG91IHJ1bm4nc3QgYXdheS4KClNBTVBTT04KCiAgICBBIGRvZyBvZiB0aGF0IGhvdXNlIHNoYWxsIG1vdmUgbWUgdG8gc3RhbmQ6IEkgd2lsbAogICAgdGFrZSB0aGUgd2FsbCBvZiBhbnkgbWFuIG9yIG1haWQgb2YgTW9udGFndWUncy4KCkdSRUdPUlkKCiAgICBUaGF0IHNob3dzIHRoZWUgYSB3ZWFrIHNsYXZlOyBmb3IgdGhlIHdlYWtlc3QgZ29lcwogICAgdG8gdGhlIHdhbGwuCgpTQU1QU09OCgogICAgVHJ1ZTsgYW5kIHRoZXJlZm9yZSB3b21lbiwgYmVpbmcgdGhlIHdlYWtlciB2ZXNzZWxzLAogICAgYXJlIGV2ZXIgdGhydXN0IHRvIHRoZSB3YWxsOiB0aGVyZWZvcmUgSSB3aWxsIHB1c2gKICAgIE1vbnRhZ3VlJ3MgbWVuIGZyb20gdGhlIHdhbGwsIGFuZCB0aHJ1c3QgaGlzIG1haWRzCiAgICB0byB0aGUgd2FsbC4KCkdSRUdPUlkKCiAgICBUaGUgcXVhcnJlbCBpcyBiZXR3ZWVuIG91ciBtYXN0ZXJzIGFuZCB1cyB0aGVpciBtZW4uCgpTQU1QU09OCgogICAgJ1RpcyBhbGwgb25lLCBJIHdpbGwgc2hvdyBteXNlbGYgYSB0eXJhbnQ6IHdoZW4gSQogICAgaGF2ZSBmb3VnaHQgd2l0aCB0aGUgbWVuLCBJIHdpbGwgYmUgY3J1ZWwgd2l0aCB0aGUKICAgIG1haWRzLCBhbmQgY3V0IG9mZiB0aGVpciBoZWFkcy4KCkdSRUdPUlkKCiAgICBUaGUgaGVhZHMgb2YgdGhlIG1haWRzPwoKU0FNUFNPTgoKICAgIEF5LCB0aGUgaGVhZHMgb2YgdGhlIG1haWRzLCBvciB0aGVpciBtYWlkZW5oZWFkczsKICAgIHRha2UgaXQgaW4gd2hhdCBzZW5zZSB0aG91IHdpbHQuCgpHUkVHT1JZCgogICAgVGhleSBtdXN0IHRha2UgaXQgaW4gc2Vuc2UgdGhhdCBmZWVsIGl0LgoKU0FNUFNPTgoKICAgIE1lIHRoZXkgc2hhbGwgZmVlbCB3aGlsZSBJIGFtIGFibGUgdG8gc3RhbmQ6IGFuZAogICAgJ3RpcyBrbm93biBJIGFtIGEgcHJldHR5IHBpZWNlIG9mIGZsZXNoLgoKR1JFR09SWQoKICAgICdUaXMgd2VsbCB0aG91IGFydCBub3QgZmlzaDsgaWYgdGhvdSBoYWRzdCwgdGhvdQogICAgaGFkc3QgYmVlbiBwb29yIEpvaG4uIERyYXcgdGh5IHRvb2whIGhlcmUgY29tZXMKICAgIHR3byBvZiB0aGUgaG91c2Ugb2YgdGhlIE1vbnRhZ3Vlcy4KClNBTVBTT04KCiAgICBNeSBuYWtlZCB3ZWFwb24gaXMgb3V0OiBxdWFycmVsLCBJIHdpbGwgYmFjayB0aGVlLgoKR1JFR09SWQoKICAgIEhvdyEgdHVybiB0aHkgYmFjayBhbmQgcnVuPwoKU0FNUFNPTgoKICAgIEZlYXIgbWUgbm90LgoKR1JFR09SWQoKICAgIE5vLCBtYXJyeTsgSSBmZWFyIHRoZWUhCgpTQU1QU09OCgogICAgTGV0IHVzIHRha2UgdGhlIGxhdyBvZiBvdXIgc2lkZXM7IGxldCB0aGVtIGJlZ2luLgoKR1JFR09SWQoKICAgIEkgd2lsbCBmcm93biBhcyBJIHBhc3MgYnksIGFuZCBsZXQgdGhlbSB0YWtlIGl0IGFzCiAgICB0aGV5IGxpc3QuCgpTQU1QU09OCgogICAgTmF5LCBhcyB0aGV5IGRhcmUuIEkgd2lsbCBiaXRlIG15IHRodW1iIGF0IHRoZW07CiAgICB3aGljaCBpcyBhIGRpc2dyYWNlIHRvIHRoZW0sIGlmIHRoZXkgYmVhciBpdC4KCiAgICBFbnRlciBBQlJBSEFNIGFuZCBCQUxUSEFTQVIKCkFCUkFIQU0KCiAgICBEbyB5b3UgYml0ZSB5b3VyIHRodW1iIGF0IHVzLCBzaXICgpTQU1QU09OCgogICAgSSBkbyBiaXRlIG15IHRodW1iLCBzaXIuCgpBQlJBSEFNCgogICAgRG8geW91IGJpdGUgeW91ciB0aHVtYiBhdCB1cywgc2lyPwoKU0FNUFNPTgoKICAgIFtBc2lkZSB0byBHUkVHT1JZXSBJcyB0aGUgbGF3IG9mIG91ciBzaWRlLCBpZiBJIHNheQogICAgYXkCgpHUkVHT1JZCgogICAgTm8uCgpTQU1QU09OCgogICAgTm8sIHNpciwgSSBkbyBub3QgYml0ZSBteSB0aHVtYiBhdCB5b3UsIHNpciwgYnV0IEkKICAgIGJpdGUgbXkgdGh1bWIsIHNpci4KCkdSRUdPUlkKCiAgICBEbyB5b3UgcXVhcnJlbCwgc2lyPwoKQUJSQUhBTQoKICAgIFF1YXJyZWwgc2lyISBubywgc2lyLgoKU0FNUFNPTgoKICAgIElmIHlvdSBkbywgc2lyLCBJIGFtIGZvciB5b3U6IEkgc2VydmUgYXMgZ29vZCBhIG1hbiBhcyB5b3UuCgpBQlJBSEFNCgogICAgTm8gYmV0dGVyLgoKU0FNUFNPTgoKICAgIFdlbGwsIHNpci4KCkdSRUdPUlkKCiAgICBTYXkgJ2JldHRlcjonIGhlcmUgY29tZXMgb25lIG9mIG15IG1hc3RlcidzIGtpbnNtZW4uCgpTQU1QU09OCgogICAgWWVzLCBiZXR0ZXIsIHNpci4KCkFCUkFIQU0KCiAgICBZb3UgbGllLgoKU0FNUFNPTgoKICAgIERyYXcsIGlmIHlvdSBiZSBtZW4uIEdyZWdvcnksIHJlbWVtYmVyIHRoeSBzd2FzaGluZyBibG93LgoKICAgIFRoZXkgZmlnaHQKCiAgICBFbnRlciBCRU5WT0xJTwoKQkVOVk9MSU8KCiAgICBQYXJ0LCBmb29scyEKICAgIFB1dCB1cCB5b3VyIHN3b3JkczsgeW91IGtub3cgbm90IHdoYXQgeW91IGRvLgoKICAgIEJlYXRzIGRvd24gdGhlaXIgc3dvcmRzCgogICAgRW50ZXIgVFlCQUxUCgpUWUJBTFQKCiAgICBXaGF0LCBhcnQgdGhvdSBkcmF3biBhbW9uZyB0aGVzZSBoZWFydGxlc3MgaGluZHMCiAgICBUdXJuIHRoZWUsIEJlbnZvbGlvLCBsb29rIHVwb24gdGh5IGRlYXRoLgoKQkVOVk9MSU8KCiAgICBJIGRvIGJ1dCBrZWVwIHRoZSBwZWFjZTogcHV0IHVwIHRoeSBzd29yZCwKICAgIE9yIG1hbmFnZSBpdCB0byBwYXJ0IHRoZXNlIG1lbiB3aXRoIG1lLgoKVFlCQUxUCgogICAgV2hhdCwgZHJhd24sIGFuZCB0YWxrIG9mIHBlYWNlISBJIGhhdGUgdGhlIHdvcmQsCiAgICBBcyBJIGhhdGUgaGVsbCwgYWxsIE1vbnRhZ3VlcywgYW5kIHRoZWU6CiAgICBIYXZlIGF0IHRoZWUsIGNvd2FyZCEKCiAgICBUaGV5IGZpZ2h0CgogICAgRW50ZXIsIHNldmVyYWwgb2YgYm90aCBob3VzZXMsIHdobyBqb2luIHRoZSBmcmF5OyB0aGVuIGVudGVyIENpdGl6ZW5zLCB3aXRoIGNsdWJzCgpGaXJzdCBDaXRpemVuCgogICAgQ2x1YnMsIGJpbGxzLCBhbmQgcGFydGlzYW5zISBzdHJpa2UhIGJlYXQgdGhlbSBkb3duIQogICAgRG93biB3aXRoIHRoZSBDYXB1bGV0cyEgZG93biB3aXRoIHRoZSBNb250YWd1ZXMhCgogICAgRW50ZXIgQ0FQVUxFVCBpbiBoaXMgZ293biwgYW5kIExBRFkgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgdGhpcz8gR2l2ZSBtZSBteSBsb25nIHN3b3JkLCBobyEKCkxBRFkgQ0FQVUxFVAoKICAgIEEgY3J1dGNoLCBhIGNydXRjaCEgd2h5IGNhbGwgeW91IGZvciBhIHN3b3JkPwoKQ0FQVUxFVAoKICAgIE15IHN3b3JkLCBJIHNheSEgT2xkIE1vbnRhZ3VlIGlzIGNvbWUsCiAgICBBbmQgZmxvdXJpc2hlcyBoaXMgYmxhZGUgaW4gc3BpdGUgb2YgbWUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIExBRFkgTU9OVEFHVUUKCk1PTlRBR1VFCgogICAgVGhvdSB2aWxsYWluIENhcHVsZXQsLS1Ib2xkIG1lIG5vdCwgbGV0IG1lIGdvLgoKTEFEWSBNT05UQUdVRQoKICAgIFRob3Ugc2hhbHQgbm90IHN0aXIgYSBmb290IHRvIHNlZWsgYSBmb2UuCgogICAgRW50ZXIgUFJJTkNFLCB3aXRoIEF0dGVuZGFudHMKClBSSU5DRQoKICAgIFJlYmVsbGlvdXMgc3ViamVjdHMsIGVuZW1pZXMgdG8gcGVhY2UsCiAgICBQcm9mYW5lcnMgb2YgdGhpcyBuZWlnaGJvdXItc3RhaW5lZCBzdGVlbCwtLQogICAgV2lsbCB0aGV5IG5vdCBoZWFyPyBXaGF0LCBobyEgeW91IG1lbiwgeW91IGJlYXN0cywKICAgIFRoYXQgcXVlbmNoIHRoZSBmaXJlIG9mIHlvdXIgcGVybmljaW91cyByYWdlCiAgICBXaXRoIHB1cnBsZSBmb3VudGFpbnMgaXNzdWluZyBmcm9tIHlvdXIgdmVpbnMsCiAgICBPbiBwYWluIG9mIHRvcnR1cmUsIGZyb20gdGhvc2UgYmxvb2R5IGhhbmRzCiAgICBUaHJvdyB5b3VyIG1pc3RlbXBlcidkIHdlYXBvbnMgdG8gdGhlIGdyb3VuZCwKICAgIEFuZCBoZWFyIHRoZSBzZW50ZW5jZSBvZiB5b3VyIG1vdmVkIHByaW5jZS4KICAgIFRocmVlIGNpdmlsIGJyYXdscywgYnJlZCBvZiBhbiBhaXJ5IHdvcmQsCiAgICBCeSB0aGVlLCBvbGQgQ2FwdWxldCwgYW5kIE1vbnRhZ3VlLAogICAgSGF2ZSB0aHJpY2UgZGlzdHVyYidkIHRoZSBxdWlldCBvZiBvdXIgc3RyZWV0cywKICAgIEFuZCBtYWRlIFZlcm9uYSdzIGFuY2llbnQgY2l0aXplbnMKICAgIENhc3QgYnkgdGhlaXIgZ3JhdmUgYmVzZWVtaW5nIG9ybmFtZW50cywKICAgIFRvIHdpZWxkIG9sZCBwYXJ0aXNhbnMsIGluIGhhbmRzIGFzIG9sZCwKICAgIENhbmtlcidkIHdpdGggcGVhY2UsIHRvIHBhcnQgeW91ciBjYW5rZXInZCBoYXRlOgogICAgSWYgZXZlciB5b3UgZGlzdHVyYiBvdXIgc3RyZWV0cyBhZ2FpbiwKICAgIFlvdXIgbGl2ZXMgc2hhbGwgcGF5IHRoZSBmb3JmZWl0IG9mIHRoZSBwZWFjZS4KICAgIEZvciB0aGlzIHRpbWUsIGFsbCB0aGUgcmVzdCBkZXBhcnQgYXdheToKICAgIFlvdSBDYXB1bGV0OyBzaGFsbCBnbyBhbG9uZyB3aXRoIG1lOgogICAgQW5kLCBNb250YWd1ZSwgY29tZSB5b3UgdGhpcyBhZnRlcm5vb24sCiAgICBUbyBrbm93IG91ciBmdXJ0aGVyIHBsZWFzdXJlIGluIHRoaXMgY2FzZSwKICAgIFRvIG9sZCBGcmVlLXRvd24sIG91ciBjb21tb24ganVkZ21lbnQtcGxhY2UuCiAgICBPbmNlIG1vcmUsIG9uIHBhaW4gb2YgZGVhdGgsIGFsbCBtZW4gZGVwYXJ0LgoKICAgIEV4ZXVudCBhbGwgYnV0IE1PTlRBR1VFLCBMQURZIE1PTlRBR1VFLCBhbmQgQkVOVk9MSU8KCk1PTlRBR1VFCgogICAgV2hvIHNldCB0aGlzIGFuY2llbnQgcXVhcnJlbCBuZXcgYWJyb2FjaD8KICAgIFNwZWFrLCBuZXBoZXcsIHdlcmUgeW91IGJ5IHdoZW4gaXQgYmVnYW4CgpCRU5WT0xJTwoKICAgIEhlcmUgd2VyZSB0aGUgc2VydmFudHMgb2YgeW91ciBhZHZlcnNhcnksCiAgICBBbmQgeW91cnMsIGNsb3NlIGZpZ2h0aW5nIGVyZSBJIGRpZCBhcHByb2FjaDoKICAgIEkgZHJldyB0byBwYXJ0IHRoZW06IGluIHRoZSBpbnN0YW50IGNhbWUKICAgIFRoZSBmaWVyeSBUeWJhbHQsIHdpdGggaGlzIHN3b3JkIHByZXBhcmVkLAogICAgV2hpY2gsIGFzIGhlIGJyZWF0aGVkIGRlZmlhbmNlIHRvIG15IGVhcnMsCiAgICBIZSBzd3VuZyBhYm91dCBoaXMgaGVhZCBhbmQgY3V0IHRoZSB3aW5kcywKICAgIFdobyBub3RoaW5nIGh1cnQgd2l0aGFsIGhpc3MnZCBoaW0gaW4gc2Nvcm46CiAgICBXaGlsZSB3ZSB3ZXJlIGludGVyY2hhbmdpbmcgdGhydXN0cyBhbmQgYmxvd3MsCiAgICBDYW1lIG1vcmUgYW5kIG1vcmUgYW5kIGZvdWdodCBvbiBwYXJ0IGFuZCBwYXJ0LAogICAgVGlsbCB0aGUgcHJpbmNlIGNhbWUsIHdobyBwYXJ0ZWQgZWl0aGVyIHBhcnQuCgpMQURZIE1PTlRBR1VFCgogICAgTywgd2hlcmUgaXMgUm9tZW8IHNhdyB5b3UgaGltIHRvLWRheT8KICAgIFJpZ2h0IGdsYWQgSSBhbSBoZSB3YXMgbm90IGF0IHRoaXMgZnJheS4KCkJFTlZPTElPCgogICAgTWFkYW0sIGFuIGhvdXIgYmVmb3JlIHRoZSB3b3JzaGlwcCdkIHN1bgogICAgUGVlcidkIGZvcnRoIHRoZSBnb2xkZW4gd2luZG93IG9mIHRoZSBlYXN0LAogICAgQSB0cm91YmxlZCBtaW5kIGRyYXZlIG1lIHRvIHdhbGsgYWJyb2FkOwogICAgV2hlcmUsIHVuZGVybmVhdGggdGhlIGdyb3ZlIG9mIHN5Y2Ftb3JlCiAgICBUaGF0IHdlc3R3YXJkIHJvb3RldGggZnJvbSB0aGUgY2l0eSdzIHNpZGUsCiAgICBTbyBlYXJseSB3YWxraW5nIGRpZCBJIHNlZSB5b3VyIHNvbjoKICAgIFRvd2FyZHMgaGltIEkgbWFkZSwgYnV0IGhlIHdhcyB3YXJlIG9mIG1lCiAgICBBbmQgc3RvbGUgaW50byB0aGUgY292ZXJ0IG9mIHRoZSB3b29kOgogICAgSSwgbWVhc3VyaW5nIGhpcyBhZmZlY3Rpb25zIGJ5IG15IG93biwKICAgIFRoYXQgbW9zdCBhcmUgYnVzaWVkIHdoZW4gdGhleSdyZSBtb3N0IGFsb25lLAogICAgUHVyc3VlZCBteSBodW1vdXIgbm90IHB1cnN1aW5nIGhpcywKICAgIEFuZCBnbGFkbHkgc2h1bm4nZCB3aG8gZ2xhZGx5IGZsZWQgZnJvbSBtZS4KCk1PTlRBR1VFCgogICAgTWFueSBhIG1vcm5pbmcgaGF0aCBoZSB0aGVyZSBiZWVuIHNlZW4sCiAgICBXaXRoIHRlYXJzIGF1Z21lbnRpbmcgdGhlIGZyZXNoIG1vcm5pbmcgZGV3LgogICAgQWRkaW5nIHRvIGNsb3VkcyBtb3JlIGNsb3VkcyB3aXRoIGhpcyBkZWVwIHNpZ2hzOwogICAgQnV0IGFsbCBzbyBzb29uIGFzIHRoZSBhbGwtY2hlZXJpbmcgc3VuCiAgICBTaG91bGQgaW4gdGhlIGZ1cnRoZXN0IGVhc3QgYmVnaW4gdG8gZHJhdwogICAgVGhlIHNoYWR5IGN1cnRhaW5zIGZyb20gQXVyb3JhJ3MgYmVkLAogICAgQXdheSBmcm9tIHRoZSBsaWdodCBzdGVhbHMgaG9tZSBteSBoZWF2eSBzb24sCiAgICBBbmQgcHJpdmF0ZSBpbiBoaXMgY2hhbWJlciBwZW5zIGhpbXNlbGYsCiAgICBTaHV0cyB1cCBoaXMgd2luZG93cywgbG9ja3MgZmFyIGRheWxpZ2h0IG91dAogICAgQW5kIG1ha2VzIGhpbXNlbGYgYW4gYXJ0aWZpY2lhbCBuaWdodDoKICAgIEJsYWNrIGFuZCBwb3J0ZW50b3VzIG11c3QgdGhpcyBodW1vdXIgcHJvdmUsCiAgICBVbmxlc3MgZ29vZCBjb3Vuc2VsIG1heSB0aGUgY2F1c2UgcmVtb3ZlLgoKQkVOVk9MSU8KCiAgICBNeSBub2JsZSB1bmNsZSwgZG8geW91IGtub3cgdGhlIGNhdXNlPwoKTU9OVEFHVUUKCiAgICBJIG5laXRoZXIga25vdyBpdCBub3IgY2FuIGxlYXJuIG9mIGhpbS4KCkJFTlZPTElPCgogICAgSGF2ZSB5b3UgaW1wb3J0dW5lZCBoaW0gYnkgYW55IG1lYW5zPwoKTU9OVEFHVUUKCiAgICBCb3RoIGJ5IG15c2VsZiBhbmQgbWFueSBvdGhlciBmcmllbmRzOgogICAgQnV0IGhlLCBoaXMgb3duIGFmZmVjdGlvbnMnIGNvdW5zZWxsb3IsCiAgICBJcyB0byBoaW1zZWxmLS1JIHdpb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UVPCgogICAgR29vZCBoZWFydCwgYXQgd2hhdD8KCkJFTlZPTElPCgogICAgQXQgdGh5IGdvb2QgaGVhcnQncyBvcHByZXNzaW9uLgoKUk9NRU8KCiAgICBXaHksIHN1Y2ggaXMgbG92ZSdzIHRyYW5zZ3Jlc3Npb24uCiAgICBHcmllZnMgb2YgbWluZSBvd24gbGllIGhlYXZ5IGluIG15IGJyZWFzdCwKICAgIFdoaWNoIHRob3Ugd2lsdCBwcm9wYWdhdGUsIHRvIGhhdmUgaXQgcHJlc3QKICAgIFdpdGggbW9yZSBvZiB0aGluZTogdGhpcyBsb3ZlIHRoYXQgdGhvdSBoYXN0IHNob3duCiAgICBEb3RoIGFkZCBtb3JlIGdyaWVmIHRvIHRvbyBtdWNoIG9mIG1pbmUgb3duLgogICAgTG92ZSBpcyBhIHNtb2tlIHJhaXNlZCB3aXRoIHRoZSBmdW1lIG9mIHNpZ2hzOwogICAgQmVpbmcgcHVyZ2VkLCBhIGZpcmUgc3BhcmtsaW5nIGluIGxvdmVycycgZXllczsKICAgIEJlaW5nIHZleCdkIGEgc2VhIG5vdXJpc2gnZCB3aXRoIGxvdmVycycgdGVhcnM6CiAgICBXaGF0IGlzIGl0IGVsc2UIGEgbWFkbmVzcyBtb3N0IGRpc2NyZWV0LAogICAgQSBjaG9raW5nIGdhbGwgYW5kIGEgcHJlc2VydmluZyBzd2VldC4KICAgIEZhcmV3ZWxsLCBteSBjb3ouCgpCRU5WT0xJTwoKICAgIFNvZnQhIEkgd2lsbCBnbyBhbG9uZzsKICAgIEFuIGlmIHlvdSBsZWF2ZSBtZSBzbywgeW91IGRvIG1lIHdyb25nLgoKUk9NRU8KCiAgICBUdXQsIEkgaGF2ZSBsb3N0IG15c2VsZjsgSSBhbSBub3QgaGVyZTsKICAgIFRoaXMgaXMgbm90IFJvbWVvLCBoZSdzIHNvbWUgb3RoZXIgd2hlcmUuCgpCRU5WT0xJTwoKICAgIFRlbGwgbWUgaW4gc2FkbmVzcywgd2hvIGlzIHRoYXQgeW91IGxvdmUuCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIEkgZ3JvYW4gYW5kIHRlbGwgdGhlZT8KCkJFTlZPTElPCgogICAgR3JvYW4hIHdoeSwgbm8uCiAgICBCdXQgc2FkbHkgdGVsbCBtZSB3aG8uCgpST01FTwoKICAgIEJpZCBhIHNpY2sgbWFuIGluIHNhZG5lc3MgbWFrZSBoaXMgd2lsbDoKICAgIEFoLCB3b3JkIGlsbCB1cmdlZCB0byBvbmUgdGhhdCBpcyBzbyBpbGwhCiAgICBJbiBzYWRuZXNzLCBjb3VzaW4sIEkgZG8gbG92ZSBhIHdvbWFuLgoKQkVOVk9MSU8KCiAgICBJIGFpbSdkIHNvIG5lYXIsIHdoZW4gSSBzdXBwb3NlZCB5b3UgbG92ZWQuCgpST01FTwoKICAgIEEgcmlnaHQgZ29vZCBtYXJrLW1hbiEgQW5kIHNoZSdzIGZhaXIgSSBsb3ZlLgoKQkVOVk9MSU8KCiAgICBBIHJpZ2h0IGZhaXIgbWFyaywgZmFpciBjb3osIGlzIHNvb25lc3QgaGl0LgoKUk9NRU8KCiAgICBXZWxsLCBpbiB0aGF0IGhpdCB5b3UgbWlzczogc2hlJ2xsIG5vdCBiZSBoaXQKICAgIFdpdGggQ3VwaWQncyBhcnJvdzsgc2hlIGhhdGggRGlhbidzIHdpdDsKICAgIEFuZCwgaW4gc3Ryb25nIHByb29mIG9mIGNoYXN0aXR5IHdlbGwgYXJtJ2QsCiAgICBGcm9tIGxvdmUncyB3ZWFrIGNoaWxkaXNoIGJvdyBzaGUgbGl2ZXMgdW5oYXJtJ2QuCiAgICBTaGUgd2lsbCBub3Qgc3RheSB0aGUgc2llZ2Ugb2YgbG92aW5nIHRlcm1zLAogICAgTm9yIGJpZGUgdGhlIGVuY291bnRlciBvZiBhc3NhaWxpbmcgZXllcywKICAgIE5vciBvcGUgaGVyIGxhcCB0byBzYWludC1zZWR1Y2luZyBnb2xkOgogICAgTywgc2hlIGlzIHJpY2ggaW4gYmVhdXR5LCBvbmx5IHBvb3IsCiAgICBUaGF0IHdoZW4gc2hlIGRpZXMgd2l0aCBiZWF1dHkgZGllcyBoZXIgc3RvcmUuCgpCRU5WT0xJTwoKICAgIFRoZW4gc2hlIGhhdGggc3dvcm4gdGhhdCBzaGUgd2lsbCBzdGlsbCBsaXZlIGNoYXN0ZT8KClJPTUVPCgogICAgU2hlIGhhdGgsIGFuZCBpbiB0aGF0IHNwYXJpbmcgbWFrZXMgaHVnZSB3YXN0ZSwKICAgIEZvciBiZWF1dHkgc3RhcnZlZCB3aXRoIGhlciBzZXZlcml0eQogICAgQ3V0cyBiZWF1dHkgb2ZmIGZyb20gYWxsIHBvc3Rlcml0eS4KICAgIFNoZSBpcyB0b28gZmFpciwgdG9vIHdpc2UsIHdpc2VseSB0b28gZmFpciwKICAgIFRvIG1lcml0IGJsaXNzIGJ5IG1ha2luZyBtZSBkZXNwYWlyOgogICAgU2hlIGhhdGggZm9yc3dvcm4gdG8gbG92ZSwgYW5kIGluIHRoYXQgdm93CiAgICBEbyBJIGxpdmUgZGVhZCB0aGF0IGxpdmUgdG8gdGVsbCBpdCBub3cuCgpCRU5WT0xJTwoKICAgIEJlIHJ1bGVkIGJ5IG1lLCBmb3JnZXQgdG8gdGhpbmsgb2YgaGVyLgoKUk9NRU8KCiAgICBPLCB0ZWFjaCBtZSBob3cgSSBzaG91bGQgZm9yZ2V0IHRvIHRoaW5rLgoKQkVOVk9MSU8KCiAgICBCeSBnaXZpbmcgbGliZXJ0eSB1bnRvIHRoaW5lIGV5ZXM7CiAgICBFeGFtaW5lIG90aGVyIGJlYXV0aWVzLgoKUk9NRU8KCiAgICAnVGlzIHRoZSB3YXkKICAgIFRvIGNhbGwgaGVycyBleHF1aXNpdGUsIGluIHF1ZXN0aW9uIG1vcmU6CiAgICBUaGVzZSBoYXBweSBtYXNrcyB0aGF0IGtpc3MgZmFpciBsYWRpZXMnIGJyb3dzCiAgICBCZWluZyBibGFjayBwdXQgdXMgaW4gbWluZCB0aGV5IGhpZGUgdGhlIGZhaXI7CiAgICBIZSB0aGF0IGlzIHN0cnVja2VuIGJsaW5kIGNhbm5vdCBmb3JnZXQKICAgIFRoZSBwcmVjaW91cyB0cmVhc3VyZSBvZiBoaXMgZXllc2lnaHQgbG9zdDoKICAgIFNob3cgbWUgYSBtaXN0cmVzcyB0aGF0IGlzIHBhc3NpbmcgZmFpciwKICAgIFdoYXQgZG90aCBoZXIgYmVhdXR5IHNlcnZlLCBidXQgYXMgYSBub3RlCiAgICBXaGVyZSBJIG1heSByZWFkIHdobyBwYXNzJ2QgdGhhdCBwYXNzaW5nIGZhaXICiAgICBGYXJld2VsbDogdGhvdSBjYW5zdCBub3QgdGVhY2ggbWUgdG8gZm9yZ2V0LgoKQkVOVk9MSU8KCiAgICBJJ2xsIHBheSB0aGF0IGRvY3RyaW5lLCBvciBlbHNlIGRpZSBpbiBkZWJ0LgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEEgc3RyZWV0LgoKICAgIEVudGVyIENBUFVMRVQsIFBBUklTLCBhbmQgU2VydmFudCAKCkNBUFVMRVQKCiAgICBCdXQgTW9udGFndWUgaXMgYm91bmQgYXMgd2VsbCBhcyBJLAogICAgSW4gcGVuYWx0eSBhbGlrZTsgYW5kICd0aXMgbm90IGhhcmQsIEkgdGhpbmssCiAgICBGb3IgbWVuIHNvIG9sZCBhcyB3ZSB0byBrZWVwIHRoZSBwZWFjZS4KClBBUklTCgogICAgT2YgaG9ub3VyYWJsZSByZWNrb25pbmcgYXJlIHlvdSBib3RoOwogICAgQW5kIHBpdHkgJ3RpcyB5b3UgbGl2ZWQgYXQgb2RkcyBzbyBsb25nLgogICAgQnV0IG5vdywgbXkgbG9yZCwgd2hhdCBzYXkgeW91IHRvIG15IHN1aXQCgpDQVBVTEVUCgogICAgQnV0IHNheWluZyBvJ2VyIHdoYXQgSSBoYXZlIHNhaWQgYmVmb3JlOgogICAgTXkgY2hpbGQgaXMgeWV0IGEgc3RyYW5nZXIgaW4gdGhlIHdvcmxkOwogICAgU2hlIGhhdGggbm90IHNlZW4gdGhlIGNoYW5nZSBvZiBmb3VydGVlbiB5ZWFycywKICAgIExldCB0d28gbW9yZSBzdW1tZXJzIHdpdGhlciBpbiB0aGVpciBwcmlkZSwKICAgIEVyZSB3ZSBtYXkgdGhpbmsgaGVyIHJpcGUgdG8gYmUgYSBicmlkZS4KClBBUklTCgogICAgWW91bmdlciB0aGFuIHNoZSBhcmUgaGFwcHkgbW90aGVycyBtYWRlLgoKQ0FQVUxFVAoKICAgIEFuZCB0b28gc29vbiBtYXJyJ2QgYXJlIHRob3NlIHNvIGVhcmx5IG1hZGUuCiAgICBUaGUgZWFydGggaGF0aCBzd2FsbG93J2QgYWxsIG15IGhvcGVzIGJ1dCBzaGUsCiAgICBTaGUgaXMgdGhlIGhvcGVmdWwgbGFkeSBvZiBteSBlYXJ0aDoKICAgIEJ1dCB3b28gaGVyLCBnZW50bGUgUGFyaXMsIGdldCBoZXIgaGVhcnQsCiAgICBNeSB3aWxsIHRvIGhlciBjb25zZW50IGlzIGJ1dCBhIHBhcnQ7CiAgICBBbiBzaGUgYWdyZWUsIHdpdGhpbiBoZXIgc2NvcGUgb2YgY2hvaWNlCiAgICBMaWVzIG15IGNvbnNlbnQgYW5kIGZhaXIgYWNjb3JkaW5nIHZvaWNlLgogICAgVGhpcyBuaWdodCBJIGhvbGQgYW4gb2xkIGFjY3VzdG9tJ2QgZmVhc3QsCiAgICBXaGVyZXRvIEkgaGF2ZSBpbnZpdGVkIG1hbnkgYSBndWVzdCwKICAgIFN1Y2ggYXMgSSBsb3ZlOyBhbmQgeW91LCBhbW9uZyB0aGUgc3RvcmUsCiAgICBPbmUgbW9yZSwgbW9zdCB3ZWxjb21lLCBtYWtlcyBteSBudW1iZXIgbW9yZS4KICAgIEF0IG15IHBvb3IgaG91c2UgbG9vayB0byBiZWhvbGQgdGhpcyBuaWdodAogICAgRWFydGgtdHJlYWRpbmcgc3RhcnMgdGhhdCBtYWtlIGRhcmsgaGVhdmVuIGxpZ2h0OgogICAgU3VjaCBjb21mb3J0IGFzIGRvIGx1c3R5IHlvdW5nIG1lbiBmZWVsCiAgICBXaGVuIHdlbGwtYXBwYXJlbGwnZCBBcHJpbCBvbiB0aGUgaGVlbAogICAgT2YgbGltcGluZyB3aW50ZXIgdHJlYWRzLCBldmVuIHN1Y2ggZGVsaWdodAogICAgQW1vbmcgZnJlc2ggZmVtYWxlIGJ1ZHMgc2hhbGwgeW91IHRoaXMgbmlnaHQKICAgIEluaGVyaXQgYXQgbXkgaG91c2U7IGhlYXIgYWxsLCBhbGwgc2VlLAogICAgQW5kIGxpa2UgaGVyIG1vc3Qgd2hvc2UgbWVyaXQgbW9zdCBzaGFsbCBiZToKICAgIFdoaWNoIG9uIG1vcmUgdmlldywgb2YgbWFueSBtaW5lIGJlaW5nIG9uZQogICAgTWF5IHN0YW5kIGluIG51bWJlciwgdGhvdWdoIGluIHJlY2tvbmluZyBub25lLAogICAgQ29tZSwgZ28gd2l0aCBtZS4KCiAgICBUbyBTZXJ2YW50LCBnaXZpbmcgYSBwYXBlcgogICAgR28sIHNpcnJhaCwgdHJ1ZGdlIGFib3V0CiAgICBUaHJvdWdoIGZhaXIgVmVyb25hOyBmaW5kIHRob3NlIHBlcnNvbnMgb3V0CiAgICBXaG9zZSBuYW1lcyBhcmUgd3JpdHRlbiB0aGVyZSwgYW5kIHRvIHRoZW0gc2F5LAogICAgTXkgaG91c2UgYW5kIHdlbGNvbWUgb24gdGhlaXIgcGxlYXN1cmUgc3RheS4KCiAgICBFeGV1bnQgQ0FQVUxFVCBhbmQgUEFSSVMKClNlcnZhbnQKCiAgICBGaW5kIHRoZW0gb3V0IHdob3NlIG5hbWVzIGFyZSB3cml0dGVuIGhlcmUhIEl0IGlzCiAgICB3cml0dGVuLCB0aGF0IHRoZSBzaG9lbWFrZXIgc2hvdWxkIG1lZGRsZSB3aXRoIGhpcwogICAgeWFyZCwgYW5kIHRoZSB0YWlsb3Igd2l0aCBoaXMgbGFzdCwgdGhlIGZpc2hlciB3aXRoCiAgICBoaXMgcGVuY2lsLCBhbmQgdGhlIHBhaW50ZXIgd2l0aCBoaXMgbmV0czsgYnV0IEkgYW0KICAgIHNlbnQgdG8gZmluZCB0aG9zZSBwZXJzb25zIHdob3NlIG5hbWVzIGFyZSBoZXJlCiAgICB3cml0LCBhbmQgY2FuIG5ldmVyIGZpbmQgd2hhdCBuYW1lcyB0aGUgd3JpdGluZwogICAgcGVyc29uIGhhdGggaGVyZSB3cml0LiBJIG11c3QgdG8gdGhlIGxlYXJuZWQuLS1JbiBnb29kIHRpbWUuCgogICAgRW50ZXIgQkVOVk9MSU8gYW5kIFJPTUVPCgpCRU5WT0xJTwoKICAgIFR1dCwgbWFuLCBvbmUgZmlyZSBidXJucyBvdXQgYW5vdGhlcidzIGJ1cm5pbmcsCiAgICBPbmUgcGFpbiBpcyBsZXNzZW4nZCBieSBhbm90aGVyJ3MgYW5ndWlzaDsKICAgIFR1cm4gZ2lkZHksIGFuZCBiZSBob2xwIGJ5IGJhY2t3YXJkIHR1cm5pbmc7CiAgICBPbmUgZGVzcGVyYXRlIGdyaWVmIGN1cmVzIHdpdGggYW5vdGhlcidzIGxhbmd1aXNoOgogICAgVGFrZSB0aG91IHNvbWUgbmV3IGluZmVjdGlvbiB0byB0aHkgZXllLAogICAgQW5kIHRoZSByYW5rIHBvaXNvbiBvZiB0aGUgb2xkIHdpbGwgZGllLgoKUk9NRU8KCiAgICBZb3VyIHBsYWludGFpbi1sZWFmIGlzIGV4Y2VsbGVudCBmb3IgdGhhdC4KCkJFTlZPTElPCgogICAgRm9yIHdoYXQsIEkgcHJheSB0aGVlPwoKUk9NRU8KCiAgICBGb3IgeW91ciBicm9rZW4gc2hpbi4KCkJFTlZPTElPCgogICAgV2h5LCBSb21lbywgYXJ0IHRob3UgbWFkPwoKUk9NRU8KCiAgICBOb3QgbWFkLCBidXQgYm91bmQgbW9yZSB0aGFuIGEgbWFkLW1hbiBpczsKICAgIFNodXQgdXAgaW4gcHJpc29uLCBrZXB0IHdpdGhvdXQgbXkgZm9vZCwKICAgIFdoaXBwJ2QgYW5kIHRvcm1lbnRlZCBhbmQtLUdvZC1kZW4sIGdvb2QgZmVsbG93LgoKU2VydmFudAoKICAgIEdvZCBnaScgZ29kLWRlbi4gSSBwcmF5LCBzaXIsIGNhbiB5b3UgcmVhZD8KClJPTUVPCgogICAgQXksIG1pbmUgb3duIGZvcnR1bmUgaW4gbXkgbWlzZXJ5LgoKU2VydmFudAoKICAgIFBlcmhhcHMgeW91IGhhdmUgbGVhcm5lZCBpdCB3aXRob3V0IGJvb2s6IGJ1dCwgSQogICAgcHJheSwgY2FuIHlvdSByZWFkIGFueSB0aGluZyB5b3Ugc2VlPwoKUk9NRU8KCiAgICBBeSwgaWYgSSBrbm93IHRoZSBsZXR0ZXJzIGFuZCB0aGUgbGFuZ3VhZ2UuCgpTZXJ2YW50CgogICAgWWUgc2F5IGhvbmVzdGx5OiByZXN0IHlvdSBtZXJyeSEKClJPTUVPCgogICAgU3RheSwgZmVsbG93OyBJIGNhbiByZWFkLgoKICAgIFJlYWRzCiAgICAnU2lnbmlvciBNYXJ0aW5vIGFuZCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOwogICAgQ291bnR5IEFuc2VsbWUgYW5kIGhpcyBiZWF1dGVvdXMgc2lzdGVyczsgdGhlIGxhZHkKICAgIHdpZG93IG9mIFZpdHJhdmlvOyBTaWduaW9yIFBsYWNlbnRpbyBhbmQgaGlzIGxvdmVseQogICAgbmllY2VzOyBNZXJjdXRpbyBhbmQgaGlzIGJyb3RoZXIgVmFsZW50aW5lOyBtaW5lCiAgICB1bmNsZSBDYXB1bGV0LCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOyBteSBmYWlyIG5pZWNlCiAgICBSb3NhbGluZTsgTGl2aWE7IFNpZ25pb3IgVmFsZW50aW8gYW5kIGhpcyBjb3VzaW4KICAgIFR5YmFsdCwgTHVjaW8gYW5kIHRoZSBsaXZlbHkgSGVsZW5hLicgQSBmYWlyCiAgICBhc3NlbWJseTogd2hpdGhlciBzaG91bGQgdGhleSBjb21lPwoKU2VydmFudAoKICAgIFVwLgoKUk9NRU8KCiAgICBXaGl0aGVyPwoKU2VydmFudAoKICAgIFRvIHN1cHBlcjsgdG8gb3VyIGhvdXNlLgoKUk9NRU8KCiAgICBXaG9zZSBob3VzZT8KClNlcnZhbnQKCiAgICBNeSBtYXN0ZXIncy4KClJPTUVPCgogICAgSW5kZWVkLCBJIHNob3VsZCBoYXZlIGFzaydkIHlvdSB0aGF0IGJlZm9yZS4KClNlcnZhbnQKCiAgICBOb3cgSSdsbCB0ZWxsIHlvdSB3aXRob3V0IGFza2luZzogbXkgbWFzdGVyIGlzIHRoZQogICAgZ3JlYXQgcmljaCBDYXB1bGV0OyBhbmQgaWYgeW91IGJlIG5vdCBvZiB0aGUgaG91c2UKICAgIG9mIE1vbnRhZ3VlcywgSSBwcmF5LCBjb21lIGFuZCBjcnVzaCBhIGN1cCBvZiB3aW5lLgogICAgUmVzdCB5b3UgbWVycnkhCgogICAgRXhpdAoKQkVOVk9MSU8KCiAgICBBdCB0aGlzIHNhbWUgYW5jaWVudCBmZWFzdCBvZiBDYXB1bGV0J3MKICAgIFN1cHMgdGhlIGZhaXIgUm9zYWxpbmUgd2hvbSB0aG91IHNvIGxvdmVzdCwKICAgIFdpdGggYWxsIHRoZSBhZG1pcmVkIGJlYXV0aWVzIG9mIFZlcm9uYToKICAgIEdvIHRoaXRoZXI7IGFuZCwgd2l0aCB1bmF0dGFpbnRlZCBleWUsCiAgICBDb21wYXJlIGhlciBmYWNlIHdpdGggc29tZSB0aGF0IEkgc2hhbGwgc2hvdywKICAgIEFuZCBJIHdpbGwgbWFrZSB0aGVlIHRoaW5rIHRoeSBzd2FuIGEgY3Jvdy4KClJPTUVPCgogICAgV2hlbiB0aGUgZGV2b3V0IHJlbGlnaW9uIG9mIG1pbmUgZXllCiAgICBNYWludGFpbnMgc3VjaCBmYWxzZWhvb2QsIHRoZW4gdHVybiB0ZWFycyB0byBmaXJlczsKICAgIEFuZCB0aGVzZSwgd2hvIG9mdGVuIGRyb3duJ2QgY291bGQgbmV2ZXIgZGllLAogICAgVHJhbnNwYXJlbnQgaGVyZXRpY3MsIGJlIGJ1cm50IGZvciBsaWFycyEKICAgIE9uZSBmYWlyZXIgdGhhbiBteSBsb3ZlISB0aGUgYWxsLXNlZWluZyBzdW4KICAgIE5lJ2VyIHNhdyBoZXIgbWF0Y2ggc2luY2UgZmlyc3QgdGhlIHdvcmxkIGJlZ3VuLgoKQkVOVk9MSU8KCiAgICBUdXQsIHlvdSBzYXcgaGVyIGZhaXIsIG5vbmUgZWxzZSBiZWluZyBieSwKICAgIEhlcnNlbGYgcG9pc2VkIHdpdGggaGVyc2VsZiBpbiBlaXRoZXIgZXllOgogICAgQnV0IGluIHRoYXQgY3J5c3RhbCBzY2FsZXMgbGV0IHRoZXJlIGJlIHdlaWdoJ2QKICAgIFlvdXIgbGFkeSdzIGxvdmUgYWdhaW5zdCBzb21lIG90aGVyIG1haWQKICAgIFRoYXQgSSB3aWxsIHNob3cgeW91IHNoaW5pbmcgYXQgdGhpcyBmZWFzdCwKICAgIEFuZCBzaGUgc2hhbGwgc2NhbnQgc2hvdyB3ZWxsIHRoYXQgbm93IHNob3dzIGJlc3QuCgpST01FTwoKICAgIEknbGwgZ28gYWxvbmcsIG5vIHN1Y2ggc2lnaHQgdG8gYmUgc2hvd24sCiAgICBCdXQgdG8gcmVqb2ljZSBpbiBzcGxlbmRvciBvZiBtaW5lIG93bi4KCiAgICBFeGV1bnQKClNDRU5FIElJSS4gQSByb29tIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgTnVyc2UsIHdoZXJlJ3MgbXkgZGF1Z2h0ZXIIGNhbGwgaGVyIGZvcnRoIHRvIG1lLgoKTnVyc2UKCiAgICBOb3csIGJ5IG15IG1haWRlbmhlYWQsIGF0IHR3ZWx2ZSB5ZWFyIG9sZCwKICAgIEkgYmFkZSBoZXIgY29tZS4gV2hhdCwgbGFtYiEgd2hhdCwgbGFkeWJpcmQhCiAgICBHb2QgZm9yYmlkISBXaGVyZSdzIHRoaXMgZ2lybD8gV2hhdCwgSnVsaWV0IQoKICAgIEVudGVyIEpVTElFVAoKSlVMSUVUCgogICAgSG93IG5vdyEgd2hvIGNhbGxzPwoKTnVyc2UKCiAgICBZb3VyIG1vdGhlci4KCkpVTElFVAoKICAgIE1hZGFtLCBJIGFtIGhlcmUuCiAgICBXaGF0IGlzIHlvdXIgd2lsbD8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoaXMgaXMgdGhlIG1hdHRlcjotLU51cnNlLCBnaXZlIGxlYXZlIGF3aGlsZSwKICAgIFdlIG11c3QgdGFsayBpbiBzZWNyZXQ6LS1udXJzZSwgY29tZSBiYWNrIGFnYWluOwogICAgSSBoYXZlIHJlbWVtYmVyJ2QgbWUsIHRob3UncyBoZWFyIG91ciBjb3Vuc2VsLgogICAgVGhvdSBrbm93J3N0IG15IGRhdWdodGVyJ3Mgb2YgYSBwcmV0dHkgYWdlLgoKTnVyc2UKCiAgICBGYWl0aCwgSSBjYW4gdGVsbCBoZXIgYWdlIHVudG8gYW4gaG91ci4KCkxBRFkgQ0FQVUxFVAoKICAgIFNoZSdzIG5vdCBmb3VydGVlbi4KCk51cnNlCgogICAgSSdsbCBsYXkgZm91cnRlZW4gb2YgbXkgdGVldGgsLS0KICAgIEFuZCB5ZXQsIHRvIG15IHRlZXRoIGJlIGl0IHNwb2tlbiwgSSBoYXZlIGJ1dCBmb3VyLS0KICAgIFNoZSBpcyBub3QgZm91cnRlZW4uIEhvdyBsb25nIGlzIGl0IG5vdwogICAgVG8gTGFtbWFzLXRpZGUCgpMQURZIENBUFVMRVQKCiAgICBBIGZvcnRuaWdodCBhbmQgb2RkIGRheXMuCgpOdXJzZQoKICAgIEV2ZW4gb3Igb2RkLCBvZiBhbGwgZGF5cyBpbiB0aGUgeWVhciwKICAgIENvbWUgTGFtbWFzLWV2ZSBhdCBuaWdodCBzaGFsbCBzaGUgYmUgZm91cnRlZW4uCiAgICBTdXNhbiBhbmQgc2hlLS1Hb2QgcmVzdCBhbGwgQ2hyaXN0aWFuIHNvdWxzIS0tCiAgICBXZXJlIG9mIGFuIGFnZTogd2VsbCwgU3VzYW4gaXMgd2l0aCBHb2Q7CiAgICBTaGUgd2FzIHRvbyBnb29kIGZvciBtZTogYnV0LCBhcyBJIHNhaWQsCiAgICBPbiBMYW1tYXMtZXZlIGF0IG5pZ2h0IHNoYWxsIHNoZSBiZSBmb3VydGVlbjsKICAgIFRoYXQgc2hhbGwgc2hlLCBtYXJyeTsgSSByZW1lbWJlciBpdCB3ZWxsLgogICAgJ1RpcyBzaW5jZSB0aGUgZWFydGhxdWFrZSBub3cgZWxldmVuIHllYXJzOwogICAgQW5kIHNoZSB3YXMgd2VhbidkLC0tSSBuZXZlciBzaGFsbCBmb3JnZXQgaXQsLS0KICAgIE9mIGFsbCB0aGUgZGF5cyBvZiB0aGUgeWVhciwgdXBvbiB0aGF0IGRheToKICAgIEZvciBJIGhhZCB0aGVuIGxhaWQgd29ybXdvb2QgdG8gbXkgZHVnLAogICAgU2l0dGluZyBpbiB0aGUgc3VuIHVuZGVyIHRoZSBkb3ZlLWhvdXNlIHdhbGw7CiAgICBNeSBsb3JkIGFuZCB5b3Ugd2VyZSB0aGVuIGF0IE1hbnR1YTotLQogICAgTmF5LCBJIGRvIGJlYXIgYSBicmFpbjotLWJ1dCwgYXMgSSBzYWlkLAogICAgV2hlbiBpdCBkaWQgdGFzdGUgdGhlIHdvcm13b29kIG9uIHRoZSBuaXBwbGUKICAgIE9mIG15IGR1ZyBhbmQgZmVsdCBpdCBiaXR0ZXIsIHByZXR0eSBmb29sLAogICAgVG8gc2VlIGl0IHRldGNoeSBhbmQgZmFsbCBvdXQgd2l0aCB0aGUgZHVnIQogICAgU2hha2UgcXVvdGggdGhlIGRvdmUtaG91c2U6ICd0d2FzIG5vIG5lZWQsIEkgdHJvdywKICAgIFRvIGJpZCBtZSB0cnVkZ2U6CiAgICBBbmQgc2luY2UgdGhhdCB0aW1lIGl0IGlzIGVsZXZlbiB5ZWFyczsKICAgIEZvciB0aGVuIHNoZSBjb3VsZCBzdGFuZCBhbG9uZTsgbmF5LCBieSB0aGUgcm9vZCwKICAgIFNoZSBjb3VsZCBoYXZlIHJ1biBhbmQgd2FkZGxlZCBhbGwgYWJvdXQ7CiAgICBGb3IgZXZlbiB0aGUgZGF5IGJlZm9yZSwgc2hlIGJyb2tlIGhlciBicm93OgogICAgQW5kIHRoZW4gbXkgaHVzYmFuZC0tR29kIGJlIHdpdGggaGlzIHNvdWwhCiAgICBBJyB3YXMgYSBtZXJyeSBtYW4tLXRvb2sgdXAgdGhlIGNoaWxkOgogICAgJ1llYSwnIHF1b3RoIGhlLCAnZG9zdCB0aG91IGZhbGwgdXBvbiB0aHkgZmFjZT8KICAgIFRob3Ugd2lsdCBmYWxsIGJhY2t3YXJkIHdoZW4gdGhvdSBoYXN0IG1vcmUgd2l0OwogICAgV2lsdCB0aG91IG5vdCwgSnVsZT8nIGFuZCwgYnkgbXkgaG9saWRhbWUsCiAgICBUaGUgcHJldHR5IHdyZXRjaCBsZWZ0IGNyeWluZyBhbmQgc2FpZCAnQXkuJwogICAgVG8gc2VlLCBub3csIGhvdyBhIGplc3Qgc2hhbGwgY29tZSBhYm91dCEKICAgIEkgd2FycmFudCwgYW4gSSBzaG91bGQgbGl2ZSBhIHRob3VzYW5kIHllYXJzLAogICAgSSBuZXZlciBzaG91bGQgZm9yZ2V0IGl0OiAnV2lsdCB0aG91IG5vdCwgSnVsZT8nIHF1b3RoIGhlOwogICAgQW5kLCBwcmV0dHkgZm9vbCwgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKTEFEWSBDQVBVTEVUCgogICAgRW5vdWdoIG9mIHRoaXM7IEkgcHJheSB0aGVlLCBob2xkIHRoeSBwZWFjZS4KCk51cnNlCgogICAgWWVzLCBtYWRhbTogeWV0IEkgY2Fubm90IGNob29zZSBidXQgbGF1Z2gsCiAgICBUbyB0aGluayBpdCBzaG91bGQgbGVhdmUgY3J5aW5nIGFuZCBzYXkgJ0F5LicKICAgIEFuZCB5ZXQsIEkgd2FycmFudCwgaXQgaGFkIHVwb24gaXRzIGJyb3cKICAgIEEgYnVtcCBhcyBiaWcgYXMgYSB5b3VuZyBjb2NrZXJlbCdzIHN0b25lOwogICAgQSBwYXJsb3VzIGtub2NrOyBhbmQgaXQgY3JpZWQgYml0dGVybHk6CiAgICAnWWVhLCcgcXVvdGggbXkgaHVzYmFuZCwnZmFsbCdzdCB1cG9uIHRoeSBmYWNlPwogICAgVGhvdSB3aWx0IGZhbGwgYmFja3dhcmQgd2hlbiB0aG91IGNvbWVzdCB0byBhZ2U7CiAgICBXaWx0IHRob3Ugbm90LCBKdWxlPycgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKSlVMSUVUCgogICAgQW5kIHN0aW50IHRob3UgdG9vLCBJIHByYXkgdGhlZSwgbnVyc2UsIHNheSBJLgoKTnVyc2UKCiAgICBQZWFjZSwgSSBoYXZlIGRvbmUuIEdvZCBtYXJrIHRoZWUgdG8gaGlzIGdyYWNlIQogICAgVGhvdSB3YXN0IHRoZSBwcmV0dGllc3QgYmFiZSB0aGF0IGUnZXIgSSBudXJzZWQ6CiAgICBBbiBJIG1pZ2h0IGxpdmUgdG8gc2VlIHRoZWUgbWFycmllZCBvbmNlLAogICAgSSBoYXZlIG15IHdpc2guCgpMQURZIENBUFVMRVQKCiAgICBNYXJyeSwgdGhhdCAnbWFycnknIGlzIHRoZSB2ZXJ5IHRoZW1lCiAgICBJIGNhbWUgdG8gdGFsayBvZi4gVGVsbCBtZSwgZGF1Z2h0ZXIgSnVsaWV0LAogICAgSG93IHN0YW5kcyB5b3VyIGRpc3Bvc2l0aW9uIHRvIGJlIG1hcnJpZWQCgpKVUxJRVQKCiAgICBJdCBpcyBhbiBob25vdXIgdGhhdCBJIGRyZWFtIG5vdCBvZi4KCk51cnNlCgogICAgQW4gaG9ub3VyISB3ZXJlIG5vdCBJIHRoaW5lIG9ubHkgbnVyc2UsCiAgICBJIHdvdWxkIHNheSB0aG91IGhhZHN0IHN1Y2snZCB3aXNkb20gZnJvbSB0aHkgdGVhdC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHRoaW5rIG9mIG1hcnJpYWdlIG5vdzsgeW91bmdlciB0aGFuIHlvdSwKICAgIEhlcmUgaW4gVmVyb25hLCBsYWRpZXMgb2YgZXN0ZWVtLAogICAgQXJlIG1hZGUgYWxyZWFkeSBtb3RoZXJzOiBieSBteSBjb3VudCwKICAgIEkgd2FzIHlvdXIgbW90aGVyIG11Y2ggdXBvbiB0aGVzZSB5ZWFycwogICAgVGhhdCB5b3UgYXJlIG5vdyBhIG1haWQuIFRodXMgdGhlbiBpbiBicmllZjoKICAgIFRoZSB2YWxpYW50IFBhcmlzIHNlZWtzIHlvdSBmb3IgaGlzIGxvdmUuCgpOdXJzZQoKICAgIEEgbWFuLCB5b3VuZyBsYWR5ISBsYWR5LCBzdWNoIGEgbWFuCiAgICBBcyBhbGwgdGhlIHdvcmxkLS13aHksIGhlJ3MgYSBtYW4gb2Ygd2F4LgoKTEFEWSBDQVBVTEVUCgogICAgVmVyb25hJ3Mgc3VtbWVyIGhhdGggbm90IHN1Y2ggYSBmbG93ZXIuCgpOdXJzZQoKICAgIE5heSwgaGUncyBhIGZsb3dlcjsgaW4gZmFpdGgsIGEgdmVyeSBmbG93ZXIuCgpMQURZIENBUFVMRVQKCiAgICBXaGF0IHNheSB5b3UIGNhbiB5b3UgbG92ZSB0aGUgZ2VudGxlbWFuPwogICAgVGhpcyBuaWdodCB5b3Ugc2hhbGwgYmVob2xkIGhpbSBhdCBvdXIgZmVhc3Q7CiAgICBSZWFkIG8nZXIgdGhlIHZvbHVtZSBvZiB5b3VuZyBQYXJpcycgZmFjZSwKICAgIEFuZCBmaW5kIGRlbGlnaHQgd3JpdCB0aGVyZSB3aXRoIGJlYXV0eSdzIHBlbjsKICAgIEV4YW1pbmUgZXZlcnkgbWFycmllZCBsaW5lYW1lbnQsCiAgICBBbmQgc2VlIGhvdyBvbmUgYW5vdGhlciBsZW5kcyBjb250ZW50CiAgICBBbmQgd2hhdCBvYnNjdXJlZCBpbiB0aGlzIGZhaXIgdm9sdW1lIGxpZXMKICAgIEZpbmQgd3JpdHRlbiBpbiB0aGUgbWFyZ2VudCBvZiBoaXMgZXllcy4KICAgIFRoaXMgcHJlY2lvdXMgYm9vayBvZiBsb3ZlLCB0aGlzIHVuYm91bmQgbG92ZXIsCiAgICBUbyBiZWF1dGlmeSBoaW0sIG9ubHkgbGFja3MgYSBjb3ZlcjoKICAgIFRoZSBmaXNoIGxpdmVzIGluIHRoZSBzZWEsIGFuZCAndGlzIG11Y2ggcHJpZGUKICAgIEZvciBmYWlyIHdpdGhvdXQgdGhlIGZhaXIgd2l0aGluIHRvIGhpZGU6CiAgICBUaGF0IGJvb2sgaW4gbWFueSdzIGV5ZXMgZG90aCBzaGFyZSB0aGUgZ2xvcnksCiAgICBUaGF0IGluIGdvbGQgY2xhc3BzIGxvY2tzIGluIHRoZSBnb2xkZW4gc3Rvcnk7CiAgICBTbyBzaGFsbCB5b3Ugc2hhcmUgYWxsIHRoYXQgaGUgZG90aCBwb3NzZXNzLAogICAgQnkgaGF2aW5nIGhpbSwgbWFraW5nIHlvdXJzZWxmIG5vIGxlc3MuCgpOdXJzZQoKICAgIE5vIGxlc3MhIG5heSwgYmlnZ2VyOyB3b21lbiBncm93IGJ5IG1lbi4KCkxBRFkgQ0FQVUxFVAoKICAgIFNwZWFrIGJyaWVmbHksIGNhbiB5b3UgbGlrZSBvZiBQYXJpcycgbG92ZT8KCkpVTElFVAoKICAgIEknbGwgbG9vayB0byBsaWtlLCBpZiBsb29raW5nIGxpa2luZyBtb3ZlOgogICAgQnV0IG5vIG1vcmUgZGVlcCB3aWxsIEkgZW5kYXJ0IG1pbmUgZXllCiAgICBUaGFuIHlvdXIgY29uc2VudCBnaXZlcyBzdHJlbmd0aCB0byBtYWtlIGl0IGZseS4KCiAgICBFbnRlciBhIFNlcnZhbnQKClNlcnZhbnQKCiAgICBNYWRhbSwgdGhlIGd1ZXN0cyBhcmUgY29tZSwgc3VwcGVyIHNlcnZlZCB1cCwgeW91CiAgICBjYWxsZWQsIG15IHlvdW5nIGxhZHkgYXNrZWQgZm9yLCB0aGUgbnVyc2UgY3Vyc2VkIGluCiAgICB0aGUgcGFudHJ5LCBhbmQgZXZlcnkgdGhpbmcgaW4gZXh0cmVtaXR5LiBJIG11c3QKICAgIGhlbmNlIHRvIHdhaXQ7IEkgYmVzZWVjaCB5b3UsIGZvbGxvdyBzdHJhaWdodC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlIGZvbGxvdyB0aGVlLgoKICAgIEV4aXQgU2VydmFudAogICAgSnVsaWV0LCB0aGUgY291bnR5IHN0YXlzLgoKTnVyc2UKCiAgICBHbywgZ2lybCwgc2VlayBoYXBweSBuaWdodHMgdG8gaGFwcHkgZGF5cy4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBST01FTywgTUVSQ1VUSU8sIEJFTlZPTElPLCB3aXRoIGZpdmUgb3Igc2l4IE1hc2tlcnMsIFRvcmNoLWJlYXJlcnMsIGFuZCBvdGhlcnMgCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIHRoaXMgc3BlZWNoIGJlIHNwb2tlIGZvciBvdXIgZXhjdXNlPwogICAgT3Igc2hhbGwgd2Ugb24gd2l0aG91dCBhIGFwb2xvZ3kCgpCRU5WT0xJTwoKICAgIFRoZSBkYXRlIGlzIG91dCBvZiBzdWNoIHByb2xpeGl0eToKICAgIFdlJ2xsIGhhdmUgbm8gQ3VwaWQgaG9vZHdpbmsnZCB3aXRoIGEgc2NhcmYsCiAgICBCZWFyaW5nIGEgVGFydGFyJ3MgcGFpbnRlZCBib3cgb2YgbGF0aCwKICAgIFNjYXJpbmcgdGhlIGxhZGllcyBsaWtlIGEgY3Jvdy1rZWVwZXI7CiAgICBOb3Igbm8gd2l0aG91dC1ib29rIHByb2xvZ3VlLCBmYWludGx5IHNwb2tlCiAgICBBZnRlciB0aGUgcHJvbXB0ZXIsIGZvciBvdXIgZW50cmFuY2U6CiAgICBCdXQgbGV0IHRoZW0gbWVhc3VyZSB1cyBieSB3aGF0IHRoZXkgd2lsbDsKICAgIFdlJ2xsIG1lYXN1cmUgdGhlbSBhIG1lYXN1cmUsIGFuZCBiZSBnb25lLgoKUk9NRU8KCiAgICBHaXZlIG1lIGEgdG9yY2g6IEkgYW0gbm90IGZvciB0aGlzIGFtYmxpbmc7CiAgICBCZWluZyBidXQgaGVhdnksIEkgd2lsbCBiZWFyIHRoZSBsaWdodC4KCk1FUkNVVElPCgogICAgTmF5LCBnZW50bGUgUm9tZW8sIHdlIG11c3QgaGF2ZSB5b3UgZGFuY2UuCgpST01FTwoKICAgIE5vdCBJLCBiZWxpZXZlIG1lOiB5b3UgaGF2ZSBkYW5jaW5nIHNob2VzCiAgICBXaXRoIG5pbWJsZSBzb2xlczogSSBoYXZlIGEgc291bCBvZiBsZWFkCiAgICBTbyBzdGFrZXMgbWUgdG8gdGhlIGdyb3VuZCBJIGNhbm5vdCBtb3ZlLgoKTUVSQ1VUSU8KCiAgICBZb3UgYXJlIGEgbG92ZXI7IGJvcnJvdyBDdXBpZCdzIHdpbmdzLAogICAgQW5kIHNvYXIgd2l0aCB0aGVtIGFib3ZlIGEgY29tbW9uIGJvdW5kLgoKUk9NRU8KCiAgICBJIGFtIHRvbyBzb3JlIGVucGllcmNlZCB3aXRoIGhpcyBzaGFmdAogICAgVG8gc29hciB3aXRoIGhpcyBsaWdodCBmZWF0aGVycywgYW5kIHNvIGJvdW5kLAogICAgSSBjYW5ub3QgYm91bmQgYSBwaXRjaCBhYm92ZSBkdWxsIHdvZToKICAgIFVuZGVyIGxvdmUncyBoZWF2eSBidXJkZW4gZG8gSSBzaW5rLgoKTUVSQ1VUSU8KCiAgICBBbmQsIHRvIHNpbmsgaW4gaXQsIHNob3VsZCB5b3UgYnVyZGVuIGxvdmU7CiAgICBUb28gZ3JlYXQgb3BwcmVzc2lvbiBmb3IgYSB0ZW5kZXIgdGhpbmcuCgpST01FTwoKICAgIElzIGxvdmUgYSB0ZW5kZXIgdGhpbmcIGl0IGlzIHRvbyByb3VnaCwKICAgIFRvbyBydWRlLCB0b28gYm9pc3Rlcm91cywgYW5kIGl0IHByaWNrcyBsaWtlIHRob3JuLgoKTUVSQ1VUSU8KCiAgICBJZiBsb3ZlIGJlIHJvdWdoIHdpdGggeW91LCBiZSByb3VnaCB3aXRoIGxvdmU7CiAgICBQcmljayBsb3ZlIGZvciBwcmlja2luZywgYW5kIHlvdSBiZWF0IGxvdmUgZG93bi4KICAgIEdpdmUgbWUgYSBjYXNlIHRvIHB1dCBteSB2aXNhZ2UgaW46CiAgICBBIHZpc29yIGZvciBhIHZpc29yISB3aGF0IGNhcmUgSQogICAgV2hhdCBjdXJpb3VzIGV5ZSBkb3RoIHF1b3RlIGRlZm9ybWl0aWVzPwogICAgSGVyZSBhcmUgdGhlIGJlZXRsZSBicm93cyBzaGFsbCBibHVzaCBmb3IgbWUuCgpCRU5WT0xJTwoKICAgIENvbWUsIGtub2NrIGFuZCBlbnRlcjsgYW5kIG5vIHNvb25lciBpbiwKICAgIEJ1dCBldmVyeSBtYW4gYmV0YWtlIGhpbSB0byBoaXMgbGVncy4KClJPTUVPCgogICAgQSB0b3JjaCBmb3IgbWU6IGxldCB3YW50b25zIGxpZ2h0IG9mIGhlYXJ0CiAgICBUaWNrbGUgdGhlIHNlbnNlbGVzcyBydXNoZXMgd2l0aCB0aGVpciBoZWVscywKICAgIEZvciBJIGFtIHByb3ZlcmInZCB3aXRoIGEgZ3JhbmRzaXJlIHBocmFzZTsKICAgIEknbGwgYmUgYSBjYW5kbGUtaG9sZGVyLCBhbmQgbG9vayBvbi4KICAgIFRoZSBnYW1lIHdhcyBuZSdlciBzbyBmYWlyLCBhbmQgSSBhbSBkb25lLgoKTUVSQ1VUSU8KCiAgICBUdXQsIGR1bidzIHRoZSBtb3VzZSwgdGhlIGNvbnN0YWJsZSdzIG93biB3b3JkOgogICAgSWYgdGhvdSBhcnQgZHVuLCB3ZSdsbCBkcmF3IHRoZWUgZnJvbSB0aGUgbWlyZQogICAgT2YgdGhpcyBzaXItcmV2ZXJlbmNlIGxvdmUsIHdoZXJlaW4gdGhvdSBzdGljaydzdAogICAgVXAgdG8gdGhlIGVhcnMuIENvbWUsIHdlIGJ1cm4gZGF5bGlnaHQsIGhvIQoKUk9NRU8KCiAgICBOYXksIHRoYXQncyBub3Qgc28uCgpNRVJDVVRJTwoKICAgIEkgbWVhbiwgc2lyLCBpbiBkZWxheQogICAgV2Ugd2FzdGUgb3VyIGxpZ2h0cyBpbiB2YWluLCBsaWtlIGxhbXBzIGJ5IGRheS4KICAgIFRha2Ugb3VyIGdvb2QgbWVhbmluZywgZm9yIG91ciBqdWRnbWVudCBzaXRzCiAgICBGaXZlIHRpbWVzIGluIHRoYXQgZXJlIG9uY2UgaW4gb3VyIGZpdmUgd2l0cy4KClJPTUVPCgogICAgQW5kIHdlIG1lYW4gd2VsbCBpbiBnb2luZyB0byB0aGlzIG1hc2s7CiAgICBCdXQgJ3RpcyBubyB3aXQgdG8gZ28uCgpNRVJDVVRJTwoKICAgIFdoeSwgbWF5IG9uZSBhc2sCgpST01FTwoKICAgIEkgZHJlYW0nZCBhIGRyZWFtIHRvLW5pZ2h0LgoKTUVSQ1VUSU8KCiAgICBBbmQgc28gZGlkIEkuCgpST01FTwoKICAgIFdlbGwsIHdoYXQgd2FzIHlvdXJzPwoKTUVSQ1VUSU8KCiAgICBUaGF0IGRyZWFtZXJzIG9mdGVuIGxpZS4KClJPTUVPCgogICAgSW4gYmVkIGFzbGVlcCwgd2hpbGUgdGhleSBkbyBkcmVhbSB0aGluZ3MgdHJ1ZS4KCk1FUkNVVElPCgogICAgTywgdGhlbiwgSSBzZWUgUXVlZW4gTWFiIGhhdGggYmVlbiB3aXRoIHlvdS4KICAgIFNoZSBpcyB0aGUgZmFpcmllcycgbWlkd2lmZSwgYW5kIHNoZSBjb21lcwogICAgSW4gc2hhcGUgbm8gYmlnZ2VyIHRoYW4gYW4gYWdhdGUtc3RvbmUKICAgIE9uIHRoZSBmb3JlLWZpbmdlciBvZiBhbiBhbGRlcm1hbiwKICAgIERyYXduIHdpdGggYSB0ZWFtIG9mIGxpdHRsZSBhdG9taWVzCiAgICBBdGh3YXJ0IG1lbidzIG5vc2VzIGFzIHRoZXkgbGllIGFzbGVlcDsKICAgIEhlciB3YWdvbi1zcG9rZXMgbWFkZSBvZiBsb25nIHNwaWRlcnMnIGxlZ3MsCiAgICBUaGUgY292ZXIgb2YgdGhlIHdpbmdzIG9mIGdyYXNzaG9wcGVycywKICAgIFRoZSB0cmFjZXMgb2YgdGhlIHNtYWxsZXN0IHNwaWRlcidzIHdlYiwKICAgIFRoZSBjb2xsYXJzIG9mIHRoZSBtb29uc2hpbmUncyB3YXRlcnkgYmVhbXMsCiAgICBIZXIgd2hpcCBvZiBjcmlja2V0J3MgYm9uZSwgdGhlIGxhc2ggb2YgZmlsbSwKICAgIEhlciB3YWdvbmVyIGEgc21hbGwgZ3JleS1jb2F0ZWQgZ25hdCwKICAgIE5vdCBzbyBiaWcgYXMgYSByb3VuZCBsaXR0bGUgd29ybQogICAgUHJpY2snZCBmcm9tIHRoZSBsYXp5IGZpbmdlciBvZiBhIG1haWQ7CiAgICBIZXIgY2hhcmlvdCBpcyBhbiBlbXB0eSBoYXplbC1udXQKICAgIE1hZGUgYnkgdGhlIGpvaW5lciBzcXVpcnJlbCBvciBvbGQgZ3J1YiwKICAgIFRpbWUgb3V0IG8nIG1pbmQgdGhlIGZhaXJpZXMnIGNvYWNobWFrZXJzLgogICAgQW5kIGluIHRoaXMgc3RhdGUgc2hlIGdhbGxvcHMgbmlnaHQgYnkgbmlnaHQKICAgIFRocm91Z2ggbG92ZXJzJyBicmFpbnMsIGFuZCB0aGVuIHRoZXkgZHJlYW0gb2YgbG92ZTsKICAgIE8nZXIgY291cnRpZXJzJyBrbmVlcywgdGhhdCBkcmVhbSBvbiBjb3VydCdzaWVzIHN0cmFpZ2h0LAogICAgTydlciBsYXd5ZXJzJyBmaW5nZXJzLCB3aG8gc3RyYWlnaHQgZHJlYW0gb24gZmVlcywKICAgIE8nZXIgbGFkaWVzICcgbGlwcywgd2hvIHN0cmFpZ2h0IG9uIGtpc3NlcyBkcmVhbSwKICAgIFdoaWNoIG9mdCB0aGUgYW5ncnkgTWFiIHdpdGggYmxpc3RlcnMgcGxhZ3VlcywKICAgIEJlY2F1c2UgdGhlaXIgYnJlYXRocyB3aXRoIHN3ZWV0bWVhdHMgdGFpbnRlZCBhcmU6CiAgICBTb21ldGltZSBzaGUgZ2FsbG9wcyBvJ2VyIGEgY291cnRpZXIncyBub3NlLAogICAgQW5kIHRoZW4gZHJlYW1zIGhlIG9mIHNtZWxsaW5nIG91dCBhIHN1aXQ7CiAgICBBbmQgc29tZXRpbWUgY29tZXMgc2hlIHdpdGggYSB0aXRoZS1waWcncyB0YWlsCiAgICBUaWNrbGluZyBhIHBhcnNvbidzIG5vc2UgYXMgYScgbGllcyBhc2xlZXAsCiAgICBUaGVuIGRyZWFtcywgaGUgb2YgYW5vdGhlciBiZW5lZmljZToKICAgIFNvbWV0aW1lIHNoZSBkcml2ZXRoIG8nZXIgYSBzb2xkaWVyJ3MgbmVjaywKICAgIEFuZCB0aGVuIGRyZWFtcyBoZSBvZiBjdXR0aW5nIGZvcmVpZ24gdGhyb2F0cywKICAgIE9mIGJyZWFjaGVzLCBhbWJ1c2NhZG9lcywgU3BhbmlzaCBibGFkZXMsCiAgICBPZiBoZWFsdGhzIGZpdmUtZmF0aG9tIGRlZXA7IGFuZCB0aGVuIGFub24KICAgIERydW1zIGluIGhpcyBlYXIsIGF0IHdoaWNoIGhlIHN0YXJ0cyBhbmQgd2FrZXMsCiAgICBBbmQgYmVpbmcgdGh1cyBmcmlnaHRlZCBzd2VhcnMgYSBwcmF5ZXIgb3IgdHdvCiAgICBBbmQgc2xlZXBzIGFnYWluLiBUaGlzIGlzIHRoYXQgdmVyeSBNYWIKICAgIFRoYXQgcGxhdHMgdGhlIG1hbmVzIG9mIGhvcnNlcyBpbiB0aGUgbmlnaHQsCiAgICBBbmQgYmFrZXMgdGhlIGVsZmxvY2tzIGluIGZvdWwgc2x1dHRpc2ggaGFpcnMsCiAgICBXaGljaCBvbmNlIHVudGFuZ2xlZCwgbXVjaCBtaXNmb3J0dW5lIGJvZGVzOgogICAgVGhpcyBpcyB0aGUgaGFnLCB3aGVuIG1haWRzIGxpZSBvbiB0aGVpciBiYWNrcywKICAgIFRoYXQgcHJlc3NlcyB0aGVtIGFuZCBsZWFybnMgdGhlbSBmaXJzdCB0byBiZWFyLAogICAgTWFraW5nIHRoZW0gd29tZW4gb2YgZ29vZCBjYXJyaWFnZToKICAgIFRoaXMgaXMgc2hlLS0KClJPTUVPCgogICAgUGVhY2UsIHBlYWNlLCBNZXJjdXRpbywgcGVhY2UhCiAgICBUaG91IHRhbGsnc3Qgb2Ygbm90aGluZy4KCk1FUkNVVElPCgogICAgVHJ1ZSwgSSB0YWxrIG9mIGRyZWFtcywKICAgIFdoaWNoIGFyZSB0aGUgY2hpbGRyZW4gb2YgYW4gaWRsZSBicmFpbiwKICAgIEJlZ290IG9mIG5vdGhpbmcgYnV0IHZhaW4gZmFudGFzeSwKICAgIFdoaWNoIGlzIGFzIHRoaW4gb2Ygc3Vic3RhbmNlIGFzIHRoZSBhaXIKICAgIEFuZCBtb3JlIGluY29uc3RhbnQgdGhhbiB0aGUgd2luZCwgd2hvIHdvb2VzCiAgICBFdmVuIG5vdyB0aGUgZnJvemVuIGJvc29tIG9mIHRoZSBub3J0aCwKICAgIEFuZCwgYmVpbmcgYW5nZXInZCwgcHVmZnMgYXdheSBmcm9tIHRoZW5jZSwKICAgIFR1cm5pbmcgaGlzIGZhY2UgdG8gdGhlIGRldy1kcm9wcGluZyBzb3V0aC4KCkJFTlZPTElPCgogICAgVGhpcyB3aW5kLCB5b3UgdGFsayBvZiwgYmxvd3MgdXMgZnJvbSBvdXJzZWx2ZXM7CiAgICBTdXBwZXIgaXMgZG9uZSwgYW5kIHdlIHNoYWxsIGNvbWUgdG9vIGxhdGUuCgpST01FTwoKICAgIEkgZmVhciwgdG9vIGVhcmx5OiBmb3IgbXkgbWluZCBtaXNnaXZlcwogICAgU29tZSBjb25zZXF1ZW5jZSB5ZXQgaGFuZ2luZyBpbiB0aGUgc3RhcnMKICAgIFNoYWxsIGJpdHRlcmx5IGJlZ2luIGhpcyBmZWFyZnVsIGRhdGUKICAgIFdpdGggdGhpcyBuaWdodCdzIHJldmVscyBhbmQgZXhwaXJlIHRoZSB0ZXJtCiAgICBPZiBhIGRlc3Bpc2VkIGxpZmUgY2xvc2VkIGluIG15IGJyZWFzdAogICAgQnkgc29tZSB2aWxlIGZvcmZlaXQgb2YgdW50aW1lbHkgZGVhdGguCiAgICBCdXQgSGUsIHRoYXQgaGF0aCB0aGUgc3RlZXJhZ2Ugb2YgbXkgY291cnNlLAogICAgRGlyZWN0IG15IHNhaWwhIE9uLCBsdXN0eSBnZW50bGVtZW4uCgpCRU5WT0xJTwoKICAgIFN0cmlrZSwgZHJ1bS4KCiAgICBFeGV1bnQKClNDRU5FIFYuIEEgaGFsbCBpbiBDYXB1bGV0J3MgaG91c2UuCgogICAgTXVzaWNpYW5zIHdhaXRpbmcuIEVudGVyIFNlcnZpbmdtZW4gd2l0aCBuYXBraW5zIAoKRmlyc3QgU2VydmFudAoKICAgIFdoZXJlJ3MgUG90cGFuLCB0aGF0IGhlIGhlbHBzIG5vdCB0byB0YWtlIGF3YXkIEhlCiAgICBzaGlmdCBhIHRyZW5jaGVyPyBoZSBzY3JhcGUgYSB0cmVuY2hlciEKClNlY29uZCBTZXJ2YW50CgogICAgV2hlbiBnb29kIG1hbm5lcnMgc2hhbGwgbGllIGFsbCBpbiBvbmUgb3IgdHdvIG1lbidzCiAgICBoYW5kcyBhbmQgdGhleSB1bndhc2hlZCB0b28sICd0aXMgYSBmb3VsIHRoaW5nLgoKRmlyc3QgU2VydmFudAoKICAgIEF3YXkgd2l0aCB0aGUgam9pbnQtc3Rvb2xzLCByZW1vdmUgdGhlCiAgICBjb3VydC1jdXBib2FyZCwgbG9vayB0byB0aGUgcGxhdGUuIEdvb2QgdGhvdSwgc2F2ZQogICAgbWUgYSBwaWVjZSBvZiBtYXJjaHBhbmU7IGFuZCwgYXMgdGhvdSBsb3Zlc3QgbWUsIGxldAogICAgdGhlIHBvcnRlciBsZXQgaW4gU3VzYW4gR3JpbmRzdG9uZSBhbmQgTmVsbC4KICAgIEFudG9ueSwgYW5kIFBvdHBhbiEKClNlY29uZCBTZXJ2YW50CgogICAgQXksIGJveSwgcmVhZHkuCgpGaXJzdCBTZXJ2YW50CgogICAgWW91IGFyZSBsb29rZWQgZm9yIGFuZCBjYWxsZWQgZm9yLCBhc2tlZCBmb3IgYW5kCiAgICBzb3VnaHQgZm9yLCBpbiB0aGUgZ3JlYXQgY2hhbWJlci4KClNlY29uZCBTZXJ2YW50CgogICAgV2UgY2Fubm90IGJlIGhlcmUgYW5kIHRoZXJlIHRvby4gQ2hlZXJseSwgYm95czsgYmUKICAgIGJyaXNrIGF3aGlsZSwgYW5kIHRoZSBsb25nZXIgbGl2ZXIgdGFrZSBhbGwuCgogICAgRW50ZXIgQ0FQVUxFVCwgd2l0aCBKVUxJRVQgYW5kIG90aGVycyBvZiBoaXMgaG91c2UsIG1lZXRpbmcgdGhlIEd1ZXN0cyBhbmQgTWFza2VycwoKQ0FQVUxFVAoKICAgIFdlbGNvbWUsIGdlbnRsZW1lbiEgbGFkaWVzIHRoYXQgaGF2ZSB0aGVpciB0b2VzCiAgICBVbnBsYWd1ZWQgd2l0aCBjb3JucyB3aWxsIGhhdmUgYSBib3V0IHdpdGggeW91LgogICAgQWggaGEsIG15IG1pc3RyZXNzZXMhIHdoaWNoIG9mIHlvdSBhbGwKICAgIFdpbGwgbm93IGRlbnkgdG8gZGFuY2UIHNoZSB0aGF0IG1ha2VzIGRhaW50eSwKICAgIFNoZSwgSSdsbCBzd2VhciwgaGF0aCBjb3JuczsgYW0gSSBjb21lIG5lYXIgeWUgbm93PwogICAgV2VsY29tZSwgZ2VudGxlbWVuISBJIGhhdmUgc2VlbiB0aGUgZGF5CiAgICBUaGF0IEkgaGF2ZSB3b3JuIGEgdmlzb3IgYW5kIGNvdWxkIHRlbGwKICAgIEEgd2hpc3BlcmluZyB0YWxlIGluIGEgZmFpciBsYWR5J3MgZWFyLAogICAgU3VjaCBhcyB3b3VsZCBwbGVhc2U6ICd0aXMgZ29uZSwgJ3RpcyBnb25lLCAndGlzIGdvbmU6CiAgICBZb3UgYXJlIHdlbGNvbWUsIGdlbnRsZW1lbiEgY29tZSwgbXVzaWNpYW5zLCBwbGF5LgogICAgQSBoYWxsLCBhIGhhbGwhIGdpdmUgcm9vbSEgYW5kIGZvb3QgaXQsIGdpcmxzLgoKICAgIE11c2ljIHBsYXlzLCBhbmQgdGhleSBkYW5jZQogICAgTW9yZSBsaWdodCwgeW91IGtuYXZlczsgYW5kIHR1cm4gdGhlIHRhYmxlcyB1cCwKICAgIEFuZCBxdWVuY2ggdGhlIGZpcmUsIHRoZSByb29tIGlzIGdyb3duIHRvbyBob3QuCiAgICBBaCwgc2lycmFoLCB0aGlzIHVubG9vaydkLWZvciBzcG9ydCBjb21lcyB3ZWxsLgogICAgTmF5LCBzaXQsIG5heSwgc2l0LCBnb29kIGNvdXNpbiBDYXB1bGV0OwogICAgRm9yIHlvdSBhbmQgSSBhcmUgcGFzdCBvdXIgZGFuY2luZyBkYXlzOgogICAgSG93IGxvbmcgaXMndCBub3cgc2luY2UgbGFzdCB5b3Vyc2VsZiBhbmQgSQogICAgV2VyZSBpbiBhIG1hc2sCgpTZWNvbmQgQ2FwdWxldAoKICAgIEJ5J3IgbGFkeSwgdGhpcnR5IHllYXJzLgoKQ0FQVUxFVAoKICAgIFdoYXQsIG1hbiEgJ3RpcyBub3Qgc28gbXVjaCwgJ3RpcyBub3Qgc28gbXVjaDoKICAgICdUaXMgc2luY2UgdGhlIG51cHRpYWxzIG9mIEx1Y2VudGlvLAogICAgQ29tZSBwZW50ZWNvc3QgYXMgcXVpY2tseSBhcyBpdCB3aWxsLAogICAgU29tZSBmaXZlIGFuZCB0d2VudHkgeWVhcnM7IGFuZCB0aGVuIHdlIG1hc2snZC4KClNlY29uZCBDYXB1bGV0CgogICAgJ1RpcyBtb3JlLCAndGlzIG1vcmUsIGhpcyBzb24gaXMgZWxkZXIsIHNpcjsKICAgIEhpcyBzb24gaXMgdGhpcnR5LgoKQ0FQVUxFVAoKICAgIFdpbGwgeW91IHRlbGwgbWUgdGhhdD8KICAgIEhpcyBzb24gd2FzIGJ1dCBhIHdhcmQgdHdvIHllYXJzIGFnby4KClJPTUVPCgogICAgW1RvIGEgU2VydmluZ21hbl0gV2hhdCBsYWR5IGlzIHRoYXQsIHdoaWNoIGRvdGgKICAgIGVucmljaCB0aGUgaGFuZAogICAgT2YgeW9uZGVyIGtuaWdodD8KClNlcnZhbnQKCiAgICBJIGtub3cgbm90LCBzaXIuCgpST01FTwoKICAgIE8sIHNoZSBkb3RoIHRlYWNoIHRoZSB0b3JjaGVzIHRvIGJ1cm4gYnJpZ2h0IQogICAgSXQgc2VlbXMgc2hlIGhhbmdzIHVwb24gdGhlIGNoZWVrIG9mIG5pZ2h0CiAgICBMaWtlIGEgcmljaCBqZXdlbCBpbiBhbiBFdGhpb3BlJ3MgZWFyOwogICAgQmVhdXR5IHRvbyByaWNoIGZvciB1c2UsIGZvciBlYXJ0aCB0b28gZGVhciEKICAgIFNvIHNob3dzIGEgc25vd3kgZG92ZSB0cm9vcGluZyB3aXRoIGNyb3dzLAogICAgQXMgeW9uZGVyIGxhZHkgbydlciBoZXIgZmVsbG93cyBzaG93cy4KICAgIFRoZSBtZWFzdXJlIGRvbmUsIEknbGwgd2F0Y2ggaGVyIHBsYWNlIG9mIHN0YW5kLAogICAgQW5kLCB0b3VjaGluZyBoZXJzLCBtYWtlIGJsZXNzZWQgbXkgcnVkZSBoYW5kLgogICAgRGlkIG15IGhlYXJ0IGxvdmUgdGlsbCBub3cIGZvcnN3ZWFyIGl0LCBzaWdodCEKICAgIEZvciBJIG5lJ2VyIHNhdyB0cnVlIGJlYXV0eSB0aWxsIHRoaXMgbmlnaHQuCgpUWUJBTFQKCiAgICBUaGlzLCBieSBoaXMgdm9pY2UsIHNob3VsZCBiZSBhIE1vbnRhZ3VlLgogICAgRmV0Y2ggbWUgbXkgcmFwaWVyLCBib3kuIFdoYXQgZGFyZXMgdGhlIHNsYXZlCiAgICBDb21lIGhpdGhlciwgY292ZXInZCB3aXRoIGFuIGFudGljIGZhY2UsCiAgICBUbyBmbGVlciBhbmQgc2Nvcm4gYXQgb3VyIHNvbGVtbml0eT8KICAgIE5vdywgYnkgdGhlIHN0b2NrIGFuZCBob25vdXIgb2YgbXkga2luLAogICAgVG8gc3RyaWtlIGhpbSBkZWFkLCBJIGhvbGQgaXQgbm90IGEgc2luLgoKQ0FQVUxFVAoKICAgIFdoeSwgaG93IG5vdywga2luc21hbiEgd2hlcmVmb3JlIHN0b3JtIHlvdSBzbz8KClRZQkFMVAoKICAgIFVuY2xlLCB0aGlzIGlzIGEgTW9udGFndWUsIG91ciBmb2UsCiAgICBBIHZpbGxhaW4gdGhhdCBpcyBoaXRoZXIgY29tZSBpbiBzcGl0ZSwKICAgIFRvIHNjb3JuIGF0IG91ciBzb2xlbW5pdHkgdGhpcyBuaWdodC4KCkNBUFVMRVQKCiAgICBZb3VuZyBSb21lbyBpcyBpdD8KClRZQkFMVAoKICAgICdUaXMgaGUsIHRoYXQgdmlsbGFpbiBSb21lby4KCkNBUFVMRVQKCiAgICBDb250ZW50IHRoZWUsIGdlbnRsZSBjb3osIGxldCBoaW0gYWxvbmU7CiAgICBIZSBiZWFycyBoaW0gbGlrZSBhIHBvcnRseSBnZW50bGVtYW47CiAgICBBbmQsIHRvIHNheSB0cnV0aCwgVmVyb25hIGJyYWdzIG9mIGhpbQogICAgVG8gYmUgYSB2aXJ0dW91cyBhbmQgd2VsbC1nb3Zlcm4nZCB5b3V0aDoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd2VhbHRoIG9mIGFsbCB0aGUgdG93bgogICAgSGVyZSBpbiBteSBob3VzZSBkbyBoaW0gZGlzcGFyYWdlbWVudDoKICAgIFRoZXJlZm9yZSBiZSBwYXRpZW50LCB0YWtlIG5vIG5vdGUgb2YgaGltOgogICAgSXQgaXMgbXkgd2lsbCwgdGhlIHdoaWNoIGlmIHRob3UgcmVzcGVjdCwKICAgIFNob3cgYSBmYWlyIHByZXNlbmNlIGFuZCBwdXQgb2ZmIHRoZXNlIGZyb3ducywKICAgIEFuZCBpbGwtYmVzZWVtaW5nIHNlbWJsYW5jZSBmb3IgYSBmZWFzdC4KClRZQkFMVAoKICAgIEl0IGZpdHMsIHdoZW4gc3VjaCBhIHZpbGxhaW4gaXMgYSBndWVzdDoKICAgIEknbGwgbm90IGVuZHVyZSBoaW0uCgpDQVBVTEVUCgogICAgSGUgc2hhbGwgYmUgZW5kdXJlZDoKICAgIFdoYXQsIGdvb2RtYW4gYm95ISBJIHNheSwgaGUgc2hhbGw6IGdvIHRvOwogICAgQW0gSSB0aGUgbWFzdGVyIGhlcmUsIG9yIHlvdT8gZ28gdG8uCiAgICBZb3UnbGwgbm90IGVuZHVyZSBoaW0hIEdvZCBzaGFsbCBtZW5kIG15IHNvdWwhCiAgICBZb3UnbGwgbWFrZSBhIG11dGlueSBhbW9uZyBteSBndWVzdHMhCiAgICBZb3Ugd2lsbCBzZXQgY29jay1hLWhvb3AhIHlvdSdsbCBiZSB0aGUgbWFuIQoKVFlCQUxUCgogICAgV2h5LCB1bmNsZSwgJ3RpcyBhIHNoYW1lLgoKQ0FQVUxFVAoKICAgIEdvIHRvLCBnbyB0bzsKICAgIFlvdSBhcmUgYSBzYXVjeSBib3k6IGlzJ3Qgc28sIGluZGVlZD8KICAgIFRoaXMgdHJpY2sgbWF5IGNoYW5jZSB0byBzY2F0aGUgeW91LCBJIGtub3cgd2hhdDoKICAgIFlvdSBtdXN0IGNvbnRyYXJ5IG1lISBtYXJyeSwgJ3RpcyB0aW1lLgogICAgV2VsbCBzYWlkLCBteSBoZWFydHMhIFlvdSBhcmUgYSBwcmluY294OyBnbzoKICAgIEJlIHF1aWV0LCBvci0tTW9yZSBsaWdodCwgbW9yZSBsaWdodCEgRm9yIHNoYW1lIQogICAgSSdsbCBtYWtlIHlvdSBxdWlldC4gV2hhdCwgY2hlZXJseSwgbXkgaGVhcnRzIQoKVFlCQUxUCgogICAgUGF0aWVuY2UgcGVyZm9yY2Ugd2l0aCB3aWxmdWwgY2hvbGVyIG1lZXRpbmcKICAgIE1ha2VzIG15IGZsZXNoIHRyZW1ibGUgaW4gdGhlaXIgZGlmZmVyZW50IGdyZWV0aW5nLgogICAgSSB3aWxsIHdpdGhkcmF3OiBidXQgdGhpcyBpbnRydXNpb24gc2hhbGwKICAgIE5vdyBzZWVtaW5nIHN3ZWV0IGNvbnZlcnQgdG8gYml0dGVyIGdhbGwuCgogICAgRXhpdAoKUk9NRU8KCiAgICBbVG8gSlVMSUVUXSBJZiBJIHByb2ZhbmUgd2l0aCBteSB1bndvcnRoaWVzdCBoYW5kCiAgICBUaGlzIGhvbHkgc2hyaW5lLCB0aGUgZ2VudGxlIGZpbmUgaXMgdGhpczoKICAgIE15IGxpcHMsIHR3byBibHVzaGluZyBwaWxncmltcywgcmVhZHkgc3RhbmQKICAgIFRvIHNtb290aCB0aGF0IHJvdWdoIHRvdWNoIHdpdGggYSB0ZW5kZXIga2lzcy4KCkpVTElFVAoKICAgIEdvb2QgcGlsZ3JpbSwgeW91IGRvIHdyb25nIHlvdXIgaGFuZCB0b28gbXVjaCwKICAgIFdoaWNoIG1hbm5lcmx5IGRldm90aW9uIHNob3dzIGluIHRoaXM7CiAgICBGb3Igc2FpbnRzIGhhdmUgaGFuZHMgdGhhdCBwaWxncmltcycgaGFuZHMgZG8gdG91Y2gsCiAgICBBbmQgcGF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lIGJlIG1hcnJpZWQuCiAgICBNeSBncmF2ZSBpcyBsaWtlIHRvIGJlIG15IHdlZGRpbmcgYmVkLgoKTnVyc2UKCiAgICBIaXMgbmFtZSBpcyBSb21lbywgYW5kIGEgTW9udGFndWU7CiAgICBUaGUgb25seSBzb24gb2YgeW91ciBncmVhdCBlbmVteS4KCkpVTElFVAoKICAgIE15IG9ubHkgbG92ZSBzcHJ1bmcgZnJvbSBteSBvbmx5IGhhdGUhCiAgICBUb28gZWFybHkgc2VlbiB1bmtub3duLCBhbmQga25vd24gdG9vIGxhdGUhCiAgICBQcm9kaWdpb3VzIGJpcnRoIG9mIGxvdmUgaXQgaXMgdG8gbWUsCiAgICBUaGF0IEkgbXVzdCBsb3ZlIGEgbG9hdGhlZCBlbmVteS4KCk51cnNlCgogICAgV2hhdCdzIHRoaXMIHdoYXQncyB0aGlzPwoKSlVMSUVUCgogICAgQSByaHltZSBJIGxlYXJuJ2QgZXZlbiBub3cKICAgIE9mIG9uZSBJIGRhbmNlZCB3aXRoYWwuCgogICAgT25lIGNhbGxzIHdpdGhpbiAnSnVsaWV0LicKCk51cnNlCgogICAgQW5vbiwgYW5vbiEKICAgIENvbWUsIGxldCdzIGF3YXk7IHRoZSBzdHJhbmdlcnMgYWxsIGFyZSBnb25lLgoKICAgIEV4ZXVudAoKQUNUIElJClBST0xPR1VFCgogICAgRW50ZXIgQ2hvcnVzIAoKQ2hvcnVzCgogICAgTm93IG9sZCBkZXNpcmUgZG90aCBpbiBoaXMgZGVhdGgtYmVkIGxpZSwKICAgIEFuZCB5b3VuZyBhZmZlY3Rpb24gZ2FwZXMgdG8gYmUgaGlzIGhlaXI7CiAgICBUaGF0IGZhaXIgZm9yIHdoaWNoIGxvdmUgZ3JvYW4nZCBmb3IgYW5kIHdvdWxkIGRpZSwKICAgIFdpdGggdGVuZGVyIEp1bGlldCBtYXRjaCdkLCBpcyBub3cgbm90IGZhaXIuCiAgICBOb3cgUm9tZW8gaXMgYmVsb3ZlZCBhbmQgbG92ZXMgYWdhaW4sCiAgICBBbGlrZSBiZXR3aXRjaGVkIGJ5IHRoZSBjaGFybSBvZiBsb29rcywKICAgIEJ1dCB0byBoaXMgZm9lIHN1cHBvc2VkIGhlIG11c3QgY29tcGxhaW4sCiAgICBBbmQgc2hlIHN0ZWFsIGxvdmUncyBzd2VldCBiYWl0IGZyb20gZmVhcmZ1bCBob29rczoKICAgIEJlaW5nIGhlbGQgYSBmb2UsIGhlIG1heSBub3QgaGF2ZSBhY2Nlc3MKICAgIFRvIGJyZWF0aGUgc3VjaCB2b3dzIGFzIGxvdmVycyB1c2UgdG8gc3dlYXI7CiAgICBBbmQgc2hlIGFzIG11Y2ggaW4gbG92ZSwgaGVyIG1lYW5zIG11Y2ggbGVzcwogICAgVG8gbWVldCBoZXIgbmV3LWJlbG92ZWQgYW55IHdoZXJlOgogICAgQnV0IHBhc3Npb24gbGVuZHMgdGhlbSBwb3dlciwgdGltZSBtZWFucywgdG8gbWVldAogICAgVGVtcGVyaW5nIGV4dHJlbWl0aWVzIHdpdGggZXh0cmVtZSBzd2VldC4KCiAgICBFeGl0CgpTQ0VORSBJLiBBIGxhbmUgYnkgdGhlIHdhbGwgb2YgQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gCgpST01FTwoKICAgIENhbiBJIGdvIGZvcndhcmQgd2hlbiBteSBoZWFydCBpcyBoZXJlPwogICAgVHVybiBiYWNrLCBkdWxsIGVhcnRoLCBhbmQgZmluZCB0aHkgY2VudHJlIG91dC4KCiAgICBIZSBjbGltYnMgdGhlIHdhbGwsIGFuZCBsZWFwcyBkb3duIHdpdGhpbiBpdAoKICAgIEVudGVyIEJFTlZPTElPIGFuZCBNRVJDVVRJTwoKQkVOVk9MSU8KCiAgICBSb21lbyEgbXkgY291c2luIFJvbWVvIQoKTUVSQ1VUSU8KCiAgICBIZSBpcyB3aXNlOwogICAgQW5kLCBvbiBteSBsaWUsIGhhdGggc3RvbCduIGhpbSBob21lIHRvIGJlZC4KCkJFTlZPTElPCgogICAgSGUgcmFuIHRoaXMgd2F5LCBhbmQgbGVhcCdkIHRoaXMgb3JjaGFyZCB3YWxsOgogICAgQ2FsbCwgZ29vZCBNZXJjdXRpby4KCk1FUkNVVElPCgogICAgTmF5LCBJJ2xsIGNvbmp1cmUgdG9vLgogICAgUm9tZW8hIGh1bW91cnMhIG1hZG1hbiEgcGFzc2lvbiEgbG92ZXIhCiAgICBBcHBlYXIgdGhvdSBpbiB0aGUgbGlrZW5lc3Mgb2YgYSBzaWdoOgogICAgU3BlYWsgYnV0IG9uZSByaHltZSwgYW5kIEkgYW0gc2F0aXNmaWVkOwogICAgQ3J5IGJ1dCAnQXkgbWUhJyBwcm9ub3VuY2UgYnV0ICdsb3ZlJyBhbmQgJ2RvdmU7JwogICAgU3BlYWsgdG8gbXkgZ29zc2lwIFZlbnVzIG9uZSBmYWlyIHdvcmQsCiAgICBPbmUgbmljay1uYW1lIGZvciBoZXIgcHVyYmxpbmQgc29uIGFuZCBoZWlyLAogICAgWW91bmcgQWRhbSBDdXBpZCwgaGUgdGhhdCBzaG90IHNvIHRyaW0sCiAgICBXaGVuIEtpbmcgQ29waGV0dWEgbG92ZWQgdGhlIGJlZ2dhci1tYWlkIQogICAgSGUgaGVhcmV0aCBub3QsIGhlIHN0aXJyZXRoIG5vdCwgaGUgbW92ZXRoIG5vdDsKICAgIFRoZSBhcGUgaXMgZGVhZCwgYW5kIEkgbXVzdCBjb25qdXJlIGhpbS4KICAgIEkgY29uanVyZSB0aGVlIGJ5IFJvc2FsaW5lJ3MgYnJpZ2h0IGV5ZXMsCiAgICBCeSBoZXIgaGlnaCBmb3JlaGVhZCBhbmQgaGVyIHNjYXJsZXQgbGlwLAogICAgQnkgaGVyIGZpbmUgZm9vdCwgc3RyYWlnaHQgbGVnIGFuZCBxdWl2ZXJpbmcgdGhpZ2gKICAgIEFuZCB0aGUgZGVtZXNuZXMgdGhhdCB0aGVyZSBhZGphY2VudCBsaWUsCiAgICBUaGF0IGluIHRoeSBsaWtlbmVzcyB0aG91IGFwcGVhciB0byB1cyEKCkJFTlZPTElPCgogICAgQW5kIGlmIGhlIGhlYXIgdGhlZSwgdGhvdSB3aWx0IGFuZ2VyIGhpbS4KCk1FUkNVVElPCgogICAgVGhpcyBjYW5ub3QgYW5nZXIgaGltOiAndHdvdWxkIGFuZ2VyIGhpbQogICAgVG8gcmFpc2UgYSBzcGlyaXQgaW4gaGlzIG1pc3RyZXNzJyBjaXJjbGUKICAgIE9mIHNvbWUgc3RyYW5nZSBuYXR1cmUsIGxldHRpbmcgaXQgdGhlcmUgc3RhbmQKICAgIFRpbGwgc2hlIGhhZCBsYWlkIGl0IGFuZCBjb25qdXJlZCBpdCBkb3duOwogICAgVGhhdCB3ZXJlIHNvbWUgc3BpdGU6IG15IGludm9jYXRpb24KICAgIElzIGZhaXIgYW5kIGhvbmVzdCwgYW5kIGluIGhpcyBtaXN0cmVzIHMnIG5hbWUKICAgIEkgY29uanVyZSBvbmx5IGJ1dCB0byByYWlzZSB1cCBoaW0uCgpCRU5WT0xJTwoKICAgIENvbWUsIGhlIGhhdGggaGlkIGhpbXNlbGYgYW1vbmcgdGhlc2UgdHJlZXMsCiAgICBUbyBiZSBjb25zb3J0ZWQgd2l0aCB0aGUgaHVtb3JvdXMgbmlnaHQ6CiAgICBCbGluZCBpcyBoaXMgbG92ZSBhbmQgYmVzdCBiZWZpdHMgdGhlIGRhcmsuCgpNRVJDVVRJTwoKICAgIElmIGxvdmUgYmUgYmxpbmQsIGxvdmUgY2Fubm90IGhpdCB0aGUgbWFyay4KICAgIE5vdyB3aWxsIGhlIHNpdCB1bmRlciBhIG1lZGxhciB0cmVlLAogICAgQW5kIHdpc2ggaGlzIG1pc3RyZXNzIHdlcmUgdGhhdCBraW5kIG9mIGZydWl0CiAgICBBcyBtYWlkcyBjYWxsIG1lZGxhcnMsIHdoZW4gdGhleSBsYXVnaCBhbG9uZS4KICAgIFJvbWVvLCB0aGF0IHNoZSB3ZXJlLCBPLCB0aGF0IHNoZSB3ZXJlCiAgICBBbiBvcGVuIGV0IGNhZXRlcmEsIHRob3UgYSBwb3BlcmluIHBlYXIhCiAgICBSb21lbywgZ29vZCBuaWdodDogSSdsbCB0byBteSB0cnVja2xlLWJlZDsKICAgIFRoaXMgZmllbGQtYmVkIGlzIHRvbyBjb2xkIGZvciBtZSB0byBzbGVlcDoKICAgIENvbWUsIHNoYWxsIHdlIGdvPwoKQkVOVk9MSU8KCiAgICBHbywgdGhlbjsgZm9yICd0aXMgaW4gdmFpbgogICAgVG8gc2VlayBoaW0gaGVyZSB0aGF0IG1lYW5zIG5vdCB0byBiZSBmb3VuZC4KCiAgICBFeGV1bnQKClNDRU5FIElJLiBDYXB1bGV0J3Mgb3JjaGFyZC4KCiAgICBFbnRlciBST01FTyAKClJPTUVPCgogICAgSGUgamVzdHMgYXQgc2NhcnMgdGhhdCBuZXZlciBmZWx0IGEgd291bmQuCgogICAgSlVMSUVUIGFwcGVhcnMgYWJvdmUgYXQgYSB3aW5kb3cKICAgIEJ1dCwgc29mdCEgd2hhdCBsaWdodCB0aHJvdWdoIHlvbmRlciB3aW5kb3cgYnJlYWtzPwogICAgSXQgaXMgdGhlIGVhc3QsIGFuZCBKdWxpZXQgaXMgdGhlIHN1bi4KICAgIEFyaXNlLCBmYWlyIHN1biwgYW5kIGtpbGwgdGhlIGVudmlvdXMgbW9vbiwKICAgIFdobyBpcyBhbHJlYWR5IHNpY2sgYW5kIHBhbGUgd2l0aCBncmllZiwKICAgIFRoYXQgdGhvdSBoZXIgbWFpZCBhcnQgZmFyIG1vcmUgZmFpciB0aGFuIHNoZToKICAgIEJlIG5vdCBoZXIgbWFpZCwgc2luY2Ugc2hlIGlzIGVudmlvdXM7CiAgICBIZXIgdmVzdGFsIGxpdmVyeSBpcyBidXQgc2ljayBhbmQgZ3JlZW4KICAgIEFuZCBub25lIGJ1dCBmb29scyBkbyB3ZWFyIGl0OyBjYXN0IGl0IG9mZi4KICAgIEl0IGlzIG15IGxhZHksIE8sIGl0IGlzIG15IGxvdmUhCiAgICBPLCB0aGF0IHNoZSBrbmV3IHNoZSB3ZXJlIQogICAgU2hlIHNwZWFrcyB5ZXQgc2hlIHNheXMgbm90aGluZzogd2hhdCBvZiB0aGF0PwogICAgSGVyIGV5ZSBkaXNjb3Vyc2VzOyBJIHdpbGwgYW5zd2VyIGl0LgogICAgSSBhbSB0b28gYm9sZCwgJ3RpcyBub3QgdG8gbWUgc2hlIHNwZWFrczoKICAgIFR3byBvZiB0aGUgZmFpcmVzdCBzdGFycyBpbiBhbGwgdGhlIGhlYXZlbiwKICAgIEhhdmluZyBzb21lIGJ1c2luZXNzLCBkbyBlbnRyZWF0IGhlciBleWVzCiAgICBUbyB0d2lua2xlIGluIHRoZWlyIHNwaGVyZXMgdGlsbCB0aGV5IHJldHVybi4KICAgIFdoYXQgaWYgaGVyIGV5ZXMgd2VyZSB0aGVyZSwgdGhleSBpbiBoZXIgaGVhZD8KICAgIFRoZSBicmlnaHRuZXNzIG9mIGhlciBjaGVlayB3b3VsZCBzaGFtZSB0aG9zZSBzdGFycywKICAgIEFzIGRheWxpZ2h0IGRvdGggYSBsYW1wOyBoZXIgZXllcyBpbiBoZWF2ZW4KICAgIFdvdWxkIHRocm91Z2ggdGhlIGFpcnkgcmVnaW9uIHN0cmVhbSBzbyBicmlnaHQKICAgIFRoYXQgYmlyZHMgd291bGQgc2luZyBhbmQgdGhpbmsgaXQgd2VyZSBub3QgbmlnaHQuCiAgICBTZWUsIGhvdyBzaGUgbGVhbnMgaGVyIGNoZWVrIHVwb24gaGVyIGhhbmQhCiAgICBPLCB0aGF0IEkgd2VyZSBhIGdsb3ZlIHVwb24gdGhhdCBoYW5kLAogICAgVGhhdCBJIG1pZ2h0IHRvdWNoIHRoYXQgY2hlZWshCgpKVUxJRVQKCiAgICBBeSBtZSEKClJPTUVPCgogICAgU2hlIHNwZWFrczoKICAgIE8sIHNwZWFrIGFnYWluLCBicmlnaHQgYW5nZWwhIGZvciB0aG91IGFydAogICAgQXMgZ2xvcmlvdXMgdG8gdGhpcyBuaWdodCwgYmVpbmcgbydlciBteSBoZWFkCiAgICBBcyBpcyBhIHdpbmdlZCBtZXNzZW5nZXIgb2YgaGVhdmVuCiAgICBVbnRvIHRoZSB3aGl0ZS11cHR1cm5lZCB3b25kZXJpbmcgZXllcwogICAgT2YgbW9ydGFscyB0aGF0IGZhbGwgYmFjayB0byBnYXplIG9uIGhpbQogICAgV2hlbiBoZSBiZXN0cmlkZXMgdGhlIGxhenktcGFjaW5nIGNsb3VkcwogICAgQW5kIHNhaWxzIHVwb24gdGhlIGJvc29tIG9mIHRoZSBhaXIuCgpKVUxJRVQKCiAgICBPIFJvbWVvLCBSb21lbyEgd2hlcmVmb3JlIGFydCB0aG91IFJvbWVvPwogICAgRGVueSB0aHkgZmF0aGVyIGFuZCByZWZ1c2UgdGh5IG5hbWU7CiAgICBPciwgaWYgdGhvdSB3aWx0IG5vdCwgYmUgYnV0IHN3b3JuIG15IGxvdmUsCiAgICBBbmQgSSdsbCBubyBsb25nZXIgYmUgYSBDYXB1bGV0LgoKUk9NRU8KCiAgICBbQXNpZGVdIFNoYWxsIEkgaGVhciBtb3JlLCBvciBzaGFsbCBJIHNwZWFrIGF0IHRoaXMCgpKVUxJRVQKCiAgICAnVGlzIGJ1dCB0aHkgbmFtZSB0aGF0IGlzIG15IGVuZW15OwogICAgVGhvdSBhcnQgdGh5c2VsZiwgdGhvdWdoIG5vdCBhIE1vbnRhZ3VlLgogICAgV2hhdCdzIE1vbnRhZ3VlPyBpdCBpcyBub3IgaGFuZCwgbm9yIGZvb3QsCiAgICBOb3IgYXJtLCBub3IgZmFjZSwgbm9yIGFueSBvdGhlciBwYXJ0CiAgICBCZWxvbmdpbmcgdG8gYSBtYW4uIE8sIGJlIHNvbWUgb3RoZXIgbmFtZSEKICAgIFdoYXQncyBpbiBhIG5hbWUIHRoYXQgd2hpY2ggd2UgY2FsbCBhIHJvc2UKICAgIEJ5IGFueSBvdGhlciBuYW1lIHdvdWxkIHNtZWxsIGFzIHN3ZWV0OwogICAgU28gUm9tZW8gd291bGQsIHdlcmUgaGUgbm90IFJvbWVvIGNhbGwnZCwKICAgIFJldGFpbiB0aGF0IGRlYXIgcGVyZmVjdGlvbiB3aGljaCBoZSBvd2VzCiAgICBXaXRob3V0IHRoYXQgdGl0bGUuIFJvbWVvLCBkb2ZmIHRoeSBuYW1lLAogICAgQW5kIGZvciB0aGF0IG5hbWUgd2hpY2ggaXMgbm8gcGFydCBvZiB0aGVlCiAgICBUYWtlIGFsbCBteXNlbGYuCgpST01FTwoKICAgIEkgdGFrZSB0aGVlIGF0IHRoeSB3b3JkOgogICAgQ2FsbCBtZSBidXQgbG92ZSwgYW5kIEknbGwgYmUgbmV3IGJhcHRpemVkOwogICAgSGVuY2Vmb3J0aCBJIG5ldmVyIHdpbGwgYmUgUm9tZW8uCgpKVUxJRVQKCiAgICBXaGF0IG1hbiBhcnQgdGhvdSB0aGF0IHRodXMgYmVzY3JlZW4nZCBpbiBuaWdodAogICAgU28gc3R1bWJsZXN0IG9uIG15IGNvdW5zZWwCgpST01FTwoKICAgIEJ5IGEgbmFtZQogICAgSSBrbm93IG5vdCBob3cgdG8gdGVsbCB0aGVlIHdobyBJIGFtOgogICAgTXkgbmFtZSwgZGVhciBzYWludCwgaXMgaGF0ZWZ1bCB0byBteXNlbGYsCiAgICBCZWNhdXNlIGl0IGlzIGFuIGVuZW15IHRvIHRoZWU7CiAgICBIYWQgSSBpdCB3cml0dGVuLCBJIHdvdWxkIHRlYXIgdGhlIHdvcmQuCgpKVUxJRVQKCiAgICBNeSBlYXJzIGhhdmUgbm90IHlldCBkcnVuayBhIGh1bmRyZWQgd29yZHMKICAgIE9mIHRoYXQgdG9uZ3VlJ3MgdXR0ZXJhbmNlLCB5ZXQgSSBrbm93IHRoZSBzb3VuZDoKICAgIEFydCB0aG91IG5vdCBSb21lbyBhbmQgYSBNb250YWd1ZT8KClJPTUVPCgogICAgTmVpdGhlciwgZmFpciBzYWludCwgaWYgZWl0aGVyIHRoZWUgZGlzbGlrZS4KCkpVTElFVAoKICAgIEhvdyBjYW1lc3QgdGhvdSBoaXRoZXIsIHRlbGwgbWUsIGFuZCB3aGVyZWZvcmUCiAgICBUaGUgb3JjaGFyZCB3YWxscyBhcmUgaGlnaCBhbmQgaGFyZCB0byBjbGltYiwKICAgIEFuZCB0aGUgcGxhY2UgZGVhdGgsIGNvbnNpZGVyaW5nIHdobyB0aG91IGFydCwKICAgIElmIGFueSBvZiBteSBraW5zbWVuIGZpbmQgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBXaXRoIGxvdmUncyBsaWdodCB3aW5ncyBkaWQgSSBvJ2VyLXBlcmNoIHRoZXNlIHdhbGxzOwogICAgRm9yIHN0b255IGxpbWl0cyBjYW5ub3QgaG9sZCBsb3ZlIG91dCwKICAgIEFuZCB3aGF0IGxvdmUgY2FuIGRvIHRoYXQgZGFyZXMgbG92ZSBhdHRlbXB0OwogICAgVGhlcmVmb3JlIHRoeSBraW5zbWVuIGFyZSBubyBsZXQgdG8gbWUuCgpKVUxJRVQKCiAgICBJZiB0aGV5IGRvIHNlZSB0aGVlLCB0aGV5IHdpbGwgbXVyZGVyIHRoZWUuCgpST01FTwoKICAgIEFsYWNrLCB0aGVyZSBsaWVzIG1vcmUgcGVyaWwgaW4gdGhpbmUgZXllCiAgICBUaGFuIHR3ZW50eSBvZiB0aGVpciBzd29yZHM6IGxvb2sgdGhvdSBidXQgc3dlZXQsCiAgICBBbmQgSSBhbSBwcm9vZiBhZ2FpbnN0IHRoZWlyIGVubWl0eS4KCkpVTElFVAoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd29ybGQgdGhleSBzYXcgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBJIGhhdmUgbmlnaHQncyBjbG9hayB0byBoaWRlIG1lIGZyb20gdGhlaXIgc2lnaHQ7CiAgICBBbmQgYnV0IHRob3UgbG92ZSBtZSwgbGV0IHRoZW0gZmluZCBtZSBoZXJlOgogICAgTXkgbGlmZSB3ZXJlIGJldHRlciBlbmRlZCBieSB0aGVpciBoYXRlLAogICAgVGhhbiBkZWF0aCBwcm9yb2d1ZWQsIHdhbnRpbmcgb2YgdGh5IGxvdmUuCgpKVUxJRVQKCiAgICBCeSB3aG9zZSBkaXJlY3Rpb24gZm91bmQnc3QgdGhvdSBvdXQgdGhpcyBwbGFjZT8KClJPTUVPCgogICAgQnkgbG92ZSwgd2hvIGZpcnN0IGRpZCBwcm9tcHQgbWUgdG8gaW5xdWlyZTsKICAgIEhlIGxlbnQgbWUgY291bnNlbCBhbmQgSSBsZW50IGhpbSBleWVzLgogICAgSSBhbSBubyBwaWxvdDsgeWV0LCB3ZXJ0IHRob3UgYXMgZmFyCiAgICBBcyB0aGF0IHZhc3Qgc2hvcmUgd2FzaCdkIHdpdGggdGhlIGZhcnRoZXN0IHNlYSwKICAgIEkgd291bGQgYWR2ZW50dXJlIGZvciBzdWNoIG1lcmNoYW5kaXNlLgoKSlVMSUVUCgogICAgVGhvdSBrbm93J3N0IHRoZSBtYXNrIG9mIG5pZ2h0IGlzIG9uIG15IGZhY2UsCiAgICBFbHNlIHdvdWxkIGEgbWFpZGVuIGJsdXNoIGJlcGFpbnQgbXkgY2hlZWsKICAgIEZvciB0aGF0IHdoaWNoIHRob3UgaGFzdCBoZWFyZCBtZSBzcGVhayB0by1uaWdodAogICAgRmFpbiB3b3VsZCBJIGR3ZWxsIG9uIGZvcm0sIGZhaW4sIGZhaW4gZGVueQogICAgV2hhdCBJIGhhdmUgc3Bva2U6IGJ1dCBmYXJld2VsbCBjb21wbGltZW50IQogICAgRG9zdCB0aG91IGxvdmUgbWUIEkga25vdyB0aG91IHdpbHQgc2F5ICdBeSwnCiAgICBBbmQgSSB3aWxsIHRha2UgdGh5IHdvcmQ6IHlldCBpZiB0aG91IHN3ZWFyJ3N0LAogICAgVGhvdSBtYXlzdCBwcm92ZSBmYWxzZTsgYXQgbG92ZXJzJyBwZXJqdXJpZXMKICAgIFRoZW4gc2F5LCBKb3ZlIGxhdWdocy4gTyBnZW50bGUgUm9tZW8sCiAgICBJZiB0aG91IGRvc3QgbG92ZSwgcHJvbm91bmNlIGl0IGZhaXRoZnVsbHk6CiAgICBPciBpZiB0aG91IHRoaW5rJ3N0IEkgYW0gdG9vIHF1aWNrbHkgd29uLAogICAgSSdsbCBmcm93biBhbmQgYmUgcGVydmVyc2UgYW4gc2F5IHRoZWUgbmF5LAogICAgU28gdGhvdSB3aWx0IHdvbzsgYnV0IGVsc2UsIG5vdCBmb3IgdGhlIHdvcmxkLgogICAgSW4gdHJ1dGgsIGZhaXIgTW9udGFndWUsIEkgYW0gdG9vIGZvbmQsCiAgICBBbmQgdGhlcmVmb3JlIHRob3UgbWF5c3QgdGhpbmsgbXkgJ2hhdmlvciBsaWdodDoKICAgIEJ1dCB0cnVzdCBtZSwgZ2VudGxlbWFuLCBJJ2xsIHByb3ZlIG1vcmUgdHJ1ZQogICAgVGhhbiB0aG9zZSB0aGF0IGhhdmUgbW9yZSBjdW5uaW5nIHRvIGJlIHN0cmFuZ2UuCiAgICBJIHNob3VsZCBoYXZlIGJlZW4gbW9yZSBzdHJhbmdlLCBJIG11c3QgY29uZmVzcywKICAgIEJ1dCB0aGF0IHRob3Ugb3ZlcmhlYXJkJ3N0LCBlcmUgSSB3YXMgd2FyZSwKICAgIE15IHRydWUgbG92ZSdzIHBhc3Npb246IHRoZXJlZm9yZSBwYXJkb24gbWUsCiAgICBBbmQgbm90IGltcHV0ZSB0aGlzIHlpZWxkaW5nIHRvIGxpZ2h0IGxvdmUsCiAgICBXaGljaCB0aGUgZGFyayBuaWdodCBoYXRoIHNvIGRpc2NvdmVyZWQuCgpST01FTwoKICAgIExhZHksIGJ5IHlvbmRlciBibGVzc2VkIG1vb24gSSBzd2VhcgogICAgVGhhdCB0aXBzIHdpdGggc2lsdmVyIGFsbCB0aGVzZSBmcnVpdC10cmVlIHRvcHMtLQoKSlVMSUVUCgogICAgTywgc3dlYXIgbm90IGJ5IHRoZSBtb29uLCB0aGUgaW5jb25zdGFudCBtb29uLAogICAgVGhhdCBtb250aGx5IGNoYW5nZXMgaW4gaGVyIGNpcmNsZWQgb3JiLAogICAgTGVzdCB0aGF0IHRoeSBsb3ZlIHByb3ZlIGxpa2V3aXNlIHZhcmlhYmxlLgoKUk9NRU8KCiAgICBXaGF0IHNoYWxsIEkgc3dlYXIgYnkCgpKVUxJRVQKCiAgICBEbyBub3Qgc3dlYXIgYXQgYWxsOwogICAgT3IsIGlmIHRob3Ugd2lsdCwgc3dlYXIgYnkgdGh5IGdyYWNpb3VzIHNlbGYsCiAgICBXaGljaCBpcyB0aGUgZ29kIG9mIG15IGlkb2xhdHJ5LAogICAgQW5kIEknbGwgYmVsaWV2ZSB0aGVlLgoKUk9NRU8KCiAgICBJZiBteSBoZWFydCdzIGRlYXIgbG92ZS0tCgpKVUxJRVQKCiAgICBXZWxsLCBkbyBub3Qgc3dlYXI6IGFsdGhvdWdoIEkgam95IGluIHRoZWUsCiAgICBJIGhhdmUgbm8gam95IG9mIHRoaXMgY29udHJhY3QgdG8tbmlnaHQ6CiAgICBJdCBpcyB0b28gcmFzaCwgdG9vIHVuYWR2aXNlZCwgdG9vIHN1ZGRlbjsKICAgIFRvbyBsaWtlIHRoZSBsaWdodG5pbmcsIHdoaWNoIGRvdGggY2Vhc2UgdG8gYmUKICAgIEVyZSBvbmUgY2FuIHNheSAnSXQgbGlnaHRlbnMuJyBTd2VldCwgZ29vZCBuaWdodCEKICAgIFRoaXMgYnVkIG9mIGxvdmUsIGJ5IHN1bW1lcidzIHJpcGVuaW5nIGJyZWF0aCwKICAgIE1heSBwcm92ZSBhIGJlYXV0ZW91cyBmbG93ZXIgd2hlbiBuZXh0IHdlIG1lZXQuCiAgICBHb29kIG5pZ2h0LCBnb29kIG5pZ2h0ISBhcyBzd2VldCByZXBvc2UgYW5kIHJlc3QKICAgIENvbWUgdG8gdGh5IGhlYXJ0IGFzIHRoYXQgd2l0aGluIG15IGJyZWFzdCEKClJPTUVPCgogICAgTywgd2lsdCB0aG91IGxlYXZlIG1lIHNvIHVuc2F0aXNmaWVkPwoKSlVMSUVUCgogICAgV2hhdCBzYXRpc2ZhY3Rpb24gY2Fuc3QgdGhvdSBoYXZlIHRvLW5pZ2h0PwoKUk9NRU8KCiAgICBUaGUgZXhjaGFuZ2Ugb2YgdGh5IGxvdmUncyBmYWl0aGZ1bCB2b3cgZm9yIG1pbmUuCgpKVUxJRVQKCiAgICBJIGdhdmUgdGhlZSBtaW5lIGJlZm9yZSB0aG91IGRpZHN0IHJlcXVlc3QgaXQ6CiAgICBBbmQgeWV0IEkgd291bGQgaXQgd2VyZSB0byBnaXZlIGFnYWluLgoKUk9NRU8KCiAgICBXb3VsZHN0IHRob3Ugd2l0aGRyYXcgaXQIGZvciB3aGF0IHB1cnBvc2UsIGxvdmUCgpKVUxJRVQKCiAgICBCdXQgdG8gYmUgZnJhbmssIGFuZCBnaXZlIGl0IHRoZWUgYWdhaW4uCiAgICBBbmQgeWV0IEkgd2lzaCBidXQgZm9yIHRoZSB0aGluZyBJIGhhdmU6CiAgICBNeSBib3VudHkgaXMgYXMgYm91bmRsZXNzIGFzIHRoZSBzZWEsCiAgICBNeSBsb3ZlIGFzIGRlZXA7IHRoZSBtb3JlIEkgZ2l2ZSB0byB0aGVlLAogICAgVGhlIG1vcmUgSSBoYXZlLCBmb3IgYm90aCBhcmUgaW5maW5pdGUuCgogICAgTnVyc2UgY2FsbHMgd2l0aGluCiAgICBJIGhlYXIgc29tZSBub2lzZSB3aXRoaW47IGRlYXIgbG92ZSwgYWRpZXUhCiAgICBBbm9uLCBnb29kIG51cnNlISBTd2VldCBNb250YWd1ZSwgYmUgdHJ1ZS4KICAgIFN0YXkgYnV0IGEgbGl0dGxlLCBJIHdpbGwgY29tZSBhZ2Fpbi4KCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBPIGJsZXNzZWQsIGJsZXNzZWQgbmlnaHQhIEkgYW0gYWZlYXJkLgogICAgQmVpbmcgaW4gbmlnaHQsIGFsbCB0aGlzIGlzIGJ1dCBhIGRyZWFtLAogICAgVG9vIGZsYXR0ZXJpbmctc3dlZXQgdG8gYmUgc3Vic3RhbnRpYWwuCgogICAgUmUtZW50ZXIgSlVMSUVULCBhYm92ZQoKSlVMSUVUCgogICAgVGhyZWUgd29yZHMsIGRlYXIgUm9tZW8sIGFuZCBnb29kIG5pZ2h0IGluZGVlZC4KICAgIElmIHRoYXQgdGh5IGJlbnQgb2YgbG92ZSBiZSBob25vdXJhYmxlLAogICAgVGh5IHB1cnBvc2UgbWFycmlhZ2UsIHNlbmQgbWUgd29yZCB0by1tb3Jyb3csCiAgICBCeSBvbmUgdGhhdCBJJ2xsIHByb2N1cmUgdG8gY29tZSB0byB0aGVlLAogICAgV2hlcmUgYW5kIHdoYXQgdGltZSB0aG91IHdpbHQgcGVyZm9ybSB0aGUgcml0ZTsKICAgIEFuZCBhbGwgbXkgZm9ydHVuZXMgYXQgdGh5IGZvb3QgSSdsbCBsYXkKICAgIEFuZCBmb2xsb3cgdGhlZSBteSBsb3JkIHRocm91Z2hvdXQgdGhlIHdvcmxkLgoKTnVyc2UKCiAgICBbV2l0aGluXSBNYWRhbSEKCkpVTElFVAoKICAgIEkgY29tZSwgYW5vbi4tLUJ1dCBpZiB0aG91IG1lYW4nc3Qgbm90IHdlbGwsCiAgICBJIGRvIGJlc2VlY2ggdGhlZS0tCgpOdXJzZQoKICAgIFtXaXRoaW5dIE1hZGFtIQoKSlVMSUVUCgogICAgQnkgYW5kIGJ5LCBJIGNvbWU6LS0KICAgIFRvIGNlYXNlIHRoeSBzdWl0LCBhbmQgbGVhdmUgbWUgdG8gbXkgZ3JpZWY6CiAgICBUby1tb3Jyb3cgd2lsbCBJIHNlbmQuCgpST01FTwoKICAgIFNvIHRocml2ZSBteSBzb3VsLS0KCkpVTElFVAoKICAgIEEgdGhvdXNhbmQgdGltZXMgZ29vZCBuaWdodCEKCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBBIHRob3VzYW5kIHRpbWVzIHRoZSB3b3JzZSwgdG8gd2FudCB0aHkgbGlnaHQuCiAgICBMb3ZlIGdvZXMgdG93YXJkIGxvdmUsIGFzIHNjaG9vbGJveXMgZnJvbQogICAgdGhlaXIgYm9va3MsCiAgICBCdXQgbG92ZSBmcm9tIGxvdmUsIHRvd2FyZCBzY2hvb2wgd2l0aCBoZWF2eSBsb29rcy4KCiAgICBSZXRpcmluZwoKICAgIFJlLWVudGVyIEpVTElFVCwgYWJvdmUKCkpVTElFVAoKICAgIEhpc3QhIFJvbWVvLCBoaXN0ISBPLCBmb3IgYSBmYWxjb25lcidzIHZvaWNlLAogICAgVG8gbHVyZSB0aGlzIHRhc3NlbC1nZW50bGUgYmFjayBhZ2FpbiEKICAgIEJvbmRhZ2UgaXMgaG9hcnNlLCBhbmQgbWF5IG5vdCBzcGVhayBhbG91ZDsKICAgIEVsc2Ugd291bGQgSSB0ZWFyIHRoZSBjYXZlIHdoZXJlIEVjaG8gbGllcywKICAgIEFuZCBtYWtlIGhlciBhaXJ5IHRvbmd1ZSBtb3JlIGhvYXJzZSB0aGFuIG1pbmUsCiAgICBXaXRoIHJlcGV0aXRpb24gb2YgbXkgUm9tZW8ncyBuYW1lLgoKUk9NRU8KCiAgICBJdCBpcyBteSBzb3VsIHRoYXQgY2FsbHMgdXBvbiBteSBuYW1lOgogICAgSG93IHNpbHZlci1zd2VldCBzb3VuZCBsb3ZlcnMnIHRvbmd1ZXMgYnkgbmlnaHQsCiAgICBMaWtlIHNvZnRlc3QgbXVzaWMgdG8gYXR0ZW5kaW5nIGVhcnMhCgpKVUxJRVQKCiAgICBSb21lbyEKClJPTUVPCgogICAgTXkgZGVhcj8KCkpVTElFVAoKICAgIEF0IHdoYXQgbydjbG9jayB0by1tb3Jyb3cKICAgIFNoYWxsIEkgc2VuZCB0byB0aGVlPwoKUk9NRU8KCiAgICBBdCB0aGUgaG91ciBvZiBuaW5lLgoKSlVMSUVUCgogICAgSSB3aWxsIG5vdCBmYWlsOiAndGlzIHR3ZW50eSB5ZWFycyB0aWxsIHRoZW4uCiAgICBJIGhhdmUgZm9yZ290IHdoeSBJIGRpZCBjYWxsIHRoZWUgYmFjay4KClJPTUVPCgogICAgTGV0IG1lIHN0YW5kIGhlcmUgdGlsbCB0aG91IHJlbWVtYmVyIGl0LgoKSlVMSUVUCgogICAgSSBzaGFsbCBmb3JnZXQsIHRvIGhhdmUgdGhlZSBzdGlsbCBzdGFuZCB0aGVyZSwKICAgIFJlbWVtYmVyaW5nIGhvdyBJIGxvdmUgdGh5IGNvbXBhbnkuCgpST01FTwoKICAgIEFuZCBJJ2xsIHN0aWxsIHN0YXksIHRvIGhhdmUgdGhlZSBzdGlsbCBmb3JnZXQsCiAgICBGb3JnZXR0aW5nIGFueSBvdGhlciBob21lIGJ1dCB0aGlzLgoKSlVMSUVUCgogICAgJ1RpcyBhbG1vc3QgbW9ybmluZzsgSSB3b3VsZCBoYXZlIHRoZWUgZ29uZToKICAgIEFuZCB5ZXQgbm8gZnVydGhlciB0aGFuIGEgd2FudG9uJ3MgYmlyZDsKICAgIFdobyBsZXRzIGl0IGhvcCBhIGxpdHRsZSBmcm9tIGhlciBoYW5kLAogICAgTGlrZSBhIHBvb3IgcHJpc29uZXIgaW4gaGlzIHR3aXN0ZWQgZ3l2ZXMsCiAgICBBbmQgd2l0aCBhIHNpbGsgdGhyZWFkIHBsdWNrcyBpdCBiYWNrIGFnYWluLAogICAgU28gbG92aW5nLWplYWxvdXMgb2YgaGlzIGxpYmVydHkuCgpST01FTwoKICAgIEkgd291bGQgSSB3ZXJlIHRoeSBiaXJkLgoKSlVMSUVUCgogICAgU3dlZXQsIHNvIHdvdWxkIEk6CiAgICBZZXQgSSBzaG91bGQga2lsbCB0aGVlIHdpdGggbXVjaCBjaGVyaXNoaW5nLgogICAgR29vZCBuaWdodCwgZ29vZCBuaWdodCEgcGFydGluZyBpcyBzdWNoCiAgICBzd2VldCBzb3Jyb3csCiAgICBUaGF0IEkgc2hhbGwgc2F5IGdvb2QgbmlnaHQgdGlsbCBpdCBiZSBtb3Jyb3cuCgogICAgRXhpdCBhYm92ZQoKUk9NRU8KCiAgICBTbGVlcCBkd2VsbCB1cG9uIHRoaW5lIGV5ZXMsIHBlYWNlIGluIHRoeSBicmVhc3QhCiAgICBXb3VsZCBJIHdlcmUgc2xlZXAgYW5kIHBlYWNlLCBzbyBzd2VldCB0byByZXN0IQogICAgSGVuY2Ugd2lsbCBJIHRvIG15IGdob3N0bHkgZmF0aGVyJ3MgY2VsbCwKICAgIEhpcyBoZWxwIHRvIGNyYXZlLCBhbmQgbXkgZGVhciBoYXAgdG8gdGVsbC4KCiAgICBFeGl0CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSwgd2l0aCBhIGJhc2tldCAKCkZSSUFSIExBVVJFTkNFCgogICAgVGhlIGdyZXktZXllZCBtb3JuIHNtaWxlcyBvbiB0aGUgZnJvd25pbmcgbmlnaHQsCiAgICBDaGVxdWVyaW5nIHRoZSBlYXN0ZXJuIGNsb3VkcyB3aXRoIHN0cmVha3Mgb2YgbGlnaHQsCiAgICBBbmQgZmxlY2tlZCBkYXJrbmVzcyBsaWtlIGEgZHJ1bmthcmQgcmVlbHMKICAgIEZyb20gZm9ydGggZGF5J3MgcGF0aCBhbmQgVGl0YW4ncyBmaWVyeSB3aGVlbHM6CiAgICBOb3csIGVyZSB0aGUgc3VuIGFkdmFuY2UgaGlzIGJ1cm5pbmcgZXllLAogICAgVGhlIGRheSB0byBjaGVlciBhbmQgbmlnaHQncyBkYW5rIGRldyB0byBkcnksCiAgICBJIG11c3QgdXAtZmlsbCB0aGlzIG9zaWVyIGNhZ2Ugb2Ygb3VycwogICAgV2l0aCBiYWxlZnVsIHdlZWRzIGFuZCBwcmVjaW91cy1qdWljZWQgZmxvd2Vycy4KICAgIFRoZSBlYXJ0aCB0aGF0J3MgbmF0dXJlJ3MgbW90aGVyIGlzIGhlciB0b21iOwogICAgV2hhdCBpcyBoZXIgYnVyeWluZyBncmF2ZSB0aGF0IGlzIGhlciB3b21iLAogICAgQW5kIGZyb20gaGVyIHdvbWIgY2hpbGRyZW4gb2YgZGl2ZXJzIGtpbmQKICAgIFdlIHN1Y2tpbmcgb24gaGVyIG5hdHVyYWwgYm9zb20gZmluZCwKICAgIE1hbnkgZm9yIG1hbnkgdmlydHVlcyBleGNlbGxlbnQsCiAgICBOb25lIGJ1dCBmb3Igc29tZSBhbmQgeWV0IGFsbCBkaWZmZXJlbnQuCiAgICBPLCBtaWNrbGUgaXMgdGhlIHBvd2VyZnVsIGdyYWNlIHRoYXQgbGllcwogICAgSW4gaGVyYnMsIHBsYW50cywgc3RvbmVzLCBhbmQgdGhlaXIgdHJ1ZSBxdWFsaXRpZXM6CiAgICBGb3Igbm91Z2h0IHNvIHZpbGUgdGhhdCBvbiB0aGUgZWFydGggZG90aCBsaXZlCiAgICBCdXQgdG8gdGhlIGVhcnRoIHNvbWUgc3BlY2lhbCBnb29kIGRvdGggZ2l2ZSwKICAgIE5vciBhdWdodCBzbyBnb29kIGJ1dCBzdHJhaW4nZCBmcm9tIHRoYXQgZmFpciB1c2UKICAgIFJldm9sdHMgZnJvbSB0cnVlIGJpcnRoLCBzdHVtYmxpbmcgb24gYWJ1c2U6CiAgICBWaXJ0dWUgaXRzZWxmIHR1cm5zIHZpY2UsIGJlaW5nIG1pc2FwcGxpZWQ7CiAgICBBbmQgdmljZSBzb21ldGltZXMgYnkgYWN0aW9uIGRpZ25pZmllZC4KICAgIFdpdGhpbiB0aGUgaW5mYW50IHJpbmQgb2YgdGhpcyBzbWFsbCBmbG93ZXIKICAgIFBvaXNvbiBoYXRoIHJlc2lkZW5jZSBhbmQgbWVkaWNpbmUgcG93ZXI6CiAgICBGb3IgdGhpcywgYmVpbmcgc21lbHQsIHdpdGggdGhhdCBwYXJ0IGNoZWVycyBlYWNoIHBhcnQ7CiAgICBCZWluZyB0YXN0ZWQsIHNsYXlzIGFsbCBzZW5zZXMgd2l0aCB0aGUgaGVhcnQuCiAgICBUd28gc3VjaCBvcHBvc2VkIGtpbmdzIGVuY2FtcCB0aGVtIHN0aWxsCiAgICBJbiBtYW4gYXMgd2VsbCBhcyBoZXJicywgZ3JhY2UgYW5kIHJ1ZGUgd2lsbDsKICAgIEFuZCB3aGVyZSB0aGUgd29yc2VyIGlzIHByZWRvbWluYW50LAogICAgRnVsbCBzb29uIHRoZSBjYW5rZXIgZGVhdGggZWF0cyB1cCB0aGF0IHBsYW50LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEdvb2QgbW9ycm93LCBmYXRoZXIuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlbmVkaWNpdGUhCiAgICBXaGF0IGVhcmx5IHRvbmd1ZSBzbyBzd2VldCBzYWx1dGV0aCBtZT8KICAgIFlvdW5nIHNvbiwgaXQgYXJndWVzIGEgZGlzdGVtcGVyJ2QgaGVhZAogICAgU28gc29vbiB0byBiaWQgZ29vZCBtb3Jyb3cgdG8gdGh5IGJlZDoKICAgIENhcmUga2VlcHMgaGlzIHdhdGNoIGluIGV2ZXJ5IG9sZCBtYW4ncyBleWUsCiAgICBBbmQgd2hlcmUgY2FyZSBsb2RnZXMsIHNsZWVwIHdpbGwgbmV2ZXIgbGllOwogICAgQnV0IHdoZXJlIHVuYnJ1aXNlZCB5b3V0aCB3aXRoIHVuc3R1ZmYnZCBicmFpbgogICAgRG90aCBjb3VjaCBoaXMgbGltYnMsIHRoZXJlIGdvbGRlbiBzbGVlcCBkb3RoIHJlaWduOgogICAgVGhlcmVmb3JlIHRoeSBlYXJsaW5lc3MgZG90aCBtZSBhc3N1cmUKICAgIFRob3UgYXJ0IHVwLXJvdXNlZCBieSBzb21lIGRpc3RlbXBlcmF0dXJlOwogICAgT3IgaWYgbm90IHNvLCB0aGVuIGhlcmUgSSBoaXQgaXQgcmlnaHQsCiAgICBPdXIgUm9tZW8gaGF0aCBub3QgYmVlbiBpbiBiZWQgdG8tbmlnaHQuCgpST01FTwoKICAgIFRoYXQgbGFzdCBpcyB0cnVlOyB0aGUgc3dlZXRlciByZXN0IHdhcyBtaW5lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHb2QgcGFyZG9uIHNpbiEgd2FzdCB0aG91IHdpdGggUm9zYWxpbmUCgpST01FTwoKICAgIFdpdGggUm9zYWxpbmUsIG15IGdob3N0bHkgZmF0aGVyPyBubzsKICAgIEkgaGF2ZSBmb3Jnb3QgdGhhdCBuYW1lLCBhbmQgdGhhdCBuYW1lJ3Mgd29lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGF0J3MgbXkgZ29vZCBzb246IGJ1dCB3aGVyZSBoYXN0IHRob3UgYmVlbiwgdGhlbj8KClJPTUVPCgogICAgSSdsbCB0ZWxsIHRoZWUsIGVyZSB0aG91IGFzayBpdCBtZSBhZ2Fpbi4KICAgIEkgaGF2ZSBiZWVuIGZlYXN0aW5nIHdpdGggbWluZSBlbmVteSwKICAgIFdoZXJlIG9uIGEgc3VkZGVuIG9uZSBoYXRoIHdvdW5kZWQgbWUsCiAgICBUaGF0J3MgYnkgbWUgd291bmRlZDogYm90aCBvdXIgcmVtZWRpZXMKICAgIFdpdGhpbiB0aHkgaGVscCBhbmQgaG9seSBwaHlzaWMgbGllczoKICAgIEkgYmVhciBubyBoYXRyZWQsIGJsZXNzZWQgbWFuLCBmb3IsIGxvLAogICAgTXkgaW50ZXJjZXNzaW9uIGxpa2V3aXNlIHN0ZWFkcyBteSBmb2UuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlIHBsYWluLCBnb29kIHNvbiwgYW5kIGhvbWVseSBpbiB0aHkgZHJpZnQ7CiAgICBSaWRkbGluZyBjb25mZXNzaW9uIGZpbmRzIGJ1dCByaWRkbGluZyBzaHJpZnQuCgpST01FTwoKICAgIFRoZW4gcGxhaW5seSBrbm93IG15IGhlYXJ0J3MgZGVhciBsb3ZlIGlzIHNldAogICAgT24gdGhlIGZhaXIgZGF1Z2h0ZXIgb2YgcmljaCBDYXB1bGV0OgogICAgQXMgbWluZSBvbiBoZXJzLCBzbyBoZXJzIGlzIHNldCBvbiBtaW5lOwogICAgQW5kIGFsbCBjb21iaW5lZCwgc2F2ZSB3aGF0IHRob3UgbXVzdCBjb21iaW5lCiAgICBCeSBob2x5IG1hcnJpYWdlOiB3aGVuIGFuZCB3aGVyZSBhbmQgaG93CiAgICBXZSBtZXQsIHdlIHdvbydkIGFuZCBtYWRlIGV4Y2hhbmdlIG9mIHZvdywKICAgIEknbGwgdGVsbCB0aGVlIGFzIHdlIHBhc3M7IGJ1dCB0aGlzIEkgcHJheSwKICAgIFRoYXQgdGhvdSBjb25zZW50IHRvIG1hcnJ5IHVzIHRvLWRheS4KCkZSSUFSIExBVVJFTkNFCgogICAgSG9seSBTYWludCBGcmFuY2lzLCB3aGF0IGEgY2hhbmdlIGlzIGhlcmUhCiAgICBJcyBSb3NhbGluZSwgd2hvbSB0aG91IGRpZHN0IGxvdmUgc28gZGVhciwKICAgIFNvIHNvb24gZm9yc2FrZW4IHlvdW5nIG1lbidzIGxvdmUgdGhlbiBsaWVzCiAgICBOb3QgdHJ1bHkgaW4gdGhlaXIgaGVhcnRzLCBidXQgaW4gdGhlaXIgZXllcy4KICAgIEplc3UgTWFyaWEsIHdoYXQgYSBkZWFsIG9mIGJyaW5lCiAgICBIYXRoIHdhc2gnZCB0aHkgc2FsbG93IGNoZWVrcyBmb3IgUm9zYWxpbmUhCiAgICBIb3cgbXVjaCBzYWx0IHdhdGVyIHRocm93biBhd2F5IGluIHdhc3RlLAogICAgVG8gc2Vhc29uIGxvdmUsIHRoYXQgb2YgaXQgZG90aCBub3QgdGFzdGUhCiAgICBUaGUgc3VuIG5vdCB5ZXQgdGh5IHNpZ2hzIGZyb20gaGVhdmVuIGNsZWFycywKICAgIFRoeSBvbGQgZ3JvYW5zIHJpbmcgeWV0IGluIG15IGFuY2llbnQgZWFyczsKICAgIExvLCBoZXJlIHVwb24gdGh5IGNoZWVrIHRoZSBzdGFpbiBkb3RoIHNpdAogICAgT2YgYW4gb2xkIHRlYXIgdGhhdCBpcyBub3Qgd2FzaCdkIG9mZiB5ZXQ6CiAgICBJZiBlJ2VyIHRob3Ugd2FzdCB0aHlzZWxmIGFuZCB0aGVzZSB3b2VzIHRoaW5lLAogICAgVGhvdSBhbmQgdGhlc2Ugd29lcyB3ZXJlIGFsbCBmb3IgUm9zYWxpbmU6CiAgICBBbmQgYXJ0IHRob3UgY2hhbmdlZD8gcHJvbm91bmNlIHRoaXMgc2VudGVuY2UgdGhlbiwKICAgIFdvbWVuIG1heSBmYWxsLCB3aGVuIHRoZXJlJ3Mgbm8gc3RyZW5ndGggaW4gbWVuLgoKUk9NRU8KCiAgICBUaG91IGNoaWQnc3QgbWUgb2Z0IGZvciBsb3ZpbmcgUm9zYWxpbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIEZvciBkb3RpbmcsIG5vdCBmb3IgbG92aW5nLCBwdXBpbCBtaW5lLgoKUk9NRU8KCiAgICBBbmQgYmFkJ3N0IG1lIGJ1cnkgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTm90IGluIGEgZ3JhdmUsCiAgICBUbyBsYXkgb25lIGluLCBhbm90aGVyIG91dCB0byBoYXZlLgoKUk9NRU8KCiAgICBJIHByYXkgdGhlZSwgY2hpZGUgbm90OyBzaGUgd2hvbSBJIGxvdmUgbm93CiAgICBEb3RoIGdyYWNlIGZvciBncmFjZSBhbmQgbG92ZSBmb3IgbG92ZSBhbGxvdzsKICAgIFRoZSBvdGhlciBkaWQgbm90IHNvLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBPLCBzaGUga25ldyB3ZWxsCiAgICBUaHkgbG92ZSBkaWQgcmVhZCBieSByb3RlIGFuZCBjb3VsZCBub3Qgc3BlbGwuCiAgICBCdXQgY29tZSwgeW91bmcgd2F2ZXJlciwgY29tZSwgZ28gd2l0aCBtZSwKICAgIEluIG9uZSByZXNwZWN0IEknbGwgdGh5IGFzc2lzdGFudCBiZTsKICAgIEZvciB0aGlzIGFsbGlhbmNlIG1heSBzbyBoYXBweSBwcm92ZSwKICAgIFRvIHR1cm4geW91ciBob3VzZWhvbGRzJyByYW5jb3VyIHRvIHB1cmUgbG92ZS4KClJPTUVPCgogICAgTywgbGV0IHVzIGhlbmNlOyBJIHN0YW5kIG9uIHN1ZGRlbiBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2lzZWx5IGFuZCBzbG93OyB0aGV5IHN0dW1ibGUgdGhhdCBydW4gZmFzdC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBCRU5WT0xJTyBhbmQgTUVSQ1VUSU8gCgpNRVJDVVRJTwoKICAgIFdoZXJlIHRoZSBkZXZpbCBzaG91bGQgdGhpcyBSb21lbyBiZT8KICAgIENhbWUgaGUgbm90IGhvbWUgdG8tbmlnaHQCgpCRU5WT0xJTwoKICAgIE5vdCB0byBoaXMgZmF0aGVyJ3M7IEkgc3Bva2Ugd2l0aCBoaXMgbWFuLgoKTUVSQ1VUSU8KCiAgICBBaCwgdGhhdCBzYW1lIHBhbGUgaGFyZC1oZWFydGVkIHdlbmNoLCB0aGF0IFJvc2FsaW5lLgogICAgVG9ybWVudHMgaGltIHNvLCB0aGF0IGhlIHdpbGwgc3VyZSBydW4gbWFkLgoKQkVOVk9MSU8KCiAgICBUeWJhbHQsIHRoZSBraW5zbWFuIG9mIG9sZCBDYXB1bGV0LAogICAgSGF0aCBzZW50IGEgbGV0dGVyIHRvIGhpcyBmYXRoZXIncyBob3VzZS4KCk1FUkNVVElPCgogICAgQSBjaGFsbGVuZ2UsIG9uIG15IGxpZmUuCgpCRU5WT0xJTwoKICAgIFJvbWVvIHdpbGwgYW5zd2VyIGl0LgoKTUVSQ1VUSU8KCiAgICBBbnkgbWFuIHRoYXQgY2FuIHdyaXRlIG1heSBhbnN3ZXIgYSBsZXR0ZXIuCgpCRU5WT0xJTwoKICAgIE5heSwgaGUgd2lsbCBhbnN3ZXIgdGhlIGxldHRlcidzIG1hc3RlciwgaG93IGhlCiAgICBkYXJlcywgYmVpbmcgZGFyZWQuCgpNRVJDVVRJTwoKICAgIEFsYXMgcG9vciBSb21lbyEgaGUgaXMgYWxyZWFkeSBkZWFkOyBzdGFiYmVkIHdpdGggYQogICAgd2hpdGUgd2VuY2gncyBibGFjayBleWU7IHNob3QgdGhyb3VnaCB0aGUgZWFyIHdpdGggYQogICAgbG92ZS1zb25nOyB0aGUgdmVyeSBwaW4gb2YgaGlzIGhlYXJ0IGNsZWZ0IHdpdGggdGhlCiAgICBibGluZCBib3ctYm95J3MgYnV0dC1zaGFmdDogYW5kIGlzIGhlIGEgbWFuIHRvCiAgICBlbmNvdW50ZXIgVHliYWx0PwoKQkVOVk9MSU8KCiAgICBXaHksIHdoYXQgaXMgVHliYWx0PwoKTUVSQ1VUSU8KCiAgICBNb3JlIHRoYW4gcHJpbmNlIG9mIGNhdHMsIEkgY2FuIHRlbGwgeW91LiBPLCBoZSBpcwogICAgdGhlIGNvdXJhZ2VvdXMgY2FwdGFpbiBvZiBjb21wbGltZW50cy4gSGUgZmlnaHRzIGFzCiAgICB5b3Ugc2luZyBwcmljay1zb25nLCBrZWVwcyB0aW1lLCBkaXN0YW5jZSwgYW5kCiAgICBwcm9wb3J0aW9uOyByZXN0cyBtZSBoaXMgbWluaW0gcmVzdCwgb25lLCB0d28sIGFuZAogICAgdGhlIHRoaXJkIGluIHlvdXIgYm9zb206IHRoZSB2ZXJ5IGJ1dGNoZXIgb2YgYSBzaWxrCiAgICBidXR0b24sIGEgZHVlbGxpc3QsIGEgZHVlbGxpc3Q7IGEgZ2VudGxlbWFuIG9mIHRoZQogICAgdmVyeSBmaXJzdCBob3VzZSwgb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2F1c2U6CiAgICBhaCwgdGhlIGltbW9ydGFsIHBhc3NhZG8hIHRoZSBwdW50byByZXZlcnNvISB0aGUKICAgIGhhaSEKCkJFTlZPTElPCgogICAgVGhlIHdoYXQCgpNRVJDVVRJTwoKICAgIFRoZSBwb3ggb2Ygc3VjaCBhbnRpYywgbGlzcGluZywgYWZmZWN0aW5nCiAgICBmYW50YXN0aWNvZXM7IHRoZXNlIG5ldyB0dW5lcnMgb2YgYWNjZW50cyEgJ0J5IEplc3UsCiAgICBhIHZlcnkgZ29vZCBibGFkZSEgYSB2ZXJ5IHRhbGwgbWFuISBhIHZlcnkgZ29vZAogICAgd2hvcmUhJyBXaHksIGlzIG5vdCB0aGlzIGEgbGFtZW50YWJsZSB0aGluZywKICAgIGdyYW5kc2lyZSwgdGhhdCB3ZSBzaG91bGQgYmUgdGh1cyBhZmZsaWN0ZWQgd2l0aAogICAgdGhlc2Ugc3RyYW5nZSBmbGllcywgdGhlc2UgZmFzaGlvbi1tb25nZXJzLCB0aGVzZQogICAgcGVyZG9uYS1taSdzLCB3aG8gc3RhbmQgc28gbXVjaCBvbiB0aGUgbmV3IGZvcm0sCiAgICB0aGF0IHRoZXkgY2Fubm90IGF0IGVhc2Ugb24gdGhlIG9sZCBiZW5jaD8gTywgdGhlaXIKICAgIGJvbmVzLCB0aGVpciBib25lcyEKCiAgICBFbnRlciBST01FTwoKQkVOVk9MSU8KCiAgICBIZXJlIGNvbWVzIFJvbWVvLCBoZXJlIGNvbWVzIFJvbWVvLgoKTUVSQ1VUSU8KCiAgICBXaXRob3V0IGhpcyByb2UsIGxpa2UgYSBkcmllZCBoZXJyaW5nOiBmbGVzaCwgZmxlc2gsCiAgICBob3cgYXJ0IHRob3UgZmlzaGlmaWVkISBOb3cgaXMgaGUgZm9yIHRoZSBudW1iZXJzCiAgICB0aGF0IFBldHJhcmNoIGZsb3dlZCBpbjogTGF1cmEgdG8gaGlzIGxhZHkgd2FzIGJ1dCBhCiAgICBraXRjaGVuLXdlbmNoOyBtYXJyeSwgc2hlIGhhZCBhIGJldHRlciBsb3ZlIHRvCiAgICBiZS1yaHltZSBoZXI7IERpZG8gYSBkb3dkeTsgQ2xlb3BhdHJhIGEgZ2lwc3k7CiAgICBIZWxlbiBhbmQgSGVybyBoaWxkaW5ncyBhbmQgaGFybG90czsgVGhpc2JlIGEgZ3JleQogICAgZXllIG9yIHNvLCBidXQgbm90IHRvIHRoZSBwdXJwb3NlLiBTaWduaW9yCiAgICBSb21lbywgYm9uIGpvdXIhIHRoZXJlJ3MgYSBGcmVuY2ggc2FsdXRhdGlvbgogICAgdG8geW91ciBGcmVuY2ggc2xvcC4gWW91IGdhdmUgdXMgdGhlIGNvdW50ZXJmZWl0CiAgICBmYWlybHkgbGFzdCBuaWdodC4KClJPTUVPCgogICAgR29vZCBtb3Jyb3cgdG8geW91IGJvdGguIFdoYXQgY291bnRlcmZlaXQgZGlkIEkgZ2l2ZSB5b3UCgpNRVJDVVRJTwoKICAgIFRoZSBzaGlwLCBzaXIsIHRoZSBzbGlwOyBjYW4geW91IG5vdCBjb25jZWl2ZT8KClJPTUVPCgogICAgUGFyZG9uLCBnb29kIE1lcmN1dGlvLCBteSBidXNpbmVzcyB3YXMgZ3JlYXQ7IGFuZCBpbgogICAgc3VjaCBhIGNhc2UgYXMgbWluZSBhIG1hbiBtYXkgc3RyYWluIGNvdXJ0ZXN5LgoKTUVSQ1VUSU8KCiAgICBUaGF0J3MgYXMgbXVjaCBhcyB0byBzYXksIHN1Y2ggYSBjYXNlIGFzIHlvdXJzCiAgICBjb25zdHJhaW5zIGEgbWFuIHRvIGJvdyBpbiB0aGUgaGFtcy4KClJPTUVPCgogICAgTWVhbmluZywgdG8gY291cnQnc3kuCgpNRVJDVVRJTwoKICAgIFRob3UgaGFzdCBtb3N0IGtpbmRseSBoaXQgaXQuCgpST01FTwoKICAgIEEgbW9zdCBjb3VydGVvdXMgZXhwb3NpdGlvbi4KCk1FUkNVVElPCgogICAgTmF5LCBJIGFtIHRoZSB2ZXJ5IHBpbmsgb2YgY291cnRlc3kuCgpST01FTwoKICAgIFBpbmsgZm9yIGZsb3dlci4KCk1FUkNVVElPCgogICAgUmlnaHQuCgpST01FTwoKICAgIFdoeSwgdGhlbiBpcyBteSBwdW1wIHdlbGwgZmxvd2VyZWQuCgpNRVJDVVRJTwoKICAgIFdlbGwgc2FpZDogZm9sbG93IG1lIHRoaXMgamVzdCBub3cgdGlsbCB0aG91IGhhc3QKICAgIHdvcm4gb3V0IHRoeSBwdW1wLCB0aGF0IHdoZW4gdGhlIHNpbmdsZSBzb2xlIG9mIGl0CiAgICBpcyB3b3JuLCB0aGUgamVzdCBtYXkgcmVtYWluIGFmdGVyIHRoZSB3ZWFyaW5nIHNvbGUgc2luZ3VsYXIuCgpST01FTwoKICAgIE8gc2luZ2xlLXNvbGVkIGplc3QsIHNvbGVseSBzaW5ndWxhciBmb3IgdGhlCiAgICBzaW5nbGVuZXNzLgoKTUVSQ1VUSU8KCiAgICBDb21lIGJldHdlZW4gdXMsIGdvb2QgQmVudm9saW87IG15IHdpdHMgZmFpbnQuCgpST01FTwoKICAgIFN3aXRjaCBhbmQgc3B1cnMsIHN3aXRjaCBhbmQgc3B1cnM7IG9yIEknbGwgY3J5IGEgbWF0Y2guCgpNRVJDVVRJTwoKICAgIE5heSwgaWYgdGh5IHdpdHMgcnVuIHRoZSB3aWxkLWdvb3NlIGNoYXNlLCBJIGhhdmUKICAgIGRvbmUsIGZvciB0aG91IGhhc3QgbW9yZSBvZiB0aGUgd2lsZC1nb29zZSBpbiBvbmUgb2YKICAgIHRoeSB3aXRzIHRoYW4sIEkgYW0gc3VyZSwgSSBoYXZlIGluIG15IHdob2xlIGZpdmU6CiAgICB3YXMgSSB3aXRoIHlvdSB0aGVyZSBmb3IgdGhlIGdvb3NlPwoKUk9NRU8KCiAgICBUaG91IHdhc3QgbmV2ZXIgd2l0aCBtZSBmb3IgYW55IHRoaW5nIHdoZW4gdGhvdSB3YXN0CiAgICBub3QgdGhlcmUgZm9yIHRoZSBnb29zZS4KCk1FUkNVVElPCgogICAgSSB3aWxsIGJpdGUgdGhlZSBieSB0aGUgZWFyIGZvciB0aGF0IGplc3QuCgpST01FTwoKICAgIE5heSwgZ29vZCBnb29zZSwgYml0ZSBub3QuCgpNRVJDVVRJTwoKICAgIFRoeSB3aXQgaXMgYSB2ZXJ5IGJpdHRlciBzd2VldGluZzsgaXQgaXMgYSBtb3N0CiAgICBzaGFycCBzYXVjZS4KClJPTUVPCgogICAgQW5kIGlzIGl0IG5vdCB3ZWxsIHNlcnZlZCBpbiB0byBhIHN3ZWV0IGdvb3NlPwoKTUVSQ1VUSU8KCiAgICBPIGhlcmUncyBhIHdpdCBvZiBjaGV2ZXJpbCwgdGhhdCBzdHJldGNoZXMgZnJvbSBhbgogICAgaW5jaCBuYXJyb3cgdG8gYW4gZWxsIGJyb2FkIQoKUk9NRU8KCiAgICBJIHN0cmV0Y2ggaXQgb3V0IGZvciB0aGF0IHdvcmQgJ2Jyb2FkOycgd2hpY2ggYWRkZWQKICAgIHRvIHRoZSBnb29zZSwgcHJvdmVzIHRoZWUgZmFyIGFuZCB3aWRlIGEgYnJvYWQgZ29vc2UuCgpNRVJDVVRJTwoKICAgIFdoeSwgaXMgbm90IHRoaXMgYmV0dGVyIG5vdyB0aGFuIGdyb2FuaW5nIGZvciBsb3ZlPwogICAgbm93IGFydCB0aG91IHNvY2lhYmxlLCBub3cgYXJ0IHRob3UgUm9tZW87IG5vdyBhcnQKICAgIHRob3Ugd2hhdCB0aG91IGFydCwgYnkgYXJ0IGFzIHdlbGwgYXMgYnkgbmF0dXJlOgogICAgZm9yIHRoaXMgZHJpdmVsbGluZyBsb3ZlIGlzIGxpa2UgYSBncmVhdCBuYXR1cmFsLAogICAgdGhhdCBydW5zIGxvbGxpbmcgdXAgYW5kIGRvd24gdG8gaGlkZSBoaXMgYmF1YmxlIGluIGEgaG9sZS4KCkJFTlZPTElPCgogICAgU3RvcCB0aGVyZSwgc3RvcCB0aGVyZS4KCk1FUkNVVElPCgogICAgVGhvdSBkZXNpcmVzdCBtZSB0byBzdG9wIGluIG15IHRhbGUgYWdhaW5zdCB0aGUgaGFpci4KCkJFTlZPTElPCgogICAgVGhvdSB3b3VsZHN0IGVsc2UgaGF2ZSBtYWRlIHRoeSB0YWxlIGxhcmdlLgoKTUVSQ1VUSU8KCiAgICBPLCB0aG91IGFydCBkZWNlaXZlZDsgSSB3b3VsZCBoYXZlIG1hZGUgaXQgc2hvcnQ6CiAgICBmb3IgSSB3YXMgY29tZSB0byB0aGUgd2hvbGUgZGVwdGggb2YgbXkgdGFsZTsgYW5kCiAgICBtZWFudCwgaW5kZWVkLCB0byBvY2N1cHkgdGhlIGFyZ3VtZW50IG5vIGxvbmdlci4KClJPTUVPCgogICAgSGVyZSdzIGdvb2RseSBnZWFyIQoKICAgIEVudGVyIE51cnNlIGFuZCBQRVRFUgoKTUVSQ1VUSU8KCiAgICBBIHNhaWwsIGEgc2FpbCEKCkJFTlZPTElPCgogICAgVHdvLCB0d287IGEgc2hpcnQgYW5kIGEgc21vY2suCgpOdXJzZQoKICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBNeSBmYW4sIFBldGVyLgoKTUVSQ1VUSU8KCiAgICBHb29kIFBldGVyLCB0byBoaWRlIGhlciBmYWNlOyBmb3IgaGVyIGZhbidzIHRoZQogICAgZmFpcmVyIGZhY2UuCgpOdXJzZQoKICAgIEdvZCB5ZSBnb29kIG1vcnJvdywgZ2VudGxlbWVuLgoKTUVSQ1VUSU8KCiAgICBHb2QgeWUgZ29vZCBkZW4sIGZhaXIgZ2VudGxld29tYW4uCgpOdXJzZQoKICAgIElzIGl0IGdvb2QgZGVuPwoKTUVSQ1VUSU8KCiAgICAnVGlzIG5vIGxlc3MsIEkgdGVsbCB5b3UsIGZvciB0aGUgYmF3ZHkgaGFuZCBvZiB0aGUKICAgIGRpYWwgaXMgbm93IHVwb24gdGhlIHByaWNrIG9mIG5vb24uCgpOdXJzZQoKICAgIE91dCB1cG9uIHlvdSEgd2hhdCBhIG1hbiBhcmUgeW91IQoKUk9NRU8KCiAgICBPbmUsIGdlbnRsZXdvbWFuLCB0aGF0IEdvZCBoYXRoIG1hZGUgZm9yIGhpbXNlbGYgdG8KICAgIG1hci4KCk51cnNlCgogICAgQnkgbXkgdHJvdGgsIGl0IGlzIHdlbGwgc2FpZDsgJ2ZvciBoaW1zZWxmIHRvIG1hciwnCiAgICBxdW90aCBhJz8gR2VudGxlbWVuLCBjYW4gYW55IG9mIHlvdSB0ZWxsIG1lIHdoZXJlIEkKICAgIG1heSBmaW5kIHRoZSB5b3VuZyBSb21lbz8KClJPTUVPCgogICAgSSBjYW4gdGVsbCB5b3U7IGJ1dCB5b3VuZyBSb21lbyB3aWxsIGJlIG9sZGVyIHdoZW4KICAgIHlvdSBoYXZlIGZvdW5kIGhpbSB0aGFuIGhlIHdhcyB3aGVuIHlvdSBzb3VnaHQgaGltOgogICAgSSBhbSB0aGUgeW91bmdlc3Qgb2YgdGhhdCBuYW1lLCBmb3IgZmF1bHQgb2YgYSB3b3JzZS4KCk51cnNlCgogICAgWW91IHNheSB3ZWxsLgoKTUVSQ1VUSU8KCiAgICBZZWEsIGlzIHRoZSB3b3JzdCB3ZWxsPyB2ZXJ5IHdlbGwgdG9vaywgaScgZmFpdGg7CiAgICB3aXNlbHksIHdpc2VseS4KCk51cnNlCgogICAgaWYgeW91IGJlIGhlLCBzaXIsIEkgZGVzaXJlIHNvbWUgY29uZmlkZW5jZSB3aXRoCiAgICB5b3UuCgpCRU5WT0xJTwoKICAgIFNoZSB3aWxsIGluZGl0ZSBoaW0gdG8gc29tZSBzdXBwZXIuCgpNRVJDVVRJTwoKICAgIEEgYmF3ZCwgYSBiYXdkLCBhIGJhd2QhIHNvIGhvIQoKUk9NRU8KCiAgICBXaGF0IGhhc3QgdGhvdSBmb3VuZD8KCk1FUkNVVElPCgogICAgTm8gaGFyZSwgc2lyOyB1bmxlc3MgYSBoYXJlLCBzaXIsIGluIGEgbGVudGVuIHBpZSwKICAgIHRoYXQgaXMgc29tZXRoaW5nIHN0YWxlIGFuZCBob2FyIGVyZSBpdCBiZSBzcGVudC4KCiAgICBTaW5ncwogICAgQW4gb2xkIGhhcmUgaG9hciwKICAgIEFuZCBhbiBvbGQgaGFyZSBob2FyLAogICAgSXMgdmVyeSBnb29kIG1lYXQgaW4gbGVudAogICAgQnV0IGEgaGFyZSB0aGF0IGlzIGhvYXIKICAgIElzIHRvbyBtdWNoIGZvciBhIHNjb3JlLAogICAgV2hlbiBpdCBob2FycyBlcmUgaXQgYmUgc3BlbnQuCiAgICBSb21lbywgd2lsbCB5b3UgY29tZSB0byB5b3VyIGZhdGhlcidzPyB3ZSdsbAogICAgdG8gZGlubmVyLCB0aGl0aGVyLgoKUk9NRU8KCiAgICBJIHdpbGwgZm9sbG93IHlvdS4KCk1FUkNVVElPCgogICAgRmFyZXdlbGwsIGFuY2llbnQgbGFkeTsgZmFyZXdlbGwsCgogICAgU2luZ2luZwogICAgJ2xhZHksIGxhZHksIGxhZHkuJwoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KCk51cnNlCgogICAgTWFycnksIGZhcmV3ZWxsISBJIHByYXkgeW91LCBzaXIsIHdoYXQgc2F1Y3kKICAgIG1lcmNoYW50IHdhcyB0aGlzLCB0aGF0IHdhcyBzbyBmdWxsIG9mIGhpcyByb3BlcnkCgpST01FTwoKICAgIEEgZ2VudGxlbWFuLCBudXJzZSwgdGhhdCBsb3ZlcyB0byBoZWFyIGhpbXNlbGYgdGFsaywKICAgIGFuZCB3aWxsIHNwZWFrIG1vcmUgaW4gYSBtaW51dGUgdGhhbiBoZSB3aWxsIHN0YW5kCiAgICB0byBpbiBhIG1vbnRoLgoKTnVyc2UKCiAgICBBbiBhJyBzcGVhayBhbnkgdGhpbmcgYWdhaW5zdCBtZSwgSSdsbCB0YWtlIGhpbQogICAgZG93biwgYW4gYScgd2VyZSBsdXN0aWVyIHRoYW4gaGUgaXMsIGFuZCB0d2VudHkgc3VjaAogICAgSmFja3M7IGFuZCBpZiBJIGNhbm5vdCwgSSdsbCBmaW5kIHRob3NlIHRoYXQgc2hhbGwuCiAgICBTY3Vydnkga25hdmUhIEkgYW0gbm9uZSBvZiBoaXMgZmxpcnQtZ2lsbHM7IEkgYW0KICAgIG5vbmUgb2YgaGlzIHNrYWlucy1tYXRlcy4gQW5kIHRob3UgbXVzdCBzdGFuZCBieQogICAgdG9vLCBhbmQgc3VmZmVyIGV2ZXJ5IGtuYXZlIHRvIHVzZSBtZSBhdCBoaXMgcGxlYXN1cmUCgpQRVRFUgoKICAgIEkgc2F3IG5vIG1hbiB1c2UgeW91IGEgcGxlYXN1cmU7IGlmIEkgaGFkLCBteSB3ZWFwb24KICAgIHNob3VsZCBxdWlja2x5IGhhdmUgYmVlbiBvdXQsIEkgd2FycmFudCB5b3U6IEkgZGFyZQogICAgZHJhdyBhcyBzb29uIGFzIGFub3RoZXIgbWFuLCBpZiBJIHNlZSBvY2Nhc2lvbiBpbiBhCiAgICBnb29kIHF1YXJyZWwsIGFuZCB0aGUgbGF3IG9uIG15IHNpZGUuCgpOdXJzZQoKICAgIE5vdywgYWZvcmUgR29kLCBJIGFtIHNvIHZleGVkLCB0aGF0IGV2ZXJ5IHBhcnQgYWJvdXQKICAgIG1lIHF1aXZlcnMuIFNjdXJ2eSBrbmF2ZSEgUHJheSB5b3UsIHNpciwgYSB3b3JkOgogICAgYW5kIGFzIEkgdG9sZCB5b3UsIG15IHlvdW5nIGxhZHkgYmFkZSBtZSBpbnF1aXJlIHlvdQogICAgb3V0OyB3aGF0IHNoZSBiYWRlIG1lIHNheSwgSSB3aWxsIGtlZXAgdG8gbXlzZWxmOgogICAgYnV0IGZpcnN0IGxldCBtZSB0ZWxsIHllLCBpZiB5ZSBzaG91bGQgbGVhZCBoZXIgaW50bwogICAgYSBmb29sJ3MgcGFyYWRpc2UsIGFzIHRoZXkgc2F5LCBpdCB3ZXJlIGEgdmVyeSBncm9zcwogICAga2luZCBvZiBiZWhhdmlvciwgYXMgdGhleSBzYXk6IGZvciB0aGUgZ2VudGxld29tYW4KICAgIGlzIHlvdW5nOyBhbmQsIHRoZXJlZm9yZSwgaWYgeW91IHNob3VsZCBkZWFsIGRvdWJsZQogICAgd2l0aCBoZXIsIHRydWx5IGl0IHdlcmUgYW4gaWxsIHRoaW5nIHRvIGJlIG9mZmVyZWQKICAgIHRvIGFueSBnZW50bGV3b21hbiwgYW5kIHZlcnkgd2VhayBkZWFsaW5nLgoKUk9NRU8KCiAgICBOdXJzZSwgY29tbWVuZCBtZSB0byB0aHkgbGFkeSBhbmQgbWlzdHJlc3MuIEkKICAgIHByb3Rlc3QgdW50byB0aGVlLS0KCk51cnNlCgogICAgR29vZCBoZWFydCwgYW5kLCBpJyBmYWl0aCwgSSB3aWxsIHRlbGwgaGVyIGFzIG11Y2g6CiAgICBMb3JkLCBMb3JkLCBzaGUgd2lsbCBiZSBhIGpveWZ1bCB3b21hbi4KClJPTUVPCgogICAgV2hhdCB3aWx0IHRob3UgdGVsbCBoZXIsIG51cnNlPyB0aG91IGRvc3Qgbm90IG1hcmsgbWUuCgpOdXJzZQoKICAgIEkgd2lsbCB0ZWxsIGhlciwgc2lyLCB0aGF0IHlvdSBkbyBwcm90ZXN0OyB3aGljaCwgYXMKICAgIEkgdGFrZSBpdCwgaXMgYSBnZW50bGVtYW5saWtlIG9mZmVyLgoKUk9NRU8KCiAgICBCaWQgaGVyIGRldmlzZQogICAgU29tZSBtZWFucyB0byBjb21lIHRvIHNocmlmdCB0aGlzIGFmdGVybm9vbjsKICAgIEFuZCB0aGVyZSBzaGUgc2hhbGwgYXQgRnJpYXIgTGF1cmVuY2UnIGNlbGwKICAgIEJlIHNocml2ZWQgYW5kIG1hcnJpZWQuIEhlcmUgaXMgZm9yIHRoeSBwYWlucy4KCk51cnNlCgogICAgTm8gdHJ1bHkgc2lyOyBub3QgYSBwZW5ueS4KClJPTUVPCgogICAgR28gdG87IEkgc2F5IHlvdSBzaGFsbC4KCk51cnNlCgogICAgVGhpcyBhZnRlcm5vb24sIHNpcj8gd2VsbCwgc2hlIHNoYWxsIGJlIHRoZXJlLgoKUk9NRU8KCiAgICBBbmQgc3RheSwgZ29vZCBudXJzZSwgYmVoaW5kIHRoZSBhYmJleSB3YWxsOgogICAgV2l0aGluIHRoaXMgaG91ciBteSBtYW4gc2hhbGwgYmUgd2l0aCB0aGVlCiAgICBBbmQgYnJpbmcgdGhlZSBjb3JkcyBtYWRlIGxpa2UgYSB0YWNrbGVkIHN0YWlyOwogICAgV2hpY2ggdG8gdGhlIGhpZ2ggdG9wLWdhbGxhbnQgb2YgbXkgam95CiAgICBNdXN0IGJlIG15IGNvbnZveSBpbiB0aGUgc2VjcmV0IG5pZ2h0LgogICAgRmFyZXdlbGw7IGJlIHRydXN0eSwgYW5kIEknbGwgcXVpdCB0aHkgcGFpbnM6CiAgICBGYXJld2VsbDsgY29tbWVuZCBtZSB0byB0aHkgbWlzdHJlc3MuCgpOdXJzZQoKICAgIE5vdyBHb2QgaW4gaGVhdmVuIGJsZXNzIHRoZWUhIEhhcmsgeW91LCBzaXIuCgpST01FTwoKICAgIFdoYXQgc2F5J3N0IHRob3UsIG15IGRlYXIgbnVyc2UCgpOdXJzZQoKICAgIElzIHlvdXIgbWFuIHNlY3JldD8gRGlkIHlvdSBuZSdlciBoZWFyIHNheSwKICAgIFR3byBtYXkga2VlcCBjb3Vuc2VsLCBwdXR0aW5nIG9uZSBhd2F5PwoKUk9NRU8KCiAgICBJIHdhcnJhbnQgdGhlZSwgbXkgbWFuJ3MgYXMgdHJ1ZSBhcyBzdGVlbC4KCk5VUlNFCgogICAgV2VsbCwgc2lyOyBteSBtaXN0cmVzcyBpcyB0aGUgc3dlZXRlc3QgbGFkeS0tTG9yZCwKICAgIExvcmQhIHdoZW4gJ3R3YXMgYSBsaXR0bGUgcHJhdGluZyB0aGluZzotLU8sIHRoZXJlCiAgICBpcyBhIG5vYmxlbWFuIGluIHRvd24sIG9uZSBQYXJpcywgdGhhdCB3b3VsZCBmYWluCiAgICBsYXkga25pZmUgYWJvYXJkOyBidXQgc2hlLCBnb29kIHNvdWwsIGhhZCBhcyBsaWVmCiAgICBzZWUgYSB0b2FkLCBhIHZlcnkgdG9hZCwgYXMgc2VlIGhpbS4gSSBhbmdlciBoZXIKICAgIHNvbWV0aW1lcyBhbmQgdGVsbCBoZXIgdGhhdCBQYXJpcyBpcyB0aGUgcHJvcGVyZXIKICAgIG1hbjsgYnV0LCBJJ2xsIHdhcnJhbnQgeW91LCB3aGVuIEkgc2F5IHNvLCBzaGUgbG9va3MKICAgIGFzIHBhbGUgYXMgYW55IGNsb3V0IGluIHRoZSB2ZXJzYWwgd29ybGQuIERvdGggbm90CiAgICByb3NlbWFyeSBhbmQgUm9tZW8gYmVnaW4gYm90aCB3aXRoIGEgbGV0dGVyPwoKUk9NRU8KCiAgICBBeSwgbnVyc2U7IHdoYXQgb2YgdGhhdD8gYm90aCB3aXRoIGFuIFIuCgpOdXJzZQoKICAgIEFoLiBtb2NrZXIhIHRoYXQncyB0aGUgZG9nJ3MgbmFtZTsgUiBpcyBmb3IKICAgIHRoZS0tTm87IEkga25vdyBpdCBiZWdpbnMgd2l0aCBzb21lIG90aGVyCiAgICBsZXR0ZXI6LS1hbmQgc2hlIGhhdGggdGhlIHByZXR0aWVzdCBzZW50ZW50aW91cyBvZgogICAgaXQsIG9mIHlvdSBhbmQgcm9zZW1hcnksIHRoYXQgaXQgd291bGQgZG8geW91IGdvb2QKICAgIHRvIGhlYXIgaXQuCgpST01FTwoKICAgIENvbW1lbmQgbWUgdG8gdGh5IGxhZHkuCgpOdXJzZQoKICAgIEF5LCBhIHRob3VzYW5kIHRpbWVzLgoKICAgIEV4aXQgUm9tZW8KICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBQZXRlciwgdGFrZSBteSBmYW4sIGFuZCBnbyBiZWZvcmUgYW5kIGFwYWNlLgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgSlVMSUVUIAoKSlVMSUVUCgogICAgVGhlIGNsb2NrIHN0cnVjayBuaW5lIHdoZW4gSSBkaWQgc2VuZCB0aGUgbnVyc2U7CiAgICBJbiBoYWxmIGFuIGhvdXIgc2hlIHByb21pc2VkIHRvIHJldHVybi4KICAgIFBlcmNoYW5jZSBzaGUgY2Fubm90IG1lZXQgaGltOiB0aGF0J3Mgbm90IHNvLgogICAgTywgc2hlIGlzIGxhbWUhIGxvdmUncyBoZXJhbGRzIHNob3VsZCBiZSB0aG91Z2h0cywKICAgIFdoaWNoIHRlbiB0aW1lcyBmYXN0ZXIgZ2xpZGUgdGhhbiB0aGUgc3VuJ3MgYmVhbXMsCiAgICBEcml2aW5nIGJhY2sgc2hhZG93cyBvdmVyIGxvdXJpbmcgaGlsbHM6CiAgICBUaGVyZWZvcmUgZG8gbmltYmxlLXBpbmlvbidkIGRvdmVzIGRyYXcgbG92ZSwKICAgIEFuZCB0aGVyZWZvcmUgaGF0aCB0aGUgd2luZC1zd2lmdCBDdXBpZCB3aW5ncy4KICAgIE5vdyBpcyB0aGUgc3VuIHVwb24gdGhlIGhpZ2htb3N0IGhpbGwKICAgIE9mIHRoaXMgZGF5J3Mgam91cm5leSwgYW5kIGZyb20gbmluZSB0aWxsIHR3ZWx2ZQogICAgSXMgdGhyZWUgbG9uZyBob3VycywgeWV0IHNoZSBpcyBub3QgY29tZS4KICAgIEhhZCBzaGUgYWZmZWN0aW9ucyBhbmQgd2FybSB5b3V0aGZ1bCBibG9vZCwKICAgIFNoZSB3b3VsZCBiZSBhcyBzd2lmdCBpbiBtb3Rpb24gYXMgYSBiYWxsOwogICAgTXkgd29yZHMgd291bGQgYmFuZHkgaGVyIHRvIG15IHN3ZWV0IGxvdmUsCiAgICBBbmQgaGlzIHRvIG1lOgogICAgQnV0IG9sZCBmb2xrcywgbWFueSBmZWlnbiBhcyB0aGV5IHdlcmUgZGVhZDsKICAgIFVud2llbGR5LCBzbG93LCBoZWF2eSBhbmQgcGFsZSBhcyBsZWFkLgogICAgTyBHb2QsIHNoZSBjb21lcyEKCiAgICBFbnRlciBOdXJzZSBhbmQgUEVURVIKICAgIE8gaG9uZXkgbnVyc2UsIHdoYXQgbmV3cz8KICAgIEhhc3QgdGhvdSBtZXQgd2l0aCBoaW0IFNlbmQgdGh5IG1hbiBhd2F5LgoKTnVyc2UKCiAgICBQZXRlciwgc3RheSBhdCB0aGUgZ2F0ZS4KCiAgICBFeGl0IFBFVEVSCgpKVUxJRVQKCiAgICBOb3csIGdvb2Qgc3dlZXQgbnVyc2UsLS1PIExvcmQsIHdoeSBsb29rJ3N0IHRob3Ugc2FkPwogICAgVGhvdWdoIG5ld3MgYmUgc2FkLCB5ZXQgdGVsbCB0aGVtIG1lcnJpbHk7CiAgICBJZiBnb29kLCB0aG91IHNoYW1lc3QgdGhlIG11c2ljIG9mIHN3ZWV0IG5ld3MKICAgIEJ5IHBsYXlpbmcgaXQgdG8gbWUgd2l0aCBzbyBzb3VyIGEgZmFjZS4KCk51cnNlCgogICAgSSBhbSBhLXdlYXJ5LCBnaXZlIG1lIGxlYXZlIGF3aGlsZToKICAgIEZpZSwgaG93IG15IGJvbmVzIGFjaGUhIHdoYXQgYSBqYXVudCBoYXZlIEkgaGFkIQoKSlVMSUVUCgogICAgSSB3b3VsZCB0aG91IGhhZHN0IG15IGJvbmVzLCBhbmQgSSB0aHkgbmV3czoKICAgIE5heSwgY29tZSwgSSBwcmF5IHRoZWUsIHNwZWFrOyBnb29kLCBnb29kIG51cnNlLCBzcGVhay4KCk51cnNlCgogICAgSmVzdSwgd2hhdCBoYXN0ZT8gY2FuIHlvdSBub3Qgc3RheSBhd2hpbGUCiAgICBEbyB5b3Ugbm90IHNlZSB0aGF0IEkgYW0gb3V0IG9mIGJyZWF0aD8KCkpVTElFVAoKICAgIEhvdyBhcnQgdGhvdSBvdXQgb2YgYnJlYXRoLCB3aGVuIHRob3UgaGFzdCBicmVhdGgKICAgIFRvIHNheSB0byBtZSB0aGF0IHRob3UgYXJ0IG91dCBvZiBicmVhdGgCiAgICBUaGUgZXhjdXNlIHRoYXQgdGhvdSBkb3N0IG1ha2UgaW4gdGhpcyBkZWxheQogICAgSXMgbG9uZ2VyIHRoYW4gdGhlIHRhbGUgdGhvdSBkb3N0IGV4Y3VzZS4KICAgIElzIHRoeSBuZXdzIGdvb2QsIG9yIGJhZD8gYW5zd2VyIHRvIHRoYXQ7CiAgICBTYXkgZWl0aGVyLCBhbmQgSSdsbCBzdGF5IHRoZSBjaXJjdW1zdGFuY2U6CiAgICBMZXQgbWUgYmUgc2F0aXNmaWVkLCBpcyd0IGdvb2Qgb3IgYmFkPwoKTnVyc2UKCiAgICBXZWxsLCB5b3UgaGF2ZSBtYWRlIGEgc2ltcGxlIGNob2ljZTsgeW91IGtub3cgbm90CiAgICBob3cgdG8gY2hvb3NlIGEgbWFuOiBSb21lbyEgbm8sIG5vdCBoZTsgdGhvdWdoIGhpcwogICAgZmFjZSBiZSBiZXR0ZXIgdGhhbiBhbnkgbWFuJ3MsIHlldCBoaXMgbGVnIGV4Y2VscwogICAgYWxsIG1lbidzOyBhbmQgZm9yIGEgaGFuZCwgYW5kIGEgZm9vdCwgYW5kIGEgYm9keSwKICAgIHRob3VnaCB0aGV5IGJlIG5vdCB0byBiZSB0YWxrZWQgb24sIHlldCB0aGV5IGFyZQogICAgcGFzdCBjb21wYXJlOiBoZSBpcyBub3QgdGhlIGZsb3dlciBvZiBjb3VydGVzeSwKICAgIGJ1dCwgSSdsbCB3YXJyYW50IGhpbSwgYXMgZ2VudGxlIGFzIGEgbGFtYi4gR28gdGh5CiAgICB3YXlzLCB3ZW5jaDsgc2VydmUgR29kLiBXaGF0LCBoYXZlIHlvdSBkaW5lZCBhdCBob21lPwoKSlVMSUVUCgogICAgTm8sIG5vOiBidXQgYWxsIHRoaXMgZGlkIEkga25vdyBiZWZvcmUuCiAgICBXaGF0IHNheXMgaGUgb2Ygb3VyIG1hcnJpYWdlPyB3aGF0IG9mIHRoYXQCgpOdXJzZQoKICAgIExvcmQsIGhvdyBteSBoZWFkIGFjaGVzISB3aGF0IGEgaGVhZCBoYXZlIEkhCiAgICBJdCBiZWF0cyBhcyBpdCB3b3VsZCBmYWxsIGluIHR3ZW50eSBwaWVjZXMuCiAgICBNeSBiYWNrIG8nIHQnIG90aGVyIHNpZGUsLS1PLCBteSBiYWNrLCBteSBiYWNrIQogICAgQmVzaHJldyB5b3VyIGhlYXJ0IGZvciBzZW5kaW5nIG1lIGFib3V0LAogICAgVG8gY2F0Y2ggbXkgZGVhdGggd2l0aCBqYXVudGluZyB1cCBhbmQgZG93biEKCkpVTElFVAoKICAgIEknIGZhaXRoLCBJIGFtIHNvcnJ5IHRoYXQgdGhvdSBhcnQgbm90IHdlbGwuCiAgICBTd2VldCwgc3dlZXQsIHN3ZWV0IG51cnNlLCB0ZWxsIG1lLCB3aGF0IHNheXMgbXkgbG92ZT8KCk51cnNlCgogICAgWW91ciBsb3ZlIHNheXMsIGxpa2UgYW4gaG9uZXN0IGdlbnRsZW1hbiwgYW5kIGEKICAgIGNvdXJ0ZW91cywgYW5kIGEga2luZCwgYW5kIGEgaGFuZHNvbWUsIGFuZCwgSQogICAgd2FycmFudCwgYSB2aXJ0dW91cywtLVdoZXJlIGlzIHlvdXIgbW90aGVyPwoKSlVMSUVUCgogICAgV2hlcmUgaXMgbXkgbW90aGVyISB3aHksIHNoZSBpcyB3aXRoaW47CiAgICBXaGVyZSBzaG91bGQgc2hlIGJlPyBIb3cgb2RkbHkgdGhvdSByZXBsaWVzdCEKICAgICdZb3VyIGxvdmUgc2F5cywgbGlrZSBhbiBob25lc3QgZ2VudGxlbWFuLAogICAgV2hlcmUgaXMgeW91ciBtb3RoZXIJwoKTnVyc2UKCiAgICBPIEdvZCdzIGxhZHkgZGVhciEKICAgIEFyZSB5b3Ugc28gaG90PyBtYXJyeSwgY29tZSB1cCwgSSB0cm93OwogICAgSXMgdGhpcyB0aGUgcG91bHRpY2UgZm9yIG15IGFjaGluZyBib25lcz8KICAgIEhlbmNlZm9yd2FyZCBkbyB5b3VyIG1lc3NhZ2VzIHlvdXJzZWxmLgoKSlVMSUVUCgogICAgSGVyZSdzIHN1Y2ggYSBjb2lsISBjb21lLCB3aGF0IHNheXMgUm9tZW8CgpOdXJzZQoKICAgIEhhdmUgeW91IGdvdCBsZWF2ZSB0byBnbyB0byBzaHJpZnQgdG8tZGF5PwoKSlVMSUVUCgogICAgSSBoYXZlLgoKTnVyc2UKCiAgICBUaGVuIGhpZSB5b3UgaGVuY2UgdG8gRnJpYXIgTGF1cmVuY2UnIGNlbGw7CiAgICBUaGVyZSBzdGF5cyBhIGh1c2JhbmQgdG8gbWFrZSB5b3UgYSB3aWZlOgogICAgTm93IGNvbWVzIHRoZSB3YW50b24gYmxvb2QgdXAgaW4geW91ciBjaGVla3MsCiAgICBUaGV5J2xsIGJlIGluIHNjYXJsZXQgc3RyYWlnaHQgYXQgYW55IG5ld3MuCiAgICBIaWUgeW91IHRvIGNodXJjaDsgSSBtdXN0IGFub3RoZXIgd2F5LAogICAgVG8gZmV0Y2ggYSBsYWRkZXIsIGJ5IHRoZSB3aGljaCB5b3VyIGxvdmUKICAgIE11c3QgY2xpbWIgYSBiaXJkJ3MgbmVzdCBzb29uIHdoZW4gaXQgaXMgZGFyazoKICAgIEkgYW0gdGhlIGRydWRnZSBhbmQgdG9pbCBpbiB5b3VyIGRlbGlnaHQsCiAgICBCdXQgeW91IHNoYWxsIGJlYXIgdGhlIGJ1cmRlbiBzb29uIGF0IG5pZ2h0LgogICAgR287IEknbGwgdG8gZGlubmVyOiBoaWUgeW91IHRvIHRoZSBjZWxsLgoKSlVMSUVUCgogICAgSGllIHRvIGhpZ2ggZm9ydHVuZSEgSG9uZXN0IG51cnNlLCBmYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIFZJLiBGcmlhciBMYXVyZW5jZSdzIGNlbGwuCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UgYW5kIFJPTUVPIAoKRlJJQVIgTEFVUkVOQ0UKCiAgICBTbyBzbWlsZSB0aGUgaGVhdmVucyB1cG9uIHRoaXMgaG9seSBhY3QsCiAgICBUaGF0IGFmdGVyIGhvdXJzIHdpdGggc29ycm93IGNoaWRlIHVzIG5vdCEKClJPTUVPCgogICAgQW1lbiwgYW1lbiEgYnV0IGNvbWUgd2hhdCBzb3Jyb3cgY2FuLAogICAgSXQgY2Fubm90IGNvdW50ZXJ2YWlsIHRoZSBleGNoYW5nZSBvZiBqb3kKICAgIFRoYXQgb25lIHNob3J0IG1pbnV0ZSBnaXZlcyBtZSBpbiBoZXIgc2lnaHQ6CiAgICBEbyB0aG91IGJ1dCBjbG9zZSBvdXIgaGFuZHMgd2l0aCBob2x5IHdvcmRzLAogICAgVGhlbiBsb3ZlLWRldm91cmluZyBkZWF0aCBkbyB3aGF0IGhlIGRhcmU7CiAgICBJdCBpcyBlbm91Z2ggSSBtYXkgYnV0IGNhbGwgaGVyIG1pbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFRoZXNlIHZpb2xlbnQgZGVsaWdodHMgaGF2ZSB2aW9sZW50IGVuZHMKICAgIEFuZCBpbiB0aGVpciB0cml1bXBoIGRpZSwgbGlrZSBmaXJlIGFuZCBwb3dkZXIsCiAgICBXaGljaCBhcyB0aGV5IGtpc3MgY29uc3VtZTogdGhlIHN3ZWV0ZXN0IGhvbmV5CiAgICBJcyBsb2F0aHNvbWUgaW4gaGlzIG93biBkZWxpY2lvdXNuZXNzCiAgICBBbmQgaW4gdGhlIHRhc3RlIGNvbmZvdW5kcyB0aGUgYXBwZXRpdGU6CiAgICBUaGVyZWZvcmUgbG92ZSBtb2RlcmF0ZWx5OyBsb25nIGxvdmUgZG90aCBzbzsKICAgIFRvbyBzd2lmdCBhcnJpdmVzIGFzIHRhcmR5IGFzIHRvbyBzbG93LgoKICAgIEVudGVyIEpVTElFVAogICAgSGVyZSBjb21lcyB0aGUgbGFkeTogTywgc28gbGlnaHQgYSBmb290CiAgICBXaWxsIG5lJ2VyIHdlYXIgb3V0IHRoZSBldmVybGFzdGluZyBmbGludDoKICAgIEEgbG92ZXIgbWF5IGJlc3RyaWRlIHRoZSBnb3NzYW1lcgogICAgVGhhdCBpZGxlcyBpbiB0aGUgd2FudG9uIHN1bW1lciBhaXIsCiAgICBBbmQgeWV0IG5vdCBmYWxsOyBzbyBsaWdodCBpcyB2YW5pdHkuCgpKVUxJRVQKCiAgICBHb29kIGV2ZW4gdG8gbXkgZ2hvc3RseSBjb25mZXNzb3IuCgpGUklBUiBMQVVSRU5DRQoKICAgIFJvbWVvIHNoYWxsIHRoYW5rIHRoZWUsIGRhdWdodGVyLCBmb3IgdXMgYm90aC4KCkpVTElFVAoKICAgIEFzIG11Y2ggdG8gaGltLCBlbHNlIGlzIGhpcyB0aGFua3MgdG9vIG11Y2guCgpST01FTwoKICAgIEFoLCBKdWxpZXQsIGlmIHRoZSBtZWFzdXJlIG9mIHRoeSBqb3kKICAgIEJlIGhlYXAnZCBsaWtlIG1pbmUgYW5kIHRoYXQgdGh5IHNraWxsIGJlIG1vcmUKICAgIFRvIGJsYXpvbiBpdCwgdGhlbiBzd2VldGVuIHdpdGggdGh5IGJyZWF0aAogICAgVGhpcyBuZWlnaGJvdXIgYWlyLCBhbmQgbGV0IHJpY2ggbXVzaWMncyB0b25ndWUKICAgIFVuZm9sZCB0aGUgaW1hZ2luZWQgaGFwcGluZXNzIHRoYXQgYm90aAogICAgUmVjZWl2ZSBpbiBlaXRoZXIgYnkgdGhpcyBkZWFyIGVuY291bnRlci4KCkpVTElFVAoKICAgIENvbmNlaXQsIG1vcmUgcmljaCBpbiBtYXR0ZXIgdGhhbiBpbiB3b3JkcywKICAgIEJyYWdzIG9mIGhpcyBzdWJzdGFuY2UsIG5vdCBvZiBvcm5hbWVudDoKICAgIFRoZXkgYXJlIGJ1dCBiZWdnYXJzIHRoYXQgY2FuIGNvdW50IHRoZWlyIHdvcnRoOwogICAgQnV0IG15IHRydWUgbG92ZSBpcyBncm93biB0byBzdWNoIGV4Y2VzcwogICAgSSBjYW5ub3Qgc3VtIHVwIHN1bSBvZiBoYWxmIG15IHdlYWx0aC4KCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgY29tZSB3aXRoIG1lLCBhbmQgd2Ugd2lsbCBtYWtlIHNob3J0IHdvcms7CiAgICBGb3IsIGJ5IHlvdXIgbGVhdmVzLCB5b3Ugc2hhbGwgbm90IHN0YXkgYWxvbmUKICAgIFRpbGwgaG9seSBjaHVyY2ggaW5jb3Jwb3JhdGUgdHdvIGluIG9uZS4KCiAgICBFeGV1bnQKCkFDVCBJSUkKU0NFTkUgSS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgTUVSQ1VUSU8sIEJFTlZPTElPLCBQYWdlLCBhbmQgU2VydmFudHMgCgpCRU5WT0xJTwoKICAgIEkgcHJheSB0aGVlLCBnb29kIE1lcmN1dGlvLCBsZXQncyByZXRpcmU6CiAgICBUaGUgZGF5IGlzIGhvdCwgdGhlIENhcHVsZXRzIGFicm9hZCwKICAgIEFuZCwgaWYgd2UgbWVldCwgd2Ugc2hhbGwgbm90IHNjYXBlIGEgYnJhd2w7CiAgICBGb3Igbm93LCB0aGVzZSBob3QgZGF5cywgaXMgdGhlIG1hZCBibG9vZCBzdGlycmluZy4KCk1FUkNVVElPCgogICAgVGhvdSBhcnQgbGlrZSBvbmUgb2YgdGhvc2UgZmVsbG93cyB0aGF0IHdoZW4gaGUKICAgIGVudGVycyB0aGUgY29uZmluZXMgb2YgYSB0YXZlcm4gY2xhcHMgbWUgaGlzIHN3b3JkCiAgICB1cG9uIHRoZSB0YWJsZSBhbmQgc2F5cyAnR29kIHNlbmQgbWUgbm8gbmVlZCBvZgogICAgdGhlZSEnIGFuZCBieSB0aGUgb3BlcmF0aW9uIG9mIHRoZSBzZWNvbmQgY3VwIGRyYXdzCiAgICBpdCBvbiB0aGUgZHJhd2VyLCB3aGVuIGluZGVlZCB0aGVyZSBpcyBubyBuZWVkLgoKQkVOVk9MSU8KCiAgICBBbSBJIGxpa2Ugc3VjaCBhIGZlbGxvdz8KCk1FUkNVVElPCgogICAgQ29tZSwgY29tZSwgdGhvdSBhcnQgYXMgaG90IGEgSmFjayBpbiB0aHkgbW9vZCBhcwogICAgYW55IGluIEl0YWx5LCBhbmQgYXMgc29vbiBtb3ZlZCB0byBiZSBtb29keSwgYW5kIGFzCiAgICBzb29uIG1vb2R5IHRvIGJlIG1vdmVkLgoKQkVOVk9MSU8KCiAgICBBbmQgd2hhdCB0bz8KCk1FUkNVVElPCgogICAgTmF5LCBhbiB0aGVyZSB3ZXJlIHR3byBzdWNoLCB3ZSBzaG91bGQgaGF2ZSBub25lCiAgICBzaG9ydGx5LCBmb3Igb25lIHdvdWxkIGtpbGwgdGhlIG90aGVyLiBUaG91ISB3aHksCiAgICB0aG91IHdpbHQgcXVhcnJlbCB3aXRoIGEgbWFuIHRoYXQgaGF0aCBhIGhhaXIgbW9yZSwKICAgIG9yIGEgaGFpciBsZXNzLCBpbiBoaXMgYmVhcmQsIHRoYW4gdGhvdSBoYXN0OiB0aG91CiAgICB3aWx0IHF1YXJyZWwgd2l0aCBhIG1hbiBmb3IgY3JhY2tpbmcgbnV0cywgaGF2aW5nIG5vCiAgICBvdGhlciByZWFzb24gYnV0IGJlY2F1c2UgdGhvdSBoYXN0IGhhemVsIGV5ZXM6IHdoYXQKICAgIGV5ZSBidXQgc3VjaCBhbiBleWUgd291bGQgc3B5IG91dCBzdWNoIGEgcXVhcnJlbD8KICAgIFRoeSBoZWFkIGlzIGFzIGZ1biBvZiBxdWFycmVscyBhcyBhbiBlZ2cgaXMgZnVsbCBvZgogICAgbWVhdCwgYW5kIHlldCB0aHkgaGVhZCBoYXRoIGJlZW4gYmVhdGVuIGFzIGFkZGxlIGFzCiAgICBhbiBlZ2cgZm9yIHF1YXJyZWxsaW5nOiB0aG91IGhhc3QgcXVhcnJlbGxlZCB3aXRoIGEKICAgIG1hbiBmb3IgY291Z2hpbmcgaW4gdGhlIHN0cmVldCwgYmVjYXVzZSBoZSBoYXRoCiAgICB3YWtlbmVkIHRoeSBkb2cgdGhhdCBoYXRoIGxhaW4gYXNsZWVwIGluIHRoZSBzdW46CiAgICBkaWRzdCB0aG91IG5vdCBmYWxsIG91dCB3aXRoIGEgdGFpbG9yIGZvciB3ZWFyaW5nCiAgICBoaXMgbmV3IGRvdWJsZXQgYmVmb3JlIEVhc3Rlcj8gd2l0aCBhbm90aGVyLCBmb3IKICAgIHR5aW5nIGhpcyBuZXcgc2hvZXMgd2l0aCBvbGQgcmliYW5kPyBhbmQgeWV0IHRob3UKICAgIHdpbHQgdHV0b3IgbWUgZnJvbSBxdWFycmVsbGluZyEKCkJFTlZPTElPCgogICAgQW4gSSB3ZXJlIHNvIGFwdCB0byBxdWFycmVsIGFzIHRob3UgYXJ0LCBhbnkgbWFuCiAgICBzaG91bGQgYnV5IHRoZSBmZWUtc2ltcGxlIG9mIG15IGxpZmUgZm9yIGFuIGhvdXIgYW5kIGEgcXVhcnRlci4KCk1FUkNVVElPCgogICAgVGhlIGZlZS1zaW1wbGUhIE8gc2ltcGxlIQoKQkVOVk9MSU8KCiAgICBCeSBteSBoZWFkLCBoZXJlIGNvbWUgdGhlIENhcHVsZXRzLgoKTUVSQ1VUSU8KCiAgICBCeSBteSBoZWVsLCBJIGNhcmUgbm90LgoKICAgIEVudGVyIFRZQkFMVCBhbmQgb3RoZXJzCgpUWUJBTFQKCiAgICBGb2xsb3cgbWUgY2xvc2UsIGZvciBJIHdpbGwgc3BlYWsgdG8gdGhlbS4KICAgIEdlbnRsZW1lbiwgZ29vZCBkZW46IGEgd29yZCB3aXRoIG9uZSBvZiB5b3UuCgpNRVJDVVRJTwoKICAgIEFuZCBidXQgb25lIHdvcmQgd2l0aCBvbmUgb2YgdXMIGNvdXBsZSBpdCB3aXRoCiAgICBzb21ldGhpbmc7IG1ha2UgaXQgYSB3b3JkIGFuZCBhIGJsb3cuCgpUWUJBTFQKCiAgICBZb3Ugc2hhbGwgZmluZCBtZSBhcHQgZW5vdWdoIHRvIHRoYXQsIHNpciwgYW4geW91CiAgICB3aWxsIGdpdmUgbWUgb2NjYXNpb24uCgpNRVJDVVRJTwoKICAgIENvdWxkIHlvdSBub3QgdGFrZSBzb21lIG9jY2FzaW9uIHdpdGhvdXQgZ2l2aW5nPwoKVFlCQUxUCgogICAgTWVyY3V0aW8sIHRob3UgY29uc29ydCdzdCB3aXRoIFJvbWVvLC0tCgpNRVJDVVRJTwoKICAgIENvbnNvcnQhIHdoYXQsIGRvc3QgdGhvdSBtYWtlIHVzIG1pbnN0cmVscz8gYW4KICAgIHRob3UgbWFrZSBtaW5zdHJlbHMgb2YgdXMsIGxvb2sgdG8gaGVhciBub3RoaW5nIGJ1dAogICAgZGlzY29yZHM6IGhlcmUncyBteSBmaWRkbGVzdGljazsgaGVyZSdzIHRoYXQgc2hhbGwKICAgIG1ha2UgeW91IGRhbmNlLiAnWm91bmRzLCBjb25zb3J0IQoKQkVOVk9MSU8KCiAgICBXZSB0YWxrIGhlcmUgaW4gdGhlIHB1YmxpYyBoYXVudCBvZiBtZW46CiAgICBFaXRoZXIgd2l0aGRyYXcgdW50byBzb21lIHByaXZhdGUgcGxhY2UsCiAgICBBbmQgcmVhc29uIGNvbGRseSBvZiB5b3VyIGdyaWV2YW5jZXMsCiAgICBPciBlbHNlIGRlcGFydDsgaGVyZSBhbGwgZXllcyBnYXplIG9uIHVzLgoKTUVSQ1VUSU8KCiAgICBNZW4ncyBleWVzIHdlcmUgbWFkZSB0byBsb29rLCBhbmQgbGV0IHRoZW0gZ2F6ZTsKICAgIEkgd2lsbCBub3QgYnVkZ2UgZm9yIG5vIG1hbidzIHBsZWFzdXJlLCBJLgoKICAgIEVudGVyIFJPTUVPCgpUWUJBTFQKCiAgICBXZWxsLCBwZWFjZSBiZSB3aXRoIHlvdSwgc2lyOiBoZXJlIGNvbWVzIG15IG1hbi4KCk1FUkNVVElPCgogICAgQnV0IEknbGwgYmUgaGFuZ2VkLCBzaXIsIGlmIGhlIHdlYXIgeW91ciBsaXZlcnk6CiAgICBNYXJyeSwgZ28gYmVmb3JlIHRvIGZpZWxkLCBoZSdsbCBiZSB5b3VyIGZvbGxvd2VyOwogICAgWW91ciB3b3JzaGlwIGluIHRoYXQgc2Vuc2UgbWF5IGNhbGwgaGltICdtYW4uJwoKVFlCQUxUCgogICAgUm9tZW8sIHRoZSBoYXRlIEkgYmVhciB0aGVlIGNhbiBhZmZvcmQKICAgIE5vIGJldHRlciB0ZXJtIHRoYW4gdGhpcywtLXRob3UgYXJ0IGEgdmlsbGFpbi4KClJPTUVPCgogICAgVHliYWx0LCB0aGUgcmVhc29uIHRoYXQgSSBoYXZlIHRvIGxvdmUgdGhlZQogICAgRG90aCBtdWNoIGV4Y3VzZSB0aGUgYXBwZXJ0YWluaW5nIHJhZ2UKICAgIFRvIHN1Y2ggYSBncmVldGluZzogdmlsbGFpbiBhbSBJIG5vbmU7CiAgICBUaGVyZWZvcmUgZmFyZXdlbGw7IEkgc2VlIHRob3Uga25vdydzdCBtZSBub3QuCgpUWUJBTFQKCiAgICBCb3ksIHRoaXMgc2hhbGwgbm90IGV4Y3VzZSB0aGUgaW5qdXJpZXMKICAgIFRoYXQgdGhvdSBoYXN0IGRvbmUgbWU7IHRoZXJlZm9yZSB0dXJuIGFuZCBkcmF3LgoKUk9NRU8KCiAgICBJIGRvIHByb3Rlc3QsIEkgbmV2ZXIgaW5qdXJlZCB0aGVlLAogICAgQnV0IGxvdmUgdGhlZSBiZXR0ZXIgdGhhbiB0aG91IGNhbnN0IGRldmlzZSwKICAgIFRpbGwgdGhvdSBzaGFsdCBrbm93IHRoZSByZWFzb24gb2YgbXkgbG92ZToKICAgIEFuZCBzbywgZ29vZCBDYXB1bGV0LC0td2hpY2ggbmFtZSBJIHRlbmRlcgogICAgQXMgZGVhcmx5IGFzIG15IG93biwtLWJlIHNhdGlzZmllZC4KCk1FUkNVVElPCgogICAgTyBjYWxtLCBkaXNob25vdXJhYmxlLCB2aWxlIHN1Ym1pc3Npb24hCiAgICBBbGxhIHN0b2NjYXRhIGNhcnJpZXMgaXQgYXdheS4KCiAgICBEcmF3cwogICAgVHliYWx0LCB5b3UgcmF0LWNhdGNoZXIsIHdpbGwgeW91IHdhbGsCgpUWUJBTFQKCiAgICBXaGF0IHdvdWxkc3QgdGhvdSBoYXZlIHdpdGggbWUCgpNRVJDVVRJTwoKICAgIEdvb2Qga2luZyBvZiBjYXRzLCBub3RoaW5nIGJ1dCBvbmUgb2YgeW91ciBuaW5lCiAgICBsaXZlczsgdGhhdCBJIG1lYW4gdG8gbWFrZSBib2xkIHdpdGhhbCwgYW5kIGFzIHlvdQogICAgc2hhbGwgdXNlIG1lIGhlcmVhZnRlciwgZHJ5YmVhdCB0aGUgcmVzdCBvZiB0aGUKICAgIGVpZ2h0LiBXaWxsIHlvdSBwbHVjayB5b3VyIHN3b3JkIG91dCBvZiBoaXMgcGl0Y2hlcgogICAgYnkgdGhlIGVhcnMIG1ha2UgaGFzdGUsIGxlc3QgbWluZSBiZSBhYm91dCB5b3VyCiAgICBlYXJzIGVyZSBpdCBiZSBvdXQuCgpUWUJBTFQKCiAgICBJIGFtIGZvciB5b3UuCgogICAgRHJhd2luZwoKUk9NRU8KCiAgICBHZW50bGUgTWVyY3V0aW8sIHB1dCB0aHkgcmFwaWVyIHVwLgoKTUVSQ1VUSU8KCiAgICBDb21lLCBzaXIsIHlvdXIgcGFzc2Fkby4KCiAgICBUaGV5IGZpZ2h0CgpST01FTwoKICAgIERyYXcsIEJlbnZvbGlvOyBiZWF0IGRvd24gdGhlaXIgd2VhcG9ucy4KICAgIEdlbnRsZW1lbiwgZm9yIHNoYW1lLCBmb3JiZWFyIHRoaXMgb3V0cmFnZSEKICAgIFR5YmFsdCwgTWVyY3V0aW8sIHRoZSBwcmluY2UgZXhwcmVzc2x5IGhhdGgKICAgIEZvcmJpZGRlbiBiYW5keWluZyBpbiBWZXJvbmEgc3RyZWV0czoKICAgIEhvbGQsIFR5YmFsdCEgZ29vZCBNZXJjdXRpbyEKCiAgICBUWUJBTFQgdW5kZXIgUk9NRU8ncyBhcm0gc3RhYnMgTUVSQ1VUSU8sIGFuZCBmbGllcyB3aXRoIGhpcyBmb2xsb3dlcnMKCk1FUkNVVElPCgogICAgSSBhbSBodXJ0LgogICAgQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEgSSBhbSBzcGVkLgogICAgSXMgaGUgZ29uZSwgYW5kIGhhdGggbm90aGluZz8KCkJFTlZPTElPCgogICAgV2hhdCwgYXJ0IHRob3UgaHVydD8KCk1FUkNVVElPCgogICAgQXksIGF5LCBhIHNjcmF0Y2gsIGEgc2NyYXRjaDsgbWFycnksICd0aXMgZW5vdWdoLgogICAgV2hlcmUgaXMgbXkgcGFnZT8gR28sIHZpbGxhaW4sIGZldGNoIGEgc3VyZ2Vvbi4KCiAgICBFeGl0IFBhZ2UKClJPTUVPCgogICAgQ291cmFnZSwgbWFuOyB0aGUgaHVydCBjYW5ub3QgYmUgbXVjaC4KCk1FUkNVVElPCgogICAgTm8sICd0aXMgbm90IHNvIGRlZXAgYXMgYSB3ZWxsLCBub3Igc28gd2lkZSBhcyBhCiAgICBjaHVyY2gtZG9vcjsgYnV0ICd0aXMgZW5vdWdoLCd0d2lsbCBzZXJ2ZTogYXNrIGZvcgogICAgbWUgdG8tbW9ycm93LCBhbmQgeW91IHNoYWxsIGZpbmQgbWUgYSBncmF2ZSBtYW4uIEkKICAgIGFtIHBlcHBlcmVkLCBJIHdhcnJhbnQsIGZvciB0aGlzIHdvcmxkLiBBIHBsYWd1ZSBvJwogICAgYm90aCB5b3VyIGhvdXNlcyEgJ1pvdW5kcywgYSBkb2csIGEgcmF0LCBhIG1vdXNlLCBhCiAgICBjYXQsIHRvIHNjcmF0Y2ggYSBtYW4gdG8gZGVhdGghIGEgYnJhZ2dhcnQsIGEKICAgIHJvZ3VlLCBhIHZpbGxhaW4sIHRoYXQgZmlnaHRzIGJ5IHRoZSBib29rIG9mCiAgICBhcml0aG1ldGljISBXaHkgdGhlIGRldmlsIGNhbWUgeW91IGJldHdlZW4gdXMIEkKICAgIHdhcyBodXJ0IHVuZGVyIHlvdXIgYXJtLgoKUk9NRU8KCiAgICBJIHRob3VnaHQgYWxsIGZvciB0aGUgYmVzdC4KCk1FUkNVVElPCgogICAgSGVscCBtZSBpbnRvIHNvbWUgaG91c2UsIEJlbnZvbGlvLAogICAgT3IgSSBzaGFsbCBmYWludC4gQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEKICAgIFRoZXkgaGF2ZSBtYWRlIHdvcm1zJyBtZWF0IG9mIG1lOiBJIGhhdmUgaXQsCiAgICBBbmQgc291bmRseSB0b286IHlvdXIgaG91c2VzIQoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KClJPTUVPCgogICAgVGhpcyBnZW50bGVtYW4sIHRoZSBwcmluY2UncyBuZWFyIGFsbHksCiAgICBNeSB2ZXJ5IGZyaWVuZCwgaGF0aCBnb3QgaGlzIG1vcnRhbCBodXJ0CiAgICBJbiBteSBiZWhhbGY7IG15IHJlcHV0YXRpb24gc3RhaW4nZAogICAgV2l0aCBUeWJhbHQncyBzbGFuZGVyLC0tVHliYWx0LCB0aGF0IGFuIGhvdXIKICAgIEhhdGggYmVlbiBteSBraW5zbWFuISBPIHN3ZWV0IEp1bGlldCwKICAgIFRoeSBiZWF1dHkgaGF0aCBtYWRlIG1lIGVmZmVtaW5hdGUKICAgIEFuZCBpbiBteSB0ZW1wZXIgc29mdGVuJ2QgdmFsb3VyJ3Mgc3RlZWwhCgogICAgUmUtZW50ZXIgQkVOVk9MSU8KCkJFTlZPTElPCgogICAgTyBSb21lbywgUm9tZW8sIGJyYXZlIE1lcmN1dGlvJ3MgZGVhZCEKICAgIFRoYXQgZ2FsbGFudCBzcGlyaXQgaGF0aCBhc3BpcmVkIHRoZSBjbG91ZHMsCiAgICBXaGljaCB0b28gdW50aW1lbHkgaGVyZSBkaWQgc2Nvcm4gdGhlIGVhcnRoLgoKUk9NRU8KCiAgICBUaGlzIGRheSdzIGJsYWNrIGZhdGUgb24gbW9yZSBkYXlzIGRvdGggZGVwZW5kOwogICAgVGhpcyBidXQgYmVnaW5zIHRoZSB3b2UsIG90aGVycyBtdXN0IGVuZC4KCkJFTlZPTElPCgogICAgSGVyZSBjb21lcyB0aGUgZnVyaW91cyBUeWJhbHQgYmFjayBhZ2Fpbi4KClJPTUVPCgogICAgQWxpdmUsIGluIHRyaXVtcGghIGFuZCBNZXJjdXRpbyBzbGFpbiEKICAgIEF3YXkgdG8gaGVhdmVuLCByZXNwZWN0aXZlIGxlbml0eSwKICAgIEFuZCBmaXJlLWV5ZWQgZnVyeSBiZSBteSBjb25kdWN0IG5vdyEKCiAgICBSZS1lbnRlciBUWUJBTFQKICAgIE5vdywgVHliYWx0LCB0YWtlIHRoZSB2aWxsYWluIGJhY2sgYWdhaW4sCiAgICBUaGF0IGxhdGUgdGhvdSBnYXZlc3QgbWU7IGZvciBNZXJjdXRpbydzIHNvdWwKICAgIElzIGJ1dCBhIGxpdHRsZSB3YXkgYWJvdmUgb3VyIGhlYWRzLAogICAgU3RheWluZyBmb3IgdGhpbmUgdG8ga2VlcCBoaW0gY29tcGFueToKICAgIEVpdGhlciB0aG91LCBvciBJLCBvciBib3RoLCBtdXN0IGdvIHdpdGggaGltLgoKVFlCQUxUCgogICAgVGhvdSwgd3JldGNoZWQgYm95LCB0aGF0IGRpZHN0IGNvbnNvcnQgaGltIGhlcmUsCiAgICBTaGFsdCB3aXRoIGhpbSBoZW5jZS4KClJPTUVPCgogICAgVGhpcyBzaGFsbCBkZXRlcm1pbmUgdGhhdC4KCiAgICBUaGV5IGZpZ2h0OyBUWUJBTFQgZmFsbHMKCkJFTlZPTElPCgogICAgUm9tZW8sIGF3YXksIGJlIGdvbmUhCiAgICBUaGUgY2l0aXplbnMgYXJlIHVwLCBhbmQgVHliYWx0IHNsYWluLgogICAgU3RhbmQgbm90IGFtYXplZDogdGhlIHByaW5jZSB3aWxsIGRvb20gdGhlZSBkZWF0aCwKICAgIElmIHRob3UgYXJ0IHRha2VuOiBoZW5jZSwgYmUgZ29uZSwgYXdheSEKClJPTUVPCgogICAgTywgSSBhbSBmb3J0dW5lJ3MgZm9vbCEKCkJFTlZPTElPCgogICAgV2h5IGRvc3QgdGhvdSBzdGF5PwoKICAgIEV4aXQgUk9NRU8KCiAgICBFbnRlciBDaXRpemVucywgJiBjCgpGaXJzdCBDaXRpemVuCgogICAgV2hpY2ggd2F5IHJhbiBoZSB0aGF0IGtpbGwnZCBNZXJjdXRpbz8KICAgIFR5YmFsdCwgdGhhdCBtdXJkZXJlciwgd2hpY2ggd2F5IHJhbiBoZT8KCkJFTlZPTElPCgogICAgVGhlcmUgbGllcyB0aGF0IFR5YmFsdC4KCkZpcnN0IENpdGl6ZW4KCiAgICBVcCwgc2lyLCBnbyB3aXRoIG1lOwogICAgSSBjaGFyZ2UgdGhlZSBpbiB0aGUgcHJpbmNlcyBuYW1lLCBvYmV5LgoKICAgIEVudGVyIFByaW5jZSwgYXR0ZW5kZWQ7IE1PTlRBR1VFLCBDQVBVTEVULCB0aGVpciBXaXZlcywgYW5kIG90aGVycwoKUFJJTkNFCgogICAgV2hlcmUgYXJlIHRoZSB2aWxlIGJlZ2lubmVycyBvZiB0aGlzIGZyYXkCgpCRU5WT0xJTwoKICAgIE8gbm9ibGUgcHJpbmNlLCBJIGNhbiBkaXNjb3ZlciBhbGwKICAgIFRoZSB1bmx1Y2t5IG1hbmFnZSBvZiB0aGlzIGZhdGFsIGJyYXdsOgogICAgVGhlcmUgbGllcyB0aGUgbWFuLCBzbGFpbiBieSB5b3VuZyBSb21lbywKICAgIFRoYXQgc2xldyB0aHkga2luc21hbiwgYnJhdmUgTWVyY3V0aW8uCgpMQURZIENBUFVMRVQKCiAgICBUeWJhbHQsIG15IGNvdXNpbiEgTyBteSBicm90aGVyJ3MgY2hpbGQhCiAgICBPIHByaW5jZSEgTyBjb3VzaW4hIGh1c2JhbmQhIE8sIHRoZSBibG9vZCBpcyBzcGlsdAogICAgTyBteSBkZWFyIGtpbnNtYW4hIFByaW5jZSwgYXMgdGhvdSBhcnQgdHJ1ZSwKICAgIEZvciBibG9vZCBvZiBvdXJzLCBzaGVkIGJsb29kIG9mIE1vbnRhZ3VlLgogICAgTyBjb3VzaW4sIGNvdXNpbiEKClBSSU5DRQoKICAgIEJlbnZvbGlvLCB3aG8gYmVnYW4gdGhpcyBibG9vZHkgZnJheT8KCkJFTlZPTElPCgogICAgVHliYWx0LCBoZXJlIHNsYWluLCB3aG9tIFJvbWVvJ3MgaGFuZCBkaWQgc2xheTsKICAgIFJvbWVvIHRoYXQgc3Bva2UgaGltIGZhaXIsIGJhZGUgaGltIGJldGhpbmsKICAgIEhvdyBuaWNlIHRoZSBxdWFycmVsIHdhcywgYW5kIHVyZ2VkIHdpdGhhbAogICAgWW91ciBoaWdoIGRpc3BsZWFzdXJlOiBhbGwgdGhpcyB1dHRlcmVkCiAgICBXaXRoIGdlbnRsZSBicmVhdGgsIGNhbG0gbG9vaywga25lZXMgaHVtYmx5IGJvdydkLAogICAgQ291bGQgbm90IHRha2UgdHJ1Y2Ugd2l0aCB0aGUgdW5ydWx5IHNwbGVlbgogICAgT2YgVHliYWx0IGRlYWYgdG8gcGVhY2UsIGJ1dCB0aGF0IGhlIHRpbHRzCiAgICBXaXRoIHBpZXJjaW5nIHN0ZWVsIGF0IGJvbGQgTWVyY3V0aW8ncyBicmVhc3QsCiAgICBXaG8gYWxsIGFzIGhvdCwgdHVybnMgZGVhZGx5IHBvaW50IHRvIHBvaW50LAogICAgQW5kLCB3aXRoIGEgbWFydGlhbCBzY29ybiwgd2l0aCBvbmUgaGFuZCBiZWF0cwogICAgQ29sZCBkZWF0aCBhc2lkZSwgYW5kIHdpdGggdGhlIG90aGVyIHNlbmRzCiAgICBJdCBiYWNrIHRvIFR5YmFsdCwgd2hvc2UgZGV4dGVyaXR5LAogICAgUmV0b3J0cyBpdDogUm9tZW8gaGUgY3JpZXMgYWxvdWQsCiAgICAnSG9sZCwgZnJpZW5kcyEgZnJpZW5kcywgcGFydCEnIGFuZCwgc3dpZnRlciB0aGFuCiAgICBoaXMgdG9uZ3VlLAogICAgSGlzIGFnaWxlIGFybSBiZWF0cyBkb3duIHRoZWlyIGZhdGFsIHBvaW50cywKICAgIEFuZCAndHdpeHQgdGhlbSBydXNoZXM7IHVuZGVybmVhdGggd2hvc2UgYXJtCiAgICBBbiBlbnZpb3VzIHRocnVzdCBmcm9tIFR5YmFsdCBoaXQgdGhlIGxpZmUKICAgIE9mIHN0b3V0IE1lcmN1dGlvLCBhbmQgdGhlbiBUeWJhbHQgZmxlZDsKICAgIEJ1dCBieSBhbmQgYnkgY29tZXMgYmFjayB0byBSb21lbywKICAgIFdobyBoYWQgYnV0IG5ld2x5IGVudGVydGFpbidkIHJldmVuZ2UsCiAgICBBbmQgdG8gJ3QgdGhleSBnbyBsaWtlIGxpZ2h0bmluZywgZm9yLCBlcmUgSQogICAgQ291bGQgZHJhdyB0byBwYXJ0IHRoZW0sIHdhcyBzdG91dCBUeWJhbHQgc2xhaW4uCiAgICBBbmQsIGFzIGhlIGZlbGwsIGRpZCBSb21lbyB0dXJuIGFuZCBmbHkuCiAgICBUaGlzIGlzIHRoZSB0cnV0aCwgb3IgbGV0IEJlbnZvbGlvIGRpZS4KCkxBRFkgQ0FQVUxFVAoKICAgIEhlIGlzIGEga2luc21hbiB0byB0aGUgTW9udGFndWU7CiAgICBBZmZlY3Rpb24gbWFrZXMgaGltIGZhbHNlOyBoZSBzcGVha3Mgbm90IHRydWU6CiAgICBTb21lIHR3ZW50eSBvZiB0aGVtIGZvdWdodCBpbiB0aGlzIGJsYWNrIHN0cmlmZSwKICAgIEFuZCBhbGwgdGhvc2UgdHdlbnR5IGNvdWxkIGJ1dCBraWxsIG9uZSBsaWZlLgogICAgSSBiZWcgZm9yIGp1c3RpY2UsIHdoaWNoIHRob3UsIHByaW5jZSwgbXVzdCBnaXZlOwogICAgUm9tZW8gc2xldyBUeWJhbHQsIFJvbWVvIG11c3Qgbm90IGxpdmUuCgpQUklOQ0UKCiAgICBSb21lbyBzbGV3IGhpbSwgaGUgc2xldyBNZXJjdXRpbzsKICAgIFdobyBub3cgdGhlIHByaWNlIG9mIGhpcyBkZWFyIGJsb29kIGRvdGggb3dlPwoKTU9OVEFHVUUKCiAgICBOb3QgUm9tZW8sIHByaW5jZSwgaGUgd2FzIE1lcmN1dGlvJ3MgZnJpZW5kOwogICAgSGlzIGZhdWx0IGNvbmNsdWRlcyBidXQgd2hhdCB0aGUgbGF3IHNob3VsZCBlbmQsCiAgICBUaGUgbGlmZSBvZiBUeWJhbHQuCgpQUklOQ0UKCiAgICBBbmQgZm9yIHRoYXQgb2ZmZW5jZQogICAgSW1tZWRpYXRlbHkgd2UgZG8gZXhpbGUgaGltIGhlbmNlOgogICAgSSBoYXZlIGFuIGludGVyZXN0IGluIHlvdXIgaGF0ZSdzIHByb2NlZWRpbmcsCiAgICBNeSBibG9vZCBmb3IgeW91ciBydWRlIGJyYXdscyBkb3RoIGxpZSBhLWJsZWVkaW5nOwogICAgQnV0IEknbGwgYW1lcmNlIHlvdSB3aXRoIHNvIHN0cm9uZyBhIGZpbmUKICAgIFRoYXQgeW91IHNoYWxsIGFsbCByZXBlbnQgdGhlIGxvc3Mgb2YgbWluZToKICAgIEkgd2lsbCBiZSBkZWFmIHRvIHBsZWFkaW5nIGFuZCBleGN1c2VzOwogICAgTm9yIHRlYXJzIG5vciBwcmF5ZXJzIHNoYWxsIHB1cmNoYXNlIG91dCBhYnVzZXM6CiAgICBUaGVyZWZvcmUgdXNlIG5vbmU6IGxldCBSb21lbyBoZW5jZSBpbiBoYXN0ZSwKICAgIEVsc2UsIHdoZW4gaGUncyBmb3VuZCwgdGhhdCBob3VyIGlzIGhpcyBsYXN0LgogICAgQmVhciBoZW5jZSB0aGlzIGJvZHkgYW5kIGF0dGVuZCBvdXIgd2lsbDoKICAgIE1lcmN5IGJ1dCBtdXJkZXJzLCBwYXJkb25pbmcgdGhvc2UgdGhhdCBraWxsLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIENhcHVsZXQncyBvcmNoYXJkLgoKICAgIEVudGVyIEpVTElFVCAKCkpVTElFVAoKICAgIEdhbGxvcCBhcGFjZSwgeW91IGZpZXJ5LWZvb3RlZCBzdGVlZHMsCiAgICBUb3dhcmRzIFBob2VidXMnIGxvZGdpbmc6IHN1Y2ggYSB3YWdvbmVyCiAgICBBcyBQaGFldGhvbiB3b3VsZCB3aGlwIHlvdSB0byB0aGUgd2VzdCwKICAgIEFuZCBicmluZyBpbiBjbG91ZHkgbmlnaHQgaW1tZWRpYXRlbHkuCiAgICBTcHJlYWQgdGh5IGNsb3NlIGN1cnRhaW4sIGxvdmUtcGVyZm9ybWluZyBuaWdodCwKICAgIFRoYXQgcnVuYXdheSdzIGV5ZXMgbWF5IHdpbmsgYW5kIFJvbWVvCiAgICBMZWFwIHRvIHRoZXNlIGFybXMsIHVudGFsaydkIG9mIGFuZCB1bnNlZW4uCiAgICBMb3ZlcnMgY2FuIHNlZSB0byBkbyB0aGVpciBhbW9yb3VzIHJpdGVzCiAgICBCeSB0aGVpciBvd24gYmVhdXRpZXM7IG9yLCBpZiBsb3ZlIGJlIGJsaW5kLAogICAgSXQgYmVzdCBhZ3JlZXMgd2l0aCBuaWdodC4gQ29tZSwgY2l2aWwgbmlnaHQsCiAgICBUaG91IHNvYmVyLXN1aXRlZCBtYXRyb24sIGFsbCBpbiBibGFjaywKICAgIEFuZCBsZWFybiBtZSBob3cgdG8gbG9zZSBhIHdpbm5pbmcgbWF0Y2gsCiAgICBQbGF5J2QgZm9yIGEgcGFpciBvZiBzdGFpbmxlc3MgbWFpZGVuaG9vZHM6CiAgICBIb29kIG15IHVubWFubidkIGJsb29kLCBiYXRpbmcgaW4gbXkgY2hlZWtzLAogICAgV2l0aCB0aHkgYmxhY2sgbWFudGxlOyB0aWxsIHN0cmFuZ2UgbG92ZSwgZ3Jvd24gYm9sZCwKICAgIFRoaW5rIHRydWUgbG92ZSBhY3RlZCBzaW1wbGUgbW9kZXN0eS4KICAgIENvbWUsIG5pZ2h0OyBjb21lLCBSb21lbzsgY29tZSwgdGhvdSBkYXkgaW4gbmlnaHQ7CiAgICBGb3IgdGhvdSB3aWx0IGxpZSB1cG9uIHRoZSB3aW5ncyBvZiBuaWdodAogICAgV2hpdGVyIHRoYW4gbmV3IHNub3cgb24gYSByYXZlbidzIGJhY2suCiAgICBDb21lLCBnZW50bGUgbmlnaHQsIGNvbWUsIGxvdmluZywgYmxhY2stYnJvdydkIG5pZ2h0LAogICAgR2l2ZSBtZSBteSBSb21lbzsgYW5kLCB3aGVuIGhlIHNoYWxsIGRpZSwKICAgIFRha2UgaGltIGFuZCBjdXQgaGltIG91dCBpbiBsaXR0bGUgc3RhcnMsCiAgICBBbmQgaGUgd2lsbCBtYWtlIHRoZSBmYWNlIG9mIGhlYXZlbiBzbyBmaW5lCiAgICBUaGF0IGFsbCB0aGUgd29ybGQgd2lsbCBiZSBpbiBsb3ZlIHdpdGggbmlnaHQKICAgIEFuZCBwYXkgbm8gd29yc2hpcCB0byB0aGUgZ2FyaXNoIHN1bi4KICAgIE8sIEkgaGF2ZSBib3VnaHQgdGhlIG1hbnNpb24gb2YgYSBsb3ZlLAogICAgQnV0IG5vdCBwb3NzZXNzJ2QgaXQsIGFuZCwgdGhvdWdoIEkgYW0gc29sZCwKICAgIE5vdCB5ZXQgZW5qb3knZDogc28gdGVkaW91cyBpcyB0aGlzIGRheQogICAgQXMgaXMgdGhlIG5pZ2h0IGJlZm9yZSBzb21lIGZlc3RpdmFsCiAgICBUbyBhbiBpbXBhdGllbnQgY2hpbGQgdGhhdCBoYXRoIG5ldyByb2JlcwogICAgQW5kIG1heSBub3Qgd2VhciB0aGVtLiBPLCBoZXJlIGNvbWVzIG15IG51cnNlLAogICAgQW5kIHNoZSBicmluZ3MgbmV3czsgYW5kIGV2ZXJ5IHRvbmd1ZSB0aGF0IHNwZWFrcwogICAgQnV0IFJvbWVvJ3MgbmFtZSBzcGVha3MgaGVhdmVubHkgZWxvcXVlbmNlLgoKICAgIEVudGVyIE51cnNlLCB3aXRoIGNvcmRzCiAgICBOb3csIG51cnNlLCB3aGF0IG5ld3MIFdoYXQgaGFzdCB0aG91IHRoZXJlPyB0aGUgY29yZHMKICAgIFRoYXQgUm9tZW8gYmlkIHRoZWUgZmV0Y2gCgpOdXJzZQoKICAgIEF5LCBheSwgdGhlIGNvcmRzLgoKICAgIFRocm93cyB0aGVtIGRvd24KCkpVTElFVAoKICAgIEF5IG1lISB3aGF0IG5ld3MIHdoeSBkb3N0IHRob3Ugd3JpbmcgdGh5IGhhbmRzPwoKTnVyc2UKCiAgICBBaCwgd2VsbC1hLWRheSEgaGUncyBkZWFkLCBoZSdzIGRlYWQsIGhlJ3MgZGVhZCEKICAgIFdlIGFyZSB1bmRvbmUsIGxhZHksIHdlIGFyZSB1bmRvbmUhCiAgICBBbGFjayB0aGUgZGF5ISBoZSdzIGdvbmUsIGhlJ3Mga2lsbCdkLCBoZSdzIGRlYWQhCgpKVUxJRVQKCiAgICBDYW4gaGVhdmVuIGJlIHNvIGVudmlvdXMCgpOdXJzZQoKICAgIFJvbWVvIGNhbiwKICAgIFRob3VnaCBoZWF2ZW4gY2Fubm90OiBPIFJvbWVvLCBSb21lbyEKICAgIFdobyBldmVyIHdvdWxkIGhhdmUgdGhvdWdodCBpdD8gUm9tZW8hCgpKVUxJRVQKCiAgICBXaGF0IGRldmlsIGFydCB0aG91LCB0aGF0IGRvc3QgdG9ybWVudCBtZSB0aHVzPwogICAgVGhpcyB0b3J0dXJlIHNob3VsZCBiZSByb2FyJ2QgaW4gZGlzbWFsIGhlbGwuCiAgICBIYXRoIFJvbWVvIHNsYWluIGhpbXNlbGYIHNheSB0aG91IGJ1dCAnSSwnCiAgICBBbmQgdGhhdCBiYXJlIHZvd2VsICdJJyBzaGFsbCBwb2lzb24gbW9yZQogICAgVGhhbiB0aGUgZGVhdGgtZGFydGluZyBleWUgb2YgY29ja2F0cmljZToKICAgIEkgYW0gbm90IEksIGlmIHRoZXJlIGJlIHN1Y2ggYW4gSTsKICAgIE9yIHRob3NlIGV5ZXMgc2h1dCwgdGhhdCBtYWtlIHRoZWUgYW5zd2VyICdJLicKICAgIElmIGhlIGJlIHNsYWluLCBzYXkgJ0knOyBvciBpZiBub3QsIG5vOgogICAgQnJpZWYgc291bmRzIGRldGVybWluZSBvZiBteSB3ZWFsIG9yIHdvZS4KCk51cnNlCgogICAgSSBzYXcgdGhlIHdvdW5kLCBJIHNhdyBpdCB3aXRoIG1pbmUgZXllcywtLQogICAgR29kIHNhdmUgdGhlIG1hcmshLS1oZXJlIG9uIGhpcyBtYW5seSBicmVhc3Q6CiAgICBBIHBpdGVvdXMgY29yc2UsIGEgYmxvb2R5IHBpdGVvdXMgY29yc2U7CiAgICBQYWxlLCBwYWxlIGFzIGFzaGVzLCBhbGwgYmVkYXViJ2QgaW4gYmxvb2QsCiAgICBBbGwgaW4gZ29yZS1ibG9vZDsgSSBzd291bmRlZCBhdCB0aGUgc2lnaHQuCgpKVUxJRVQKCiAgICBPLCBicmVhaywgbXkgaGVhcnQhIHBvb3IgYmFua3J1cHQsIGJyZWFrIGF0IG9uY2UhCiAgICBUbyBwcmlzb24sIGV5ZXMsIG5lJ2VyIGxvb2sgb24gbGliZXJ0eSEKICAgIFZpbGUgZWFydGgsIHRvIGVhcnRoIHJlc2lnbjsgZW5kIG1vdGlvbiBoZXJlOwogICAgQW5kIHRob3UgYW5kIFJvbWVvIHByZXNzIG9uZSBoZWF2eSBiaWVyIQoKTnVyc2UKCiAgICBPIFR5YmFsdCwgVHliYWx0LCB0aGUgYmVzdCBmcmllbmQgSSBoYWQhCiAgICBPIGNvdXJ0ZW91cyBUeWJhbHQhIGhvbmVzdCBnZW50bGVtYW4hCiAgICBUaGF0IGV2ZXIgSSBzaG91bGQgbGl2ZSB0byBzZWUgdGhlZSBkZWFkIQoKSlVMSUVUCgogICAgV2hhdCBzdG9ybSBpcyB0aGlzIHRoYXQgYmxvd3Mgc28gY29udHJhcnkCiAgICBJcyBSb21lbyBzbGF1Z2h0ZXInZCwgYW5kIGlzIFR5YmFsdCBkZWFkPwogICAgTXkgZGVhci1sb3ZlZCBjb3VzaW4sIGFuZCBteSBkZWFyZXIgbG9yZD8KICAgIFRoZW4sIGRyZWFkZnVsIHRydW1wZXQsIHNvdW5kIHRoZSBnZW5lcmFsIGRvb20hCiAgICBGb3Igd2hvIGlzIGxpdmluZywgaWYgdGhvc2UgdHdvIGFyZSBnb25lPwoKTnVyc2UKCiAgICBUeWJhbHQgaXMgZ29uZSwgYW5kIFJvbWVvIGJhbmlzaGVkOwogICAgUm9tZW8gdGhhdCBraWxsJ2QgaGltLCBoZSBpcyBiYW5pc2hlZC4KCkpVTElFVAoKICAgIE8gR29kISBkaWQgUm9tZW8ncyBoYW5kIHNoZWQgVHliYWx0J3MgYmxvb2QCgpOdXJzZQoKICAgIEl0IGRpZCwgaXQgZGlkOyBhbGFzIHRoZSBkYXksIGl0IGRpZCEKCkpVTElFVAoKICAgIE8gc2VycGVudCBoZWFydCwgaGlkIHdpdGggYSBmbG93ZXJpbmcgZmFjZSEKICAgIERpZCBldmVyIGRyYWdvbiBrZWVwIHNvIGZhaXIgYSBjYXZlPwogICAgQmVhdXRpZnVsIHR5cmFudCEgZmllbmQgYW5nZWxpY2FsIQogICAgRG92ZS1mZWF0aGVyJ2QgcmF2ZW4hIHdvbHZpc2gtcmF2ZW5pbmcgbGFtYiEKICAgIERlc3Bpc2VkIHN1YnN0YW5jZSBvZiBkaXZpbmVzdCBzaG93IQogICAgSnVzdCBvcHBvc2l0ZSB0byB3aGF0IHRob3UganVzdGx5IHNlZW0nc3QsCiAgICBBIGRhbW5lZCBzYWludCwgYW4gaG9ub3VyYWJsZSB2aWxsYWluIQogICAgTyBuYXR1cmUsIHdoYXQgaGFkc3QgdGhvdSB0byBkbyBpbiBoZWxsLAogICAgV2hlbiB0aG91IGRpZHN0IGJvd2VyIHRoZSBzcGlyaXQgb2YgYSBmaWVuZAogICAgSW4gbW9yYWwgcGFyYWRpc2Ugb2Ygc3VjaCBzd2VldCBmbGVzaD8KICAgIFdhcyBldmVyIGJvb2sgY29udGFpbmluZyBzdWNoIHZpbGUgbWF0dGVyCiAgICBTbyBmYWlybHkgYm91bmQIE8gdGhhdCBkZWNlaXQgc2hvdWxkIGR3ZWxsCiAgICBJbiBzdWNoIGEgZ29yZ2VvdXMgcGFsYWNlIQoKTnVyc2UKCiAgICBUaGVyZSdzIG5vIHRydXN0LAogICAgTm8gZmFpdGgsIG5vIGhvbmVzdHkgaW4gbWVuOyBhbGwgcGVyanVyZWQsCiAgICBBbGwgZm9yc3dvcm4sIGFsbCBuYXVnaHQsIGFsbCBkaXNzZW1ibGVycy4KICAgIEFoLCB3aGVyZSdzIG15IG1hbj8gZ2l2ZSBtZSBzb21lIGFxdWEgdml0YWU6CiAgICBUaGVzZSBncmllZnMsIHRoZXNlIHdvZXMsIHRoZXNlIHNvcnJvd3MgbWFrZSBtZSBvbGQuCiAgICBTaGFtZSBjb21lIHRvIFJvbWVvIQoKSlVMSUVUCgogICAgQmxpc3RlcidkIGJlIHRoeSB0b25ndWUKICAgIEZvciBzdWNoIGEgd2lzaCEgaGUgd2FzIG5vdCBib3JuIHRvIHNoYW1lOgogICAgVXBvbiBoaXMgYnJvdyBzaGFtZSBpcyBhc2hhbWVkIHRvIHNpdDsKICAgIEZvciAndGlzIGEgdGhyb25lIHdoZXJlIGhvbm91ciBtYXkgYmUgY3Jvd24nZAogICAgU29sZSBtb25hcmNoIG9mIHRoZSB1bml2ZXJzYWwgZWFydGguCiAgICBPLCB3aGF0IGEgYmVhc3Qgd2FzIEkgdG8gY2hpZGUgYXQgaGltIQoKTnVyc2UKCiAgICBXaWxsIHlvdSBzcGVhayB3ZWxsIG9mIGhpbSB0aGF0IGtpbGwnZCB5b3VyIGNvdXNpbj8KCkpVTElFVAoKICAgIFNoYWxsIEkgc3BlYWsgaWxsIG9mIGhpbSB0aGF0IGlzIG15IGh1c2JhbmQCiAgICBBaCwgcG9vciBteSBsb3JkLCB3aGF0IHRvbmd1ZSBzaGFsbCBzbW9vdGggdGh5IG5hbWUsCiAgICBXaGVuIEksIHRoeSB0aHJlZS1ob3VycyB3aWZlLCBoYXZlIG1hbmdsZWQgaXQCiAgICBCdXQsIHdoZXJlZm9yZSwgdmlsbGFpbiwgZGlkc3QgdGhvdSBraWxsIG15IGNvdXNpbj8KICAgIFRoYXQgdmlsbGFpbiBjb3VzaW4gd291bGQgaGF2ZSBraWxsJ2QgbXkgaHVzYmFuZDoKICAgIEJhY2ssIGZvb2xpc2ggdGVhcnMsIGJhY2sgdG8geW91ciBuYXRpdmUgc3ByaW5nOwogICAgWW91ciB0cmlidXRhcnkgZHJvcHMgYmVsb25nIHRvIHdvZSwKICAgIFdoaWNoIHlvdSwgbWlzdGFraW5nLCBvZmZlciB1cCB0byBqb3kuCiAgICBNeSBodXNiYW5kIGxpdmVzLCB0aGF0IFR5YmFsdCB3b3VsZCBoYXZlIHNsYWluOwogICAgQW5kIFR5YmFsdCdzIGRlYWQsIHRoYXQgd291bGQgaGF2ZSBzbGFpbiBteSBodXNiYW5kOgogICAgQWxsIHRoaXMgaXMgY29tZm9ydDsgd2hlcmVmb3JlIHdlZXAgSSB0aGVuPwogICAgU29tZSB3b3JkIHRoZXJlIHdhcywgd29yc2VyIHRoYW4gVHliYWx0J3MgZGVhdGgsCiAgICBUaGF0IG11cmRlcidkIG1lOiBJIHdvdWxkIGZvcmdldCBpdCBmYWluOwogICAgQnV0LCBPLCBpdCBwcmVzc2VzIHRvIG15IG1lbW9yeSwKICAgIExpa2UgZGFtbmVkIGd1aWx0eSBkZWVkcyB0byBzaW5uZXJzJyBtaW5kczoKICAgICdUeWJhbHQgaXMgZGVhZCwgYW5kIFJvbWVvLS1iYW5pc2hlZDsnCiAgICBUaGF0ICdiYW5pc2hlZCwnIHRoYXQgb25lIHdvcmQgJ2JhbmlzaGVkLCcKICAgIEhhdGggc2xhaW4gdGVuIHRob3VzYW5kIFR5YmFsdHMuIFR5YmFsdCdzIGRlYXRoCiAgICBXYXMgd29lIGVub3VnaCwgaWYgaXQgaGFkIGVuZGVkIHRoZXJlOgogICAgT3IsIGlmIHNvdXIgd29lIGRlbGlnaHRzIGluIGZlbGxvd3NoaXAKICAgIEFuZCBuZWVkbHkgd2lsbCBiZSByYW5rJ2Qgd2l0aCBvdGhlciBncmllZnMsCiAgICBXaHkgZm9sbG93J2Qgbm90LCB3aGVuIHNoZSBzYWlkICdUeWJhbHQncyBkZWFkLCcKICAgIFRoeSBmYXRoZXIsIG9yIHRoeSBtb3RoZXIsIG5heSwgb3IgYm90aCwKICAgIFdoaWNoIG1vZGVybiBsYW1lbnRhdGlvbnMgbWlnaHQgaGF2ZSBtb3ZlZD8KICAgIEJ1dCB3aXRoIGEgcmVhci13YXJkIGZvbGxvd2luZyBUeWJhbHQncyBkZWF0aCwKICAgICdSb21lbyBpcyBiYW5pc2hlZCwnIHRvIHNwZWFrIHRoYXQgd29yZCwKICAgIElzIGZhdGhlciwgbW90aGVyLCBUeWJhbHQsIFJvbWVvLCBKdWxpZXQsCiAgICBBbGwgc2xhaW4sIGFsbCBkZWFkLiAnUm9tZW8gaXMgYmFuaXNoZWQhJwogICAgVGhlcmUgaXMgbm8gZW5kLCBubyBsaW1pdCwgbWVhc3VyZSwgYm91bmQsCiAgICBJbiB0aGF0IHdvcmQncyBkZWF0aDsgbm8gd29yZHMgY2FuIHRoYXQgd29lIHNvdW5kLgogICAgV2hlcmUgaXMgbXkgZmF0aGVyLCBhbmQgbXkgbW90aGVyLCBudXJzZT8KCk51cnNlCgogICAgV2VlcGluZyBhbmQgd2FpbGluZyBvdmVyIFR5YmFsdCdzIGNvcnNlOgogICAgV2lsbCB5b3UgZ28gdG8gdGhlbT8gSSB3aWxsIGJyaW5nIHlvdSB0aGl0aGVyLgoKSlVMSUVUCgogICAgV2FzaCB0aGV5IGhpcyB3b3VuZHMgd2l0aCB0ZWFyczogbWluZSBzaGFsbCBiZSBzcGVudCwKICAgIFdoZW4gdGhlaXJzIGFyZSBkcnksIGZvciBSb21lbydzIGJhbmlzaG1lbnQuCiAgICBUYWtlIHVwIHRob3NlIGNvcmRzOiBwb29yIHJvcGVzLCB5b3UgYXJlIGJlZ3VpbGVkLAogICAgQm90aCB5b3UgYW5kIEk7IGZvciBSb21lbyBpcyBleGlsZWQ6CiAgICBIZSBtYWRlIHlvdSBmb3IgYSBoaWdod2F5IHRvIG15IGJlZDsKICAgIEJ1dCBJLCBhIG1haWQsIGRpZSBtYWlkZW4td2lkb3dlZC4KICAgIENvbWUsIGNvcmRzLCBjb21lLCBudXJzZTsgSSdsbCB0byBteSB3ZWRkaW5nLWJlZDsKICAgIEFuZCBkZWF0aCwgbm90IFJvbWVvLCB0YWtlIG15IG1haWRlbmhlYWQhCgpOdXJzZQoKICAgIEhpZSB0byB5b3VyIGNoYW1iZXI6IEknbGwgZmluZCBSb21lbwogICAgVG8gY29tZm9ydCB5b3U6IEkgd290IHdlbGwgd2hlcmUgaGUgaXMuCiAgICBIYXJrIHllLCB5b3VyIFJvbWVvIHdpbGwgYmUgaGVyZSBhdCBuaWdodDoKICAgIEknbGwgdG8gaGltOyBoZSBpcyBoaWQgYXQgTGF1cmVuY2UnIGNlbGwuCgpKVUxJRVQKCiAgICBPLCBmaW5kIGhpbSEgZ2l2ZSB0aGlzIHJpbmcgdG8gbXkgdHJ1ZSBrbmlnaHQsCiAgICBBbmQgYmlkIGhpbSBjb21lIHRvIHRha2UgaGlzIGxhc3QgZmFyZXdlbGwuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSAKCkZSSUFSIExBVVJFTkNFCgogICAgUm9tZW8sIGNvbWUgZm9ydGg7IGNvbWUgZm9ydGgsIHRob3UgZmVhcmZ1bCBtYW46CiAgICBBZmZsaWN0aW9uIGlzIGVuYW1vdXInZCBvZiB0aHkgcGFydHMsCiAgICBBbmQgdGhvdSBhcnQgd2VkZGVkIHRvIGNhbGFtaXR5LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEZhdGhlciwgd2hhdCBuZXdzPyB3aGF0IGlzIHRoZSBwcmluY2UncyBkb29tPwogICAgV2hhdCBzb3Jyb3cgY3JhdmVzIGFjcXVhaW50YW5jZSBhdCBteSBoYW5kLAogICAgVGhhdCBJIHlldCBrbm93IG5vdD8KCkZSSUFSIExBVVJFTkNFCgogICAgVG9vIGZhbWlsaWFyCiAgICBJcyBteSBkZWFyIHNvbiB3aXRoIHN1Y2ggc291ciBjb21wYW55OgogICAgSSBicmluZyB0aGVlIHRpZGluZ3Mgb2YgdGhlIHByaW5jZSdzIGRvb20uCgpST01FTwoKICAgIFdoYXQgbGVzcyB0aGFuIGRvb21zLWRheSBpcyB0aGUgcHJpbmNlJ3MgZG9vbT8KCkZSSUFSIExBVVJFTkNFCgogICAgQSBnZW50bGVyIGp1ZGdtZW50IHZhbmlzaCdkIGZyb20gaGlzIGxpcHMsCiAgICBOb3QgYm9keSdzIGRlYXRoLCBidXQgYm9keSdzIGJhbmlzaG1lbnQuCgpST01FTwoKICAgIEhhLCBiYW5pc2htZW50ISBiZSBtZXJjaWZ1bCwgc2F5ICdkZWF0aDsnCiAgICBGb3IgZXhpbGUgaGF0aCBtb3JlIHRlcnJvciBpbiBoaXMgbG9vaywKICAgIE11Y2ggbW9yZSB0aGFuIGRlYXRoOiBkbyBub3Qgc2F5ICdiYW5pc2htZW50LicKCkZSSUFSIExBVVJFTkNFCgogICAgSGVuY2UgZnJvbSBWZXJvbmEgYXJ0IHRob3UgYmFuaXNoZWQ6CiAgICBCZSBwYXRpZW50LCBmb3IgdGhlIHdvcmxkIGlzIGJyb2FkIGFuZCB3aWRlLgoKUk9NRU8KCiAgICBUaGVyZSBpcyBubyB3b3JsZCB3aXRob3V0IFZlcm9uYSB3YWxscywKICAgIEJ1dCBwdXJnYXRvcnksIHRvcnR1cmUsIGhlbGwgaXRzZWxmLgogICAgSGVuY2UtYmFuaXNoZWQgaXMgYmFuaXNoJ2QgZnJvbSB0aGUgd29ybGQsCiAgICBBbmQgd29ybGQncyBleGlsZSBpcyBkZWF0aDogdGhlbiBiYW5pc2hlZCwKICAgIElzIGRlYXRoIG1pcy10ZXJtJ2Q6IGNhbGxpbmcgZGVhdGggYmFuaXNobWVudCwKICAgIFRob3UgY3V0dCdzdCBteSBoZWFkIG9mZiB3aXRoIGEgZ29sZGVuIGF4ZSwKICAgIEFuZCBzbWlsZXN0IHVwb24gdGhlIHN0cm9rZSB0aGF0IG11cmRlcnMgbWUuCgpGUklBUiBMQVVSRU5DRQoKICAgIE8gZGVhZGx5IHNpbiEgTyBydWRlIHVudGhhbmtmdWxuZXNzIQogICAgVGh5IGZhdWx0IG91ciBsYXcgY2FsbHMgZGVhdGg7IGJ1dCB0aGUga2luZCBwcmluY2UsCiAgICBUYWtpbmcgdGh5IHBhcnQsIGhhdGggcnVzaCdkIGFzaWRlIHRoZSBsYXcsCiAgICBBbmQgdHVybidkIHRoYXQgYmxhY2sgd29yZCBkZWF0aCB0byBiYW5pc2htZW50OgogICAgVGhpcyBpcyBkZWFyIG1lcmN5LCBhbmQgdGhvdSBzZWVzdCBpdCBub3QuCgpST01FTwoKICAgICdUaXMgdG9ydHVyZSwgYW5kIG5vdCBtZXJjeTogaGVhdmVuIGlzIGhlcmUsCiAgICBXaGVyZSBKdWxpZXQgbGl2ZXM7IGFuZCBldmVyeSBjYXQgYW5kIGRvZwogICAgQW5kIGxpdHRsZSBtb3VzZSwgZXZlcnkgdW53b3J0aHkgdGhpbmcsCiAgICBMaXZlIGhlcmUgaW4gaGVhdmVuIGFuZCBtYXkgbG9vayBvbiBoZXI7CiAgICBCdXQgUm9tZW8gbWF5IG5vdDogbW9yZSB2YWxpZGl0eSwKICAgIE1vcmUgaG9ub3VyYWJsZSBzdGF0ZSwgbW9yZSBjb3VydHNoaXAgbGl2ZXMKICAgIEluIGNhcnJpb24tZmxpZXMgdGhhbiBSb21lbzogdGhleSBteSBzZWl6ZQogICAgT24gdGhlIHdoaXRlIHdvbmRlciBvZiBkZWFyIEp1bGlldCdzIGhhbmQKICAgIEFuZCBzdGVhbCBpbW1vcnRhbCBibGVzc2luZyBmcm9tIGhlciBsaXBzLAogICAgV2hvIGV2ZW4gaW4gcHVyZSBhbmQgdmVzdGFsIG1vZGVzdHksCiAgICBTdGlsbCBibHVzaCwgYXMgdGhpbmtpbmcgdGhlaXIgb3duIGtpc3NlcyBzaW47CiAgICBCdXQgUm9tZW8gbWF5IG5vdDsgaGUgaXMgYmFuaXNoZWQ6CiAgICBGbGllcyBtYXkgZG8gdGhpcywgYnV0IEkgZnJvbSB0aGlzIG11c3QgZmx5OgogICAgVGhleSBhcmUgZnJlZSBtZW4sIGJ1dCBJIGFtIGJhbmlzaGVkLgogICAgQW5kIHNheSdzdCB0aG91IHlldCB0aGF0IGV4aWxlIGlzIG5vdCBkZWF0aD8KICAgIEhhZHN0IHRob3Ugbm8gcG9pc29uIG1peCdkLCBubyBzaGFycC1ncm91bmQga25pZmUsCiAgICBObyBzdWRkZW4gbWVhbiBvZiBkZWF0aCwgdGhvdWdoIG5lJ2VyIHNvIG1lYW4sCiAgICBCdXQgJ2JhbmlzaGVkJyB0byBraWxsIG1lPy0tJ2JhbmlzaGVkJz8KICAgIE8gZnJpYXIsIHRoZSBkYW1uZWQgdXNlIHRoYXQgd29yZCBpbiBoZWxsOwogICAgSG93bGluZ3MgYXR0ZW5kIGl0OiBob3cgaGFzdCB0aG91IHRoZSBoZWFydCwKICAgIEJlaW5nIGEgZGl2aW5lLCBhIGdob3N0bHkgY29uZmVzc29yLAogICAgQSBzaW4tYWJzb2x2ZXIsIGFuZCBteSBmcmllbmQgcHJvZmVzcydkLAogICAgVG8gbWFuZ2xlIG1lIHdpdGggdGhhdCB3b3JkICdiYW5pc2hlZCcCgpGUklBUiBMQVVSRU5DRQoKICAgIFRob3UgZm9uZCBtYWQgbWFuLCBoZWFyIG1lIGJ1dCBzcGVhayBhIHdvcmQuCgpST01FTwoKICAgIE8sIHRob3Ugd2lsdCBzcGVhayBhZ2FpbiBvZiBiYW5pc2htZW50LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJJ2xsIGdpdmUgdGhlZSBhcm1vdXIgdG8ga2VlcCBvZmYgdGhhdCB3b3JkOgogICAgQWR2ZXJzaXR5J3Mgc3dlZXQgbWlsaywgcGhpbG9zb3BoeSwKICAgIFRvIGNvbWZvcnQgdGhlZSwgdGhvdWdoIHRob3UgYXJ0IGJhbmlzaGVkLgoKUk9NRU8KCiAgICBZZXQgJ2JhbmlzaGVkJz8gSGFuZyB1cCBwaGlsb3NvcGh5IQogICAgVW5sZXNzIHBoaWxvc29waHkgY2FuIG1ha2UgYSBKdWxpZXQsCiAgICBEaXNwbGFudCBhIHRvd24sIHJldmVyc2UgYSBwcmluY2UncyBkb29tLAogICAgSXQgaGVscHMgbm90LCBpdCBwcmV2YWlscyBub3Q6IHRhbGsgbm8gbW9yZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTywgdGhlbiBJIHNlZSB0aGF0IG1hZG1lbiBoYXZlIG5vIGVhcnMuCgpST01FTwoKICAgIEhvdyBzaG91bGQgdGhleSwgd2hlbiB0aGF0IHdpc2UgbWVuIGhhdmUgbm8gZXllcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTGV0IG1lIGRpc3B1dGUgd2l0aCB0aGVlIG9mIHRoeSBlc3RhdGUuCgpST01FTwoKICAgIFRob3UgY2Fuc3Qgbm90IHNwZWFrIG9mIHRoYXQgdGhvdSBkb3N0IG5vdCBmZWVsOgogICAgV2VydCB0aG91IGFzIHlvdW5nIGFzIEksIEp1bGlldCB0aHkgbG92ZSwKICAgIEFuIGhvdXIgYnV0IG1hcnJpZWQsIFR5YmFsdCBtdXJkZXJlZCwKICAgIERvdGluZyBsaWtlIG1lIGFuZCBsaWtlIG1lIGJhbmlzaGVkLAogICAgVGhlbiBtaWdodHN0IHRob3Ugc3BlYWssIHRoZW4gbWlnaHRzdCB0aG91IHRlYXIgdGh5IGhhaXIsCiAgICBBbmQgZmFsbCB1cG9uIHRoZSBncm91bmQsIGFzIEkgZG8gbm93LAogICAgVGFraW5nIHRoZSBtZWFzdXJlIG9mIGFuIHVubWFkZSBncmF2ZS4KCiAgICBLbm9ja2luZyB3aXRoaW4KCkZSSUFSIExBVVJFTkNFCgogICAgQXJpc2U7IG9uZSBrbm9ja3M7IGdvb2QgUm9tZW8sIGhpZGUgdGh5c2VsZi4KClJPTUVPCgogICAgTm90IEk7IHVubGVzcyB0aGUgYnJlYXRoIG9mIGhlYXJ0c2ljayBncm9hbnMsCiAgICBNaXN0LWxpa2UsIGluZm9sZCBtZSBmcm9tIHRoZSBzZWFyY2ggb2YgZXllcy4KCiAgICBLbm9ja2luZwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIYXJrLCBob3cgdGhleSBrbm9jayEgV2hvJ3MgdGhlcmUIFJvbWVvLCBhcmlzZTsKICAgIFRob3Ugd2lsdCBiZSB0YWtlbi4gU3RheSBhd2hpbGUhIFN0YW5kIHVwOwoKICAgIEtub2NraW5nCiAgICBSdW4gdG8gbXkgc3R1ZHkuIEJ5IGFuZCBieSEgR29kJ3Mgd2lsbCwKICAgIFdoYXQgc2ltcGxlbmVzcyBpcyB0aGlzISBJIGNvbWUsIEkgY29tZSEKCiAgICBLbm9ja2luZwogICAgV2hvIGtub2NrcyBzbyBoYXJkPyB3aGVuY2UgY29tZSB5b3UIHdoYXQncyB5b3VyIHdpbGwCgpOdXJzZQoKICAgIFtXaXRoaW5dIExldCBtZSBjb21lIGluLCBhbmQgeW91IHNoYWxsIGtub3cKICAgIG15IGVycmFuZDsKICAgIEkgY29tZSBmcm9tIExhZHkgSnVsaWV0LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXZWxjb21lLCB0aGVuLgoKICAgIEVudGVyIE51cnNlCgpOdXJzZQoKICAgIE8gaG9seSBmcmlhciwgTywgdGVsbCBtZSwgaG9seSBmcmlhciwKICAgIFdoZXJlIGlzIG15IGxhZHkncyBsb3JkLCB3aGVyZSdzIFJvbWVvPwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGVyZSBvbiB0aGUgZ3JvdW5kLCB3aXRoIGhpcyBvd24gdGVhcnMgbWFkZSBkcnVuay4KCk51cnNlCgogICAgTywgaGUgaXMgZXZlbiBpbiBteSBtaXN0cmVzcycgY2FzZSwKICAgIEp1c3QgaW4gaGVyIGNhc2UhIE8gd29mdWwgc3ltcGF0aHkhCiAgICBQaXRlb3VzIHByZWRpY2FtZW50ISBFdmVuIHNvIGxpZXMgc2hlLAogICAgQmx1YmJlcmluZyBhbmQgd2VlcGluZywgd2VlcGluZyBhbmQgYmx1YmJlcmluZy4KICAgIFN0YW5kIHVwLCBzdGFuZCB1cDsgc3RhbmQsIGFuZCB5b3UgYmUgYSBtYW46CiAgICBGb3IgSnVsaWV0J3Mgc2FrZSwgZm9yIGhlciBzYWtlLCByaXNlIGFuZCBzdGFuZDsKICAgIFdoeSBzaG91bGQgeW91IGZhbGwgaW50byBzbyBkZWVwIGFuIE8CgpST01FTwoKICAgIE51cnNlIQoKTnVyc2UKCiAgICBBaCBzaXIhIGFoIHNpciEgV2VsbCwgZGVhdGgncyB0aGUgZW5kIG9mIGFsbC4KClJPTUVPCgogICAgU3Bha2VzdCB0aG91IG9mIEp1bGlldD8gaG93IGlzIGl0IHdpdGggaGVyPwogICAgRG90aCBzaGUgbm90IHRoaW5rIG1lIGFuIG9sZCBtdXJkZXJlciwKICAgIE5vdyBJIGhhdmUgc3RhaW4nZCB0aGUgY2hpbGRob29kIG9mIG91ciBqb3kKICAgIFdpdGggYmxvb2QgcmVtb3ZlZCBidXQgbGl0dGxlIGZyb20gaGVyIG93bj8KICAgIFdoZXJlIGlzIHNoZT8gYW5kIGhvdyBkb3RoIHNoZT8gYW5kIHdoYXQgc2F5cwogICAgTXkgY29uY2VhbCdkIGxhZHkgdG8gb3VyIGNhbmNlbGwnZCBsb3ZlPwoKTnVyc2UKCiAgICBPLCBzaGUgc2F5cyBub3RoaW5nLCBzaXIsIGJ1dCB3ZWVwcyBhbmQgd2VlcHM7CiAgICBBbmQgbm93IGZhbGxzIG9uIGhlciBiZWQ7IGFuZCB0aGVuIHN0YXJ0cyB1cCwKICAgIEFuZCBUeWJhbHQgY2FsbHM7IGFuZCB0aGVuIG9uIFJvbWVvIGNyaWVzLAogICAgQW5kIHRoZW4gZG93biBmYWxscyBhZ2Fpbi4KClJPTUVPCgogICAgQXMgaWYgdGhhdCBuYW1lLAogICAgU2hvdCBmcm9tIHRoZSBkZWFkbHkgbGV2ZWwgb2YgYSBndW4sCiAgICBEaWQgbXVyZGVyIGhlcjsgYXMgdGhhdCBuYW1lJ3MgY3Vyc2VkIGhhbmQKICAgIE11cmRlcidkIGhlciBraW5zbWFuLiBPLCB0ZWxsIG1lLCBmcmlhciwgdGVsbCBtZSwKICAgIEluIHdoYXQgdmlsZSBwYXJ0IG9mIHRoaXMgYW5hdG9teQogICAgRG90aCBteSBuYW1lIGxvZGdlPyB0ZWxsIG1lLCB0aGF0IEkgbWF5IHNhY2sKICAgIFRoZSBoYXRlZnVsIG1hbnNpb24uCgogICAgRHJhd2luZyBoaXMgc3dvcmQKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZCB0aHkgZGVzcGVyYXRlIGhhbmQ6CiAgICBBcnQgdGhvdSBhIG1hbj8gdGh5IGZvcm0gY3JpZXMgb3V0IHRob3UgYXJ0OgogICAgVGh5IHRlYXJzIGFyZSB3b21hbmlzaDsgdGh5IHdpbGQgYWN0cyBkZW5vdGUKICAgIFRoZSB1bnJlYXNvbmFibGUgZnVyeSBvZiBhIGJlYXN0OgogICAgVW5zZWVtbHkgd29tYW4gaW4gYSBzZWVtaW5nIG1hbiEKICAgIE9yIGlsbC1iZXNlZW1pbmcgYmVhc3QgaW4gc2VlbWluZyBib3RoIQogICAgVGhvdSBoYXN0IGFtYXplZCBtZTogYnkgbXkgaG9seSBvcmRlciwKICAgIEkgdGhvdWdodCB0aHkgZGlzcG9zaXRpb24gYmV0dGVyIHRlbXBlcidkLgogICAgSGFzdCB0aG91IHNsYWluIFR5YmFsdD8gd2lsdCB0aG91IHNsYXkgdGh5c2VsZj8KICAgIEFuZCBzdGF5IHRoeSBsYWR5IHRvbyB0aGF0IGxpdmVzIGluIHRoZWUsCiAgICBCeSBkb2luZyBkYW1uZWQgaGF0ZSB1cG9uIHRoeXNlbGYCiAgICBXaHkgcmFpbCdzdCB0aG91IG9uIHRoeSBiaXJ0aCwgdGhlIGhlYXZlbiwgYW5kIGVhcnRoPwogICAgU2luY2UgYmlydGgsIGFuZCBoZWF2ZW4sIGFuZCBlYXJ0aCwgYWxsIHRocmVlIGRvIG1lZXQKICAgIEluIHRoZWUgYXQgb25jZTsgd2hpY2ggdGhvdSBhdCBvbmNlIHdvdWxkc3QgbG9zZS4KICAgIEZpZSwgZmllLCB0aG91IHNoYW1lc3QgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDsKICAgIFdoaWNoLCBsaWtlIGEgdXN1cmVyLCBhYm91bmQnc3QgaW4gYWxsLAogICAgQW5kIHVzZXN0IG5vbmUgaW4gdGhhdCB0cnVlIHVzZSBpbmRlZWQKICAgIFdoaWNoIHNob3VsZCBiZWRlY2sgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDoKICAgIFRoeSBub2JsZSBzaGFwZSBpcyBidXQgYSBmb3JtIG9mIHdheCwKICAgIERpZ3Jlc3NpbmcgZnJvbSB0aGUgdmFsb3VyIG9mIGEgbWFuOwogICAgVGh5IGRlYXIgbG92ZSBzd29ybiBidXQgaG9sbG93IHBlcmp1cnksCiAgICBLaWxsaW5nIHRoYXQgbG92ZSB3aGljaCB0aG91IGhhc3Qgdm93J2QgdG8gY2hlcmlzaDsKICAgIFRoeSB3aXQsIHRoYXQgb3JuYW1lbnQgdG8gc2hhcGUgYW5kIGxvdmUsCiAgICBNaXNzaGFwZW4gaW4gdGhlIGNvbmR1Y3Qgb2YgdGhlbSBib3RoLAogICAgTGlrZSBwb3dkZXIgaW4gYSBza2l0bGVzcyBzb2xkaWVyJ3MgZmxhc2ssCiAgICBJcyBzZXQgYWZpcmUgYnkgdGhpbmUgb3duIGlnbm9yYW5jZSwKICAgIEFuZCB0aG91IGRpc21lbWJlcidkIHdpdGggdGhpbmUgb3duIGRlZmVuY2UuCiAgICBXaGF0LCByb3VzZSB0aGVlLCBtYW4hIHRoeSBKdWxpZXQgaXMgYWxpdmUsCiAgICBGb3Igd2hvc2UgZGVhciBzYWtlIHRob3Ugd2FzdCBidXQgbGF0ZWx5IGRlYWQ7CiAgICBUaGVyZSBhcnQgdGhvdSBoYXBweTogVHliYWx0IHdvdWxkIGtpbGwgdGhlZSwKICAgIEJ1dCB0aG91IHNsZXcnc3QgVHliYWx0OyB0aGVyZSBhcmUgdGhvdSBoYXBweSB0b286CiAgICBUaGUgbGF3IHRoYXQgdGhyZWF0ZW4nZCBkZWF0aCBiZWNvbWVzIHRoeSBmcmllbmQKICAgIEFuZCB0dXJucyBpdCB0byBleGlsZTsgdGhlcmUgYXJ0IHRob3UgaGFwcHk6CiAgICBBIHBhY2sgb2YgYmxlc3NpbmdzIGxpZ2h0cyB1cCB1cG9uIHRoeSBiYWNrOwogICAgSGFwcGluZXNzIGNvdXJ0cyB0aGVlIGluIGhlciBiZXN0IGFycmF5OwogICAgQnV0LCBsaWtlIGEgbWlzYmVoYXZlZCBhbmQgc3VsbGVuIHdlbmNoLAogICAgVGhvdSBwb3V0J3N0IHVwb24gdGh5IGZvcnR1bmUgYW5kIHRoeSBsb3ZlOgogICAgVGFrZSBoZWVkLCB0YWtlIGhlZWQsIGZvciBzdWNoIGRpZSBtaXNlcmFibGUuCiAgICBHbywgZ2V0IHRoZWUgdG8gdGh5IGxvdmUsIGFzIHdhcyBkZWNyZWVkLAogICAgQXNjZW5kIGhlciBjaGFtYmVyLCBoZW5jZSBhbmQgY29tZm9ydCBoZXI6CiAgICBCdXQgbG9vayB0aG91IHN0YXkgbm90IHRpbGwgdGhlIHdhdGNoIGJlIHNldCwKICAgIEZvciB0aGVuIHRob3UgY2Fuc3Qgbm90IHBhc3MgdG8gTWFudHVhOwogICAgV2hlcmUgdGhvdSBzaGFsdCBsaXZlLCB0aWxsIHdlIGNhbiBmaW5kIGEgdGltZQogICAgVG8gYmxhemUgeW91ciBtYXJyaWFnZSwgcmVjb25jaWxlIHlvdXIgZnJpZW5kcywKICAgIEJlZyBwYXJkb24gb2YgdGhlIHByaW5jZSwgYW5kIGNhbGwgdGhlZSBiYWNrCiAgICBXaXRoIHR3ZW50eSBodW5kcmVkIHRob3VzYW5kIHRpbWVzIG1vcmUgam95CiAgICBUaGFuIHRob3Ugd2VudCdzdCBmb3J0aCBpbiBsYW1lbnRhdGlvbi4KICAgIEdvIGJlZm9yZSwgbnVyc2U6IGNvbW1lbmQgbWUgdG8gdGh5IGxhZHk7CiAgICBBbmQgYmlkIGhlciBoYXN0ZW4gYWxsIHRoZSBob3VzZSB0byBiZWQsCiAgICBXaGljaCBoZWF2eSBzb3Jyb3cgbWFrZXMgdGhlbSBhcHQgdW50bzoKICAgIFJvbWVvIGlzIGNvbWluZy4KCk51cnNlCgogICAgTyBMb3JkLCBJIGNvdWxkIGhhdmUgc3RheSdkIGhlcmUgYWxsIHRoZSBuaWdodAogICAgVG8gaGVhciBnb29kIGNvdW5zZWw6IE8sIHdoYXQgbGVhcm5pbmcgaXMhCiAgICBNeSBsb3JkLCBJJ2xsIHRlbGwgbXkgbGFkeSB5b3Ugd2lsbCBjb21lLgoKUk9NRU8KCiAgICBEbyBzbywgYW5kIGJpZCBteSBzd2VldCBwcmVwYXJlIHRvIGNoaWRlLgoKTnVyc2UKCiAgICBIZXJlLCBzaXIsIGEgcmluZyBzaGUgYmlkIG1lIGdpdmUgeW91LCBzaXI6CiAgICBIaWUgeW91LCBtYWtlIGhhc3RlLCBmb3IgaXQgZ3Jvd3MgdmVyeSBsYXRlLgoKICAgIEV4aXQKClJPTUVPCgogICAgSG93IHdlbGwgbXkgY29tZm9ydCBpcyByZXZpdmVkIGJ5IHRoaXMhCgpGUklBUiBMQVVSRU5DRQoKICAgIEdvIGhlbmNlOyBnb29kIG5pZ2h0OyBhbmQgaGVyZSBzdGFuZHMgYWxsIHlvdXIgc3RhdGU6CiAgICBFaXRoZXIgYmUgZ29uZSBiZWZvcmUgdGhlIHdhdGNoIGJlIHNldCwKICAgIE9yIGJ5IHRoZSBicmVhayBvZiBkYXkgZGlzZ3Vpc2VkIGZyb20gaGVuY2U6CiAgICBTb2pvdXJuIGluIE1hbnR1YTsgSSdsbCBmaW5kIG91dCB5b3VyIG1hbiwKICAgIEFuZCBoZSBzaGFsbCBzaWduaWZ5IGZyb20gdGltZSB0byB0aW1lCiAgICBFdmVyeSBnb29kIGhhcCB0byB5b3UgdGhhdCBjaGFuY2VzIGhlcmU6CiAgICBHaXZlIG1lIHRoeSBoYW5kOyAndGlzIGxhdGU6IGZhcmV3ZWxsOyBnb29kIG5pZ2h0LgoKUk9NRU8KCiAgICBCdXQgdGhhdCBhIGpveSBwYXN0IGpveSBjYWxscyBvdXQgb24gbWUsCiAgICBJdCB3ZXJlIGEgZ3JpZWYsIHNvIGJyaWVmIHRvIHBhcnQgd2l0aCB0aGVlOiBGYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHJvb20gaW4gQ2FwdWxldCdzIGhvdXNlLgoKICAgIEVudGVyIENBUFVMRVQsIExBRFkgQ0FQVUxFVCwgYW5kIFBBUklTIAoKQ0FQVUxFVAoKICAgIFRoaW5ncyBoYXZlIGZhbGwnbiBvdXQsIHNpciwgc28gdW5sdWNraWx5LAogICAgVGhhdCB3ZSBoYXZlIGhhZCBubyB0aW1lIHRvIG1vdmUgb3VyIGRhdWdodGVyOgogICAgTG9vayB5b3UsIHNoZSBsb3ZlZCBoZXIga2luc21hbiBUeWJhbHQgZGVhcmx5LAogICAgQW5kIHNvIGRpZCBJOi0tV2VsbCwgd2Ugd2VyZSBib3JuIHRvIGRpZS4KICAgICdUaXMgdmVyeSBsYXRlLCBzaGUnbGwgbm90IGNvbWUgZG93biB0by1uaWdodDoKICAgIEkgcHJvbWlzZSB5b3UsIGJ1dCBmb3IgeW91ciBjb21wYW55LAogICAgSSB3b3VsZCBoYXZlIGJlZW4gYS1iZWQgYW4gaG91ciBhZ28uCgpQQVJJUwoKICAgIFRoZXNlIHRpbWVzIG9mIHdvZSBhZmZvcmQgbm8gdGltZSB0byB3b28uCiAgICBNYWRhbSwgZ29vZCBuaWdodDogY29tbWVuZCBtZSB0byB5b3VyIGRhdWdodGVyLgoKTEFEWSBDQVBVTEVUCgogICAgSSB3aWxsLCBhbmQga25vdyBoZXIgbWluZCBlYXJseSB0by1tb3Jyb3c7CiAgICBUby1uaWdodCBzaGUgaXMgbWV3J2QgdXAgdG8gaGVyIGhlYXZpbmVzcy4KCkNBUFVMRVQKCiAgICBTaXIgUGFyaXMsIEkgd2lsbCBtYWtlIGEgZGVzcGVyYXRlIHRlbmRlcgogICAgT2YgbXkgY2hpbGQncyBsb3ZlOiBJIHRoaW5rIHNoZSB3aWxsIGJlIHJ1bGVkCiAgICBJbiBhbGwgcmVzcGVjdHMgYnkgbWU7IG5heSwgbW9yZSwgSSBkb3VidCBpdCBub3QuCiAgICBXaWZlLCBnbyB5b3UgdG8gaGVyIGVyZSB5b3UgZ28gdG8gYmVkOwogICAgQWNxdWFpbnQgaGVyIGhlcmUgb2YgbXkgc29uIFBhcmlzJyBsb3ZlOwogICAgQW5kIGJpZCBoZXIsIG1hcmsgeW91IG1lLCBvbiBXZWRuZXNkYXkgbmV4dC0tCiAgICBCdXQsIHNvZnQhIHdoYXQgZGF5IGlzIHRoaXMCgpQQVJJUwoKICAgIE1vbmRheSwgbXkgbG9yZCwKCkNBUFVMRVQKCiAgICBNb25kYXkhIGhhLCBoYSEgV2VsbCwgV2VkbmVzZGF5IGlzIHRvbyBzb29uLAogICAgTycgVGh1cnNkYXkgbGV0IGl0IGJlOiBvJyBUaHVyc2RheSwgdGVsbCBoZXIsCiAgICBTaGUgc2hhbGwgYmUgbWFycmllZCB0byB0aGlzIG5vYmxlIGVhcmwuCiAgICBXaWxsIHlvdSBiZSByZWFkeT8gZG8geW91IGxpa2UgdGhpcyBoYXN0ZT8KICAgIFdlJ2xsIGtlZXAgbm8gZ3JlYXQgYWRvLC0tYSBmcmllbmQgb3IgdHdvOwogICAgRm9yLCBoYXJrIHlvdSwgVHliYWx0IGJlaW5nIHNsYWluIHNvIGxhdGUsCiAgICBJdCBtYXkgYmUgdGhvdWdodCB3ZSBoZWxkIGhpbSBjYXJlbGVzc2x5LAogICAgQmVpbmcgb3VyIGtpbnNtYW4sIGlmIHdlIHJldmVsIG11Y2g6CiAgICBUaGVyZWZvcmUgd2UnbGwgaGF2ZSBzb21lIGhhbGYgYSBkb3plbiBmcmllbmRzLAogICAgQW5kIHRoZXJlIGFuIGVuZC4gQnV0IHdoYXQgc2F5IHlvdSB0byBUaHVyc2RheT8KClBBUklTCgogICAgTXkgbG9yZCwgSSB3b3VsZCB0aGF0IFRodXJzZGF5IHdlcmUgdG8tbW9ycm93LgoKQ0FQVUxFVAoKICAgIFdlbGwgZ2V0IHlvdSBnb25lOiBvJyBUaHVyc2RheSBiZSBpdCwgdGhlbi4KICAgIEdvIHlvdSB0byBKdWxpZXQgZXJlIHlvdSBnbyB0byBiZWQsCiAgICBQcmVwYXJlIGhlciwgd2lmZSwgYWdhaW5zdCB0aGlzIHdlZGRpbmctZGF5LgogICAgRmFyZXdlbGwsIG15IGxvcmQuIExpZ2h0IHRvIG15IGNoYW1iZXIsIGhvIQogICAgQWZvcmUgbWUhIGl0IGlzIHNvIHZlcnkgdmVyeSBsYXRlLAogICAgVGhhdCB3ZSBtYXkgY2FsbCBpdCBlYXJseSBieSBhbmQgYnkuCiAgICBHb29kIG5pZ2h0LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gYW5kIEpVTElFVCBhYm92ZSwgYXQgdGhlIHdpbmRvdyAKCkpVTElFVAoKICAgIFdpbHQgdGhvdSBiZSBnb25lPyBpdCBpcyBub3QgeWV0IG5lYXIgZGF5OgogICAgSXQgd2FzIHRoZSBuaWdodGluZ2FsZSwgYW5kIG5vdCB0aGUgbGFyaywKICAgIFRoYXQgcGllcmNlZCB0aGUgZmVhcmZ1bCBob2xsb3cgb2YgdGhpbmUgZWFyOwogICAgTmlnaHRseSBzaGUgc2luZ3Mgb24geW9uIHBvbWVncmFuYXRlLXRyZWU6CiAgICBCZWxpZXZlIG1lLCBsb3ZlLCBpdCB3YXMgdGhlIG5pZ2h0aW5nYWxlLgoKUk9NRU8KCiAgICBJdCB3YXMgdGhlIGxhcmssIHRoZSBoZXJhbGQgb2YgdGhlIG1vcm4sCiAgICBObyBuaWdodGluZ2FsZTogbG9vaywgbG92ZSwgd2hhdCBlbnZpb3VzIHN0cmVha3MKICAgIERvIGxhY2UgdGhlIHNldmVyaW5nIGNsb3VkcyBpbiB5b25kZXIgZWFzdDoKICAgIE5pZ2h0J3MgY2FuZGxlcyBhcmUgYnVybnQgb3V0LCBhbmQgam9jdW5kIGRheQogICAgU3RhbmRzIHRpcHRvZSBvbiB0aGUgbWlzdHkgbW91bnRhaW4gdG9wcy4KICAgIEkgbXVzdCBiZSBnb25lIGFuZCBsaXZlLCBvciBzdGF5IGFuZCBkaWUuCgpKVUxJRVQKCiAgICBZb24gbGlnaHQgaXMgbm90IGRheS1saWdodCwgSSBrbm93IGl0LCBJOgogICAgSXQgaXMgc29tZSBtZXRlb3IgdGhhdCB0aGUgc3VuIGV4aGFsZXMsCiAgICBUbyBiZSB0byB0aGVlIHRoaXMgbmlnaHQgYSB0b3JjaC1iZWFyZXIsCiAgICBBbmQgbGlnaHQgdGhlZSBvbiB0aHkgd2F5IHRvIE1hbnR1YToKICAgIFRoZXJlZm9yZSBzdGF5IHlldDsgdGhvdSBuZWVkJ3N0IG5vdCB0byBiZSBnb25lLgoKUk9NRU8KCiAgICBMZXQgbWUgYmUgdGEnZW4sIGxldCBtZSBiZSBwdXQgdG8gZGVhdGg7CiAgICBJIGFtIGNvbnRlbnQsIHNvIHRob3Ugd2lsdCBoYXZlIGl0IHNvLgogICAgSSdsbCBzYXkgeW9uIGdyZXkgaXMgbm90IHRoZSBtb3JuaW5nJ3MgZXllLAogICAgJ1RpcyBidXQgdGhlIHBhbGUgcmVmbGV4IG9mIEN5bnRoaWEncyBicm93OwogICAgTm9yIHRoYXQgaXMgbm90IHRoZSBsYXJrLCB3aG9zZSBub3RlcyBkbyBiZWF0CiAgICBUaGUgdmF1bHR5IGhlYXZlbiBzbyBoaWdoIGFib3ZlIG91ciBoZWFkczoKICAgIEkgaGF2ZSBtb3JlIGNhcmUgdG8gc3RheSB0aGFuIHdpbGwgdG8gZ286CiAgICBDb21lLCBkZWF0aCwgYW5kIHdlbGNvbWUhIEp1bGlldCB3aWxscyBpdCBzby4KICAgIEhvdyBpcyd0LCBteSBzb3VsPyBsZXQncyB0YWxrOyBpdCBpcyBub3QgZGF5LgoKSlVMSUVUCgogICAgSXQgaXMsIGl0IGlzOiBoaWUgaGVuY2UsIGJlIGdvbmUsIGF3YXkhCiAgICBJdCBpcyB0aGUgbGFyayB0aGF0IHNpbmdzIHNvIG91dCBvZiB0dW5lLAogICAgU3RyYWluaW5nIGhhcnNoIGRpc2NvcmRzIGFuZCB1bnBsZWFzaW5nIHNoYXJwcy4KICAgIFNvbWUgc2F5IHRoZSBsYXJrIG1ha2VzIHN3ZWV0IGRpdmlzaW9uOwogICAgVGhpcyBkb3RoIG5vdCBzbywgZm9yIHNoZSBkaXZpZGV0aCB1czoKICAgIFNvbWUgc2F5IHRoZSBsYXJrIGFuZCBsb2F0aGVkIHRvYWQgY2hhbmdlIGV5ZXMsCiAgICBPLCBub3cgSSB3b3VsZCB0aGV5IGhhZCBjaGFuZ2VkIHZvaWNlcyB0b28hCiAgICBTaW5jZSBhcm0gZnJvbSBhcm0gdGhhdCB2b2ljZSBkb3RoIHVzIGFmZnJheSwKICAgIEh1bnRpbmcgdGhlZSBoZW5jZSB3aXRoIGh1bnQnc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cmUgd2VlcGluZyBmb3IgeW91ciBjb3VzaW4ncyBkZWF0aD8KICAgIFdoYXQsIHdpbHQgdGhvdSB3YXNoIGhpbSBmcm9tIGhpcyBncmF2ZSB3aXRoIHRlYXJzPwogICAgQW4gaWYgdGhvdSBjb3VsZHN0LCB0aG91IGNvdWxkc3Qgbm90IG1ha2UgaGltIGxpdmU7CiAgICBUaGVyZWZvcmUsIGhhdmUgZG9uZTogc29tZSBncmllZiBzaG93cyBtdWNoIG9mIGxvdmU7CiAgICBCdXQgbXVjaCBvZiBncmllZiBzaG93cyBzdGlsbCBzb21lIHdhbnQgb2Ygd2l0LgoKSlVMSUVUCgogICAgWWV0IGxldCBtZSB3ZWVwIGZvciBzdWNoIGEgZmVlbGluZyBsb3NzLgoKTEFEWSBDQVBVTEVUCgogICAgU28gc2hhbGwgeW91IGZlZWwgdGhlIGxvc3MsIGJ1dCBub3QgdGhlIGZyaWVuZAogICAgV2hpY2ggeW91IHdlZXAgZm9yLgoKSlVMSUVUCgogICAgRmVlbGluZyBzbyB0aGUgbG9zcywKICAgIENhbm5vdCBjaG9vc2UgYnV0IGV2ZXIgd2VlcCB0aGUgZnJpZW5kLgoKTEFEWSBDQVBVTEVUCgogICAgV2VsbCwgZ2lybCwgdGhvdSB3ZWVwJ3N0IG5vdCBzbyBtdWNoIGZvciBoaXMgZGVhdGgsCiAgICBBcyB0aGF0IHRoZSB2aWxsYWluIGxpdmVzIHdoaWNoIHNsYXVnaHRlcidkIGhpbS4KCkpVTElFVAoKICAgIFdoYXQgdmlsbGFpbiBtYWRhbT8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoYXQgc2FtZSB2aWxsYWluLCBSb21lby4KCkpVTElFVAoKICAgIFtBc2lkZV0gVmlsbGFpbiBhbmQgaGUgYmUgbWFueSBtaWxlcyBhc3VuZGVyLi0tCiAgICBHb2QgUGFyZG9uIGhpbSEgSSBkbywgd2l0aCBhbGwgbXkgaGVhcnQ7CiAgICBBbmQgeWV0IG5vIG1hbiBsaWtlIGhlIGRvdGggZ3JpZXZlIG15IGhlYXJ0LgoKTEFEWSBDQVBVTEVUCgogICAgVGhhdCBpcywgYmVjYXVzZSB0aGUgdHJhaXRvciBtdXJkZXJlciBsaXZlcy4KCkpVTElFVAoKICAgIEF5LCBtYWRhbSwgZnJvbSB0aGUgcmVhY2ggb2YgdGhlc2UgbXkgaGFuZHM6CiAgICBXb3VsZCBub25lIGJ1dCBJIG1pZ2h0IHZlbmdlIG15IGNvdXNpbidzIGRlYXRoIQoKTEFEWSBDQVBVTEVUCgogICAgV2Ugd2lsbCBoYXZlIHZlbmdlYW5jZSBmb3IgaXQsIGZlYXIgdGhvdSBub3Q6CiAgICBUaGVuIHdlZXAgbm8gbW9yZS4gSSdsbCBzZW5kIHRvIG9uZSBpbiBNYW50dWEsCiAgICBXaGVyZSB0aGF0IHNhbWUgYmFuaXNoJ2QgcnVuYWdhdGUgZG90aCBsaXZlLAogICAgU2hhbGwgZ2l2ZSBoaW0gc3VjaCBhbiB1bmFjY3VzdG9tJ2QgZHJhbSwKICAgIFRoYXQgaGUgc2hhbGwgc29vbiBrZWVwIFR5YmFsdCBjb21wYW55OgogICAgQW5kIHRoZW4sIEkgaG9wZSwgdGhvdSB3aWx0IGJlIHNhdGlzZmllZC4KCkpVTElFVAoKICAgIEluZGVlZCwgSSBuZXZlciBzaGFsbCBiZSBzYXRpc2ZpZWQKICAgIFdpdGggUm9tZW8sIHRpbGwgSSBiZWhvbGQgaGltLS1kZWFkLS0KICAgIElzIG15IHBvb3IgaGVhcnQgZm9yIGEga2luc21hbiB2ZXgnZC4KICAgIE1hZGFtLCBpZiB5b3UgY291bGQgZmluZCBvdXQgYnV0IGEgbWFuCiAgICBUbyBiZWFyIGEgcG9pc29uLCBJIHdvdWxkIHRlbXBlciBpdDsKICAgIFRoYXQgUm9tZW8gc2hvdWxkLCB1cG9uIHJlY2VpcHQgdGhlcmVvZiwKICAgIFNvb24gc2xlZXAgaW4gcXVpZXQuIE8sIGhvdyBteSBoZWFydCBhYmhvcnMKICAgIFRvIGhlYXIgaGltIG5hbWVkLCBhbmQgY2Fubm90IGNvbWUgdG8gaGltLgogICAgVG8gd3JlYWsgdGhlIGxvdmUgSSBib3JlIG15IGNvdXNpbgogICAgVXBvbiBoaXMgYm9keSB0aGF0IHNsYXVnaHRlcidkIGhpbSEKCkxBRFkgQ0FQVUxFVAoKICAgIEZpbmQgdGhvdSB0aGUgbWVhbnMsIGFuZCBJJ2xsIGZpbmQgc3VjaCBhIG1hbi4KICAgIEJ1dCBub3cgSSdsbCB0ZWxsIHRoZWUgam95ZnVsIHRpZGluZ3MsIGdpcmwuCgpKVUxJRVQKCiAgICBBbmQgam95IGNvbWVzIHdlbGwgaW4gc3VjaCBhIG5lZWR5IHRpbWU6CiAgICBXaGF0IGFyZSB0aGV5LCBJIGJlc2VlY2ggeW91ciBsYWR5c2hpcD8KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHdlbGwsIHRob3UgaGFzdCBhIGNhcmVmdWwgZmF0aGVyLCBjaGlsZDsKICAgIE9uZSB3aG8sIHRvIHB1dCB0aGVlIGZyb20gdGh5IGhlYXZpbmVzcywKICAgIEhhdGggc29ydGVkIG91dCBhIHN1ZGRlbiBkYXkgb2Ygam95LAogICAgVGhhdCB0aG91IGV4cGVjdCdzdCBub3Qgbm9yIEkgbG9vaydkIG5vdCBmb3IuCgpKVUxJRVQKCiAgICBNYWRhbSwgaW4gaGFwcHkgdGltZSwgd2hhdCBkYXkgaXMgdGhhdD8KCkxBRFkgQ0FQVUxFVAoKICAgIE1hcnJ5LCBteSBjaGlsZCwgZWFybHkgbmV4dCBUaHVyc2RheSBtb3JuLAogICAgVGhlIGdhbGxhbnQsIHlvdW5nIGFuZCBub2JsZSBnZW50bGVtYW4sCiAgICBUaGUgQ291bnR5IFBhcmlzLCBhdCBTYWludCBQZXRlcidzIENodXJjaCwKICAgIFNoYWxsIGhhcHBpbHkgbWFrZSB0aGVlIHRoZXJlIGEgam95ZnVsIGJyaWRlLgoKSlVMSUVUCgogICAgTm93LCBieSBTYWludCBQZXRlcidzIENodXJjaCBhbmQgUGV0ZXIgdG9vLAogICAgSGUgc2hhbGwgbm90IG1ha2UgbWUgdGhlcmUgYSBqb3lmdWwgYnJpZGUuCiAgICBJIHdvbmRlciBhdCB0aGlzIGhhc3RlOyB0aGF0IEkgbXVzdCB3ZWQKICAgIEVyZSBoZSwgdGhhdCBzaG91bGQgYmUgaHVzYmFuZCwgY29tZXMgdG8gd29vLgogICAgSSBwcmF5IHlvdSwgdGVsbCBteSBsb3JkIGFuZCBmYXRoZXIsIG1hZGFtLAogICAgSSB3aWxsIG5vdCBtYXJyeSB5ZXQ7IGFuZCwgd2hlbiBJIGRvLCBJIHN3ZWFyLAogICAgSXQgc2hhbGwgYmUgUm9tZW8sIHdob20geW91IGtub3cgSSBoYXRlLAogICAgUmF0aGVyIHRoYW4gUGFyaXMuIFRoZXNlIGFyZSBuZXdzIGluZGVlZCEKCkxBRFkgQ0FQVUxFVAoKICAgIEhlcmUgY29tZXMgeW91ciBmYXRoZXI7IHRlbGwgaGltIHNvIHlvdXJzZWxmLAogICAgQW5kIHNlZSBob3cgaGUgd2lsbCB0YWtlIGl0IGF0IHlvdXIgaGFuZHMuCgogICAgRW50ZXIgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBXaGVuIHRoZSBzdW4gc2V0cywgdGhlIGFpciBkb3RoIGRyaXp6bGUgZGV3OwogICAgQnV0IGZvciB0aGUgc3Vuc2V0IG9mIG15IGJyb3RoZXIncyBzb24KICAgIEl0IHJhaW5zIGRvd25yaWdodC4KICAgIEhvdyBub3chIGEgY29uZHVpdCwgZ2lybD8gd2hhdCwgc3RpbGwgaW4gdGVhcnMCiAgICBFdmVybW9yZSBzaG93ZXJpbmcIEluIG9uZSBsaXR0bGUgYm9keQogICAgVGhvdSBjb3VudGVyZmVpdCdzdCBhIGJhcmssIGEgc2VhLCBhIHdpbmQ7CiAgICBGb3Igc3RpbGwgdGh5IGV5ZXMsIHdoaWNoIEkgbWF5IGNhbGwgdGhlIHNlYSwKICAgIERvIGViYiBhbmQgZmxvdyB3aXRoIHRlYXJzOyB0aGUgYmFyayB0aHkgYm9keSBpcywKICAgIFNhaWxpbmcgaW4gdGhpcyBzYWx0IGZsb29kOyB0aGUgd2luZHMsIHRoeSBzaWdoczsKICAgIFdobywgcmFnaW5nIHdpdGggdGh5IHRlYXJzLCBhbmQgdGhleSB3aXRoIHRoZW0sCiAgICBXaXRob3V0IGEgc3VkZGVuIGNhbG0sIHdpbGwgb3ZlcnNldAogICAgVGh5IHRlbXBlc3QtdG9zc2VkIGJvZHkuIEhvdyBub3csIHdpZmUhCiAgICBIYXZlIHlvdSBkZWxpdmVyJ2QgdG8gaGVyIG91ciBkZWNyZWUCgpMQURZIENBUFVMRVQKCiAgICBBeSwgc2lyOyBidXQgc2hlIHdpbGwgbm9uZSwgc2hlIGdpdmVzIHlvdSB0aGFua3MuCiAgICBJIHdvdWxkIHRoZSBmb29sIHdlcmUgbWFycmllZCB0byBoZXIgZ3JhdmUhCgpDQVBVTEVUCgogICAgU29mdCEgdGFrZSBtZSB3aXRoIHlvdSwgdGFrZSBtZSB3aXRoIHlvdSwgd2lmZS4KICAgIEhvdyEgd2lsbCBzaGUgbm9uZT8gZG90aCBzaGUgbm90IGdpdmUgdXMgdGhhbmtzPwogICAgSXMgc2hlIG5vdCBwcm91ZD8gZG90aCBzaGUgbm90IGNvdW50IGhlciBibGVzdCwKICAgIFVud29ydGh5IGFzIHNoZSBpcywgdGhhdCB3ZSBoYXZlIHdyb3VnaHQKICAgIFNvIHdvcnRoeSBhIGdlbnRsZW1hbiB0byBiZSBoZXIgYnJpZGVncm9vbT8KCkpVTElFVAoKICAgIE5vdCBwcm91ZCwgeW91IGhhdmU7IGJ1dCB0aGFua2Z1bCwgdGhhdCB5b3UgaGF2ZToKICAgIFByb3VkIGNhbiBJIG5ldmVyIGJlIG9mIHdoYXQgSSBoYXRlOwogICAgQnV0IHRoYW5rZnVsIGV2ZW4gZm9yIGhhdGUsIHRoYXQgaXMgbWVhbnQgbG92ZS4KCkNBUFVMRVQKCiAgICBIb3cgbm93LCBob3cgbm93LCBjaG9wLWxvZ2ljISBXaGF0IGlzIHRoaXMCiAgICAnUHJvdWQsJyBhbmQgJ0kgdGhhbmsgeW91LCcgYW5kICdJIHRoYW5rIHlvdSBub3Q7JwogICAgQW5kIHlldCAnbm90IHByb3VkLCcgbWlzdHJlc3MgbWluaW9uLCB5b3UsCiAgICBUaGFuayBtZSBubyB0aGFua2luZ3MsIG5vciwgcHJvdWQgbWUgbm8gcHJvdWRzLAogICAgQnV0IGZldHRsZSB5b3VyIGZpbmUgam9pbnRzICdnYWluc3QgVGh1cnNkYXkgbmV4dCwKICAgIFRvIGdvIHdpdGggUGFyaXMgdG8gU2FpbnQgUGV0ZXIncyBDaHVyY2gsCiAgICBPciBJIHdpbGwgZHJhZyB0aGVlIG9uIGEgaHVyZGxlIHRoaXRoZXIuCiAgICBPdXQsIHlvdSBncmVlbi1zaWNrbmVzcyBjYXJyaW9uISBvdXQsIHlvdSBiYWdnYWdlIQogICAgWW91IHRhbGxvdy1mYWNlIQoKTEFEWSBDQVBVTEVUCgogICAgRmllLCBmaWUhIHdoYXQsIGFyZSB5b3UgbWFkPwoKSlVMSUVUCgogICAgR29vZCBmYXRoZXIsIEkgYmVzZWVjaCB5b3Ugb24gbXkga25lZXMsCiAgICBIZWFyIG1lIHdpdGggcGF0aWVuY2UgYnV0IHRvIHNwZWFrIGEgd29yZC4KCkNBUFVMRVQKCiAgICBIYW5nIHRoZWUsIHlvdW5nIGJhZ2dhZ2UhIGRpc29iZWRpZW50IHdyZXRjaCEKICAgIEkgdGVsbCB0aGVlIHdoYXQ6IGdldCB0aGVlIHRvIGNodXJjaCBvJyBUaHVyc2RheSwKICAgIE9yIG5ldmVyIGFmdGVyIGxvb2sgbWUgaW4gdGhlIGZhY2U6CiAgICBTcGVhayBub3QsIHJlcGx5IG5vdCwgZG8gbm90IGFuc3dlciBtZTsKICAgIE15IGZpbmdlcnMgaXRjaC4gV2lmZSwgd2Ugc2NhcmNlIHRob3VnaHQgdXMgYmxlc3QKICAgIFRoYXQgR29kIGhhZCBsZW50IHVzIGJ1dCB0aGlzIG9ubHkgY2hpbGQ7CiAgICBCdXQgbm93IEkgc2VlIHRoaXMgb25lIGlzIG9uZSB0b28gbXVjaCwKICAgIEFuZCB0aGF0IHdlIGhhdmUgYSBjdXJzZSBpbiBoYXZpbmcgaGVyOgogICAgT3V0IG9uIGhlciwgaGlsZGluZyEKCk51cnNlCgogICAgR29kIGluIGhlYXZlbiBibGVzcyBoZXIhCiAgICBZb3UgYXJlIHRvIGJsYW1lLCBteSBsb3JkLCB0byByYXRlIGhlciBzby4KCkNBUFVMRVQKCiAgICBBbmQgd2h5LCBteSBsYWR5IHdpc2RvbT8gaG9sZCB5b3VyIHRvbmd1ZSwKICAgIEdvb2QgcHJ1ZGVuY2U7IHNtYXR0ZXIgd2l0aCB5b3VyIGdvc3NpcHMsIGdvLgoKTnVyc2UKCiAgICBJIHNwZWFrIG5vIHRyZWFzb24uCgpDQVBVTEVUCgogICAgTywgR29kIHllIGdvZC1kZW4uCgpOdXJzZQoKICAgIE1heSBub3Qgb25lIHNwZWFrPwoKQ0FQVUxFVAoKICAgIFBlYWNlLCB5b3UgbXVtYmxpbmcgZm9vbCEKICAgIFV0dGVyIHlvdXIgZ3Jhdml0eSBvJ2VyIGEgZ29zc2lwJ3MgYm93bDsKICAgIEZvciBoZXJlIHdlIG5lZWQgaXQgbm90LgoKTEFEWSBDQVBVTEVUCgogICAgWW91IGFyZSB0b28gaG90LgoKQ0FQVUxFVAoKICAgIEdvZCdzIGJyZWFkISBpdCBtYWtlcyBtZSBtYWQ6CiAgICBEYXksIG5pZ2h0LCBob3VyLCB0aWRlLCB0aW1lLCB3b3JrLCBwbGF5LAogICAgQWxvbmUsIGluIGNvbXBhbnksIHN0aWxsIG15IGNhcmUgaGF0aCBiZWVuCiAgICBUbyBoYXZlIGhlciBtYXRjaCdkOiBhbmQgaGF2aW5nIG5vdyBwcm92aWRlZAogICAgQSBnZW50bGVtYW4gb2Ygbm9ibGUgcGFyZW50YWdlLAogICAgT2YgZmFpciBkZW1lc25lcywgeW91dGhmdWwsIGFuZCBub2JseSB0cmFpbidkLAogICAgU3R1ZmYnZCwgYXMgdGhleSBzYXksIHdpdGggaG9ub3VyYWJsZSBwYXJ0cywKICAgIFByb3BvcnRpb24nZCBhcyBvbmUncyB0aG91Z2h0IHdvdWxkIHdpc2ggYSBtYW47CiAgICBBbmQgdGhlbiB0byBoYXZlIGEgd3JldGNoZWQgcHVsaW5nIGZvb2wsCiAgICBBIHdoaW5pbmcgbWFtbWV0LCBpbiBoZXIgZm9ydHVuZSdzIHRlbmRlciwKICAgIFRvIGFuc3dlciAnSSdsbCBub3Qgd2VkOyBJIGNhbm5vdCBsb3ZlLAogICAgSSBhbSB0b28geW91bmc7IEkgcHJheSB5b3UsIHBhcmRvbiBtZS4nCiAgICBCdXQsIGFzIHlvdSB3aWxsIG5vdCB3ZWQsIEknbGwgcGFyZG9uIHlvdToKICAgIEdyYXplIHdoZXJlIHlvdSB3aWxsIHlvdSBzaGFsbCBub3QgaG91c2Ugd2l0aCBtZToKICAgIExvb2sgdG8ndCwgdGhpbmsgb24ndCwgSSBkbyBub3QgdXNlIHRvIGplc3QuCiAgICBUaHVyc2RheSBpcyBuZWFyOyBsYXkgaGFuZCBvbiBoZWFydCwgYWR2aXNlOgogICAgQW4geW91IGJlIG1pbmUsIEknbGwgZ2l2ZSB5b3UgdG8gbXkgZnJpZW5kOwogICAgQW5kIHlvdSBiZSBub3QsIGhhbmcsIGJlZywgc3RhcnZlLCBkaWUgaW4KICAgIHRoZSBzdHJlZXRzLAogICAgRm9yLCBieSBteSBzb3VsLCBJJ2xsIG5lJ2VyIGFja25vd2xlZGdlIHRoZWUsCiAgICBOb3Igd2hhdCBpcyBtaW5lIHNoYWxsIG5ldmVyIGRvIHRoZWUgZ29vZDoKICAgIFRydXN0IHRvJ3QsIGJldGhpbmsgeW91OyBJJ2xsIG5vdCBiZSBmb3Jzd29ybi4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBJcyB0aGVyZSBubyBwaXR5IHNpdHRpbmcgaW4gdGhlIGNsb3VkcywKICAgIFRoYXQgc2VlcyBpbnRvIHRoZSBib3R0b20gb2YgbXkgZ3JpZWYCiAgICBPLCBzd2VldCBteSBtb3RoZXIsIGNhc3QgbWUgbm90IGF3YXkhCiAgICBEZWxheSB0aGlzIG1hcnJpYWdlIGZvciBhIG1vbnRoLCBhIHdlZWs7CiAgICBPciwgaWYgeW91IGRvIG5vdCwgbWFrZSB0aGUgYnJpZGFsIGJlZAogICAgSW4gdGhhdCBkaW0gbW9udW1lbnQgd2hlcmUgVHliYWx0IGxpZXMuCgpMQURZIENBUFVMRVQKCiAgICBUYWxrIG5vdCB0byBtZSwgZm9yIEknbGwgbm90IHNwZWFrIGEgd29yZDoKICAgIERvIGFzIHRob3Ugd2lsdCwgZm9yIEkgaGF2ZSBkb25lIHdpdGggdGhlZS4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIEdvZCEtLU8gbnVyc2UsIGhvdyBzaGFsbCB0aGlzIGJlIHByZXZlbnRlZD8KICAgIE15IGh1c2JhbmQgaXMgb24gZWFydGgsIG15IGZhaXRoIGluIGhlYXZlbjsKICAgIEhvdyBzaGFsbCB0aGF0IGZhaXRoIHJldHVybiBhZ2FpbiB0byBlYXJ0aCwKICAgIFVubGVzcyB0aGF0IGh1c2JhbmQgc2VuZCBpdCBtZSBmcm9tIGhlYXZlbgogICAgQnkgbGVhdmluZyBlYXJ0aD8gY29tZm9ydCBtZSwgY291bnNlbCBtZS4KICAgIEFsYWNrLCBhbGFjaywgdGhhdCBoZWF2ZW4gc2hvdWxkIHByYWN0aXNlIHN0cmF0YWdlbXMKICAgIFVwb24gc28gc29mdCBhIHN1YmplY3QgYXMgbXlzZWxmIQogICAgV2hhdCBzYXknc3QgdGhvdT8gaGFzdCB0aG91IG5vdCBhIHdvcmQgb2Ygam95PwogICAgU29tZSBjb21mb3J0LCBudXJzZS4KCk51cnNlCgogICAgRmFpdGgsIGhlcmUgaXQgaXMuCiAgICBSb21lbyBpcyBiYW5pc2gnZDsgYW5kIGFsbCB0aGUgd29ybGQgdG8gbm90aGluZywKICAgIFRoYXQgaGUgZGFyZXMgbmUnZXIgY29tZSBiYWNrIHRvIGNoYWxsZW5nZSB5b3U7CiAgICBPciwgaWYgaGUgZG8sIGl0IG5lZWRzIG11c3QgYmUgYnkgc3RlYWx0aC4KICAgIFRoZW4sIHNpbmNlIHRoZSBjYXNlIHNvIHN0YW5kcyBhcyBub3cgaXQgZG90aCwKICAgIEkgdGhpbmsgaXQgYmVzdCB5b3UgbWFycmllZCB3aXRoIHRoZSBjb3VudHkuCiAgICBPLCBoZSdzIGEgbG92ZWx5IGdlbnRsZW1hbiEKICAgIFJvbWVvJ3MgYSBkaXNoY2xvdXQgdG8gaGltOiBhbiBlYWdsZSwgbWFkYW0sCiAgICBIYXRoIG5vdCBzbyBncmVlbiwgc28gcXVpY2ssIHNvIGZhaXIgYW4gZXllCiAgICBBcyBQYXJpcyBoYXRoLiBCZXNocmV3IG15IHZlcnkgaGVhcnQsCiAgICBJIHRoaW5rIHlvdSBhcmUgaGFwcHkgaW4gdGhpcyBzZWNvbmQgbWF0Y2gsCiAgICBGb3IgaXQgZXhjZWxzIHlvdXIgZmlyc3Q6IG9yIGlmIGl0IGRpZCBub3QsCiAgICBZb3VyIGZpcnN0IGlzIGRlYWQ7IG9yICd0d2VyZSBhcyBnb29kIGhlIHdlcmUsCiAgICBBcyBsaXZpbmcgaGVyZSBhbmQgeW91IG5vIHVzZSBvZiBoaW0uCgpKVUxJRVQKCiAgICBTcGVha2VzdCB0aG91IGZyb20gdGh5IGhlYXJ0PwoKTnVyc2UKCiAgICBBbmQgZnJvbSBteSBzb3VsIHRvbzsKICAgIE9yIGVsc2UgYmVzaHJldyB0aGVtIGJvdGguCgpKVUxJRVQKCiAgICBBbWVuIQoKTnVyc2UKCiAgICBXaGF0PwoKSlVMSUVUCgogICAgV2VsbCwgdGhvdSBoYXN0IGNvbWZvcnRlZCBtZSBtYXJ2ZWxsb3VzIG11Y2guCiAgICBHbyBpbjogYW5kIHRlbGwgbXkgbGFkeSBJIGFtIGdvbmUsCiAgICBIYXZpbmcgZGlzcGxlYXNlZCBteSBmYXRoZXIsIHRvIExhdXJlbmNlJyBjZWxsLAogICAgVG8gbWFrZSBjb25mZXNzaW9uIGFuZCB0byBiZSBhYnNvbHZlZC4KCk51cnNlCgogICAgTWFycnksIEkgd2lsbDsgYW5kIHRoaXMgaXMgd2lzZWx5IGRvbmUuCgogICAgRXhpdAoKSlVMSUVUCgogICAgQW5jaWVudCBkYW1uYXRpb24hIE8gbW9zdCB3aWNrZWQgZmllbmQhCiAgICBJcyBpdCBtb3JlIHNpbiB0byB3aXNoIG1lIHRodXMgZm9yc3dvcm4sCiAgICBPciB0byBkaXNwcmFpc2UgbXkgbG9yZCB3aXRoIHRoYXQgc2FtZSB0b25ndWUKICAgIFdoaWNoIHNoZSBoYXRoIHByYWlzZWQgaGltIHdpdGggYWJvdmUgY29tcGFyZQogICAgU28gbWFueSB0aG91c2FuZCB0aW1lcz8gR28sIGNvdW5zZWxsb3I7CiAgICBUaG91IGFuZCBteSBib3NvbSBoZW5jZWZvcnRoIHNoYWxsIGJlIHR3YWluLgogICAgSSdsbCB0byB0aGUgZnJpYXIsIHRvIGtub3cgaGlzIHJlbWVkeToKICAgIElmIGFsbCBlbHNlIGZhaWwsIG15c2VsZiBoYXZlIHBvd2VyIHRvIGRpZS4KCiAgICBFeGl0CgpBQ1QgSVYKU0NFTkUgSS4gRnJpYXIgTGF1cmVuY2UncyBjZWxsLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUyAKCkZSSUFSIExBVVJFTkNFCgogICAgT24gVGh1cnNkYXksIHNpcj8gdGhlIHRpbWUgaXMgdmVyeSBzaG9ydC4KClBBUklTCgogICAgTXkgZmF0aGVyIENhcHVsZXQgd2lsbCBoYXZlIGl0IHNvOwogICAgQW5kIEkgYW0gbm90aGluZyBzbG93IHRvIHNsYWNrIGhpcyBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgWW91IHNheSB5b3UgZG8gbm90IGtub3cgdGhlIGxhZHkncyBtaW5kOgogICAgVW5ldmVuIGlzIHRoZSBjb3Vyc2UsIEkgbGlrZSBpdCBub3QuCgpQQVJJUwoKICAgIEltbW9kZXJhdGVseSBzaGUgd2VlcHMgZm9yIFR5YmFsdCdzIGRlYXRoLAogICAgQW5kIHRoZXJlZm9yZSBoYXZlIEkgbGl0dGxlIHRhbGsnZCBvZiBsb3ZlOwogICAgRm9yIFZlbnVzIHNtaWxlcyBub3QgaW4gYSBob3VzZSBvZiB0ZWFycy4KICAgIE5vdywgc2lyLCBoZXIgZmF0aGVyIGNvdW50cyBpdCBkYW5nZXJvdXMKICAgIFRoYXQgc2hlIGRvdGggZ2l2ZSBoZXIgc29ycm93IHNvIG11Y2ggc3dheSwKICAgIEFuZCBpbiBoaXMgd2lzZG9tIGhhc3RlcyBvdXIgbWFycmlhZ2UsCiAgICBUbyBzdG9wIHRoZSBpbnVuZGF0aW9uIG9mIGhlciB0ZWFyczsKICAgIFdoaWNoLCB0b28gbXVjaCBtaW5kZWQgYnkgaGVyc2VsZiBhbG9uZSwKICAgIE1heSBiZSBwdXQgZnJvbSBoZXIgYnkgc29jaWV0eToKICAgIE5vdyBkbyB5b3Uga25vdyB0aGUgcmVhc29uIG9mIHRoaXMgaGFzdGUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFtBc2lkZV0gSSB3b3VsZCBJIGtuZXcgbm90IHdoeSBpdCBzaG91bGQgYmUgc2xvdydkLgogICAgTG9vaywgc2lyLCBoZXJlIGNvbWVzIHRoZSBsYWR5IHRvd2FyZHMgbXkgY2VsbC4KCiAgICBFbnRlciBKVUxJRVQKClBBUklTCgogICAgSGFwcGlseSBtZXQsIG15IGxhZHkgYW5kIG15IHdpZmUhCgpKVUxJRVQKCiAgICBUaGF0IG1heSBiZSwgc2lyLCB3aGVuIEkgbWF5IGJlIGEgd2lmZS4KClBBUklTCgogICAgVGhhdCBtYXkgYmUgbXVzdCBiZSwgbG92ZSwgb24gVGh1cnNkYXkgbmV4dC4KCkpVTElFVAoKICAgIFdoYXQgbXVzdCBiZSBzaGFsbCBiZS4KCkZSSUFSIExBVVJFTkNFCgogICAgVGhhdCdzIGEgY2VydGFpbiB0ZXh0LgoKUEFSSVMKCiAgICBDb21lIHlvdSB0byBtYWtlIGNvbmZlc3Npb24gdG8gdGhpcyBmYXRoZXICgpKVUxJRVQKCiAgICBUbyBhbnN3ZXIgdGhhdCwgSSBzaG91bGQgY29uZmVzcyB0byB5b3UuCgpQQVJJUwoKICAgIERvIG5vdCBkZW55IHRvIGhpbSB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSSB3aWxsIGNvbmZlc3MgdG8geW91IHRoYXQgSSBsb3ZlIGhpbS4KClBBUklTCgogICAgU28gd2lsbCB5ZSwgSSBhbSBzdXJlLCB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSWYgSSBkbyBzbywgaXQgd2lsbCBiZSBvZiBtb3JlIHByaWNlLAogICAgQmVpbmcgc3Bva2UgYmVoaW5kIHlvdXIgYmFjaywgdGhhbiB0byB5b3VyIGZhY2UuCgpQQVJJUwoKICAgIFBvb3Igc291bCwgdGh5IGZhY2UgaXMgbXVjaCBhYnVzZWQgd2l0aCB0ZWFycy4KCkpVTElFVAoKICAgIFRoZSB0ZWFycyBoYXZlIGdvdCBzbWFsbCB2aWN0b3J5IGJ5IHRoYXQ7CiAgICBGb3IgaXQgd2FzIGJhZCBlbm91Z2ggYmVmb3JlIHRoZWlyIHNwaXRlLgoKUEFSSVMKCiAgICBUaG91IHdyb25nJ3N0IGl0LCBtb3JlIHRoYW4gdGVhcnMsIHdpdGggdGhhdCByZXBvcnQuCgpKVUxJRVQKCiAgICBUaGF0IGlzIG5vIHNsYW5kZXIsIHNpciwgd2hpY2ggaXMgYSB0cnV0aDsKICAgIEFuZCB3aGF0IEkgc3Bha2UsIEkgc3Bha2UgaXQgdG8gbXkgZmFjZS4KClBBUklTCgogICAgVGh5IGZhY2UgaXMgbWluZSwgYW5kIHRob3UgaGFzdCBzbGFuZGVyJ2QgaXQuCgpKVUxJRVQKCiAgICBJdCBtYXkgYmUgc28sIGZvciBpdCBpcyBub3QgbWluZSBvd24uCiAgICBBcmUgeW91IGF0IGxlaXN1cmUsIGhvbHkgZmF0aGVyLCBub3c7CiAgICBPciBzaGFsbCBJIGNvbWUgdG8geW91IGF0IGV2ZW5pbmcgbWFzcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTXkgbGVpc3VyZSBzZXJ2ZXMgbWUsIHBlbnNpdmUgZGF1Z2h0ZXIsIG5vdy4KICAgIE15IGxvcmQsIHdlIG11c3QgZW50cmVhdCB0aGUgdGltZSBhbG9uZS4KClBBUklTCgogICAgR29kIHNoaWVsZCBJIHNob3VsZCBkaXN0dXJiIGRldm90aW9uIQogICAgSnVsaWV0LCBvbiBUaHVyc2RheSBlYXJseSB3aWxsIEkgcm91c2UgeWU6CiAgICBUaWxsIHRoZW4sIGFkaWV1OyBhbmQga2VlcCB0aGlzIGhvbHkga2lzcy4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIHNodXQgdGhlIGRvb3IhIGFuZCB3aGVuIHRob3UgaGFzdCBkb25lIHNvLAogICAgQ29tZSB3ZWVwIHdpdGggbWU7IHBhc3QgaG9wZSwgcGFzdCBjdXJlLCBwYXN0IGhlbHAhCgpGUklBUiBMQVVSRU5DRQoKICAgIEFoLCBKdWxpZXQsIEkgYWxyZWFkeSBrbm93IHRoeSBncmllZjsKICAgIEl0IHN0cmFpbnMgbWUgcGFzdCB0aGUgY29tcGFzcyBvZiBteSB3aXRzOgogICAgSSBoZWFyIHRob3UgbXVzdCwgYW5kIG5vdGhpbmcgbWF5IHByb3JvZ3VlIGl0LAogICAgT24gVGh1cnNkYXkgbmV4dCBiZSBtYXJyaWVkIHRvIHRoaXMgY291bnR5LgoKSlVMSUVUCgogICAgVGVsbCBtZSBub3QsIGZyaWFyLCB0aGF0IHRob3UgaGVhcidzdCBvZiB0aGlzLAogICAgVW5sZXNzIHRob3UgdGVsbCBtZSBob3cgSSBtYXkgcHJldmVudCBpdDoKICAgIElmLCBpbiB0aHkgd2lzZG9tLCB0aG91IGNhbnN0IGdpdmUgbm8gaGVscCwKICAgIERvIHRob3UgYnV0IGNhbGwgbXkgcmVzb2x1dGlvbiB3aXNlLAogICAgQW5kIHdpdGggdGhpcyBrbmlmZSBJJ2xsIGhlbHAgaXQgcHJlc2VudGx5LgogICAgR29kIGpvaW4nZCBteSBoZWFydCBhbmQgUm9tZW8ncywgdGhvdSBvdXIgaGFuZHM7CiAgICBBbmQgZXJlIHRoaXMgaGFuZCwgYnkgdGhlZSB0byBSb21lbyBzZWFsJ2QsCiAgICBTaGFsbCBiZSB0aGUgbGFiZWwgdG8gYW5vdGhlciBkZWVkLAogICAgT3IgbXkgdHJ1ZSBoZWFydCB3aXRoIHRyZWFjaGVyb3VzIHJldm9sdAogICAgVHVybiB0byBhbm90aGVyLCB0aGlzIHNoYWxsIHNsYXkgdGhlbSBib3RoOgogICAgVGhlcmVmb3JlLCBvdXQgb2YgdGh5IGxvbmctZXhwZXJpZW5jZWQgdGltZSwKICAgIEdpdmUgbWUgc29tZSBwcmVzZW50IGNvdW5zZWwsIG9yLCBiZWhvbGQsCiAgICAnVHdpeHQgbXkgZXh0cmVtZXMgYW5kIG1lIHRoaXMgYmxvb2R5IGtuaWZlCiAgICBTaGFsbCBwbGF5IHRoZSB1bXBpcmUsIGFyYml0cmF0aW5nIHRoYXQKICAgIFdoaWNoIHRoZSBjb21taXNzaW9uIG9mIHRoeSB5ZWFycyBhbmQgYXJ0CiAgICBDb3VsZCB0byBubyBpc3N1ZSBvZiB0cnVlIGhvbm91ciBicmluZy4KICAgIEJlIG5vdCBzbyBsb25nIHRvIHNwZWFrOyBJIGxvbmcgdG8gZGllLAogICAgSWYgd2hhdCB0aG91IHNwZWFrJ3N0IHNwZWFrIG5vdCBvZiByZW1lZHkuCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvbGQsIGRhdWdodGVyOiBJIGRvIHNweSBhIGtpbmQgb2YgaG9wZSwKICAgIFdoaWNoIGNyYXZlcyBhcyBkZXNwZXJhdGUgYW4gZXhlY3V0aW9uLgogICAgQXMgdGhhdCBpcyBkZXNwZXJhdGUgd2hpY2ggd2Ugd291bGQgcHJldmVudC4KICAgIElmLCByYXRoZXIgdGhhbiB0byBtYXJyeSBDb3VudHkgUGFyaXMsCiAgICBUaG91IGhhc3QgdGhlIHN0cmVuZ3RoIG9mIHdpbGwgdG8gc2xheSB0aHlzZWxmLAogICAgVGhlbiBpcyBpdCBsaWtlbHkgdGhvdSB3aWx0IHVuZGVydGFrZQogICAgQSB0aGluZyBsaWtlIGRlYXRoIHRvIGNoaWRlIGF3YXkgdGhpcyBzaGFtZSwKICAgIFRoYXQgY29wZXN0IHdpdGggZGVhdGggaGltc2VsZiB0byBzY2FwZSBmcm9tIGl0OgogICAgQW5kLCBpZiB0aG91IGRhcmVzdCwgSSdsbCBnaXZlIHRoZWUgcmVtZWR5LgoKSlVMSUVUCgogICAgTywgYmlkIG1lIGxlYXAsIHJhdGhlciB0aGFuIG1hcnJ5IFBhcmlzLAogICAgRnJvbSBvZmYgdGhlIGJhdHRsZW1lbnRzIG9mIHlvbmRlciB0b3dlcjsKICAgIE9yIHdhbGsgaW4gdGhpZXZpc2ggd2F5czsgb3IgYmlkIG1lIGx1cmsKICAgIFdoZXJlIHNlcnBlbnRzIGFyZTsgY2hhaW4gbWUgd2l0aCByb2FyaW5nIGJlYXJzOwogICAgT3Igc2h1dCBtZSBuaWdodGx5IGluIGEgY2hhcm5lbC1ob3VzZSwKICAgIE8nZXItY292ZXInZCBxdWl0ZSB3aXRoIGRlYWQgbWVuJ3MgcmF0dGxpbmcgYm9uZXMsCiAgICBXaXRoIHJlZWt5IHNoYW5rcyBhbmQgeWVsbG93IGNoYXBsZXNzIHNrdWxsczsKICAgIE9yIGJpZCBtZSBnbyBpbnRvIGEgbmV3LW1hZGUgZ3JhdmUKICAgIEFuZCBoaWRlIG1lIHdpdGggYSBkZWFkIG1hbiBpbiBoaXMgc2hyb3VkOwogICAgVGhpbmdzIHRoYXQsIHRvIGhlYXIgdGhlbSB0b2xkLCBoYXZlIG1hZGUgbWUgdHJlbWJsZTsKICAgIEFuZCBJIHdpbGwgZG8gaXQgd2l0aG91dCBmZWFyIG9yIGRvdWJ0LAogICAgVG8gbGl2ZSBhbiB1bnN0YWluJ2Qgd2lmZSB0byBteSBzd2VldCBsb3ZlLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIb2xkLCB0aGVuOyBnbyBob21lLCBiZSBtZXJyeSwgZ2l2ZSBjb25zZW50CiAgICBUbyBtYXJyeSBQYXJpczogV2VkbmVzZGF5IGlzIHRvLW1vcnJvdzoKICAgIFRvLW1vcnJvdyBuaWdodCBsb29rIHRoYXQgdGhvdSBsaWUgYWxvbmU7CiAgICBMZXQgbm90IHRoeSBudXJzZSBsaWUgd2l0aCB0aGVlIGluIHRoeSBjaGFtYmVyOgogICAgVGFrZSB0aG91IHRoaXMgdmlhbCwgYmVpbmcgdGhlbiBpbiBiZWQsCiAgICBBbmQgdGhpcyBkaXN0aWxsZWQgbGlxdW9yIGRyaW5rIHRob3Ugb2ZmOwogICAgV2hlbiBwcmVzZW50bHkgdGhyb3VnaCBhbGwgdGh5IHZlaW5zIHNoYWxsIHJ1bgogICAgQSBjb2xkIGFuZCBkcm93c3kgaHVtb3VyLCBmb3Igbm8gcHVsc2UKICAgIFNoYWxsIGtlZXAgaGlzIG5hdGl2ZSBwcm9ncmVzcywgYnV0IHN1cmNlYXNlOgogICAgTm8gd2FybXRoLCBubyBicmVhdGgsIHNoYWxsIHRlc3RpZnkgdGhvdSBsaXZlc3Q7CiAgICBUaGUgcm9zZXMgaW4gdGh5IGxpcHMgYW5kIGNoZWVrcyBzaGFsbCBmYWRlCiAgICBUbyBwYWx5IGFzaGVzLCB0aHkgZXllcycgd2luZG93cyBmYWxsLAogICAgTGlrZSBkZWF0aCwgd2hlbiBoZSBzaHV0cyB1cCB0aGUgZGF5IG9mIGxpZmU7CiAgICBFYWNoIHBhcnQsIGRlcHJpdmVkIG9mIHN1cHBsZSBnb3Zlcm5tZW50LAogICAgU2hhbGwsIHN0aWZmIGFuZCBzdGFyayBhbmQgY29sZCwgYXBwZWFyIGxpa2UgZGVhdGg6CiAgICBBbmQgaW4gdGhpcyBib3Jyb3cnZCBsaWtlbmVzcyBvZiBzaHJ1bmsgZGVhdGgKICAgIFRob3Ugc2hhbHQgY29udGludWUgdHdvIGFuZCBmb3J0eSBob3VycywKICAgIEFuZCB0aGVuIGF3YWtlIGFzIGZyb20gYSBwbGVhc2FudCBzbGVlcC4KICAgIE5vdywgd2hlbiB0aGUgYnJpZGVncm9vbSBpbiB0aGUgbW9ybmluZyBjb21lcwogICAgVG8gcm91c2UgdGhlZSBmcm9tIHRoeSBiZWQsIHRoZXJlIGFydCB0aG91IGRlYWQ6CiAgICBUaGVuLCBhcyB0aGUgbWFubmVyIG9mIG91ciBjb3VudHJ5IGlzLAogICAgSW4gdGh5IGJlc3Qgcm9iZXMgdW5jb3ZlcidkIG9uIHRoZSBiaWVyCiAgICBUaG91IHNoYWx0IGJlIGJvcm5lIHRvIHRoYXQgc2FtZSBhbmNpZW50IHZhdWx0CiAgICBXaGVyZSBhbGwgdGhlIGtpbmRyZWQgb2YgdGhlIENhcHVsZXRzIGxpZS4KICAgIEluIHRoZSBtZWFuIHRpbWUsIGFnYWluc3QgdGhvdSBzaGFsdCBhd2FrZSwKICAgIFNoYWxsIFJvbWVvIGJ5IG15IGxldHRlcnMga25vdyBvdXIgZHJpZnQsCiAgICBBbmQgaGl0aGVyIHNoYWxsIGhlIGNvbWU6IGFuZCBoZSBhbmQgSQogICAgV2lsbCB3YXRjaCB0aHkgd2FraW5nLCBhbmQgdGhhdCB2ZXJ5IG5pZ2h0CiAgICBTaGFsbCBSb21lbyBiZWFyIHRoZWUgaGVuY2UgdG8gTWFudHVhLgogICAgQW5kIHRoaXMgc2hhbGwgZnJlZSB0aGVlIGZyb20gdGhpcyBwcmVzZW50IHNoYW1lOwogICAgSWYgbm8gaW5jb25zdGFudCB0b3ksIG5vciB3b21hbmlzaCBmZWFyLAogICAgQWJhdGUgdGh5IHZhbG91ciBpbiB0aGUgYWN0aW5nIGl0LgoKSlVMSUVUCgogICAgR2l2ZSBtZSwgZ2l2ZSBtZSEgTywgdGVsbCBub3QgbWUgb2YgZmVhciEKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZDsgZ2V0IHlvdSBnb25lLCBiZSBzdHJvbmcgYW5kIHByb3NwZXJvdXMKICAgIEluIHRoaXMgcmVzb2x2ZTogSSdsbCBzZW5kIGEgZnJpYXIgd2l0aCBzcGVlZAogICAgVG8gTWFudHVhLCB3aXRoIG15IGxldHRlcnMgdG8gdGh5IGxvcmQuCgpKVUxJRVQKCiAgICBMb3ZlIGdpdmUgbWUgc3RyZW5ndGghIGFuZCBzdHJlbmd0aCBzaGFsbCBoZWxwIGFmZm9yZC4KICAgIEZhcmV3ZWxsLCBkZWFyIGZhdGhlciEKCiAgICBFeGV1bnQKClNDRU5FIElJLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIE51cnNlLCBhbmQgdHdvIFNlcnZpbmdtZW4gCgpDQVBVTEVUCgogICAgU28gbWFueSBndWVzdHMgaW52aXRlIGFzIGhlcmUgYXJlIHdyaXQuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGdvIGhpcmUgbWUgdHdlbnR5IGN1bm5pbmcgY29va3MuCgpTZWNvbmQgU2VydmFudAoKICAgIFlvdSBzaGFsbCBoYXZlIG5vbmUgaWxsLCBzaXI7IGZvciBJJ2xsIHRyeSBpZiB0aGV5CiAgICBjYW4gbGljayB0aGVpciBmaW5nZXJzLgoKQ0FQVUxFVAoKICAgIEhvdyBjYW5zdCB0aG91IHRyeSB0aGVtIHNvPwoKU2Vjb25kIFNlcnZhbnQKCiAgICBNYXJyeSwgc2lyLCAndGlzIGFuIGlsbCBjb29rIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBvd24gZmluZ2VyczogdGhlcmVmb3JlIGhlIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBmaW5nZXJzIGdvZXMgbm90IHdpdGggbWUuCgpDQVBVTEVUCgogICAgR28sIGJlIGdvbmUuCgogICAgRXhpdCBTZWNvbmQgU2VydmFudAogICAgV2Ugc2hhbGwgYmUgbXVjaCB1bmZ1cm5pc2hlZCBmb3IgdGhpcyB0aW1lLgogICAgV2hhdCwgaXMgbXkgZGF1Z2h0ZXIgZ29uZSB0byBGcmlhciBMYXVyZW5jZT8KCk51cnNlCgogICAgQXksIGZvcnNvb3RoLgoKQ0FQVUxFVAoKICAgIFdlbGwsIGhlIG1heSBjaGFuY2UgdG8gZG8gc29tZSBnb29kIG9uIGhlcjoKICAgIEEgcGVldmlzaCBzZWxmLXdpbGwnZCBoYXJsb3RyeSBpdCBpcy4KCk51cnNlCgogICAgU2VlIHdoZXJlIHNoZSBjb21lcyBmcm9tIHNocmlmdCB3aXRoIG1lcnJ5IGxvb2suCgogICAgRW50ZXIgSlVMSUVUCgpDQVBVTEVUCgogICAgSG93IG5vdywgbXkgaGVhZHN0cm9uZyEgd2hlcmUgaGF2ZSB5b3UgYmVlbiBnYWRkaW5nPwoKSlVMSUVUCgogICAgV2hlcmUgSSBoYXZlIGxlYXJuJ2QgbWUgdG8gcmVwZW50IHRoZSBzaW4KICAgIE9mIGRpc29iZWRpZW50IG9wcG9zaXRpb24KICAgIFRvIHlvdSBhbmQgeW91ciBiZWhlc3RzLCBhbmQgYW0gZW5qb2luJ2QKICAgIEJ5IGhvbHkgTGF1cmVuY2UgdG8gZmFsbCBwcm9zdHJhdGUgaGVyZSwKICAgIEFuZCBiZWcgeW91ciBwYXJkb246IHBhcmRvbiwgSSBiZXNlZWNoIHlvdSEKICAgIEhlbmNlZm9yd2FyZCBJIGFtIGV2ZXIgcnVsZWQgYnkgeW91LgoKQ0FQVUxFVAoKICAgIFNlbmQgZm9yIHRoZSBjb3VudHk7IGdvIHRlbGwgaGltIG9mIHRoaXM6CiAgICBJJ2xsIGhhdmUgdGhpcyBrbm90IGtuaXQgdXAgdG8tbW9ycm93IG1vcm5pbmcuCgpKVUxJRVQKCiAgICBJIG1ldCB0aGUgeW91dGhmdWwgbG9yZCBhdCBMYXVyZW5jZScgY2VsbDsKICAgIEFuZCBnYXZlIGhpbSB3aGF0IGJlY29tZWQgbG92ZSBJIG1pZ2h0LAogICAgTm90IHN0ZXAgbydlciB0aGUgYm91bmRzIG9mIG1vZGVzdHkuCgpDQVBVTEVUCgogICAgV2h5LCBJIGFtIGdsYWQgb24ndDsgdGhpcyBpcyB3ZWxsOiBzdGFuZCB1cDoKICAgIFRoaXMgaXMgYXMndCBzaG91bGQgYmUuIExldCBtZSBzZWUgdGhlIGNvdW50eTsKICAgIEF5LCBtYXJyeSwgZ28sIEkgc2F5LCBhbmQgZmV0Y2ggaGltIGhpdGhlci4KICAgIE5vdywgYWZvcmUgR29kISB0aGlzIHJldmVyZW5kIGhvbHkgZnJpYXIsCiAgICBPdXIgd2hvbGUgY2l0eSBpcyBtdWNoIGJvdW5kIHRvIGhpbS4KCkpVTElFVAoKICAgIE51cnNlLCB3aWxsIHlvdSBnbyB3aXRoIG1lIGludG8gbXkgY2xvc2V0LAogICAgVG8gaGVscCBtZSBzb3J0IHN1Y2ggbmVlZGZ1bCBvcm5hbWVudHMKICAgIEFzIHlvdSB0aGluayBmaXQgdG8gZnVybmlzaCBtZSB0by1tb3Jyb3cCgpMQURZIENBUFVMRVQKCiAgICBObywgbm90IHRpbGwgVGh1cnNkYXk7IHRoZXJlIGlzIHRpbWUgZW5vdWdoLgoKQ0FQVUxFVAoKICAgIEdvLCBudXJzZSwgZ28gd2l0aCBoZXI6IHdlJ2xsIHRvIGNodXJjaCB0by1tb3Jyb3cuCgogICAgRXhldW50IEpVTElFVCBhbmQgTnVyc2UKCkxBRFkgQ0FQVUxFVAoKICAgIFdlIHNoYWxsIGJlIHNob3J0IGluIG91ciBwcm92aXNpb246CiAgICAnVGlzIG5vdyBuZWFyIG5pZ2h0LgoKQ0FQVUxFVAoKICAgIFR1c2gsIEkgd2lsbCBzdGlyIGFib3V0LAogICAgQW5kIGFsbCB0aGluZ3Mgc2hhbGwgYmUgd2VsbCwgSSB3YXJyYW50IHRoZWUsIHdpZmU6CiAgICBHbyB0aG91IHRvIEp1bGlldCwgaGVscCB0byBkZWNrIHVwIGhlcjsKICAgIEknbGwgbm90IHRvIGJlZCB0by1uaWdodDsgbGV0IG1lIGFsb25lOwogICAgSSdsbCBwbGF5IHRoZSBob3VzZXdpZmUgZm9yIHRoaXMgb25jZS4gV2hhdCwgaG8hCiAgICBUaGV5IGFyZSBhbGwgZm9ydGguIFdlbGwsIEkgd2lsbCB3YWxrIG15c2VsZgogICAgVG8gQ291bnR5IFBhcmlzLCB0byBwcmVwYXJlIGhpbSB1cAogICAgQWdhaW5zdCB0by1tb3Jyb3c6IG15IGhlYXJ0IGlzIHdvbmRyb3VzIGxpZ2h0LAogICAgU2luY2UgdGhpcyBzYW1lIHdheXdhcmQgZ2lybCBpcyBzbyByZWNsYWltJ2QuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEp1bGlldCdzIGNoYW1iZXIuCgogICAgRW50ZXIgSlVMSUVUIGFuZCBOdXJzZSAKCkpVTElFVAoKICAgIEF5LCB0aG9zZSBhdHRpcmVzIGFyZSBiZXN0OiBidXQsIGdlbnRsZSBudXJzZSwKICAgIEkgcHJheSB0aGVlLCBsZWF2ZSBtZSB0byBteSBzZWxmIHRvLW5pZ2h0LAogICAgRm9yIEkgaGF2ZSBuZWVkIG9mIG1hbnkgb3Jpc29ucwogICAgVG8gbW92ZSB0aGUgaGVhdmVucyB0byBzbWlsZSB1cG9uIG15IHN0YXRlLAogICAgV2hpY2gsIHdlbGwgdGhvdSBrbm93J3N0LCBpcyBjcm9zcywgYW5kIGZ1bGwgb2Ygc2luLgoKICAgIEVudGVyIExBRFkgQ0FQVUxFVAoKTEFEWSBDQVBVTEVUCgogICAgV2hhdCwgYXJlIHlvdSBidXN5LCBobz8gbmVlZCB5b3UgbXkgaGVscD8KCkpVTElFVAoKICAgIE5vLCBtYWRhbTsgd2UgaGF2ZSBjdWxsJ2Qgc3VjaCBuZWNlc3NhcmllcwogICAgQXMgYXJlIGJlaG92ZWZ1bCBmb3Igb3VyIHN0YXRlIHRvLW1vcnJvdzoKICAgIFNvIHBsZWFzZSB5b3UsIGxldCBtZSBub3cgYmUgbGVmdCBhbG9uZSwKICAgIEFuZCBsZXQgdGhlIG51cnNlIHRoaXMgbmlnaHQgc2l0IHVwIHdpdGggeW91OwogICAgRm9yLCBJIGFtIHN1cmUsIHlvdSBoYXZlIHlvdXIgaGFuZHMgZnVsbCBhbGwsCiAgICBJbiB0aGlzIHNvIHN1ZGRlbiBidXNpbmVzcy4KCkxBRFkgQ0FQVUxFVAoKICAgIEdvb2QgbmlnaHQ6CiAgICBHZXQgdGhlZSB0byBiZWQsIGFuZCByZXN0OyBmb3IgdGhvdSBoYXN0IG5lZWQuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkpVTElFVAoKICAgIEZhcmV3ZWxsISBHb2Qga25vd3Mgd2hlbiB3ZSBzaGFsbCBtZWV0IGFnYWluLgogICAgSSBoYXZlIGEgZmFpbnQgY29sZCBmZWFyIHRocmlsbHMgdGhyb3VnaCBteSB2ZWlucywKICAgIFRoYXQgYWxtb3N0IGZyZWV6ZXMgdXAgdGhlIGhlYXQgb2YgbGlmZToKICAgIEknbGwgY2FsbCB0aGVtIGJhY2sgYWdhaW4gdG8gY29tZm9ydCBtZToKICAgIE51cnNlISBXaGF0IHNob3VsZCBzaGUgZG8gaGVyZT8KICAgIE15IGRpc21hbCBzY2VuZSBJIG5lZWRzIG11c3QgYWN0IGFsb25lLgogICAgQ29tZSwgdmlhbC4KICAgIFdoYXQgaWYgdGhpcyBtaXh0dXJlIGRvIG5vdCB3b3JrIGF0IGFsbD8KICAgIFNoYWxsIEkgYmUgbWFycmllZCB0aGVuIHRvLW1vcnJvdyBtb3JuaW5nPwogICAgTm8sIG5vOiB0aGlzIHNoYWxsIGZvcmJpZCBpdDogbGllIHRob3UgdGhlcmUuCgogICAgTGF5aW5nIGRvd24gaGVyIGRhZ2dlcgogICAgV2hhdCBpZiBpdCBiZSBhIHBvaXNvbiwgd2hpY2ggdGhlIGZyaWFyCiAgICBTdWJ0bHkgaGF0aCBtaW5pc3RlcidkIHRvIGhhdmUgbWUgZGVhZCwKICAgIExlc3QgaW4gdGhpcyBtYXJyaWFnZSBoZSBzaG91bGQgYmUgZGlzaG9ub3VyJ2QsCiAgICBCZWNhdXNlIGhlIG1hcnJpZWQgbWUgYmVmb3JlIHRvIFJvbWVvPwogICAgSSBmZWFyIGl0IGlzOiBhbmQgeWV0LCBtZXRoaW5rcywgaXQgc2hvdWxkIG5vdCwKICAgIEZvciBoZSBoYXRoIHN0aWxsIGJlZW4gdHJpZWQgYSBob2x5IG1hbi4KICAgIEhvdyBpZiwgd2hlbiBJIGFtIGxhaWQgaW50byB0aGUgdG9tYiwKICAgIEkgd2FrZSBiZWZvcmUgdGhlIHRpbWUgdGhhdCBSb21lbwogICAgQ29tZSB0byByZWRlZW0gbWUIHRoZXJlJ3MgYSBmZWFyZnVsIHBvaW50IQogICAgU2hhbGwgSSBub3QsIHRoZW4sIGJlIHN0aWZsZWQgaW4gdGhlIHZhdWx0LAogICAgVG8gd2hvc2UgZm91bCBtb3V0aCBubyBoZWFsdGhzb21lIGFpciBicmVhdGhlcyBpbiwKICAgIEFuZCB0aGVyZSBkaWUgc3RyYW5nbGVkIGVyZSBteSBSb21lbyBjb21lcz8KICAgIE9yLCBpZiBJIGxpdmUsIGlzIGl0IG5vdCB2ZXJ5IGxpa2UsCiAgICBUaGUgaG9ycmlibGUgY29uY2VpdCBvZiBkZWF0aCBhbmQgbmlnaHQsCiAgICBUb2dldGhlciB3aXRoIHRoZSB0ZXJyb3Igb2YgdGhlIHBsYWNlLC0tCiAgICBBcyBpbiBhIHZhdWx0LCBhbiBhbmNpZW50IHJlY2VwdGFjbGUsCiAgICBXaGVyZSwgZm9yIHRoZXNlIG1hbnkgaHVuZHJlZCB5ZWFycywgdGhlIGJvbmVzCiAgICBPZiBhbGwgbXkgYnVyaWVkIGFuY2VzdG9ycyBhcmUgcGFja2VkOgogICAgV2hlcmUgYmxvb2R5IFR5YmFsdCwgeWV0IGJ1dCBncmVlbiBpbiBlYXJ0aCwKICAgIExpZXMgZmVzdGVyaW5nIGluIGhpcyBzaHJvdWQ7IHdoZXJlLCBhcyB0aGV5IHNheSwKICAgIEF0IHNvbWUgaG91cnMgaW4gdGhlIG5pZ2h0IHNwaXJpdHMgcmVzb3J0Oy0tCiAgICBBbGFjaywgYWxhY2ssIGlzIGl0IG5vdCBsaWtlIHRoYXQgSSwKICAgIFNvIGVhcmx5IHdha2luZywgd2hhdCB3aXRoIGxvYXRoc29tZSBzbWVsbHMsCiAgICBBbmQgc2hyaWVrcyBsaWtlIG1hbmRyYWtlcycgdG9ybiBvdXQgb2YgdGhlIGVhcnRoLAogICAgVGhhdCBsaXZpbmcgbW9ydGFscywgaGVhcmluZyB0aGVtLCBydW4gbWFkOi0tCiAgICBPLCBpZiBJIHdha2UsIHNoYWxsIEkgbm90IGJlIGRpc3RyYXVnaHQsCiAgICBFbnZpcm9uZWQgd2l0aCBhbGwgdGhlc2UgaGlkZW91cyBmZWFycz8KICAgIEFuZCBtYWRseSBwbGF5IHdpdGggbXkgZm9yZWZhdGhlcidzIGpvaW50cz8KICAgIEFuZCBwbHVjayB0aGUgbWFuZ2xlZCBUeWJhbHQgZnJvbSBoaXMgc2hyb3VkPwogICAgQW5kLCBpbiB0aGlzIHJhZ2UsIHdpdGggc29tZSBncmVhdCBraW5zbWFuJ3MgYm9uZSwKICAgIEFzIHdpdGggYSBjbHViLCBkYXNoIG91dCBteSBkZXNwZXJhdGUgYnJhaW5zPwogICAgTywgbG9vayEgbWV0aGlua3MgSSBzZWUgbXkgY291c2luJ3MgZ2hvc3QKICAgIFNlZWtpbmcgb3V0IFJvbWVvLCB0aGF0IGRpZCBzcGl0IGhpcyBib2R5CiAgICBVcG9uIGEgcmFwaWVyJ3MgcG9pbnQ6IHN0YXksIFR5YmFsdCwgc3RheSEKICAgIFJvbWVvLCBJIGNvbWUhIHRoaXMgZG8gSSBkcmluayB0byB0aGVlLgoKICAgIFNoZSBmYWxscyB1cG9uIGhlciBiZWQsIHdpdGhpbiB0aGUgY3VydGFpbnMKClNDRU5FIElWLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgSG9sZCwgdGFrZSB0aGVzZSBrZXlzLCBhbmQgZmV0Y2ggbW9yZSBzcGljZXMsIG51cnNlLgoKTnVyc2UKCiAgICBUaGV5IGNhbGwgZm9yIGRhdGVzIGFuZCBxdWluY2VzIGluIHRoZSBwYXN0cnkuCgogICAgRW50ZXIgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIENvbWUsIHN0aXIsIHN0aXIsIHN0aXIhIHRoZSBzZWNvbmQgY29jayBoYXRoIGNyb3cnZCwKICAgIFRoZSBjdXJmZXctYmVsbCBoYXRoIHJ1bmcsICd0aXMgdGhyZWUgbydjbG9jazoKICAgIExvb2sgdG8gdGhlIGJha2VkIG1lYXRzLCBnb29kIEFuZ2VsaWNhOgogICAgU3BhcmUgbm90IGZvciB0aGUgY29zdC4KCk51cnNlCgogICAgR28sIHlvdSBjb3QtcXVlYW4sIGdvLAogICAgR2V0IHlvdSB0byBiZWQ7IGZhaXRoLCBZb3UnbGwgYmUgc2ljayB0by1tb3Jyb3cKICAgIEZvciB0aGlzIG5pZ2h0J3Mgd2F0Y2hpbmcuCgpDQVBVTEVUCgogICAgTm8sIG5vdCBhIHdoaXQ6IHdoYXQhIEkgaGF2ZSB3YXRjaCdkIGVyZSBub3cKICAgIEFsbCBuaWdodCBmb3IgbGVzc2VyIGNhdXNlLCBhbmQgbmUnZXIgYmVlbiBzaWNrLgoKTEFEWSBDQVBVTEVUCgogICAgQXksIHlvdSBoYXZlIGJlZW4gYSBtb3VzZS1odW50IGluIHlvdXIgdGltZTsKICAgIEJ1dCBJIHdpbGwgd2F0Y2ggeW91IGZyb20gc3VjaCB3YXRjaGluZyBub3cuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBBIGplYWxvdXMgaG9vZCwgYSBqZWFsb3VzIGhvb2QhCgogICAgRW50ZXIgdGhyZWUgb3IgZm91ciBTZXJ2aW5nbWVuLCB3aXRoIHNwaXRzLCBsb2dzLCBhbmQgYmFza2V0cwogICAgTm93LCBmZWxsb3csCiAgICBXaGF0J3MgdGhlcmUCgpGaXJzdCBTZXJ2YW50CgogICAgVGhpbmdzIGZvciB0aGUgY29vaywgc2lyOyBidXQgSSBrbm93IG5vdCB3aGF0LgoKQ0FQVUxFVAoKICAgIE1ha2UgaGFzdGUsIG1ha2UgaGFzdGUuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGZldGNoIGRyaWVyIGxvZ3M6CiAgICBDYWxsIFBldGVyLCBoZSB3aWxsIHNob3cgdGhlZSB3aGVyZSB0aGV5IGFyZS4KClNlY29uZCBTZXJ2YW50CgogICAgSSBoYXZlIGEgaGVhZCwgc2lyLCB0aGF0IHdpbGwgZmluZCBvdXQgbG9ncywKICAgIEFuZCBuZXZlciB0cm91YmxlIFBldGVyIGZvciB0aGUgbWF0dGVyLgoKICAgIEV4aXQKCkNBUFVMRVQKCiAgICBNYXNzLCBhbmQgd2VsbCBzYWlkOyBhIG1lcnJ5IHdob3Jlc29uLCBoYSEKICAgIFRob3Ugc2hhbHQgYmUgbG9nZ2VyLWhlYWQuIEdvb2QgZmFpdGgsICd0aXMgZGF5OgogICAgVGhlIGNvdW50eSB3aWxsIGJlIGhlcmUgd2l0aCBtdXNpYyBzdHJhaWdodCwKICAgIEZvciBzbyBoZSBzYWlkIGhlIHdvdWxkOiBJIGhlYXIgaGltIG5lYXIuCgogICAgTXVzaWMgd2l0aGluCiAgICBOdXJzZSEgV2lmZSEgV2hhdCwgaG8hIFdoYXQsIG51cnNlLCBJIHNheSEKCiAgICBSZS1lbnRlciBOdXJzZQogICAgR28gd2FrZW4gSnVsaWV0LCBnbyBhbmQgdHJpbSBoZXIgdXA7CiAgICBJJ2xsIGdvIGFuZCBjaGF0IHdpdGggUGFyaXM6IGhpZSwgbWFrZSBoYXN0ZSwKICAgIE1ha2UgaGFzdGU7IHRoZSBicmlkZWdyb29tIGhlIGlzIGNvbWUgYWxyZWFkeToKICAgIE1ha2UgaGFzdGUsIEkgc2F5LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gSnVsaWV0J3MgY2hhbWJlci4KCiAgICBFbnRlciBOdXJzZSAKCk51cnNlCgogICAgTWlzdHJlc3MhIHdoYXQsIG1pc3RyZXNzISBKdWxpZXQhIGZhc3QsIEkgd2FycmFudCBoZXIsIHNoZToKICAgIFdoeSwgbGFtYiEgd2h5LCBsYWR5ISBmaWUsIHlvdSBzbHVnLWEtYmVkIQogICAgV2h5LCBsb3ZlLCBJIHNheSEgbWFkYW0hIHN3ZWV0LWhlYXJ0ISB3aHksIGJyaWRlIQogICAgV2hhdCwgbm90IGEgd29yZD8geW91IHRha2UgeW91ciBwZW5ueXdvcnRocyBub3c7CiAgICBTbGVlcCBmb3IgYSB3ZWVrOyBmb3IgdGhlIG5leHQgbmlnaHQsIEkgd2FycmFudCwKICAgIFRoZSBDb3VudHkgUGFyaXMgaGF0aCBzZXQgdXAgaGlzIHJlc3QsCiAgICBUaGF0IHlvdSBzaGFsbCByZXN0IGJ1dCBsaXR0bGUuIEdvZCBmb3JnaXZlIG1lLAogICAgTWFycnksIGFuZCBhbWVuLCBob3cgc291bmQgaXMgc2hlIGFzbGVlcCEKICAgIEkgbXVzdCBuZWVkcyB3YWtlIGhlci4gTWFkYW0sIG1hZGFtLCBtYWRhbSEKICAgIEF5LCBsZXQgdGhlIGNvdW50eSB0YWtlIHlvdSBpbiB5b3VyIGJlZDsKICAgIEhlJ2xsIGZyaWdodCB5b3UgdXAsIGknIGZhaXRoLiBXaWxsIGl0IG5vdCBiZT8KCiAgICBVbmRyYXdzIHRoZSBjdXJ0YWlucwogICAgV2hhdCwgZHJlc3MnZCEgYW5kIGluIHlvdXIgY2xvdGhlcyEgYW5kIGRvd24gYWdhaW4hCiAgICBJIG11c3QgbmVlZHMgd2FrZSB5b3U7IExhZHkhIGxhZHkhIGxhZHkhCiAgICBBbGFzLCBhbGFzISBIZWxwLCBoZWxwISBteSBsYWR5J3MgZGVhZCEKICAgIE8sIHdlbGwtYS1kYXksIHRoYXQgZXZlciBJIHdhcyBib3JuIQogICAgU29tZSBhcXVhIHZpdGFlLCBobyEgTXkgbG9yZCEgbXkgbGFkeSEKCiAgICBFbnRlciBMQURZIENBUFVMRVQKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgaGVyZT8KCk51cnNlCgogICAgTyBsYW1lbnRhYmxlIGRheSEKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgaXMgdGhlIG1hdHRlcj8KCk51cnNlCgogICAgTG9vaywgbG9vayEgTyBoZWF2eSBkYXkhCgpMQURZIENBUFVMRVQKCiAgICBPIG1lLCBPIG1lISBNeSBjaGlsZCwgbXkgb25seSBsaWZlLAogICAgUmV2aXZlLCBsb29rIHVwLCBvciBJIHdpbGwgZGllIHdpdGggdGhlZSEKICAgIEhlbHAsIGhlbHAhIENhbGwgaGVscC4KCiAgICBFbnRlciBDQVBVTEVUCgpDQVBVTEVUCgogICAgRm9yIHNoYW1lLCBicmluZyBKdWxpZXQgZm9ydGg7IGhlciBsb3JkIGlzIGNvbWUuCgpOdXJzZQoKICAgIFNoZSdzIGRlYWQsIGRlY2Vhc2VkLCBzaGUncyBkZWFkOyBhbGFjayB0aGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgQWxhY2sgdGhlIGRheSwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCEKCkNBUFVMRVQKCiAgICBIYSEgbGV0IG1lIHNlZSBoZXI6IG91dCwgYWxhcyEgc2hlJ3MgY29sZDoKICAgIEhlciBibG9vZCBpcyBzZXR0bGVkLCBhbmQgaGVyIGpvaW50cyBhcmUgc3RpZmY7CiAgICBMaWZlIGFuZCB0aGVzZSBsaXBzIGhhdmUgbG9uZyBiZWVuIHNlcGFyYXRlZDoKICAgIERlYXRoIGxpZXMgb24gaGVyIGxpa2UgYW4gdW50aW1lbHkgZnJvc3QKICAgIFVwb24gdGhlIHN3ZWV0ZXN0IGZsb3dlciBvZiBhbGwgdGhlIGZpZWxkLgoKTnVyc2UKCiAgICBPIGxhbWVudGFibGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgTyB3b2Z1bCB0aW1lIQoKQ0FQVUxFVAoKICAgIERlYXRoLCB0aGF0IGhhdGggdGEnZW4gaGVyIGhlbmNlIHRvIG1ha2UgbWUgd2FpbCwKICAgIFRpZXMgdXAgbXkgdG9uZ3VlLCBhbmQgd2lsbCBub3QgbGV0IG1lIHNwZWFrLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUywgd2l0aCBNdXNpY2lhbnMKCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgaXMgdGhlIGJyaWRlIHJlYWR5IHRvIGdvIHRvIGNodXJjaD8KCkNBUFVMRVQKCiAgICBSZWFkeSB0byBnbywgYnV0IG5ldmVyIHRvIHJldHVybi4KICAgIE8gc29uISB0aGUgbmlnaHQgYmVmb3JlIHRoeSB3ZWRkaW5nLWRheQogICAgSGF0aCBEZWF0aCBsYWluIHdpdGggdGh5IHdpZmUuIFRoZXJlIHNoZSBsaWVzLAogICAgRmxvd2VyIGFzIHNoZSB3YXMsIGRlZmxvd2VyZWQgYnkgaGltLgogICAgRGVhdGggaXMgbXkgc29uLWluLWxhdywgRGVhdGggaXMgbXkgaGVpcjsKICAgIE15IGRhdWdodGVyIGhlIGhhdGggd2VkZGVkOiBJIHdpbGwgZGllLAogICAgQW5kIGxlYXZlIGhpbSBhbGw7IGxpZmUsIGxpdmluZywgYWxsIGlzIERlYXRoJ3MuCgpQQVJJUwoKICAgIEhhdmUgSSB0aG91Z2h0IGxvbmcgdG8gc2VlIHRoaXMgbW9ybmluZydzIGZhY2UsCiAgICBBbmQgZG90aCBpdCBnaXZlIG1lIHN1Y2ggYSBzaWdodCBhcyB0aGlzPwoKTEFEWSBDQVBVTEVUCgogICAgQWNjdXJzZWQsIHVuaGFwcHksIHdyZXRjaGVkLCBoYXRlZnVsIGRheSEKICAgIE1vc3QgbWlzZXJhYmxlIGhvdXIgdGhhdCBlJ2VyIHRpbWUgc2F3CiAgICBJbiBsYXN0aW5nIGxhYm91ciBvZiBoaXMgcGlsZ3JpbWFnZSEKICAgIEJ1dCBvbmUsIHBvb3Igb25lLCBvbmUgcG9vciBhbmQgbG92aW5nIGNoaWxkLAogICAgQnV0IG9uZSB0aGluZyB0byByZWpvaWNlIGFuZCBzb2xhY2UgaW4sCiAgICBBbmQgY3J1ZWwgZGVhdGggaGF0aCBjYXRjaCdkIGl0IGZyb20gbXkgc2lnaHQhCgpOdXJzZQoKICAgIE8gd29lISBPIHdvZnVsLCB3b2Z1bCwgd29mdWwgZGF5IQogICAgTW9zdCBsYW1lbnRhYmxlIGRheSwgbW9zdCB3b2Z1bCBkYXksCiAgICBUaGF0IGV2ZXIsIGV2ZXIsIEkgZGlkIHlldCBiZWhvbGQhCiAgICBPIGRheSEgTyBkYXkhIE8gZGF5ISBPIGhhdGVmdWwgZGF5IQogICAgTmV2ZXIgd2FzIHNlZW4gc28gYmxhY2sgYSBkYXkgYXMgdGhpczoKICAgIE8gd29mdWwgZGF5LCBPIHdvZnVsIGRheSEKClBBUklTCgogICAgQmVndWlsZWQsIGRpdm9yY2VkLCB3cm9uZ2VkLCBzcGl0ZWQsIHNsYWluIQogICAgTW9zdCBkZXRlc3RhYmxlIGRlYXRoLCBieSB0aGVlIGJlZ3VpbCdkLAogICAgQnkgY3J1ZWwgY3J1ZWwgdGhlZSBxdWl0ZSBvdmVydGhyb3duIQogICAgTyBsb3ZlISBPIGxpZmUhIG5vdCBsaWZlLCBidXQgbG92ZSBpbiBkZWF0aCEKCkNBUFVMRVQKCiAgICBEZXNwaXNlZCwgZGlzdHJlc3NlZCwgaGF0ZWQsIG1hcnR5cidkLCBraWxsJ2QhCiAgICBVbmNvbWZvcnRhYmxlIHRpbWUsIHdoeSBjYW1lc3QgdGhvdSBub3cKICAgIFRvIG11cmRlciwgbXVyZGVyIG91ciBzb2xlbW5pdHkCiAgICBPIGNoaWxkISBPIGNoaWxkISBteSBzb3VsLCBhbmQgbm90IG15IGNoaWxkIQogICAgRGVhZCBhcnQgdGhvdSEgQWxhY2shIG15IGNoaWxkIGlzIGRlYWQ7CiAgICBBbmQgd2l0aCBteSBjaGlsZCBteSBqb3lzIGFyZSBidXJpZWQuCgpGUklBUiBMQVVSRU5DRQoKICAgIFBlYWNlLCBobywgZm9yIHNoYW1lISBjb25mdXNpb24ncyBjdXJlIGxpdmVzIG5vdAogICAgSW4gdGhlc2UgY29uZnVzaW9ucy4gSGVhdmVuIGFuZCB5b3Vyc2VsZgogICAgSGFkIHBhcnQgaW4gdGhpcyBmYWlyIG1haWQ7IG5vdyBoZWF2ZW4gaGF0aCBhbGwsCiAgICBBbmQgYWxsIHRoZSBiZXR0ZXIgaXMgaXQgZm9yIHRoZSBtYWlkOgogICAgWW91ciBwYXJ0IGluIGhlciB5b3UgY291bGQgbm90IGtlZXAgZnJvbSBkZWF0aCwKICAgIEJ1dCBoZWF2ZW4ga2VlcHMgaGlzIHBhcnQgaW4gZXRlcm5hbCBsaWZlLgogICAgVGhlIG1vc3QgeW91IHNvdWdodCB3YXMgaGVyIHByb21vdGlvbjsKICAgIEZvciAndHdhcyB5b3VyIGhlYXZlbiBzaGUgc2hvdWxkIGJlIGFkdmFuY2VkOgogICAgQW5kIHdlZXAgeWUgbm93LCBzZWVpbmcgc2hlIGlzIGFkdmFuY2VkCiAgICBBYm92ZSB0aGUgY2xvdWRzLCBhcyBoaWdoIGFzIGhlYXZlbiBpdHNlbGYCiAgICBPLCBpbiB0aGlzIGxvdmUsIHlvdSBsb3ZlIHlvdXIgY2hpbGQgc28gaWxsLAogICAgVGhhdCB5b3UgcnVuIG1hZCwgc2VlaW5nIHRoYXQgc2hlIGlzIHdlbGw6CiAgICBTaGUncyBub3Qgd2VsbCBtYXJyaWVkIHRoYXQgbGl2ZXMgbWFycmllZCBsb25nOwogICAgQnV0IHNoZSdzIGJlc3QgbWFycmllZCB0aGF0IGRpZXMgbWFycmllZCB5b3VuZy4KICAgIERyeSB1cCB5b3VyIHRlYXJzLCBhbmQgc3RpY2sgeW91ciByb3NlbWFyeQogICAgT24gdGhpcyBmYWlyIGNvcnNlOyBhbmQsIGFzIHRoZSBjdXN0b20gaXMsCiAgICBJbiBhbGwgaGVyIGJlc3QgYXJyYXkgYmVhciBoZXIgdG8gY2h1cmNoOgogICAgRm9yIHRob3VnaCBmb25kIG5hdHVyZSBiaWRzIHVzIGFuIGxhbWVudCwKICAgIFlldCBuYXR1cmUncyB0ZWFycyBhcmUgcmVhc29uJ3MgbWVycmltZW50LgoKQ0FQVUxFVAoKICAgIEFsbCB0aGluZ3MgdGhhdCB3ZSBvcmRhaW5lZCBmZXN0aXZhbCwKICAgIFR1cm4gZnJvbSB0aGVpciBvZmZpY2UgdG8gYmxhY2sgZnVuZXJhbDsKICAgIE91ciBpbnN0cnVtZW50cyB0byBtZWxhbmNob2x5IGJlbGxzLAogICAgT3VyIHdlZGRpbmcgY2hlZXIgdG8gYSBzYWQgYnVyaWFsIGZlYXN0LAogICAgT3VyIHNvbGVtbiBoeW1ucyB0byBzdWxsZW4gZGlyZ2VzIGNoYW5nZSwKICAgIE91ciBicmlkYWwgZmxvd2VycyBzZXJ2ZSBmb3IgYSBidXJpZWQgY29yc2UsCiAgICBBbmQgYWxsIHRoaW5ncyBjaGFuZ2UgdGhlbSB0byB0aGUgY29udHJhcnkuCgpGUklBUiBMQVVSRU5DRQoKICAgIFNpciwgZ28geW91IGluOyBhbmQsIG1hZGFtLCBnbyB3aXRoIGhpbTsKICAgIEFuZCBnbywgU2lyIFBhcmlzOyBldmVyeSBvbmUgcHJlcGFyZQogICAgVG8gZm9sbG93IHRoaXMgZmFpciBjb3JzZSB1bnRvIGhlciBncmF2ZToKICAgIFRoZSBoZWF2ZW5zIGRvIGxvdXIgdXBvbiB5b3UgZm9yIHNvbWUgaWxsOwogICAgTW92ZSB0aGVtIG5vIG1vcmUgYnkgY3Jvc3NpbmcgdGhlaXIgaGlnaCB3aWxsLgoKICAgIEV4ZXVudCBDQVBVTEVULCBMQURZIENBUFVMRVQsIFBBUklTLCBhbmQgRlJJQVIgTEFVUkVOQ0UKCkZpcnN0IE11c2ljaWFuCgogICAgRmFpdGgsIHdlIG1heSBwdXQgdXAgb3VyIHBpcGVzLCBhbmQgYmUgZ29uZS4KCk51cnNlCgogICAgSG9uZXN0IGdvb2RmZWxsb3dzLCBhaCwgcHV0IHVwLCBwdXQgdXA7CiAgICBGb3IsIHdlbGwgeW91IGtub3csIHRoaXMgaXMgYSBwaXRpZnVsIGNhc2UuCgogICAgRXhpdAoKRmlyc3QgTXVzaWNpYW4KCiAgICBBeSwgYnkgbXkgdHJvdGgsIHRoZSBjYXNlIG1heSBiZSBhbWVuZGVkLgoKICAgIEVudGVyIFBFVEVSCgpQRVRFUgoKICAgIE11c2ljaWFucywgTywgbXVzaWNpYW5zLCAnSGVhcnQncyBlYXNlLCBIZWFydCdzCiAgICBlYXNlOicgTywgYW4geW91IHdpbGwgaGF2ZSBtZSBsaXZlLCBwbGF5ICdIZWFydCdzIGVhc2UuJwoKRmlyc3QgTXVzaWNpYW4KCiAgICBXaHkgJ0hlYXJ0J3MgZWFzZT8nCgpQRVRFUgoKICAgIE8sIG11c2ljaWFucywgYmVjYXVzZSBteSBoZWFydCBpdHNlbGYgcGxheXMgJ015CiAgICBoZWFydCBpcyBmdWxsIG9mIHdvZTonIE8sIHBsYXkgbWUgc29tZSBtZXJyeSBkdW1wLAogICAgdG8gY29tZm9ydCBtZS4KCkZpcnN0IE11c2ljaWFuCgogICAgTm90IGEgZHVtcCB3ZTsgJ3RpcyBubyB0aW1lIHRvIHBsYXkgbm93LgoKUEVURVIKCiAgICBZb3Ugd2lsbCBub3QsIHRoZW4CgpGaXJzdCBNdXNpY2lhbgoKICAgIE5vLgoKUEVURVIKCiAgICBJIHdpbGwgdGhlbiBnaXZlIGl0IHlvdSBzb3VuZGx5LgoKRmlyc3QgTXVzaWNpYW4KCiAgICBXaGF0IHdpbGwgeW91IGdpdmUgdXMCgpQRVRFUgoKICAgIE5vIG1vbmV5LCBvbiBteSBmYWl0aCwgYnV0IHRoZSBnbGVlazsKICAgIEkgd2lsbCBnaXZlIHlvdSB0aGUgbWluc3RyZWwuCgpGaXJzdCBNdXNpY2lhbgoKICAgIFRoZW4gSSB3aWxsIGdpdmUgeW91IHRoZSBzZXJ2aW5nLWNyZWF0dXJlLgoKUEVURVIKCiAgICBUaGVuIHdpbGwgSSBsYXkgdGhlIHNlcnZpbmctY3JlYXR1cmUncyBkYWdnZXIgb24KICAgIHlvdXIgcGF0ZS4gSSB3aWxsIGNhcnJ5IG5vIGNyb3RjaGV0czogSSdsbCByZSB5b3UsCiAgICBJJ2xsIGZhIHlvdTsgZG8geW91IG5vdGUgbWUCgpGaXJzdCBNdXNpY2lhbgoKICAgIEFuIHlvdSByZSB1cyBhbmQgZmEgdXMsIHlvdSBub3RlIHVzLgoKU2Vjb25kIE11c2ljaWFuCgogICAgUHJheSB5b3UsIHB1dCB1cCB5b3VyIGRhZ2dlciwgYW5kIHB1dCBvdXQgeW91ciB3aXQuCgpQRVRFUgoKICAgIFRoZW4gaGF2ZSBhdCB5b3Ugd2l0aCBteSB3aXQhIEkgd2lsbCBkcnktYmVhdCB5b3UKICAgIHdpdGggYW4gaXJvbiB3aXQsIGFuZCBwdXQgdXAgbXkgaXJvbiBkYWdnZXIuIEFuc3dlcgogICAgbWUgbGlrZSBtZW46CiAgICAnV2hlbiBncmlwaW5nIGdyaWVmIHRoZSBoZWFydCBkb3RoIHdvdW5kLAogICAgQW5kIGRvbGVmdWwgZHVtcHMgdGhlIG1pbmQgb3BwcmVzcywKICAgIFRoZW4gbXVzaWMgd2l0aCBoZXIgc2lsdmVyIHNvdW5kJy0tCiAgICB3aHkgJ3NpbHZlciBzb3VuZCcIHdoeSAnbXVzaWMgd2l0aCBoZXIgc2lsdmVyCiAgICBzb3VuZCcIFdoYXQgc2F5IHlvdSwgU2ltb24gQ2F0bGluZz8KCk11c2ljaWFuCgogICAgTWFycnksIHNpciwgYmVjYXVzZSBzaWx2ZXIgaGF0aCBhIHN3ZWV0IHNvdW5kLgoKUEVURVIKCiAgICBQcmV0dHkhIFdoYXQgc2F5IHlvdSwgSHVnaCBSZWJlY2sCgpTZWNvbmQgTXVzaWNpYW4KCiAgICBJIHNheSAnc2lsdmVyIHNvdW5kLCcgYmVjYXVzZSBtdXNpY2lhbnMgc291bmQgZm9yIHNpbHZlci4KClBFVEVSCgogICAgUHJldHR5IHRvbyEgV2hhdCBzYXkgeW91LCBKYW1lcyBTb3VuZHBvc3QCgpUaGlyZCBNdXNpY2lhbgoKICAgIEZhaXRoLCBJIGtub3cgbm90IHdoYXQgdG8gc2F5LgoKUEVURVIKCiAgICBPLCBJIGNyeSB5b3UgbWVyY3k7IHlvdSBhcmUgdGhlIHNpbmdlcjogSSB3aWxsIHNheQogICAgZm9yIHlvdS4gSXQgaXMgJ211c2ljIHdpdGggaGVyIHNpbHZlciBzb3VuZCwnCiAgICBiZWNhdXNlIG11c2ljaWFucyBoYXZlIG5vIGdvbGQgZm9yIHNvdW5kaW5nOgogICAgJ1RoZW4gbXVzaWMgd2l0aCBoZXIgc2lsdmVyIHNvdW5kCiAgICBXaXRoIHNwZWVkeSBoZWxwIGRvdGggbGVuZCByZWRyZXNzLicKCiAgICBFeGl0CgpGaXJzdCBNdXNpY2lhbgoKICAgIFdoYXQgYSBwZXN0aWxlbnQga25hdmUgaXMgdGhpcyBzYW1lIQoKU2Vjb25kIE11c2ljaWFuCgogICAgSGFuZyBoaW0sIEphY2shIENvbWUsIHdlJ2xsIGluIGhlcmU7IHRhcnJ5IGZvciB0aGUKICAgIG1vdXJuZXJzLCBhbmQgc3RheSBkaW5uZXIuCgogICAgRXhldW50CgpBQ1QgVgpTQ0VORSBJLiBNYW50dWEuIEEgc3RyZWV0LgoKICAgIEVudGVyIFJPTUVPIAoKUk9NRU8KCiAgICBJZiBJIG1heSB0cnVzdCB0aGUgZmxhdHRlcmluZyB0cnV0aCBvZiBzbGVlcCwKICAgIE15IGRyZWFtcyBwcmVzYWdlIHNvbWUgam95ZnVsIG5ld3MgYXQgaGFuZDoKICAgIE15IGJvc29tJ3MgbG9yZCBzaXRzIGxpZ2h0bHkgaW4gaGlzIHRocm9uZTsKICAgIEFuZCBhbGwgdGhpcyBkYXkgYW4gdW5hY2N1c3RvbSdkIHNwaXJpdAogICAgTGlmdHMgbWUgYWJvdmUgdGhlIGdyb3VuZCB3aXRoIGNoZWVyZnVsIHRob3VnaHRzLgogICAgSSBkcmVhbXQgbXkgbGFkeSBjYW1lIGFuZCBmb3VuZCBtZSBkZWFkLS0KICAgIFN0cmFuZ2UgZHJlYW0sIHRoYXQgZ2l2ZXMgYSBkZWFkIG1hbiBsZWF2ZQogICAgdG8gdGhpbmshLS0KICAgIEFuZCBicmVhdGhlZCBzdWNoIGxpZmUgd2l0aCBraXNzZXMgaW4gbXkgbGlwcywKICAgIFRoYXQgSSByZXZpdmVkLCBhbmQgd2FzIGFuIGVtcGVyb3IuCiAgICBBaCBtZSEgaG93IHN3ZWV0IGlzIGxvdmUgaXRzZWxmIHBvc3Nlc3MnZCwKICAgIFdoZW4gYnV0IGxvdmUncyBzaGFkb3dzIGFyZSBzbyByaWNoIGluIGpveSEKCiAgICBFbnRlciBCQUxUSEFTQVIsIGJvb3RlZAogICAgTmV3cyBmcm9tIFZlcm9uYSEtLUhvdyBub3csIEJhbHRoYXNhciEKICAgIERvc3QgdGhvdSBub3QgYnJpbmcgbWUgbGV0dGVycyBmcm9tIHRoZSBmcmlhcj8KICAgIEhvdyBkb3RoIG15IGxhZHkIElzIG15IGZhdGhlciB3ZWxsPwogICAgSG93IGZhcmVzIG15IEp1bGlldD8gdGhhdCBJIGFzayBhZ2FpbjsKICAgIEZvciBub3RoaW5nIGNhbiBiZSBpbGwsIGlmIHNoZSBiZSB3ZWxsLgoKQkFMVEhBU0FSCgogICAgVGhlbiBzaGUgaXMgd2VsbCwgYW5kIG5vdGhpbmcgY2FuIGJlIGlsbDoKICAgIEhlciBib2R5IHNsZWVwcyBpbiBDYXBlbCdzIG1vbnVtZW50LAogICAgQW5kIGhlciBpbW1vcnRhbCBwYXJ0IHdpdGggYW5nZWxzIGxpdmVzLgogICAgSSBzYXcgaGVyIGxhaWQgbG93IGluIGhlciBraW5kcmVkJ3MgdmF1bHQsCiAgICBBbmQgcHJlc2VudGx5IHRvb2sgcG9zdCB0byB0ZWxsIGl0IHlvdToKICAgIE8sIHBhcmRvbiBtZSBmb3IgYnJpbmdpbmcgdGhlc2UgaWxsIG5ld3MsCiAgICBTaW5jZSB5b3UgZGlkIGxlYXZlIGl0IGZvciBteSBvZmZpY2UsIHNpci4KClJPTUVPCgogICAgSXMgaXQgZXZlbiBzbz8gdGhlbiBJIGRlZnkgeW91LCBzdGFycyEKICAgIFRob3Uga25vdydzdCBteSBsb2RnaW5nOiBnZXQgbWUgaW5rIGFuZCBwYXBlciwKICAgIEFuZCBoaXJlIHBvc3QtaG9yc2VzOyBJIHdpbGwgaGVuY2UgdG8tbmlnaHQuCgpCQUxUSEFTQVIKCiAgICBJIGRvIGJlc2VlY2ggeW91LCBzaXIsIGhhdmUgcGF0aWVuY2U6CiAgICBZb3VyIGxvb2tzIGFyZSBwYWxlIGFuZCB3aWxkLCBhbmQgZG8gaW1wb3J0CiAgICBTb21lIG1pc2FkdmVudHVyZS4KClJPTUVPCgogICAgVHVzaCwgdGhvdSBhcnQgZGVjZWl2ZWQ6CiAgICBMZWF2ZSBtZSwgYW5kIGRvIHRoZSB0aGluZyBJIGJpZCB0aGVlIGRvLgogICAgSGFzdCB0aG91IG5vIGxldHRlcnMgdG8gbWUgZnJvbSB0aGUgZnJpYXICgpCQUxUSEFTQVIKCiAgICBObywgbXkgZ29vZCBsb3JkLgoKUk9NRU8KCiAgICBObyBtYXR0ZXI6IGdldCB0aGVlIGdvbmUsCiAgICBBbmQgaGlyZSB0aG9zZSBob3JzZXM7IEknbGwgYmUgd2l0aCB0aGVlIHN0cmFpZ2h0LgoKICAgIEV4aXQgQkFMVEhBU0FSCiAgICBXZWxsLCBKdWxpZXQsIEkgd2lsbCBsaWUgd2l0aCB0aGVlIHRvLW5pZ2h0LgogICAgTGV0J3Mgc2VlIGZvciBtZWFuczogTyBtaXNjaGllZiwgdGhvdSBhcnQgc3dpZnQKICAgIFRvIGVudGVyIGluIHRoZSB0aG91Z2h0cyBvZiBkZXNwZXJhdGUgbWVuIQogICAgSSBkbyByZW1lbWJlciBhbiBhcG90aGVjYXJ5LC0tCiAgICBBbmQgaGVyZWFib3V0cyBoZSBkd2VsbHMsLS13aGljaCBsYXRlIEkgbm90ZWQKICAgIEluIHRhdHRlcidkIHdlZWRzLCB3aXRoIG92ZXJ3aGVsbWluZyBicm93cywKICAgIEN1bGxpbmcgb2Ygc2ltcGxlczsgbWVhZ3JlIHdlcmUgaGlzIGxvb2tzLAogICAgU2hhcnAgbWlzZXJ5IGhhZCB3b3JuIGhpbSB0byB0aGUgYm9uZXM6CiAgICBBbmQgaW4gaGlzIG5lZWR5IHNob3AgYSB0b3J0b2lzZSBodW5nLAogICAgQW4gYWxsaWdhdG9yIHN0dWZmJ2QsIGFuZCBvdGhlciBza2lucwogICAgT2YgaWxsLXNoYXBlZCBmaXNoZXM7IGFuZCBhYm91dCBoaXMgc2hlbHZlcwogICAgQSBiZWdnYXJseSBhY2NvdW50IG9mIGVtcHR5IGJveGVzLAogICAgR3JlZW4gZWFydGhlbiBwb3RzLCBibGFkZGVycyBhbmQgbXVzdHkgc2VlZHMsCiAgICBSZW1uYW50cyBvZiBwYWNrdGhyZWFkIGFuZCBvbGQgY2FrZXMgb2Ygcm9zZXMsCiAgICBXZXJlIHRoaW5seSBzY2F0dGVyJ2QsIHRvIG1ha2UgdXAgYSBzaG93LgogICAgTm90aW5nIHRoaXMgcGVudXJ5LCB0byBteXNlbGYgSSBzYWlkCiAgICAnQW4gaWYgYSBtYW4gZGlkIG5lZWQgYSBwb2lzb24gbm93LAogICAgV2hvc2Ugc2FsZSBpcyBwcmVzZW50IGRlYXRoIGluIE1hbnR1YSwKICAgIEhlcmUgbGl2ZXMgYSBjYWl0aWZmIHdyZXRjaCB3b3VsZCBzZWxsIGl0IGhpbS4nCiAgICBPLCB0aGlzIHNhbWUgdGhvdWdodCBkaWQgYnV0IGZvcmVydW4gbXkgbmVlZDsKICAgIEFuZCB0aGlzIHNhbWUgbmVlZHkgbWFuIG11c3Qgc2VsbCBpdCBtZS4KICAgIEFzIEkgcmVtZW1iZXIsIHRoaXMgc2hvdWxkIGJlIHRoZSBob3VzZS4KICAgIEJlaW5nIGhvbGlkYXksIHRoZSBiZWdnYXIncyBzaG9wIGlzIHNodXQuCiAgICBXaGF0LCBobyEgYXBvdGhlY2FyeSEKCiAgICBFbnRlciBBcG90aGVjYXJ5CgpBcG90aGVjYXJ5CgogICAgV2hvIGNhbGxzIHNvIGxvdWQCgpST01FTwoKICAgIENvbWUgaGl0aGVyLCBtYW4uIEkgc2VlIHRoYXQgdGhvdSBhcnQgcG9vcjoKICAgIEhvbGQsIHRoZXJlIGlzIGZvcnR5IGR1Y2F0czogbGV0IG1lIGhhdmUKICAgIEEgZHJhbSBvZiBwb2lzb24sIHN1Y2ggc29vbi1zcGVlZGluZyBnZWFyCiAgICBBcyB3aWxsIGRpc3BlcnNlIGl0c2VsZiB0aHJvdWdoIGFsbCB0aGUgdmVpbnMKICAgIFRoYXQgdGhlIGxpZmUtd2VhcnkgdGFrZXIgbWF5IGZhbGwgZGVhZAogICAgQW5kIHRoYXQgdGhlIHRydW5rIG1heSBiZSBkaXNjaGFyZ2VkIG9mIGJyZWF0aAogICAgQXMgdmlvbGVudGx5IGFzIGhhc3R5IHBvd2RlciBmaXJlZAogICAgRG90aCBodXJyeSBmcm9tIHRoZSBmYXRhbCBjYW5ub24ncyB3b21iLgoKQXBvdGhlY2FyeQoKICAgIFN1Y2ggbW9ydGFsIGRydWdzIEkgaGF2ZTsgYnV0IE1hbnR1YSdzIGxhdwogICAgSXMgZGVhdGggdG8gYW55IGhlIHRoYXQgdXR0ZXJzIHRoZW0uCgpST01FTwoKICAgIEFydCB0aG91IHNvIGJhcmUgYW5kIGZ1bGwgb2Ygd3JldGNoZWRuZXNzLAogICAgQW5kIGZlYXInc3QgdG8gZGllPyBmYW1pbmUgaXMgaW4gdGh5IGNoZWVrcywKICAgIE5lZWQgYW5kIG9wcHJlc3Npb24gc3RhcnZldGggaW4gdGhpbmUgZXllcywKICAgIENvbnRlbXB0IGFuZCBiZWdnYXJ5IGhhbmdzIHVwb24gdGh5IGJhY2s7CiAgICBUaGUgd29ybGQgaXMgbm90IHRoeSBmcmllbmQgbm9yIHRoZSB3b3JsZCdzIGxhdzsKICAgIFRoZSB3b3JsZCBhZmZvcmRzIG5vIGxhdyB0byBtYWtlIHRoZWUgcmljaDsKICAgIFRoZW4gYmUgbm90IHBvb3IsIGJ1dCBicmVhayBpdCwgYW5kIHRha2UgdGhpcy4KCkFwb3RoZWNhcnkKCiAgICBNeSBwb3ZlcnR5LCBidXQgbm90IG15IHdpbGwsIGNvbnNlbnRzLgoKUk9NRU8KCiAgICBJIHBheSB0aHkgcG92ZXJ0eSwgYW5kIG5vdCB0aHkgd2lsbC4KCkFwb3RoZWNhcnkKCiAgICBQdXQgdGhpcyBpbiBhbnkgbGlxdWlkIHRoaW5nIHlvdSB3aWxsLAogICAgQW5kIGRyaW5rIGl0IG9mZjsgYW5kLCBpZiB5b3UgaGFkIHRoZSBzdHJlbmd0aAogICAgT2YgdHdlbnR5IG1lbiwgaXQgd291bGQgZGlzcGF0Y2ggeW91IHN0cmFpZ2h0LgoKUk9NRU8KCiAgICBUaGVyZSBpcyB0aHkgZ29sZCwgd29yc2UgcG9pc29uIHRvIG1lbidzIHNvdWxzLAogICAgRG9pbmcgbW9yZSBtdXJkZXJzIGluIHRoaXMgbG9hdGhzb21lIHdvcmxkLAogICAgVGhhbiB0aGVzZSBwb29yIGNvbXBvdW5kcyB0aGF0IHRob3UgbWF5c3Qgbm90IHNlbGwuCiAgICBJIHNlbGwgdGhlZSBwb2lzb247IHRob3UgaGFzdCBzb2xkIG1lIG5vbmUuCiAgICBGYXJld2VsbDogYnV5IGZvb2QsIGFuZCBnZXQgdGh5c2VsZiBpbiBmbGVzaC4KICAgIENvbWUsIGNvcmRpYWwgYW5kIG5vdCBwb2lzb24sIGdvIHdpdGggbWUKICAgIFRvIEp1bGlldCdzIGdyYXZlOyBmb3IgdGhlcmUgbXVzdCBJIHVzZSB0aGVlLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBKT0hOIAoKRlJJQVIgSk9ITgoKICAgIEhvbHkgRnJhbmNpc2NhbiBmcmlhciEgYnJvdGhlciwgaG8hCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UKCkZSSUFSIExBVVJFTkNFCgogICAgVGhpcyBzYW1lIHNob3VsZCBiZSB0aGUgdm9pY2Ugb2YgRnJpYXIgSm9obi4KICAgIFdlbGNvbWUgZnJvbSBNYW50dWE6IHdoYXQgc2F5cyBSb21lbz8KICAgIE9yLCBpZiBoaXMgbWluZCBiZSB3cml0LCBnaXZlIG1lIGhpcyBsZXR0ZXIuCgpGUklBUiBKT0hOCgogICAgR29pbmcgdG8gZmluZCBhIGJhcmUtZm9vdCBicm90aGVyIG91dAogICAgT25lIG9mIG91ciBvcmRlciwgdG8gYXNzb2NpYXRlIG1lLAogICAgSGVyZSBpbiB0aGlzIGNpdHkgdmlzaXRpbmcgdGhlIHNpY2ssCiAgICBBbmQgZmluZGluZyBoaW0sIHRoZSBzZWFyY2hlcnMgb2YgdGhlIHRvd24sCiAgICBTdXNwZWN0aW5nIHRoYXQgd2UgYm90aCB3ZXJlIGluIGEgaG91c2UKICAgIFdoZXJlIHRoZSBpbmZlY3Rpb3VzIHBlc3RpbGVuY2UgZGlkIHJlaWduLAogICAgU2VhbCdkIHVwIHRoZSBkb29ycywgYW5kIHdvdWxkIG5vdCBsZXQgdXMgZm9ydGg7CiAgICBTbyB0aGF0IG15IHNwZWVkIHRvIE1hbnR1YSB0aGVyZSB3YXMgc3RheSdkLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXaG8gYmFyZSBteSBsZXR0ZXIsIHRoZW4sIHRvIFJvbWVvPwoKRlJJQVIgSk9ITgoKICAgIEkgY291bGQgbm90IHNlbmQgaXQsLS1oZXJlIGl0IGlzIGFnYWluLC0tCiAgICBOb3IgZ2V0IGEgbWVzc2VuZ2VyIHRvIGJyaW5nIGl0IHRoZWUsCiAgICBTbyBmZWFyZnVsIHdlcmUgdGhleSBvZiBpbmZlY3Rpb24uCgpGUklBUiBMQVVSRU5DRQoKICAgIFVuaGFwcHkgZm9ydHVuZSEgYnkgbXkgYnJvdGhlcmhvb2QsCiAgICBUaGUgbGV0dGVyIHdhcyBub3QgbmljZSBidXQgZnVsbCBvZiBjaGFyZ2UKICAgIE9mIGRlYXIgaW1wb3J0LCBhbmQgdGhlIG5lZ2xlY3RpbmcgaXQKICAgIE1heSBkbyBtdWNoIGRhbmdlci4gRnJpYXIgSm9obiwgZ28gaGVuY2U7CiAgICBHZXQgbWUgYW4gaXJvbiBjcm93LCBhbmQgYnJpbmcgaXQgc3RyYWlnaHQKICAgIFVudG8gbXkgY2VsbC4KCkZSSUFSIEpPSE4KCiAgICBCcm90aGVyLCBJJ2xsIGdvIGFuZCBicmluZyBpdCB0aGVlLgoKICAgIEV4aXQKCkZSSUFSIExBVVJFTkNFCgogICAgTm93IG11c3QgSSB0byB0aGUgbW9udW1lbnQgYWxvbmU7CiAgICBXaXRoaW4gdGhyZWUgaG91cnMgd2lsbCBmYWlyIEp1bGlldCB3YWtlOgogICAgU2hlIHdpbGwgYmVzaHJldyBtZSBtdWNoIHRoYXQgUm9tZW8KICAgIEhhdGggaGFkIG5vIG5vdGljZSBvZiB0aGVzZSBhY2NpZGVudHM7CiAgICBCdXQgSSB3aWxsIHdyaXRlIGFnYWluIHRvIE1hbnR1YSwKICAgIEFuZCBrZWVwIGhlciBhdCBteSBjZWxsIHRpbGwgUm9tZW8gY29tZTsKICAgIFBvb3IgbGl2aW5nIGNvcnNlLCBjbG9zZWQgaW4gYSBkZWFkIG1hbidzIHRvbWIhCgogICAgRXhpdAoKU0NFTkUgSUlJLiBBIGNodXJjaHlhcmQ7IGluIGl0IGEgdG9tYiBiZWxvbmdpbmcgdG8gdGhlIENhcHVsZXRzLgoKICAgIEVudGVyIFBBUklTLCBhbmQgaGlzIFBhZ2UgYmVhcmluZyBmbG93ZXJzIGFuZCBhIHRvcmNoIAoKUEFSSVMKCiAgICBHaXZlIG1lIHRoeSB0b3JjaCwgYm95OiBoZW5jZSwgYW5kIHN0YW5kIGFsb29mOgogICAgWWV0IHB1dCBpdCBvdXQsIGZvciBJIHdvdWxkIG5vdCBiZSBzZWVuLgogICAgVW5kZXIgeW9uZCB5ZXctdHJlZXMgbGF5IHRoZWUgYWxsIGFsb25nLAogICAgSG9sZGluZyB0aGluZSBlYXIgY2xvc2UgdG8gdGhlIGhvbGxvdyBncm91bmQ7CiAgICBTbyBzaGFsbCBubyBmb290IHVwb24gdGhlIGNodXJjaHlhcmQgdHJlYWQsCiAgICBCZWluZyBsb29zZSwgdW5maXJtLCB3aXRoIGRpZ2dpbmcgdXAgb2YgZ3JhdmVzLAogICAgQnV0IHRob3Ugc2hhbHQgaGVhciBpdDogd2hpc3RsZSB0aGVuIHRvIG1lLAogICAgQXMgc2lnbmFsIHRoYXQgdGhvdSBoZWFyJ3N0IHNvbWV0aGluZyBhcHByb2FjaC4KICAgIEdpdmUgbWUgdGhvc2UgZmxvd2Vycy4gRG8gYXMgSSBiaWQgdGhlZSwgZ28uCgpQQUdFCgogICAgW0FzaWRlXSBJIGFtIGFsbW9zdCBhZnJhaWQgdG8gc3RhbmQgYWxvbmUKICAgIEhlcmUgaW4gdGhlIGNodXJjaHlhcmQ7IHlldCBJIHdpbGwgYWR2ZW50dXJlLgoKICAgIFJldGlyZXMKClBBUklTCgogICAgU3dlZXQgZmxvd2VyLCB3aXRoIGZsb3dlcnMgdGh5IGJyaWRhbCBiZWQgSSBzdHJldywtLQogICAgTyB3b2UhIHRoeSBjYW5vcHkgaXMgZHVzdCBhbmQgc3RvbmVzOy0tCiAgICBXaGljaCB3aXRoIHN3ZWV0IHdhdGVyIG5pZ2h0bHkgSSB3aWxsIGRldywKICAgIE9yLCB3YW50aW5nIHRoYXQsIHdpdGggdGVhcnMgZGlzdGlsbCdkIGJ5IG1vYW5zOgogICAgVGhlIG9ic2VxdWllcyB0aGF0IEkgZm9yIHRoZWUgd2lsbCBrZWVwCiAgICBOaWdodGx5IHNoYWxsIGJlIHRvIHN0cmV3IHRoeSBncmF2ZSBhbmQgd2VlcC4KCiAgICBUaGUgUGFnZSB3aGlzdGxlcwogICAgVGhlIGJveSBnaXZlcyB3YXJuaW5nIHNvbWV0aGluZyBkb3RoIGFwcHJvYWNoLgogICAgV2hhdCBjdXJzZWQgZm9vdCB3YW5kZXJzIHRoaXMgd2F5IHRvLW5pZ2h0LAogICAgVG8gY3Jvc3MgbXkgb2JzZXF1aWVzIGFuZCB0cnVlIGxvdmUncyByaXRlPwogICAgV2hhdCB3aXRoIGEgdG9yY2ghIG11ZmZsZSBtZSwgbmlnaHQsIGF3aGlsZS4KCiAgICBSZXRpcmVzCgogICAgRW50ZXIgUk9NRU8gYW5kIEJBTFRIQVNBUiwgd2l0aCBhIHRvcmNoLCBtYXR0b2NrLCAmIGMKClJPTUVPCgogICAgR2l2ZSBtZSB0aGF0IG1hdHRvY2sgYW5kIHRoZSB3cmVuY2hpbmcgaXJvbi4KICAgIEhvbGQsIHRha2UgdGhpcyBsZXR0ZXI7IGVhcmx5IGluIHRoZSBtb3JuaW5nCiAgICBTZWUgdGhvdSBkZWxpdmVyIGl0IHRvIG15IGxvcmQgYW5kIGZhdGhlci4KICAgIEdpdmUgbWUgdGhlIGxpZ2h0OiB1cG9uIHRoeSBsaWZlLCBJIGNoYXJnZSB0aGVlLAogICAgV2hhdGUnZXIgdGhvdSBoZWFyJ3N0IG9yIHNlZXN0LCBzdGFuZCBhbGwgYWxvb2YsCiAgICBBbmQgZG8gbm90IGludGVycnVwdCBtZSBpbiBteSBjb3Vyc2UuCiAgICBXaHkgSSBkZXNjZW5kIGludG8gdGhpcyBiZWQgb2YgZGVhdGgsCiAgICBJcyBwYXJ0bHkgdG8gYmVob2xkIG15IGxhZHkncyBmYWNlOwogICAgQnV0IGNoaWVmbHkgdG8gdGFrZSB0aGVuY2UgZnJvbSBoZXIgZGVhZCBmaW5nZXIKICAgIEEgcHJlY2lvdXMgcmluZywgYSByaW5nIHRoYXQgSSBtdXN0IHVzZQogICAgSW4gZGVhciBlbXBsb3ltZW50OiB0aGVyZWZvcmUgaGVuY2UsIGJlIGdvbmU6CiAgICBCdXQgaWYgdGhvdSwgamVhbG91cywgZG9zdCByZXR1cm4gdG8gcHJ5CiAgICBJbiB3aGF0IEkgZnVydGhlciBzaGFsbCBpbnRlbmQgdG8gZG8sCiAgICBCeSBoZWF2ZW4sIEkgd2lsbCB0ZWFyIHRoZWUgam9pbnQgYnkgam9pbnQKICAgIEFuZCBzdHJldyB0aGlzIGh1bmdyeSBjaHVyY2h5YXJkIHdpdGggdGh5IGxpbWJzOgogICAgVGhlIHRpbWUgYW5kIG15IGludGVudHMgYXJlIHNhdmFnZS13aWxkLAogICAgTW9yZSBmaWVyY2UgYW5kIG1vcmUgaW5leG9yYWJsZSBmYXIKICAgIFRoYW4gZW1wdHkgdGlnZXJzIG9yIHRoZSByb2FyaW5nIHNlYS4KCkJBTFRIQVNBUgoKICAgIEkgd2lsbCBiZSBnb25lLCBzaXIsIGFuZCBub3QgdHJvdWJsZSB5b3UuCgpST01FTwoKICAgIFNvIHNoYWx0IHRob3Ugc2hvdyBtZSBmcmllbmRzaGlwLiBUYWtlIHRob3UgdGhhdDoKICAgIExpdmUsIGFuZCBiZSBwcm9zcGVyb3VzOiBhbmQgZmFyZXdlbGwsIGdvb2QgZmVsbG93LgoKQkFMVEhBU0FSCgogICAgW0FzaWRlXSBGb3IgYWxsIHRoaXMgc2FtZSwgSSdsbCBoaWRlIG1lIGhlcmVhYm91dDoKICAgIEhpcyBsb29rcyBJIGZlYXIsIGFuZCBoaXMgaW50ZW50cyBJIGRvdWJ0LgoKICAgIFJldGlyZXMKClJPTUVPCgogICAgVGhvdSBkZXRlc3RhYmxlIG1hdywgdGhvdSB3b21iIG9mIGRlYXRoLAogICAgR29yZ2VkIHdpdGggdGhlIGRlYXJlc3QgbW9yc2VsIG9mIHRoZSBlYXJ0aCwKICAgIFRodXMgSSBlbmZvcmNlIHRoeSByb3R0ZW4gamF3cyB0byBvcGVuLAogICAgQW5kLCBpbiBkZXNwaXRlLCBJJ2xsIGNyYW0gdGhlZSB3aXRoIG1vcmUgZm9vZCEKCiAgICBPcGVucyB0aGUgdG9tYgoKUEFSSVMKCiAgICBUaGlzIGlzIHRoYXQgYmFuaXNoJ2QgaGF1Z2h0eSBNb250YWd1ZSwKICAgIFRoYXQgbXVyZGVyJ2QgbXkgbG92ZSdzIGNvdXNpbiwgd2l0aCB3aGljaCBncmllZiwKICAgIEl0IGlzIHN1cHBvc2VkLCB0aGUgZmFpciBjcmVhdHVyZSBkaWVkOwogICAgQW5kIGhlcmUgaXMgY29tZSB0byBkbyBzb21lIHZpbGxhbm91cyBzaGFtZQogICAgVG8gdGhlIGRlYWQgYm9kaWVzOiBJIHdpbGwgYXBwcmVoZW5kIGhpbS4KCiAgICBDb21lcyBmb3J3YXJkCiAgICBTdG9wIHRoeSB1bmhhbGxvdydkIHRvaWwsIHZpbGUgTW9udGFndWUhCiAgICBDYW4gdmVuZ2VhbmNlIGJlIHB1cnN1ZWQgZnVydGhlciB0aGFuIGRlYXRoPwogICAgQ29uZGVtbmVkIHZpbGxhaW4sIEkgZG8gYXBwcmVoZW5kIHRoZWU6CiAgICBPYmV5LCBhbmQgZ28gd2l0aCBtZTsgZm9yIHRob3UgbXVzdCBkaWUuCgpST01FTwoKICAgIEkgbXVzdCBpbmRlZWQ7IGFuZCB0aGVyZWZvcmUgY2FtZSBJIGhpdGhlci4KICAgIEdvb2QgZ2VudGxlIHlvdXRoLCB0ZW1wdCBub3QgYSBkZXNwZXJhdGUgbWFuOwogICAgRmx5IGhlbmNlLCBhbmQgbGVhdmUgbWU6IHRoaW5rIHVwb24gdGhlc2UgZ29uZTsKICAgIExldCB0aGVtIGFmZnJpZ2h0IHRoZWUuIEkgYmVzZWVjaCB0aGVlLCB5b3V0aCwKICAgIFB1dCBub3QgYW5vdGhlciBzaW4gdXBvbiBteSBoZWFkLAogICAgQnkgdXJnaW5nIG1lIHRvIGZ1cnk6IE8sIGJlIGdvbmUhCiAgICBCeSBoZWF2ZW4sIEkgbG92ZSB0aGVlIGJldHRlciB0aGFuIG15c2VsZjsKICAgIEZvciBJIGNvbWUgaGl0aGVyIGFybSdkIGFnYWluc3QgbXlzZWxmOgogICAgU3RheSBub3QsIGJlIGdvbmU7IGxpdmUsIGFuZCBoZXJlYWZ0ZXIgc2F5LAogICAgQSBtYWRtYW4ncyBtZXJjeSBiYWRlIHRoZWUgcnVuIGF3YXkuCgpQQVJJUwoKICAgIEkgZG8gZGVmeSB0aHkgY29uanVyYXRpb25zLAogICAgQW5kIGFwcHJlaGVuZCB0aGVlIGZvciBhIGZlbG9uIGhlcmUuCgpST01FTwoKICAgIFdpbHQgdGhvdSBwcm92b2tlIG1lPyB0aGVuIGhhdmUgYXQgdGhlZSwgYm95IQoKICAgIFRoZXkgZmlnaHQKClBBR0UKCiAgICBPIExvcmQsIHRoZXkgZmlnaHQhIEkgd2lsbCBnbyBjYWxsIHRoZSB3YXRjaC4KCiAgICBFeGl0CgpQQVJJUwoKICAgIE8sIEkgYW0gc2xhaW4hCgogICAgRmFsbHMKICAgIElmIHRob3UgYmUgbWVyY2lmdWwsCiAgICBPcGVuIHRoZSB0b21iLCBsYXkgbWUgd2l0aCBKdWxpZXQuCgogICAgRGllcwoKUk9NRU8KCiAgICBJbiBmYWl0aCwgSSB3aWxsLiBMZXQgbWUgcGVydXNlIHRoaXMgZmFjZS4KICAgIE1lcmN1dGlvJ3Mga2luc21hbiwgbm9ibGUgQ291bnR5IFBhcmlzIQogICAgV2hhdCBzYWlkIG15IG1hbiwgd2hlbiBteSBiZXRvc3NlZCBzb3VsCiAgICBEaWQgbm90IGF0dGVuZCBoaW0gYXMgd2Ugcm9kZT8gSSB0aGluawogICAgSGUgdG9sZCBtZSBQYXJpcyBzaG91bGQgaGF2ZSBtYXJyaWVkIEp1bGlldDoKICAgIFNhaWQgaGUgbm90IHNvPyBvciBkaWQgSSBkcmVhbSBpdCBzbz8KICAgIE9yIGFtIEkgbWFkLCBoZWFyaW5nIGhpbSB0YWxrIG9mIEp1bGlldCwKICAgIFRvIHRoaW5rIGl0IHdhcyBzbz8gTywgZ2l2ZSBtZSB0aHkgaGFuZCwKICAgIE9uZSB3cml0IHdpdGggbWUgaW4gc291ciBtaXNmb3J0dW5lJ3MgYm9vayEKICAgIEknbGwgYnVyeSB0aGVlIGluIGEgdHJpdW1waGFudCBncmF2ZTsKICAgIEEgZ3JhdmUIE8gbm8hIGEgbGFudGVybiwgc2xhdWdodGVyJ2QgeW91dGgsCiAgICBGb3IgaGVyZSBsaWVzIEp1bGlldCwgYW5kIGhlciBiZWF1dHkgbWFrZXMKICAgIFRoaXMgdmF1bHQgYSBmZWFzdGluZyBwcmVzZW5jZSBmdWxsIG9mIGxpZ2h0LgogICAgRGVhdGgsIGxpZSB0aG91IHRoZXJlLCBieSBhIGRlYWQgbWFuIGludGVycidkLgoKICAgIExheWluZyBQQVJJUyBpbiB0aGUgdG9tYgogICAgSG93IG9mdCB3aGVuIG1lbiBhcmUgYXQgdGhlIHBvaW50IG9mIGRlYXRoCiAgICBIYXZlIHRoZXkgYmVlbiBtZXJyeSEgd2hpY2ggdGhlaXIga2VlcGVycyBjYWxsCiAgICBBIGxpZ2h0bmluZyBiZWZvcmUgZGVhdGg6IE8sIGhvdyBtYXkgSQogICAgQ2FsbCB0aGlzIGEgbGlnaHRuaW5nPyBPIG15IGxvdmUhIG15IHdpZmUhCiAgICBEZWF0aCwgdGhhdCBoYXRoIHN1Y2snZCB0aGUgaG9uZXkgb2YgdGh5IGJyZWF0aCwKICAgIEhhdGggaGFkIG5vIHBvd2VyIHlldCB1cG9uIHRoeSBiZWF1dHk6CiAgICBUaG91IGFydCBub3QgY29ucXVlcidkOyBiZWF1dHkncyBlbnNpZ24geWV0CiAgICBJcyBjcmltc29uIGluIHRoeSBsaXBzIGFuZCBpbiB0aHkgY2hlZWtzLAogICAgQW5kIGRlYXRoJ3MgcGFsZSBmbGFnIGlzIG5vdCBhZHZhbmNlZCB0aGVyZS4KICAgIFR5YmFsdCwgbGllc3QgdGhvdSB0aGVyZSBpbiB0aHkgYmxvb2R5IHNoZWV0PwogICAgTywgd2hhdCBtb3JlIGZhdm91ciBjYW4gSSBkbyB0byB0aGVlLAogICAgVGhhbiB3aXRoIHRoYXQgaGFuZCB0aGF0IGN1dCB0aHkgeW91dGggaW4gdHdhaW4KICAgIFRvIHN1bmRlciBoaXMgdGhhdCB3YXMgdGhpbmUgZW5lbXkCiAgICBGb3JnaXZlIG1lLCBjb3VzaW4hIEFoLCBkZWFyIEp1bGlldCwKICAgIFdoeSBhcnQgdGhvdSB5ZXQgc28gZmFpcj8gc2hhbGwgSSBiZWxpZXZlCiAgICBUaGF0IHVuc3Vic3RhbnRpYWwgZGVhdGggaXMgYW1vcm91cywKICAgIEFuZCB0aGF0IHRoZSBsZWFuIGFiaG9ycmVkIG1vbnN0ZXIga2VlcHMKICAgIFRoZWUgaGVyZSBpbiBkYXJrIHRvIGJlIGhpcyBwYXJhbW91cj8KICAgIEZvciBmZWFyIG9mIHRoYXQsIEkgc3RpbGwgd2lsbCBzdGF5IHdpdGggdGhlZTsKICAgIEFuZCBuZXZlciBmcm9tIHRoaXMgcGFsYWNlIG9mIGRpbSBuaWdodAogICAgRGVwYXJ0IGFnYWluOiBoZXJlLCBoZXJlIHdpbGwgSSByZW1haW4KICAgIFdpdGggd29ybXMgdGhhdCBhcmUgdGh5IGNoYW1iZXItbWFpZHM7IE8sIGhlcmUKICAgIFdpbGwgSSBzZXQgdXAgbXkgZXZlcmxhc3RpbmcgcmVzdCwKICAgIEFuZCBzaGFrZSB0aGUgeW9rZSBvZiBpbmF1c3BpY2lvdXMgc3RhcnMKICAgIEZyb20gdGhpcyB3b3JsZC13ZWFyaWVkIGZsZXNoLiBFeWVzLCBsb29rIHlvdXIgbGFzdCEKICAgIEFybXMsIHRha2UgeW91ciBsYXN0IGVtYnJhY2UhIGFuZCwgbGlwcywgTyB5b3UKICAgIFRoZSBkb29ycyBvZiBicmVhdGgsIHNlYWwgd2l0aCBhIHJpZ2h0ZW91cyBraXNzCiAgICBBIGRhdGVsZXNzIGJhcmdhaW4gdG8gZW5ncm9zc2luZyBkZWF0aCEKICAgIENvbWUsIGJpdHRlciBjb25kdWN0LCBjb21lLCB1bnNhdm91cnkgZ3VpZGUhCiAgICBUaG91IGRlc3BlcmF0ZSBwaWxvdCwgbm93IGF0IG9uY2UgcnVuIG9uCiAgICBUaGUgZGFzaGluZyByb2NrcyB0aHkgc2VhLXNpY2sgd2VhcnkgYmFyayEKICAgIEhlcmUncyB0byBteSBsb3ZlIQoKICAgIERyaW5rcwogICAgTyB0cnVlIGFwb3RoZWNhcnkhCiAgICBUaHkgZHJ1Z3MgYXJlIHF1aWNrLiBUaHVzIHdpdGggYSBraXNzIEkgZGllLgoKICAgIERpZXMKCiAgICBFbnRlciwgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgY2h1cmNoeWFyZCwgRlJJQVIgTEFVUkVOQ0UsIHdpdGggYSBsYW50ZXJuLCBjcm93LCBhbmQgc3BhZGUKCkZSSUFSIExBVVJFTkNFCgogICAgU2FpbnQgRnJhbmNpcyBiZSBteSBzcGVlZCEgaG93IG9mdCB0by1uaWdodAogICAgSGF2ZSBteSBvbGQgZmVldCBzdHVtYmxlZCBhdCBncmF2ZXMhIFdobydzIHRoZXJlPwoKQkFMVEhBU0FSCgogICAgSGVyZSdzIG9uZSwgYSBmcmllbmQsIGFuZCBvbmUgdGhhdCBrbm93cyB5b3Ugd2VsbC4KCkZSSUFSIExBVVJFTkNFCgogICAgQmxpc3MgYmUgdXBvbiB5b3UhIFRlbGwgbWUsIGdvb2QgbXkgZnJpZW5kLAogICAgV2hhdCB0b3JjaCBpcyB5b25kLCB0aGF0IHZhaW5seSBsZW5kcyBoaXMgbGlnaHQKICAgIFRvIGdydWJzIGFuZCBleWVsZXNzIHNrdWxscz8gYXMgSSBkaXNjZXJuLAogICAgSXQgYnVybmV0aCBpbiB0aGUgQ2FwZWwncyBtb251bWVudC4KCkJBTFRIQVNBUgoKICAgIEl0IGRvdGggc28sIGhvbHkgc2lyOyBhbmQgdGhlcmUncyBteSBtYXN0ZXIsCiAgICBPbmUgdGhhdCB5b3UgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2hvIGlzIGl0PwoKQkFMVEhBU0FSCgogICAgUm9tZW8uCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvdyBsb25nIGhhdGggaGUgYmVlbiB0aGVyZT8KCkJBTFRIQVNBUgoKICAgIEZ1bGwgaGFsZiBhbiBob3VyLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHbyB3aXRoIG1lIHRvIHRoZSB2YXVsdC4KCkJBTFRIQVNBUgoKICAgIEkgZGFyZSBub3QsIHNpcgogICAgTXkgbWFzdGVyIGtub3dzIG5vdCBidXQgSSBhbSB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CwgYm95OiB3aGljaCB3YXkCgpKVUxJRVQKCiAgICBZZWEsIG5vaXNlPyB0aGVuIEknbGwgYmUgYnJpZWYuIE8gaGFwcHkgZGFnZ2VyIQoKICAgIFNuYXRjaGluZyBST01FTydzIGRhZ2dlcgogICAgVGhpcyBpcyB0aHkgc2hlYXRoOwoKICAgIFN0YWJzIGhlcnNlbGYKICAgIHRoZXJlIHJ1c3QsIGFuZCBsZXQgbWUgZGllLgoKICAgIEZhbGxzIG9uIFJPTUVPJ3MgYm9keSwgYW5kIGRpZXMKCiAgICBFbnRlciBXYXRjaCwgd2l0aCB0aGUgUGFnZSBvZiBQQVJJUwoKUEFHRQoKICAgIFRoaXMgaXMgdGhlIHBsYWNlOyB0aGVyZSwgd2hlcmUgdGhlIHRvcmNoIGRvdGggYnVybi4KCkZpcnN0IFdhdGNobWFuCgogICAgVGhlIGdyb3VuZCBpcyBibG9vZHk7IHNlYXJjaCBhYm91dCB0aGUgY2h1cmNoeWFyZDoKICAgIEdvLCBzb21lIG9mIHlvdSwgd2hvZSdlciB5b3UgZmluZCBhdHRhY2guCiAgICBQaXRpZnVsIHNpZ2h0ISBoZXJlIGxpZXMgdGhlIGNvdW50eSBzbGFpbiwKICAgIEFuZCBKdWxpZXQgYmxlZWRpbmcsIHdhcm0sIGFuZCBuZXdseSBkZWFkLAogICAgV2hvIGhlcmUgaGF0aCBsYWluIHRoZXNlIHR3byBkYXlzIGJ1cmllZC4KICAgIEdvLCB0ZWxsIHRoZSBwcmluY2U6IHJ1biB0byB0aGUgQ2FwdWxldHM6CiAgICBSYWlzZSB1cCB0aGUgTW9udGFndWVzOiBzb21lIG90aGVycyBzZWFyY2g6CiAgICBXZSBzZWUgdGhlIGdyb3VuZCB3aGVyZW9uIHRoZXNlIHdvZXMgZG8gbGllOwogICAgQnV0IHRoZSB0cnVlIGdyb3VuZCBvZiBhbGwgdGhlc2UgcGl0ZW91cyB3b2VzCiAgICBXZSBjYW5ub3Qgd2l0aG91dCBjaXJjdW1zdGFuY2UgZGVzY3J5LgoKICAgIFJlLWVudGVyIHNvbWUgb2YgdGhlIFdhdGNoLCB3aXRoIEJBTFRIQVNBUgoKU2Vjb25kIFdhdGNobWFuCgogICAgSGVyZSdzIFJvbWVvJ3MgbWFuOyB3ZSBmb3VuZCBoaW0gaW4gdGhlIGNodXJjaHlhcmQuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhvbGQgaGltIGluIHNhZmV0eSwgdGlsbCB0aGUgcHJpbmNlIGNvbWUgaGl0aGVyLgoKICAgIFJlLWVudGVyIG90aGVycyBvZiB0aGUgV2F0Y2gsIHdpdGggRlJJQVIgTEFVUkVOQ0UKClRoaXJkIFdhdGNobWFuCgogICAgSGVyZSBpcyBhIGZyaWFyLCB0aGF0IHRyZW1ibGVzLCBzaWdocyBhbmQgd2VlcHM6CiAgICBXZSB0b29rIHRoaXMgbWF0dG9jayBhbmQgdGhpcyBzcGFkZSBmcm9tIGhpbSwKICAgIEFzIGhlIHdhcyBjb21pbmcgZnJvbSB0aGlzIGNodXJjaHlhcmQgc2lkZS4KCkZpcnN0IFdhdGNobWFuCgogICAgQSBncmVhdCBzdXNwaWNpb246IHN0YXkgdGhlIGZyaWFyIHRvby4KCiAgICBFbnRlciB0aGUgUFJJTkNFIGFuZCBBdHRlbmRhbnRzCgpQUklOQ0UKCiAgICBXaGF0IG1pc2FkdmVudHVyZSBpcyBzbyBlYXJseSB1cCwKICAgIFRoYXQgY2FsbHMgb3VyIHBlcnNvbiBmcm9tIG91ciBtb3JuaW5nJ3MgcmVzdD8KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIGFuZCBvdGhlcnMKCkNBUFVMRVQKCiAgICBXaGF0IHNob3VsZCBpdCBiZSwgdGhhdCB0aGV5IHNvIHNocmllayBhYnJvYWQCgpMQURZIENBUFVMRVQKCiAgICBUaGUgcGVvcGxlIGluIHRoZSBzdHJlZXQgY3J5IFJvbWVvLAogICAgU29tZSBKdWxpZXQsIGFuZCBzb21lIFBhcmlzOyBhbmQgYWxsIHJ1biwKICAgIFdpdGggb3BlbiBvdXRjcnkgdG93YXJkIG91ciBtb251bWVudC4KClBSSU5DRQoKICAgIFdoYXQgZmVhciBpcyB0aGlzIHdoaWNoIHN0YXJ0bGVzIGluIG91ciBlYXJzPwoKRmlyc3QgV2F0Y2htYW4KCiAgICBTb3ZlcmVpZ24sIGhlcmUgbGllcyB0aGUgQ291bnR5IFBhcmlzIHNsYWluOwogICAgQW5kIFJvbWVvIGRlYWQ7IGFuZCBKdWxpZXQsIGRlYWQgYmVmb3JlLAogICAgV2FybSBhbmQgbmV3IGtpbGwnZC4KClBSSU5DRQoKICAgIFNlYXJjaCwgc2VlaywgYW5kIGtub3cgaG93IHRoaXMgZm91bCBtdXJkZXIgY29tZXMuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhlcmUgaXMgYSBmcmlhciwgYW5kIHNsYXVnaHRlcidkIFJvbWVvJ3MgbWFuOwogICAgV2l0aCBpbnN0cnVtZW50cyB1cG9uIHRoZW0sIGZpdCB0byBvcGVuCiAgICBUaGVzZSBkZWFkIG1lbidzIHRvbWJzLgoKQ0FQVUxFVAoKICAgIE8gaGVhdmVucyEgTyB3aWZlLCBsb29rIGhvdyBvdXIgZGF1Z2h0ZXIgYmxlZWRzIQogICAgVGhpcyBkYWdnZXIgaGF0aCBtaXN0YSdlbi0tZm9yLCBsbywgaGlzIGhvdXNlCiAgICBJcyBlbXB0eSBvbiB0aGUgYmFjayBvZiBNb250YWd1ZSwtLQogICAgQW5kIGl0IG1pcy1zaGVhdGhlZCBpbiBteSBkYXVnaHRlcidzIGJvc29tIQoKTEFEWSBDQVBVTEVUCgogICAgTyBtZSEgdGhpcyBzaWdodCBvZiBkZWF0aCBpcyBhcyBhIGJlbGwsCiAgICBUaGF0IHdhcm5zIG15IG9sZCBhZ2UgdG8gYSBzZXB1bGNocmUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIG90aGVycwoKUFJJTkNFCgogICAgQ29tZSwgTW9udGFndWU7IGZvciB0aG91IGFydCBlYXJseSB1cCwKICAgIFRvIHNlZSB0aHkgc29uIGFuZCBoZWlyIG1vcmUgZWFybHkgZG93bi4KCk1PTlRBR1VFCgogICAgQWxhcywgbXkgbGllZ2UsIG15IHdpZmUgaXMgZGVhZCB0by1uaWdodDsKICAgIEdyaWVmIG9mIG15IHNvbidzIGV4aWxlIGhhdGggc3RvcHAnZCBoZXIgYnJlYXRoOgogICAgV2hhdCBmdXJ0aGVyIHdvZSBjb25zcGlyZXMgYWdhaW5zdCBtaW5lIGFnZT8KClBSSU5DRQoKICAgIExvb2ssIGFuZCB0aG91IHNoYWx0IHNlZS4KCk1PTlRBR1VFCgogICAgTyB0aG91IHVudGF1Z2h0ISB3aGF0IG1hbm5lcnMgaXMgaW4gdGhpcz8KICAgIFRvIHByZXNzIGJlZm9yZSB0aHkgZmF0aGVyIHRvIGEgZ3JhdmUCgpQUklOQ0UKCiAgICBTZWFsIHVwIHRoZSBtb3V0aCBvZiBvdXRyYWdlIGZvciBhIHdoaWxlLAogICAgVGlsbCB3ZSBjYW4gY2xlYXIgdGhlc2UgYW1iaWd1aXRpZXMsCiAgICBBbmQga25vdyB0aGVpciBzcHJpbmcsIHRoZWlyIGhlYWQsIHRoZWlyCiAgICB0cnVlIGRlc2NlbnQ7CiAgICBBbmQgdGhlbiB3aWxsIEkgYmUgZ2VuZXJhbCBvZiB5b3VyIHdvZXMsCiAgICBBbmQgbGVhZCB5b3UgZXZlbiB0byBkZWF0aDogbWVhbnRpbWUgZm9yYmVhciwKICAgIEFuZCBsZXQgbWlzY2hhbmNlIGJlIHNsYXZlIHRvIHBhdGllbmNlLgogICAgQnJpbmcgZm9ydGggdGhlIHBhcnRpZXMgb2Ygc3VzcGljaW9uLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJIGFtIHRoZSBncmVhdGVzdCwgYWJsZSB0byBkbyBsZWFzdCwKICAgIFlldCBtb3N0IHN1c3BlY3RlZCwgYXMgdGhlIHRpbWUgYW5kIHBsYWNlCiAgICBEb3RoIG1ha2UgYWdhaW5zdCBtZSBvZiB0aGlzIGRpcmVmdWwgbXVyZGVyOwogICAgQW5kIGhlcmUgSSBzdGFuZCwgYm90aCB0byBpbXBlYWNoIGFuZCBwdXJnZQogICAgTXlzZWxmIGNvbmRlbW5lZCBhbmQgbXlzZWxmIGV4Y3VzZWQuCgpQUklOQ0UKCiAgICBUaGVuIHNheSBhdCBvbmNlIHdoYXQgdGhvdSBkb3N0IGtub3cgaW4gdGhpcy4KCkZSSUFSIExBVVJFTkNFCgogICAgSSB3aWxsIGJlIGJyaWVmLCBmb3IgbXkgc2hvcnQgZGF0ZSBvZiBicmVhdGgKICAgIElzIG5vdCBzbyBsb25nIGFzIGlzIGEgdGVkaW91cyB0YWxlLgogICAgUm9tZW8sIHRoZXJlIGRlYWQsIHdhcyBodXNiYW5kIHRvIHRoYXQgSnVsaWV0OwogICAgQW5kIHNoZSwgdGhlcmUgZGVhZCwgdGhhdCBSb21lbydzIGZhaXRoZnVsIHdpZmU6CiAgICBJIG1hcnJpZWQgdGhlbTsgYW5kIHRoZWlyIHN0b2wnbiBtYXJyaWFnZS1kYXkKICAgIFdhcyBUeWJhbHQncyBkb29tcy1kYXksIHdob3NlIHVudGltZWx5IGRlYXRoCiAgICBCYW5pc2gnZCB0aGUgbmV3LW1hZGUgYnJpZGVncm9vbSBmcm9tIHRoZSBjaXR5LAogICAgRm9yIHdob20sIGFuZCBub3QgZm9yIFR5YmFsdCwgSnVsaWV0IHBpbmVkLgogICAgWW91LCB0byByZW1vdmUgdGhhdCBzaWVnZSBvZiBncmllZiBmcm9tIGhlciwKICAgIEJldHJvdGgnZCBhbmQgd291bGQgaGF2ZSBtYXJyaWVkIGhlciBwZXJmb3JjZQogICAgVG8gQ291bnR5IFBhcmlzOiB0aGVuIGNvbWVzIHNoZSB0byBtZSwKICAgIEFuZCwgd2l0aCB3aWxkIGxvb2tzLCBiaWQgbWUgZGV2aXNlIHNvbWUgbWVhbgogICAgVG8gcmlkIGhlciBmcm9tIHRoaXMgc2Vjb25kIG1hcnJpYWdlLAogICAgT3IgaW4gbXkgY2VsbCB0aGVyZSB3b3VsZCBzaGUga2lsbCBoZXJzZWxmLgogICAgVGhlbiBnYXZlIEkgaGVyLCBzbyB0dXRvcidkIGJ5IG15IGFydCwKICAgIEEgc2xlZXBpbmcgcG90aW9uOyB3aGljaCBzbyB0b29rIGVmZmVjdAogICAgQXMgSSBpbnRlbmRlZCwgZm9yIGl0IHdyb3VnaHQgb24gaGVyCiAgICBUaGUgZm9ybSBvZiBkZWF0aDogbWVhbnRpbWUgSSB3cml0IHRvIFJvbWVvLAogICAgVGhhdCBoZSBzaG91bGQgaGl0aGVyIGNvbWUgYXMgdGhpcyBkaXJlIG5pZ2h0LAogICAgVG8gaGVscCB0byB0YWtlIGhlciBmcm9tIGhlciBib3Jyb3cnZCBncmF2ZSwKICAgIEJlaW5nIHRoZSB0aW1lIHRoZSBwb3Rpb24ncyBmb3JjZSBzaG91bGQgY2Vhc2UuCiAgICBCdXQgaGUgd2hpY2ggYm9yZSBteSBsZXR0ZXIsIEZyaWFyIEpvaG4sCiAgICBXYXMgc3RheSdkIGJ5IGFjY2lkZW50LCBhbmQgeWVzdGVybmlnaHQKICAgIFJldHVybidkIG15IGxldHRlciBiYWNrLiBUaGVuIGFsbCBhbG9uZQogICAgQXQgdGhlIHByZWZpeGVkIGhvdXIgb2YgaGVyIHdha2luZywKICAgIENhbWUgSSB0byB0YWtlIGhlciBmcm9tIGhlciBraW5kcmVkJ3MgdmF1bHQ7CiAgICBNZWFuaW5nIHRvIGtlZXAgaGVyIGNsb3NlbHkgYXQgbXkgY2VsbCwKICAgIFRpbGwgSSBjb252ZW5pZW50bHkgY291bGQgc2VuZCB0byBSb21lbzoKICAgIEJ1dCB3aGVuIEkgY2FtZSwgc29tZSBtaW51dGUgZXJlIHRoZSB0aW1lCiAgICBPZiBoZXIgYXdha2luZywgaGVyZSB1bnRpbWVseSBsYXkKICAgIFRoZSBub2JsZSBQYXJpcyBhbmQgdHJ1ZSBSb21lbyBkZWFkLgogICAgU2hlIHdha2VzOyBhbmQgSSBlbnRyZWF0ZWQgaGVyIGNvbWUgZm9ydGgsCiAgICBBbmQgYmVhciB0aGlzIHdvcmsgb2YgaGVhdmVuIHdpdGggcGF0aWVuY2U6CiAgICBCdXQgdGhlbiBhIG5vaXNlIGRpZCBzY2FyZSBtZSBmcm9tIHRoZSB0b21iOwogICAgQW5kIHNoZSwgdG9vIGRlc3BlcmF0ZSwgd291bGQgbm90IGdvIHdpdGggbWUsCiAgICBCdXQsIGFzIGl0IHNlZW1zLCBkaWQgdmlvbGVuY2Ugb24gaGVyc2VsZi4KICAgIEFsbCB0aGlzIEkga25vdzsgYW5kIHRvIHRoZSBtYXJyaWFnZQogICAgSGVyIG51cnNlIGlzIHByaXZ5OiBhbmQsIGlmIGF1Z2h0IGluIHRoaXMKICAgIE1pc2NhcnJpZWQgYnkgbXkgZmF1bHQsIGxldCBteSBvbGQgbGlmZQogICAgQmUgc2FjcmlmaWNlZCwgc29tZSBob3VyIGJlZm9yZSBoaXMgdGltZSwKICAgIFVudG8gdGhlIHJpZ291ciBvZiBzZXZlcmVzdCBsYXcuCgpQUklOQ0UKCiAgICBXZSBzdGlsbCBoYXZlIGtub3duIHRoZWUgZm9yIGEgaG9seSBtYW4uCiAgICBXaGVyZSdzIFJvbWVvJ3MgbWFuPyB3aGF0IGNhbiBoZSBzYXkgaW4gdGhpcz8KCkJBTFRIQVNBUgoKICAgIEkgYnJvdWdodCBteSBtYXN0ZXIgbmV3cyBvZiBKdWxpZXQncyBkZWF0aDsKICAgIEFuZCB0aGVuIGluIHBvc3QgaGUgY2FtZSBmcm9tIE1hbnR1YQogICAgVG8gdGhpcyBzYW1lIHBsYWNlLCB0byB0aGlzIHNhbWUgbW9udW1lbnQuCiAgICBUaGlzIGxldHRlciBoZSBlYXJseSBiaWQgbWUgZ2l2ZSBoaXMgZmF0aGVyLAogICAgQW5kIHRocmVhdGVuZWQgbWUgd2l0aCBkZWF0aCwgZ29pbmcgaW4gdGhlIHZhdWx0LAogICAgSSBkZXBhcnRlZCBub3QgYW5kIGxlZnQgaGltIHRoZXJlLgoKUFJJTkNFCgogICAgR2l2ZSBtZSB0aGUgbGV0dGVyOyBJIHdpbGwgbG9vayBvbiBpdC4KICAgIFdoZXJlIGlzIHRoZSBjb3VudHkncyBwYWdlLCB0aGF0IHJhaXNlZCB0aGUgd2F0Y2gCiAgICBTaXJyYWgsIHdoYXQgbWFkZSB5b3VyIG1hc3RlciBpbiB0aGlzIHBsYWNlPwoKUEFHRQoKICAgIEhlIGNhbWUgd2l0aCBmbG93ZXJzIHRvIHN0cmV3IGhpcyBsYWR5J3MgZ3JhdmU7CiAgICBBbmQgYmlkIG1lIHN0YW5kIGFsb29mLCBhbmQgc28gSSBkaWQ6CiAgICBBbm9uIGNvbWVzIG9uZSB3aXRoIGxpZ2h0IHRvIG9wZSB0aGUgdG9tYjsKICAgIEFuZCBieSBhbmQgYnkgbXkgbWFzdGVyIGRyZXcgb24gaGltOwogICAgQW5kIHRoZW4gSSByYW4gYXdheSB0byBjYWxsIHRoZSB3YXRjaC4KClBSSU5DRQoKICAgIFRoaXMgbGV0dGVyIGRvdGggbWFrZSBnb29kIHRoZSBmcmlhcidzIHdvcmRzLAogICAgVGhlaXIgY291cnNlIG9mIGxvdmUsIHRoZSB0aWRpbmdzIG9mIGhlciBkZWF0aDoKICAgIEFuZCBoZXJlIGhlIHdyaXRlcyB0aGF0IGhlIGRpZCBidXkgYSBwb2lzb24KICAgIE9mIGEgcG9vciAncG90aGVjYXJ5LCBhbmQgdGhlcmV3aXRoYWwKICAgIENhbWUgdG8gdGhpcyB2YXVsdCB0byBkaWUsIGFuZCBsaWUgd2l0aCBKdWxpZXQuCiAgICBXaGVyZSBiZSB0aGVzZSBlbmVtaWVzPyBDYXB1bGV0ISBNb250YWd1ZSEKICAgIFNlZSwgd2hhdCBhIHNjb3VyZ2UgaXMgbGFpZCB1cG9uIHlvdXIgaGF0ZSwKICAgIFRoYXQgaGVhdmVuIGZpbmRzIG1lYW5zIHRvIGtpbGwgeW91ciBqb3lzIHdpdGggbG92ZS4KICAgIEFuZCBJIGZvciB3aW5raW5nIGF0IHlvdXIgZGlzY29yZHMgdG9vCiAgICBIYXZlIGxvc3QgYSBicmFjZSBvZiBraW5zbWVuOiBhbGwgYXJlIHB1bmlzaCdkLgoKQ0FQVUxFVAoKICAgIE8gYnJvdGhlciBNb250YWd1ZSwgZ2l2ZSBtZSB0aHkgaGFuZDoKICAgIFRoaXMgaXMgbXkgZGF1Z2h0ZXIncyBqb2ludHVyZSwgZm9yIG5vIG1vcmUKICAgIENhbiBJIGRlbWFuZC4KCk1PTlRBR1VFCgogICAgQnV0IEkgY2FuIGdpdmUgdGhlZSBtb3JlOgogICAgRm9yIEkgd2lsbCByYWlzZSBoZXIgc3RhdHVlIGluIHB1cmUgZ29sZDsKICAgIFRoYXQgd2hpbGUgVmVyb25hIGJ5IHRoYXQgbmFtZSBpcyBrbm93biwKICAgIFRoZXJlIHNoYWxsIG5vIGZpZ3VyZSBhdCBzdWNoIHJhdGUgYmUgc2V0CiAgICBBcyB0aGF0IG9mIHRydWUgYW5kIGZhaXRoZnVsIEp1bGlldC4KCkNBUFVMRVQKCiAgICBBcyByaWNoIHNoYWxsIFJvbWVvJ3MgYnkgaGlzIGxhZHkncyBsaWU7CiAgICBQb29yIHNhY3JpZmljZXMgb2Ygb3VyIGVubWl0eSEKClBSSU5DRQoKICAgIEEgZ2xvb21pbmcgcGVhY2UgdGhpcyBtb3JuaW5nIHdpdGggaXQgYnJpbmdzOwogICAgVGhlIHN1biwgZm9yIHNvcnJvdywgd2lsbCBub3Qgc2hvdyBoaXMgaGVhZDoKICAgIEdvIGhlbmNlLCB0byBoYXZlIG1vcmUgdGFsayBvZiB0aGVzZSBzYWQgdGhpbmdzOwogICAgU29tZSBzaGFsbCBiZSBwYXJkb24nZCwgYW5kIHNvbWUgcHVuaXNoZWQ6CiAgICBGb3IgbmV2ZXIgd2FzIGEgc3Rvcnkgb2YgbW9yZSB3b2UKICAgIFRoYW4gdGhpcyBvZiBKdWxpZXQgYW5kIGhlciBSb21lby4KCiAgICBFeGV1bnQK

Chuck Cartledge
Chuck Cartledge
Chuck Cartledge

httpantonio-ferraroeupnword-clouds-in-r-packages-wordcloud2-and-tmrm(list=ls())library(wordcloud2)library(NLP)library(tm)library(RCurl) Necessary steps 1 Use imagesgooglecom to find an outline of the shape to fill (tmpusapng) 2 Use gimp to fill the outline with black 3 Use a command like wordcloud2(TDMasDF size = 20 figPath=tmpusapng backgroundColor = white fontFamily=Loma) to populate shape 4 Result is a web page with javascript embedded to create image and allow mouse overs Clean corpuscleanCorpus lt- function(corpus) corpustmp lt- tm_map(corpus removePunctuation) corpustmp lt- tm_map(corpustmpstripWhitespace) corpustmp lt- tm_map(corpustmptolower) corpustmp lt- tm_map(corpustmp PlainTextDocument) corpustmp lt- tm_map(corpustmpremoveWords stopwords(english)) return(corpustmp) Build TDMgenerateTDM lt- function(path) sdir lt-path scor lt-Corpus(DirSource(directory = sdir encoding= UTF-8)) scorcl lt- cleanCorpus(scor) stdm lt- TermDocumentMatrix(scorcl) stdminitData lt- function(path) if (direxists(path) == FALSE) If the directory does not exist create and populate with dummy data dummyDataFile lt- romeoAndJulietbase64 fileName lt- sprintf(sdummyDatatxt path) print(sprintf(Creating and populating the file s with dummy data fileName)) dircreate(path recursive = TRUE) write(base64( paste( readLines(dummyDataFile) collapse=) encode=FALSE) file=fileName) main lt- function() options(stringsAsFactors = FALSE) The working directory pathName lt- Text initData(pathName) Get the Term Document Matrix TDM lt- generateTDM(pathName) Do I need a matrix or a DF We will see TDMasMatrix lt- asmatrix(TDM) TDMasDFlt-dataframe(TDMasMatrix) TDMasDF$words lt-rownames(TDMasDF) Column headers colnames(TDMasDF) lt- c(freq word) TDMasDFlt-TDMasDF[ c(word freq)] TDMasDF lt- TDMasDF[order(TDMasDF$freqdecreasing=TRUE)] The results a lt- wordcloud2(TDMasDF size = 03 shape=star backgroundColor = black fontFamily=Loma) print(a) a lt- letterCloud(TDMasDF word=USA size = 03 fontFamily=Loma backgroundColor = black) print(a) a lt- wordcloud2(TDMasDF size = 13 figPath=heartpng backgroundColor = white fontFamily=Loma color=red) print(a) TDMasDF$freq lt- log(TDMasDF$freq) a lt- wordcloud2(TDMasDF size = 12 figPath=usapng backgroundColor = white shuffle=FALSE minRotation = 0 maxRotation = 2pi) print(a) print(The program has ended)main()

Chuck Cartledge
Page 5: Creating Shaped Wordclouds Using R - clc-ent.comThe wordcloud2 function behaves slightly di erently than most of the other R plot func-tions that I’ve used. The result from both

Figure 3 An empty word cloud figure

4

Figure 4 A filled word cloud figure

5

Figure 5 A filled USA word cloud figure

The wordcloud2 function behaves slightly differently than most of the other R plot func-tions that Irsquove used The result from both wordcloud2 and letterCloud is not displayablewithin R These functions actually create an HTML page in a temporary directory with em-bedded JavaScript that performs the placement of the words within the shape and providesa level of interaction after the page is displayed R ldquounderstandsrdquo that the product fromthese functions is an HTML widget and starts up the default browser to show the page Thepage and its sub-directories are removed when R ends

The fact that the page uses JavaScript introduces some interesting aspects Buried in theJavaScript used by the page to place the words in the cloud are a plethora of Mathrandom()calls The JavaScript specification says that the Mathrandom() function has to return avalue greater than or equal to 0 and less than 1 which is reasonable for a random functionThe specification also says that the implementation of the random function is up to theJavaScript application and does not specify how the numbers are to be generated Meaningthat the same HTML page being viewed by two different browsers may generate two differentsequences of random numbers Most random number generators have the capability of settinga seed value so that a repeatable sequence can be generated JavaScript does not supportthe idea of a random number seed The HTML page and collection of directories can bemoved to a server where they are available for use and support

All of this means that each loading and viewing of the page will generate a different

1Available fromhttpsgithubcomLchiffonwordcloud2

6

image and there is no practical way to ldquoget backrdquo to an image that was goodIn the Files section (see Section A on page 9) is an R script and support files to work

with The R script was used to create various images (see Figure 6 on the following page)

3 Conclusion

The wordcloud2 library enables you to create word clouds of arbitrary shape inside an HTMLusing JavaScript to position and orient each word Each HTML page and its associatedlibrary files are placed in individual directories that are removed when the creating R processterminates Pages and files can be moved or copied for safe keeping if desired Because thepages use the Mathrandom() JavaScript function each time the page is loaded words willbe positioned differently in the cloud If the desired shape has an internal hole then it ispossible that some words may not be placed in the cloud

wordcloud2 allows you to create word clouds to support your data visualization needs

7

(a) A heart

(b) The letters ldquoUSArdquo

(c) A star

(d) The USA

Figure 6 A collection of sample word clouds These images were created with the attachedR script

8

A Misc files

The files used to create all these figures are attached to this report They are

1 romeoAndJulietbase64 ndash default text used to demonstrate the software

2 heartpng ndash a heart shape with a hole

3 usapng ndash an outline of the continental United States

4 wordCloudR ndash an R script to demonstrate making word clouds

9

ClJvbWVvIGFuZCBKdWxpZXQKU2hha2VzcGVhcmUgaG9tZXBhZ2UgfCBSb21lbyBhbmQgSnVsaWV0IHwgRW50aXJlIHBsYXkKQUNUIEkKUFJPTE9HVUUKCiAgICBUd28gaG91c2Vob2xkcywgYm90aCBhbGlrZSBpbiBkaWduaXR5LAogICAgSW4gZmFpciBWZXJvbmEsIHdoZXJlIHdlIGxheSBvdXIgc2NlbmUsCiAgICBGcm9tIGFuY2llbnQgZ3J1ZGdlIGJyZWFrIHRvIG5ldyBtdXRpbnksCiAgICBXaGVyZSBjaXZpbCBibG9vZCBtYWtlcyBjaXZpbCBoYW5kcyB1bmNsZWFuLgogICAgRnJvbSBmb3J0aCB0aGUgZmF0YWwgbG9pbnMgb2YgdGhlc2UgdHdvIGZvZXMKICAgIEEgcGFpciBvZiBzdGFyLWNyb3NzJ2QgbG92ZXJzIHRha2UgdGhlaXIgbGlmZTsKICAgIFdob3NlIG1pc2FkdmVudHVyZWQgcGl0ZW91cyBvdmVydGhyb3dzCiAgICBEbyB3aXRoIHRoZWlyIGRlYXRoIGJ1cnkgdGhlaXIgcGFyZW50cycgc3RyaWZlLgogICAgVGhlIGZlYXJmdWwgcGFzc2FnZSBvZiB0aGVpciBkZWF0aC1tYXJrJ2QgbG92ZSwKICAgIEFuZCB0aGUgY29udGludWFuY2Ugb2YgdGhlaXIgcGFyZW50cycgcmFnZSwKICAgIFdoaWNoLCBidXQgdGhlaXIgY2hpbGRyZW4ncyBlbmQsIG5vdWdodCBjb3VsZCByZW1vdmUsCiAgICBJcyBub3cgdGhlIHR3byBob3VycycgdHJhZmZpYyBvZiBvdXIgc3RhZ2U7CiAgICBUaGUgd2hpY2ggaWYgeW91IHdpdGggcGF0aWVudCBlYXJzIGF0dGVuZCwKICAgIFdoYXQgaGVyZSBzaGFsbCBtaXNzLCBvdXIgdG9pbCBzaGFsbCBzdHJpdmUgdG8gbWVuZC4KClNDRU5FIEkuIFZlcm9uYS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgU0FNUFNPTiBhbmQgR1JFR09SWSwgb2YgdGhlIGhvdXNlIG9mIENhcHVsZXQsIGFybWVkIHdpdGggc3dvcmRzIGFuZCBidWNrbGVycyAKClNBTVBTT04KCiAgICBHcmVnb3J5LCBvJyBteSB3b3JkLCB3ZSdsbCBub3QgY2FycnkgY29hbHMuCgpHUkVHT1JZCgogICAgTm8sIGZvciB0aGVuIHdlIHNob3VsZCBiZSBjb2xsaWVycy4KClNBTVBTT04KCiAgICBJIG1lYW4sIGFuIHdlIGJlIGluIGNob2xlciwgd2UnbGwgZHJhdy4KCkdSRUdPUlkKCiAgICBBeSwgd2hpbGUgeW91IGxpdmUsIGRyYXcgeW91ciBuZWNrIG91dCBvJyB0aGUgY29sbGFyLgoKU0FNUFNPTgoKICAgIEkgc3RyaWtlIHF1aWNrbHksIGJlaW5nIG1vdmVkLgoKR1JFR09SWQoKICAgIEJ1dCB0aG91IGFydCBub3QgcXVpY2tseSBtb3ZlZCB0byBzdHJpa2UuCgpTQU1QU09OCgogICAgQSBkb2cgb2YgdGhlIGhvdXNlIG9mIE1vbnRhZ3VlIG1vdmVzIG1lLgoKR1JFR09SWQoKICAgIFRvIG1vdmUgaXMgdG8gc3RpcjsgYW5kIHRvIGJlIHZhbGlhbnQgaXMgdG8gc3RhbmQ6CiAgICB0aGVyZWZvcmUsIGlmIHRob3UgYXJ0IG1vdmVkLCB0aG91IHJ1bm4nc3QgYXdheS4KClNBTVBTT04KCiAgICBBIGRvZyBvZiB0aGF0IGhvdXNlIHNoYWxsIG1vdmUgbWUgdG8gc3RhbmQ6IEkgd2lsbAogICAgdGFrZSB0aGUgd2FsbCBvZiBhbnkgbWFuIG9yIG1haWQgb2YgTW9udGFndWUncy4KCkdSRUdPUlkKCiAgICBUaGF0IHNob3dzIHRoZWUgYSB3ZWFrIHNsYXZlOyBmb3IgdGhlIHdlYWtlc3QgZ29lcwogICAgdG8gdGhlIHdhbGwuCgpTQU1QU09OCgogICAgVHJ1ZTsgYW5kIHRoZXJlZm9yZSB3b21lbiwgYmVpbmcgdGhlIHdlYWtlciB2ZXNzZWxzLAogICAgYXJlIGV2ZXIgdGhydXN0IHRvIHRoZSB3YWxsOiB0aGVyZWZvcmUgSSB3aWxsIHB1c2gKICAgIE1vbnRhZ3VlJ3MgbWVuIGZyb20gdGhlIHdhbGwsIGFuZCB0aHJ1c3QgaGlzIG1haWRzCiAgICB0byB0aGUgd2FsbC4KCkdSRUdPUlkKCiAgICBUaGUgcXVhcnJlbCBpcyBiZXR3ZWVuIG91ciBtYXN0ZXJzIGFuZCB1cyB0aGVpciBtZW4uCgpTQU1QU09OCgogICAgJ1RpcyBhbGwgb25lLCBJIHdpbGwgc2hvdyBteXNlbGYgYSB0eXJhbnQ6IHdoZW4gSQogICAgaGF2ZSBmb3VnaHQgd2l0aCB0aGUgbWVuLCBJIHdpbGwgYmUgY3J1ZWwgd2l0aCB0aGUKICAgIG1haWRzLCBhbmQgY3V0IG9mZiB0aGVpciBoZWFkcy4KCkdSRUdPUlkKCiAgICBUaGUgaGVhZHMgb2YgdGhlIG1haWRzPwoKU0FNUFNPTgoKICAgIEF5LCB0aGUgaGVhZHMgb2YgdGhlIG1haWRzLCBvciB0aGVpciBtYWlkZW5oZWFkczsKICAgIHRha2UgaXQgaW4gd2hhdCBzZW5zZSB0aG91IHdpbHQuCgpHUkVHT1JZCgogICAgVGhleSBtdXN0IHRha2UgaXQgaW4gc2Vuc2UgdGhhdCBmZWVsIGl0LgoKU0FNUFNPTgoKICAgIE1lIHRoZXkgc2hhbGwgZmVlbCB3aGlsZSBJIGFtIGFibGUgdG8gc3RhbmQ6IGFuZAogICAgJ3RpcyBrbm93biBJIGFtIGEgcHJldHR5IHBpZWNlIG9mIGZsZXNoLgoKR1JFR09SWQoKICAgICdUaXMgd2VsbCB0aG91IGFydCBub3QgZmlzaDsgaWYgdGhvdSBoYWRzdCwgdGhvdQogICAgaGFkc3QgYmVlbiBwb29yIEpvaG4uIERyYXcgdGh5IHRvb2whIGhlcmUgY29tZXMKICAgIHR3byBvZiB0aGUgaG91c2Ugb2YgdGhlIE1vbnRhZ3Vlcy4KClNBTVBTT04KCiAgICBNeSBuYWtlZCB3ZWFwb24gaXMgb3V0OiBxdWFycmVsLCBJIHdpbGwgYmFjayB0aGVlLgoKR1JFR09SWQoKICAgIEhvdyEgdHVybiB0aHkgYmFjayBhbmQgcnVuPwoKU0FNUFNPTgoKICAgIEZlYXIgbWUgbm90LgoKR1JFR09SWQoKICAgIE5vLCBtYXJyeTsgSSBmZWFyIHRoZWUhCgpTQU1QU09OCgogICAgTGV0IHVzIHRha2UgdGhlIGxhdyBvZiBvdXIgc2lkZXM7IGxldCB0aGVtIGJlZ2luLgoKR1JFR09SWQoKICAgIEkgd2lsbCBmcm93biBhcyBJIHBhc3MgYnksIGFuZCBsZXQgdGhlbSB0YWtlIGl0IGFzCiAgICB0aGV5IGxpc3QuCgpTQU1QU09OCgogICAgTmF5LCBhcyB0aGV5IGRhcmUuIEkgd2lsbCBiaXRlIG15IHRodW1iIGF0IHRoZW07CiAgICB3aGljaCBpcyBhIGRpc2dyYWNlIHRvIHRoZW0sIGlmIHRoZXkgYmVhciBpdC4KCiAgICBFbnRlciBBQlJBSEFNIGFuZCBCQUxUSEFTQVIKCkFCUkFIQU0KCiAgICBEbyB5b3UgYml0ZSB5b3VyIHRodW1iIGF0IHVzLCBzaXICgpTQU1QU09OCgogICAgSSBkbyBiaXRlIG15IHRodW1iLCBzaXIuCgpBQlJBSEFNCgogICAgRG8geW91IGJpdGUgeW91ciB0aHVtYiBhdCB1cywgc2lyPwoKU0FNUFNPTgoKICAgIFtBc2lkZSB0byBHUkVHT1JZXSBJcyB0aGUgbGF3IG9mIG91ciBzaWRlLCBpZiBJIHNheQogICAgYXkCgpHUkVHT1JZCgogICAgTm8uCgpTQU1QU09OCgogICAgTm8sIHNpciwgSSBkbyBub3QgYml0ZSBteSB0aHVtYiBhdCB5b3UsIHNpciwgYnV0IEkKICAgIGJpdGUgbXkgdGh1bWIsIHNpci4KCkdSRUdPUlkKCiAgICBEbyB5b3UgcXVhcnJlbCwgc2lyPwoKQUJSQUhBTQoKICAgIFF1YXJyZWwgc2lyISBubywgc2lyLgoKU0FNUFNPTgoKICAgIElmIHlvdSBkbywgc2lyLCBJIGFtIGZvciB5b3U6IEkgc2VydmUgYXMgZ29vZCBhIG1hbiBhcyB5b3UuCgpBQlJBSEFNCgogICAgTm8gYmV0dGVyLgoKU0FNUFNPTgoKICAgIFdlbGwsIHNpci4KCkdSRUdPUlkKCiAgICBTYXkgJ2JldHRlcjonIGhlcmUgY29tZXMgb25lIG9mIG15IG1hc3RlcidzIGtpbnNtZW4uCgpTQU1QU09OCgogICAgWWVzLCBiZXR0ZXIsIHNpci4KCkFCUkFIQU0KCiAgICBZb3UgbGllLgoKU0FNUFNPTgoKICAgIERyYXcsIGlmIHlvdSBiZSBtZW4uIEdyZWdvcnksIHJlbWVtYmVyIHRoeSBzd2FzaGluZyBibG93LgoKICAgIFRoZXkgZmlnaHQKCiAgICBFbnRlciBCRU5WT0xJTwoKQkVOVk9MSU8KCiAgICBQYXJ0LCBmb29scyEKICAgIFB1dCB1cCB5b3VyIHN3b3JkczsgeW91IGtub3cgbm90IHdoYXQgeW91IGRvLgoKICAgIEJlYXRzIGRvd24gdGhlaXIgc3dvcmRzCgogICAgRW50ZXIgVFlCQUxUCgpUWUJBTFQKCiAgICBXaGF0LCBhcnQgdGhvdSBkcmF3biBhbW9uZyB0aGVzZSBoZWFydGxlc3MgaGluZHMCiAgICBUdXJuIHRoZWUsIEJlbnZvbGlvLCBsb29rIHVwb24gdGh5IGRlYXRoLgoKQkVOVk9MSU8KCiAgICBJIGRvIGJ1dCBrZWVwIHRoZSBwZWFjZTogcHV0IHVwIHRoeSBzd29yZCwKICAgIE9yIG1hbmFnZSBpdCB0byBwYXJ0IHRoZXNlIG1lbiB3aXRoIG1lLgoKVFlCQUxUCgogICAgV2hhdCwgZHJhd24sIGFuZCB0YWxrIG9mIHBlYWNlISBJIGhhdGUgdGhlIHdvcmQsCiAgICBBcyBJIGhhdGUgaGVsbCwgYWxsIE1vbnRhZ3VlcywgYW5kIHRoZWU6CiAgICBIYXZlIGF0IHRoZWUsIGNvd2FyZCEKCiAgICBUaGV5IGZpZ2h0CgogICAgRW50ZXIsIHNldmVyYWwgb2YgYm90aCBob3VzZXMsIHdobyBqb2luIHRoZSBmcmF5OyB0aGVuIGVudGVyIENpdGl6ZW5zLCB3aXRoIGNsdWJzCgpGaXJzdCBDaXRpemVuCgogICAgQ2x1YnMsIGJpbGxzLCBhbmQgcGFydGlzYW5zISBzdHJpa2UhIGJlYXQgdGhlbSBkb3duIQogICAgRG93biB3aXRoIHRoZSBDYXB1bGV0cyEgZG93biB3aXRoIHRoZSBNb250YWd1ZXMhCgogICAgRW50ZXIgQ0FQVUxFVCBpbiBoaXMgZ293biwgYW5kIExBRFkgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgdGhpcz8gR2l2ZSBtZSBteSBsb25nIHN3b3JkLCBobyEKCkxBRFkgQ0FQVUxFVAoKICAgIEEgY3J1dGNoLCBhIGNydXRjaCEgd2h5IGNhbGwgeW91IGZvciBhIHN3b3JkPwoKQ0FQVUxFVAoKICAgIE15IHN3b3JkLCBJIHNheSEgT2xkIE1vbnRhZ3VlIGlzIGNvbWUsCiAgICBBbmQgZmxvdXJpc2hlcyBoaXMgYmxhZGUgaW4gc3BpdGUgb2YgbWUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIExBRFkgTU9OVEFHVUUKCk1PTlRBR1VFCgogICAgVGhvdSB2aWxsYWluIENhcHVsZXQsLS1Ib2xkIG1lIG5vdCwgbGV0IG1lIGdvLgoKTEFEWSBNT05UQUdVRQoKICAgIFRob3Ugc2hhbHQgbm90IHN0aXIgYSBmb290IHRvIHNlZWsgYSBmb2UuCgogICAgRW50ZXIgUFJJTkNFLCB3aXRoIEF0dGVuZGFudHMKClBSSU5DRQoKICAgIFJlYmVsbGlvdXMgc3ViamVjdHMsIGVuZW1pZXMgdG8gcGVhY2UsCiAgICBQcm9mYW5lcnMgb2YgdGhpcyBuZWlnaGJvdXItc3RhaW5lZCBzdGVlbCwtLQogICAgV2lsbCB0aGV5IG5vdCBoZWFyPyBXaGF0LCBobyEgeW91IG1lbiwgeW91IGJlYXN0cywKICAgIFRoYXQgcXVlbmNoIHRoZSBmaXJlIG9mIHlvdXIgcGVybmljaW91cyByYWdlCiAgICBXaXRoIHB1cnBsZSBmb3VudGFpbnMgaXNzdWluZyBmcm9tIHlvdXIgdmVpbnMsCiAgICBPbiBwYWluIG9mIHRvcnR1cmUsIGZyb20gdGhvc2UgYmxvb2R5IGhhbmRzCiAgICBUaHJvdyB5b3VyIG1pc3RlbXBlcidkIHdlYXBvbnMgdG8gdGhlIGdyb3VuZCwKICAgIEFuZCBoZWFyIHRoZSBzZW50ZW5jZSBvZiB5b3VyIG1vdmVkIHByaW5jZS4KICAgIFRocmVlIGNpdmlsIGJyYXdscywgYnJlZCBvZiBhbiBhaXJ5IHdvcmQsCiAgICBCeSB0aGVlLCBvbGQgQ2FwdWxldCwgYW5kIE1vbnRhZ3VlLAogICAgSGF2ZSB0aHJpY2UgZGlzdHVyYidkIHRoZSBxdWlldCBvZiBvdXIgc3RyZWV0cywKICAgIEFuZCBtYWRlIFZlcm9uYSdzIGFuY2llbnQgY2l0aXplbnMKICAgIENhc3QgYnkgdGhlaXIgZ3JhdmUgYmVzZWVtaW5nIG9ybmFtZW50cywKICAgIFRvIHdpZWxkIG9sZCBwYXJ0aXNhbnMsIGluIGhhbmRzIGFzIG9sZCwKICAgIENhbmtlcidkIHdpdGggcGVhY2UsIHRvIHBhcnQgeW91ciBjYW5rZXInZCBoYXRlOgogICAgSWYgZXZlciB5b3UgZGlzdHVyYiBvdXIgc3RyZWV0cyBhZ2FpbiwKICAgIFlvdXIgbGl2ZXMgc2hhbGwgcGF5IHRoZSBmb3JmZWl0IG9mIHRoZSBwZWFjZS4KICAgIEZvciB0aGlzIHRpbWUsIGFsbCB0aGUgcmVzdCBkZXBhcnQgYXdheToKICAgIFlvdSBDYXB1bGV0OyBzaGFsbCBnbyBhbG9uZyB3aXRoIG1lOgogICAgQW5kLCBNb250YWd1ZSwgY29tZSB5b3UgdGhpcyBhZnRlcm5vb24sCiAgICBUbyBrbm93IG91ciBmdXJ0aGVyIHBsZWFzdXJlIGluIHRoaXMgY2FzZSwKICAgIFRvIG9sZCBGcmVlLXRvd24sIG91ciBjb21tb24ganVkZ21lbnQtcGxhY2UuCiAgICBPbmNlIG1vcmUsIG9uIHBhaW4gb2YgZGVhdGgsIGFsbCBtZW4gZGVwYXJ0LgoKICAgIEV4ZXVudCBhbGwgYnV0IE1PTlRBR1VFLCBMQURZIE1PTlRBR1VFLCBhbmQgQkVOVk9MSU8KCk1PTlRBR1VFCgogICAgV2hvIHNldCB0aGlzIGFuY2llbnQgcXVhcnJlbCBuZXcgYWJyb2FjaD8KICAgIFNwZWFrLCBuZXBoZXcsIHdlcmUgeW91IGJ5IHdoZW4gaXQgYmVnYW4CgpCRU5WT0xJTwoKICAgIEhlcmUgd2VyZSB0aGUgc2VydmFudHMgb2YgeW91ciBhZHZlcnNhcnksCiAgICBBbmQgeW91cnMsIGNsb3NlIGZpZ2h0aW5nIGVyZSBJIGRpZCBhcHByb2FjaDoKICAgIEkgZHJldyB0byBwYXJ0IHRoZW06IGluIHRoZSBpbnN0YW50IGNhbWUKICAgIFRoZSBmaWVyeSBUeWJhbHQsIHdpdGggaGlzIHN3b3JkIHByZXBhcmVkLAogICAgV2hpY2gsIGFzIGhlIGJyZWF0aGVkIGRlZmlhbmNlIHRvIG15IGVhcnMsCiAgICBIZSBzd3VuZyBhYm91dCBoaXMgaGVhZCBhbmQgY3V0IHRoZSB3aW5kcywKICAgIFdobyBub3RoaW5nIGh1cnQgd2l0aGFsIGhpc3MnZCBoaW0gaW4gc2Nvcm46CiAgICBXaGlsZSB3ZSB3ZXJlIGludGVyY2hhbmdpbmcgdGhydXN0cyBhbmQgYmxvd3MsCiAgICBDYW1lIG1vcmUgYW5kIG1vcmUgYW5kIGZvdWdodCBvbiBwYXJ0IGFuZCBwYXJ0LAogICAgVGlsbCB0aGUgcHJpbmNlIGNhbWUsIHdobyBwYXJ0ZWQgZWl0aGVyIHBhcnQuCgpMQURZIE1PTlRBR1VFCgogICAgTywgd2hlcmUgaXMgUm9tZW8IHNhdyB5b3UgaGltIHRvLWRheT8KICAgIFJpZ2h0IGdsYWQgSSBhbSBoZSB3YXMgbm90IGF0IHRoaXMgZnJheS4KCkJFTlZPTElPCgogICAgTWFkYW0sIGFuIGhvdXIgYmVmb3JlIHRoZSB3b3JzaGlwcCdkIHN1bgogICAgUGVlcidkIGZvcnRoIHRoZSBnb2xkZW4gd2luZG93IG9mIHRoZSBlYXN0LAogICAgQSB0cm91YmxlZCBtaW5kIGRyYXZlIG1lIHRvIHdhbGsgYWJyb2FkOwogICAgV2hlcmUsIHVuZGVybmVhdGggdGhlIGdyb3ZlIG9mIHN5Y2Ftb3JlCiAgICBUaGF0IHdlc3R3YXJkIHJvb3RldGggZnJvbSB0aGUgY2l0eSdzIHNpZGUsCiAgICBTbyBlYXJseSB3YWxraW5nIGRpZCBJIHNlZSB5b3VyIHNvbjoKICAgIFRvd2FyZHMgaGltIEkgbWFkZSwgYnV0IGhlIHdhcyB3YXJlIG9mIG1lCiAgICBBbmQgc3RvbGUgaW50byB0aGUgY292ZXJ0IG9mIHRoZSB3b29kOgogICAgSSwgbWVhc3VyaW5nIGhpcyBhZmZlY3Rpb25zIGJ5IG15IG93biwKICAgIFRoYXQgbW9zdCBhcmUgYnVzaWVkIHdoZW4gdGhleSdyZSBtb3N0IGFsb25lLAogICAgUHVyc3VlZCBteSBodW1vdXIgbm90IHB1cnN1aW5nIGhpcywKICAgIEFuZCBnbGFkbHkgc2h1bm4nZCB3aG8gZ2xhZGx5IGZsZWQgZnJvbSBtZS4KCk1PTlRBR1VFCgogICAgTWFueSBhIG1vcm5pbmcgaGF0aCBoZSB0aGVyZSBiZWVuIHNlZW4sCiAgICBXaXRoIHRlYXJzIGF1Z21lbnRpbmcgdGhlIGZyZXNoIG1vcm5pbmcgZGV3LgogICAgQWRkaW5nIHRvIGNsb3VkcyBtb3JlIGNsb3VkcyB3aXRoIGhpcyBkZWVwIHNpZ2hzOwogICAgQnV0IGFsbCBzbyBzb29uIGFzIHRoZSBhbGwtY2hlZXJpbmcgc3VuCiAgICBTaG91bGQgaW4gdGhlIGZ1cnRoZXN0IGVhc3QgYmVnaW4gdG8gZHJhdwogICAgVGhlIHNoYWR5IGN1cnRhaW5zIGZyb20gQXVyb3JhJ3MgYmVkLAogICAgQXdheSBmcm9tIHRoZSBsaWdodCBzdGVhbHMgaG9tZSBteSBoZWF2eSBzb24sCiAgICBBbmQgcHJpdmF0ZSBpbiBoaXMgY2hhbWJlciBwZW5zIGhpbXNlbGYsCiAgICBTaHV0cyB1cCBoaXMgd2luZG93cywgbG9ja3MgZmFyIGRheWxpZ2h0IG91dAogICAgQW5kIG1ha2VzIGhpbXNlbGYgYW4gYXJ0aWZpY2lhbCBuaWdodDoKICAgIEJsYWNrIGFuZCBwb3J0ZW50b3VzIG11c3QgdGhpcyBodW1vdXIgcHJvdmUsCiAgICBVbmxlc3MgZ29vZCBjb3Vuc2VsIG1heSB0aGUgY2F1c2UgcmVtb3ZlLgoKQkVOVk9MSU8KCiAgICBNeSBub2JsZSB1bmNsZSwgZG8geW91IGtub3cgdGhlIGNhdXNlPwoKTU9OVEFHVUUKCiAgICBJIG5laXRoZXIga25vdyBpdCBub3IgY2FuIGxlYXJuIG9mIGhpbS4KCkJFTlZPTElPCgogICAgSGF2ZSB5b3UgaW1wb3J0dW5lZCBoaW0gYnkgYW55IG1lYW5zPwoKTU9OVEFHVUUKCiAgICBCb3RoIGJ5IG15c2VsZiBhbmQgbWFueSBvdGhlciBmcmllbmRzOgogICAgQnV0IGhlLCBoaXMgb3duIGFmZmVjdGlvbnMnIGNvdW5zZWxsb3IsCiAgICBJcyB0byBoaW1zZWxmLS1JIHdpb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UVPCgogICAgR29vZCBoZWFydCwgYXQgd2hhdD8KCkJFTlZPTElPCgogICAgQXQgdGh5IGdvb2QgaGVhcnQncyBvcHByZXNzaW9uLgoKUk9NRU8KCiAgICBXaHksIHN1Y2ggaXMgbG92ZSdzIHRyYW5zZ3Jlc3Npb24uCiAgICBHcmllZnMgb2YgbWluZSBvd24gbGllIGhlYXZ5IGluIG15IGJyZWFzdCwKICAgIFdoaWNoIHRob3Ugd2lsdCBwcm9wYWdhdGUsIHRvIGhhdmUgaXQgcHJlc3QKICAgIFdpdGggbW9yZSBvZiB0aGluZTogdGhpcyBsb3ZlIHRoYXQgdGhvdSBoYXN0IHNob3duCiAgICBEb3RoIGFkZCBtb3JlIGdyaWVmIHRvIHRvbyBtdWNoIG9mIG1pbmUgb3duLgogICAgTG92ZSBpcyBhIHNtb2tlIHJhaXNlZCB3aXRoIHRoZSBmdW1lIG9mIHNpZ2hzOwogICAgQmVpbmcgcHVyZ2VkLCBhIGZpcmUgc3BhcmtsaW5nIGluIGxvdmVycycgZXllczsKICAgIEJlaW5nIHZleCdkIGEgc2VhIG5vdXJpc2gnZCB3aXRoIGxvdmVycycgdGVhcnM6CiAgICBXaGF0IGlzIGl0IGVsc2UIGEgbWFkbmVzcyBtb3N0IGRpc2NyZWV0LAogICAgQSBjaG9raW5nIGdhbGwgYW5kIGEgcHJlc2VydmluZyBzd2VldC4KICAgIEZhcmV3ZWxsLCBteSBjb3ouCgpCRU5WT0xJTwoKICAgIFNvZnQhIEkgd2lsbCBnbyBhbG9uZzsKICAgIEFuIGlmIHlvdSBsZWF2ZSBtZSBzbywgeW91IGRvIG1lIHdyb25nLgoKUk9NRU8KCiAgICBUdXQsIEkgaGF2ZSBsb3N0IG15c2VsZjsgSSBhbSBub3QgaGVyZTsKICAgIFRoaXMgaXMgbm90IFJvbWVvLCBoZSdzIHNvbWUgb3RoZXIgd2hlcmUuCgpCRU5WT0xJTwoKICAgIFRlbGwgbWUgaW4gc2FkbmVzcywgd2hvIGlzIHRoYXQgeW91IGxvdmUuCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIEkgZ3JvYW4gYW5kIHRlbGwgdGhlZT8KCkJFTlZPTElPCgogICAgR3JvYW4hIHdoeSwgbm8uCiAgICBCdXQgc2FkbHkgdGVsbCBtZSB3aG8uCgpST01FTwoKICAgIEJpZCBhIHNpY2sgbWFuIGluIHNhZG5lc3MgbWFrZSBoaXMgd2lsbDoKICAgIEFoLCB3b3JkIGlsbCB1cmdlZCB0byBvbmUgdGhhdCBpcyBzbyBpbGwhCiAgICBJbiBzYWRuZXNzLCBjb3VzaW4sIEkgZG8gbG92ZSBhIHdvbWFuLgoKQkVOVk9MSU8KCiAgICBJIGFpbSdkIHNvIG5lYXIsIHdoZW4gSSBzdXBwb3NlZCB5b3UgbG92ZWQuCgpST01FTwoKICAgIEEgcmlnaHQgZ29vZCBtYXJrLW1hbiEgQW5kIHNoZSdzIGZhaXIgSSBsb3ZlLgoKQkVOVk9MSU8KCiAgICBBIHJpZ2h0IGZhaXIgbWFyaywgZmFpciBjb3osIGlzIHNvb25lc3QgaGl0LgoKUk9NRU8KCiAgICBXZWxsLCBpbiB0aGF0IGhpdCB5b3UgbWlzczogc2hlJ2xsIG5vdCBiZSBoaXQKICAgIFdpdGggQ3VwaWQncyBhcnJvdzsgc2hlIGhhdGggRGlhbidzIHdpdDsKICAgIEFuZCwgaW4gc3Ryb25nIHByb29mIG9mIGNoYXN0aXR5IHdlbGwgYXJtJ2QsCiAgICBGcm9tIGxvdmUncyB3ZWFrIGNoaWxkaXNoIGJvdyBzaGUgbGl2ZXMgdW5oYXJtJ2QuCiAgICBTaGUgd2lsbCBub3Qgc3RheSB0aGUgc2llZ2Ugb2YgbG92aW5nIHRlcm1zLAogICAgTm9yIGJpZGUgdGhlIGVuY291bnRlciBvZiBhc3NhaWxpbmcgZXllcywKICAgIE5vciBvcGUgaGVyIGxhcCB0byBzYWludC1zZWR1Y2luZyBnb2xkOgogICAgTywgc2hlIGlzIHJpY2ggaW4gYmVhdXR5LCBvbmx5IHBvb3IsCiAgICBUaGF0IHdoZW4gc2hlIGRpZXMgd2l0aCBiZWF1dHkgZGllcyBoZXIgc3RvcmUuCgpCRU5WT0xJTwoKICAgIFRoZW4gc2hlIGhhdGggc3dvcm4gdGhhdCBzaGUgd2lsbCBzdGlsbCBsaXZlIGNoYXN0ZT8KClJPTUVPCgogICAgU2hlIGhhdGgsIGFuZCBpbiB0aGF0IHNwYXJpbmcgbWFrZXMgaHVnZSB3YXN0ZSwKICAgIEZvciBiZWF1dHkgc3RhcnZlZCB3aXRoIGhlciBzZXZlcml0eQogICAgQ3V0cyBiZWF1dHkgb2ZmIGZyb20gYWxsIHBvc3Rlcml0eS4KICAgIFNoZSBpcyB0b28gZmFpciwgdG9vIHdpc2UsIHdpc2VseSB0b28gZmFpciwKICAgIFRvIG1lcml0IGJsaXNzIGJ5IG1ha2luZyBtZSBkZXNwYWlyOgogICAgU2hlIGhhdGggZm9yc3dvcm4gdG8gbG92ZSwgYW5kIGluIHRoYXQgdm93CiAgICBEbyBJIGxpdmUgZGVhZCB0aGF0IGxpdmUgdG8gdGVsbCBpdCBub3cuCgpCRU5WT0xJTwoKICAgIEJlIHJ1bGVkIGJ5IG1lLCBmb3JnZXQgdG8gdGhpbmsgb2YgaGVyLgoKUk9NRU8KCiAgICBPLCB0ZWFjaCBtZSBob3cgSSBzaG91bGQgZm9yZ2V0IHRvIHRoaW5rLgoKQkVOVk9MSU8KCiAgICBCeSBnaXZpbmcgbGliZXJ0eSB1bnRvIHRoaW5lIGV5ZXM7CiAgICBFeGFtaW5lIG90aGVyIGJlYXV0aWVzLgoKUk9NRU8KCiAgICAnVGlzIHRoZSB3YXkKICAgIFRvIGNhbGwgaGVycyBleHF1aXNpdGUsIGluIHF1ZXN0aW9uIG1vcmU6CiAgICBUaGVzZSBoYXBweSBtYXNrcyB0aGF0IGtpc3MgZmFpciBsYWRpZXMnIGJyb3dzCiAgICBCZWluZyBibGFjayBwdXQgdXMgaW4gbWluZCB0aGV5IGhpZGUgdGhlIGZhaXI7CiAgICBIZSB0aGF0IGlzIHN0cnVja2VuIGJsaW5kIGNhbm5vdCBmb3JnZXQKICAgIFRoZSBwcmVjaW91cyB0cmVhc3VyZSBvZiBoaXMgZXllc2lnaHQgbG9zdDoKICAgIFNob3cgbWUgYSBtaXN0cmVzcyB0aGF0IGlzIHBhc3NpbmcgZmFpciwKICAgIFdoYXQgZG90aCBoZXIgYmVhdXR5IHNlcnZlLCBidXQgYXMgYSBub3RlCiAgICBXaGVyZSBJIG1heSByZWFkIHdobyBwYXNzJ2QgdGhhdCBwYXNzaW5nIGZhaXICiAgICBGYXJld2VsbDogdGhvdSBjYW5zdCBub3QgdGVhY2ggbWUgdG8gZm9yZ2V0LgoKQkVOVk9MSU8KCiAgICBJJ2xsIHBheSB0aGF0IGRvY3RyaW5lLCBvciBlbHNlIGRpZSBpbiBkZWJ0LgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEEgc3RyZWV0LgoKICAgIEVudGVyIENBUFVMRVQsIFBBUklTLCBhbmQgU2VydmFudCAKCkNBUFVMRVQKCiAgICBCdXQgTW9udGFndWUgaXMgYm91bmQgYXMgd2VsbCBhcyBJLAogICAgSW4gcGVuYWx0eSBhbGlrZTsgYW5kICd0aXMgbm90IGhhcmQsIEkgdGhpbmssCiAgICBGb3IgbWVuIHNvIG9sZCBhcyB3ZSB0byBrZWVwIHRoZSBwZWFjZS4KClBBUklTCgogICAgT2YgaG9ub3VyYWJsZSByZWNrb25pbmcgYXJlIHlvdSBib3RoOwogICAgQW5kIHBpdHkgJ3RpcyB5b3UgbGl2ZWQgYXQgb2RkcyBzbyBsb25nLgogICAgQnV0IG5vdywgbXkgbG9yZCwgd2hhdCBzYXkgeW91IHRvIG15IHN1aXQCgpDQVBVTEVUCgogICAgQnV0IHNheWluZyBvJ2VyIHdoYXQgSSBoYXZlIHNhaWQgYmVmb3JlOgogICAgTXkgY2hpbGQgaXMgeWV0IGEgc3RyYW5nZXIgaW4gdGhlIHdvcmxkOwogICAgU2hlIGhhdGggbm90IHNlZW4gdGhlIGNoYW5nZSBvZiBmb3VydGVlbiB5ZWFycywKICAgIExldCB0d28gbW9yZSBzdW1tZXJzIHdpdGhlciBpbiB0aGVpciBwcmlkZSwKICAgIEVyZSB3ZSBtYXkgdGhpbmsgaGVyIHJpcGUgdG8gYmUgYSBicmlkZS4KClBBUklTCgogICAgWW91bmdlciB0aGFuIHNoZSBhcmUgaGFwcHkgbW90aGVycyBtYWRlLgoKQ0FQVUxFVAoKICAgIEFuZCB0b28gc29vbiBtYXJyJ2QgYXJlIHRob3NlIHNvIGVhcmx5IG1hZGUuCiAgICBUaGUgZWFydGggaGF0aCBzd2FsbG93J2QgYWxsIG15IGhvcGVzIGJ1dCBzaGUsCiAgICBTaGUgaXMgdGhlIGhvcGVmdWwgbGFkeSBvZiBteSBlYXJ0aDoKICAgIEJ1dCB3b28gaGVyLCBnZW50bGUgUGFyaXMsIGdldCBoZXIgaGVhcnQsCiAgICBNeSB3aWxsIHRvIGhlciBjb25zZW50IGlzIGJ1dCBhIHBhcnQ7CiAgICBBbiBzaGUgYWdyZWUsIHdpdGhpbiBoZXIgc2NvcGUgb2YgY2hvaWNlCiAgICBMaWVzIG15IGNvbnNlbnQgYW5kIGZhaXIgYWNjb3JkaW5nIHZvaWNlLgogICAgVGhpcyBuaWdodCBJIGhvbGQgYW4gb2xkIGFjY3VzdG9tJ2QgZmVhc3QsCiAgICBXaGVyZXRvIEkgaGF2ZSBpbnZpdGVkIG1hbnkgYSBndWVzdCwKICAgIFN1Y2ggYXMgSSBsb3ZlOyBhbmQgeW91LCBhbW9uZyB0aGUgc3RvcmUsCiAgICBPbmUgbW9yZSwgbW9zdCB3ZWxjb21lLCBtYWtlcyBteSBudW1iZXIgbW9yZS4KICAgIEF0IG15IHBvb3IgaG91c2UgbG9vayB0byBiZWhvbGQgdGhpcyBuaWdodAogICAgRWFydGgtdHJlYWRpbmcgc3RhcnMgdGhhdCBtYWtlIGRhcmsgaGVhdmVuIGxpZ2h0OgogICAgU3VjaCBjb21mb3J0IGFzIGRvIGx1c3R5IHlvdW5nIG1lbiBmZWVsCiAgICBXaGVuIHdlbGwtYXBwYXJlbGwnZCBBcHJpbCBvbiB0aGUgaGVlbAogICAgT2YgbGltcGluZyB3aW50ZXIgdHJlYWRzLCBldmVuIHN1Y2ggZGVsaWdodAogICAgQW1vbmcgZnJlc2ggZmVtYWxlIGJ1ZHMgc2hhbGwgeW91IHRoaXMgbmlnaHQKICAgIEluaGVyaXQgYXQgbXkgaG91c2U7IGhlYXIgYWxsLCBhbGwgc2VlLAogICAgQW5kIGxpa2UgaGVyIG1vc3Qgd2hvc2UgbWVyaXQgbW9zdCBzaGFsbCBiZToKICAgIFdoaWNoIG9uIG1vcmUgdmlldywgb2YgbWFueSBtaW5lIGJlaW5nIG9uZQogICAgTWF5IHN0YW5kIGluIG51bWJlciwgdGhvdWdoIGluIHJlY2tvbmluZyBub25lLAogICAgQ29tZSwgZ28gd2l0aCBtZS4KCiAgICBUbyBTZXJ2YW50LCBnaXZpbmcgYSBwYXBlcgogICAgR28sIHNpcnJhaCwgdHJ1ZGdlIGFib3V0CiAgICBUaHJvdWdoIGZhaXIgVmVyb25hOyBmaW5kIHRob3NlIHBlcnNvbnMgb3V0CiAgICBXaG9zZSBuYW1lcyBhcmUgd3JpdHRlbiB0aGVyZSwgYW5kIHRvIHRoZW0gc2F5LAogICAgTXkgaG91c2UgYW5kIHdlbGNvbWUgb24gdGhlaXIgcGxlYXN1cmUgc3RheS4KCiAgICBFeGV1bnQgQ0FQVUxFVCBhbmQgUEFSSVMKClNlcnZhbnQKCiAgICBGaW5kIHRoZW0gb3V0IHdob3NlIG5hbWVzIGFyZSB3cml0dGVuIGhlcmUhIEl0IGlzCiAgICB3cml0dGVuLCB0aGF0IHRoZSBzaG9lbWFrZXIgc2hvdWxkIG1lZGRsZSB3aXRoIGhpcwogICAgeWFyZCwgYW5kIHRoZSB0YWlsb3Igd2l0aCBoaXMgbGFzdCwgdGhlIGZpc2hlciB3aXRoCiAgICBoaXMgcGVuY2lsLCBhbmQgdGhlIHBhaW50ZXIgd2l0aCBoaXMgbmV0czsgYnV0IEkgYW0KICAgIHNlbnQgdG8gZmluZCB0aG9zZSBwZXJzb25zIHdob3NlIG5hbWVzIGFyZSBoZXJlCiAgICB3cml0LCBhbmQgY2FuIG5ldmVyIGZpbmQgd2hhdCBuYW1lcyB0aGUgd3JpdGluZwogICAgcGVyc29uIGhhdGggaGVyZSB3cml0LiBJIG11c3QgdG8gdGhlIGxlYXJuZWQuLS1JbiBnb29kIHRpbWUuCgogICAgRW50ZXIgQkVOVk9MSU8gYW5kIFJPTUVPCgpCRU5WT0xJTwoKICAgIFR1dCwgbWFuLCBvbmUgZmlyZSBidXJucyBvdXQgYW5vdGhlcidzIGJ1cm5pbmcsCiAgICBPbmUgcGFpbiBpcyBsZXNzZW4nZCBieSBhbm90aGVyJ3MgYW5ndWlzaDsKICAgIFR1cm4gZ2lkZHksIGFuZCBiZSBob2xwIGJ5IGJhY2t3YXJkIHR1cm5pbmc7CiAgICBPbmUgZGVzcGVyYXRlIGdyaWVmIGN1cmVzIHdpdGggYW5vdGhlcidzIGxhbmd1aXNoOgogICAgVGFrZSB0aG91IHNvbWUgbmV3IGluZmVjdGlvbiB0byB0aHkgZXllLAogICAgQW5kIHRoZSByYW5rIHBvaXNvbiBvZiB0aGUgb2xkIHdpbGwgZGllLgoKUk9NRU8KCiAgICBZb3VyIHBsYWludGFpbi1sZWFmIGlzIGV4Y2VsbGVudCBmb3IgdGhhdC4KCkJFTlZPTElPCgogICAgRm9yIHdoYXQsIEkgcHJheSB0aGVlPwoKUk9NRU8KCiAgICBGb3IgeW91ciBicm9rZW4gc2hpbi4KCkJFTlZPTElPCgogICAgV2h5LCBSb21lbywgYXJ0IHRob3UgbWFkPwoKUk9NRU8KCiAgICBOb3QgbWFkLCBidXQgYm91bmQgbW9yZSB0aGFuIGEgbWFkLW1hbiBpczsKICAgIFNodXQgdXAgaW4gcHJpc29uLCBrZXB0IHdpdGhvdXQgbXkgZm9vZCwKICAgIFdoaXBwJ2QgYW5kIHRvcm1lbnRlZCBhbmQtLUdvZC1kZW4sIGdvb2QgZmVsbG93LgoKU2VydmFudAoKICAgIEdvZCBnaScgZ29kLWRlbi4gSSBwcmF5LCBzaXIsIGNhbiB5b3UgcmVhZD8KClJPTUVPCgogICAgQXksIG1pbmUgb3duIGZvcnR1bmUgaW4gbXkgbWlzZXJ5LgoKU2VydmFudAoKICAgIFBlcmhhcHMgeW91IGhhdmUgbGVhcm5lZCBpdCB3aXRob3V0IGJvb2s6IGJ1dCwgSQogICAgcHJheSwgY2FuIHlvdSByZWFkIGFueSB0aGluZyB5b3Ugc2VlPwoKUk9NRU8KCiAgICBBeSwgaWYgSSBrbm93IHRoZSBsZXR0ZXJzIGFuZCB0aGUgbGFuZ3VhZ2UuCgpTZXJ2YW50CgogICAgWWUgc2F5IGhvbmVzdGx5OiByZXN0IHlvdSBtZXJyeSEKClJPTUVPCgogICAgU3RheSwgZmVsbG93OyBJIGNhbiByZWFkLgoKICAgIFJlYWRzCiAgICAnU2lnbmlvciBNYXJ0aW5vIGFuZCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOwogICAgQ291bnR5IEFuc2VsbWUgYW5kIGhpcyBiZWF1dGVvdXMgc2lzdGVyczsgdGhlIGxhZHkKICAgIHdpZG93IG9mIFZpdHJhdmlvOyBTaWduaW9yIFBsYWNlbnRpbyBhbmQgaGlzIGxvdmVseQogICAgbmllY2VzOyBNZXJjdXRpbyBhbmQgaGlzIGJyb3RoZXIgVmFsZW50aW5lOyBtaW5lCiAgICB1bmNsZSBDYXB1bGV0LCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOyBteSBmYWlyIG5pZWNlCiAgICBSb3NhbGluZTsgTGl2aWE7IFNpZ25pb3IgVmFsZW50aW8gYW5kIGhpcyBjb3VzaW4KICAgIFR5YmFsdCwgTHVjaW8gYW5kIHRoZSBsaXZlbHkgSGVsZW5hLicgQSBmYWlyCiAgICBhc3NlbWJseTogd2hpdGhlciBzaG91bGQgdGhleSBjb21lPwoKU2VydmFudAoKICAgIFVwLgoKUk9NRU8KCiAgICBXaGl0aGVyPwoKU2VydmFudAoKICAgIFRvIHN1cHBlcjsgdG8gb3VyIGhvdXNlLgoKUk9NRU8KCiAgICBXaG9zZSBob3VzZT8KClNlcnZhbnQKCiAgICBNeSBtYXN0ZXIncy4KClJPTUVPCgogICAgSW5kZWVkLCBJIHNob3VsZCBoYXZlIGFzaydkIHlvdSB0aGF0IGJlZm9yZS4KClNlcnZhbnQKCiAgICBOb3cgSSdsbCB0ZWxsIHlvdSB3aXRob3V0IGFza2luZzogbXkgbWFzdGVyIGlzIHRoZQogICAgZ3JlYXQgcmljaCBDYXB1bGV0OyBhbmQgaWYgeW91IGJlIG5vdCBvZiB0aGUgaG91c2UKICAgIG9mIE1vbnRhZ3VlcywgSSBwcmF5LCBjb21lIGFuZCBjcnVzaCBhIGN1cCBvZiB3aW5lLgogICAgUmVzdCB5b3UgbWVycnkhCgogICAgRXhpdAoKQkVOVk9MSU8KCiAgICBBdCB0aGlzIHNhbWUgYW5jaWVudCBmZWFzdCBvZiBDYXB1bGV0J3MKICAgIFN1cHMgdGhlIGZhaXIgUm9zYWxpbmUgd2hvbSB0aG91IHNvIGxvdmVzdCwKICAgIFdpdGggYWxsIHRoZSBhZG1pcmVkIGJlYXV0aWVzIG9mIFZlcm9uYToKICAgIEdvIHRoaXRoZXI7IGFuZCwgd2l0aCB1bmF0dGFpbnRlZCBleWUsCiAgICBDb21wYXJlIGhlciBmYWNlIHdpdGggc29tZSB0aGF0IEkgc2hhbGwgc2hvdywKICAgIEFuZCBJIHdpbGwgbWFrZSB0aGVlIHRoaW5rIHRoeSBzd2FuIGEgY3Jvdy4KClJPTUVPCgogICAgV2hlbiB0aGUgZGV2b3V0IHJlbGlnaW9uIG9mIG1pbmUgZXllCiAgICBNYWludGFpbnMgc3VjaCBmYWxzZWhvb2QsIHRoZW4gdHVybiB0ZWFycyB0byBmaXJlczsKICAgIEFuZCB0aGVzZSwgd2hvIG9mdGVuIGRyb3duJ2QgY291bGQgbmV2ZXIgZGllLAogICAgVHJhbnNwYXJlbnQgaGVyZXRpY3MsIGJlIGJ1cm50IGZvciBsaWFycyEKICAgIE9uZSBmYWlyZXIgdGhhbiBteSBsb3ZlISB0aGUgYWxsLXNlZWluZyBzdW4KICAgIE5lJ2VyIHNhdyBoZXIgbWF0Y2ggc2luY2UgZmlyc3QgdGhlIHdvcmxkIGJlZ3VuLgoKQkVOVk9MSU8KCiAgICBUdXQsIHlvdSBzYXcgaGVyIGZhaXIsIG5vbmUgZWxzZSBiZWluZyBieSwKICAgIEhlcnNlbGYgcG9pc2VkIHdpdGggaGVyc2VsZiBpbiBlaXRoZXIgZXllOgogICAgQnV0IGluIHRoYXQgY3J5c3RhbCBzY2FsZXMgbGV0IHRoZXJlIGJlIHdlaWdoJ2QKICAgIFlvdXIgbGFkeSdzIGxvdmUgYWdhaW5zdCBzb21lIG90aGVyIG1haWQKICAgIFRoYXQgSSB3aWxsIHNob3cgeW91IHNoaW5pbmcgYXQgdGhpcyBmZWFzdCwKICAgIEFuZCBzaGUgc2hhbGwgc2NhbnQgc2hvdyB3ZWxsIHRoYXQgbm93IHNob3dzIGJlc3QuCgpST01FTwoKICAgIEknbGwgZ28gYWxvbmcsIG5vIHN1Y2ggc2lnaHQgdG8gYmUgc2hvd24sCiAgICBCdXQgdG8gcmVqb2ljZSBpbiBzcGxlbmRvciBvZiBtaW5lIG93bi4KCiAgICBFeGV1bnQKClNDRU5FIElJSS4gQSByb29tIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgTnVyc2UsIHdoZXJlJ3MgbXkgZGF1Z2h0ZXIIGNhbGwgaGVyIGZvcnRoIHRvIG1lLgoKTnVyc2UKCiAgICBOb3csIGJ5IG15IG1haWRlbmhlYWQsIGF0IHR3ZWx2ZSB5ZWFyIG9sZCwKICAgIEkgYmFkZSBoZXIgY29tZS4gV2hhdCwgbGFtYiEgd2hhdCwgbGFkeWJpcmQhCiAgICBHb2QgZm9yYmlkISBXaGVyZSdzIHRoaXMgZ2lybD8gV2hhdCwgSnVsaWV0IQoKICAgIEVudGVyIEpVTElFVAoKSlVMSUVUCgogICAgSG93IG5vdyEgd2hvIGNhbGxzPwoKTnVyc2UKCiAgICBZb3VyIG1vdGhlci4KCkpVTElFVAoKICAgIE1hZGFtLCBJIGFtIGhlcmUuCiAgICBXaGF0IGlzIHlvdXIgd2lsbD8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoaXMgaXMgdGhlIG1hdHRlcjotLU51cnNlLCBnaXZlIGxlYXZlIGF3aGlsZSwKICAgIFdlIG11c3QgdGFsayBpbiBzZWNyZXQ6LS1udXJzZSwgY29tZSBiYWNrIGFnYWluOwogICAgSSBoYXZlIHJlbWVtYmVyJ2QgbWUsIHRob3UncyBoZWFyIG91ciBjb3Vuc2VsLgogICAgVGhvdSBrbm93J3N0IG15IGRhdWdodGVyJ3Mgb2YgYSBwcmV0dHkgYWdlLgoKTnVyc2UKCiAgICBGYWl0aCwgSSBjYW4gdGVsbCBoZXIgYWdlIHVudG8gYW4gaG91ci4KCkxBRFkgQ0FQVUxFVAoKICAgIFNoZSdzIG5vdCBmb3VydGVlbi4KCk51cnNlCgogICAgSSdsbCBsYXkgZm91cnRlZW4gb2YgbXkgdGVldGgsLS0KICAgIEFuZCB5ZXQsIHRvIG15IHRlZXRoIGJlIGl0IHNwb2tlbiwgSSBoYXZlIGJ1dCBmb3VyLS0KICAgIFNoZSBpcyBub3QgZm91cnRlZW4uIEhvdyBsb25nIGlzIGl0IG5vdwogICAgVG8gTGFtbWFzLXRpZGUCgpMQURZIENBUFVMRVQKCiAgICBBIGZvcnRuaWdodCBhbmQgb2RkIGRheXMuCgpOdXJzZQoKICAgIEV2ZW4gb3Igb2RkLCBvZiBhbGwgZGF5cyBpbiB0aGUgeWVhciwKICAgIENvbWUgTGFtbWFzLWV2ZSBhdCBuaWdodCBzaGFsbCBzaGUgYmUgZm91cnRlZW4uCiAgICBTdXNhbiBhbmQgc2hlLS1Hb2QgcmVzdCBhbGwgQ2hyaXN0aWFuIHNvdWxzIS0tCiAgICBXZXJlIG9mIGFuIGFnZTogd2VsbCwgU3VzYW4gaXMgd2l0aCBHb2Q7CiAgICBTaGUgd2FzIHRvbyBnb29kIGZvciBtZTogYnV0LCBhcyBJIHNhaWQsCiAgICBPbiBMYW1tYXMtZXZlIGF0IG5pZ2h0IHNoYWxsIHNoZSBiZSBmb3VydGVlbjsKICAgIFRoYXQgc2hhbGwgc2hlLCBtYXJyeTsgSSByZW1lbWJlciBpdCB3ZWxsLgogICAgJ1RpcyBzaW5jZSB0aGUgZWFydGhxdWFrZSBub3cgZWxldmVuIHllYXJzOwogICAgQW5kIHNoZSB3YXMgd2VhbidkLC0tSSBuZXZlciBzaGFsbCBmb3JnZXQgaXQsLS0KICAgIE9mIGFsbCB0aGUgZGF5cyBvZiB0aGUgeWVhciwgdXBvbiB0aGF0IGRheToKICAgIEZvciBJIGhhZCB0aGVuIGxhaWQgd29ybXdvb2QgdG8gbXkgZHVnLAogICAgU2l0dGluZyBpbiB0aGUgc3VuIHVuZGVyIHRoZSBkb3ZlLWhvdXNlIHdhbGw7CiAgICBNeSBsb3JkIGFuZCB5b3Ugd2VyZSB0aGVuIGF0IE1hbnR1YTotLQogICAgTmF5LCBJIGRvIGJlYXIgYSBicmFpbjotLWJ1dCwgYXMgSSBzYWlkLAogICAgV2hlbiBpdCBkaWQgdGFzdGUgdGhlIHdvcm13b29kIG9uIHRoZSBuaXBwbGUKICAgIE9mIG15IGR1ZyBhbmQgZmVsdCBpdCBiaXR0ZXIsIHByZXR0eSBmb29sLAogICAgVG8gc2VlIGl0IHRldGNoeSBhbmQgZmFsbCBvdXQgd2l0aCB0aGUgZHVnIQogICAgU2hha2UgcXVvdGggdGhlIGRvdmUtaG91c2U6ICd0d2FzIG5vIG5lZWQsIEkgdHJvdywKICAgIFRvIGJpZCBtZSB0cnVkZ2U6CiAgICBBbmQgc2luY2UgdGhhdCB0aW1lIGl0IGlzIGVsZXZlbiB5ZWFyczsKICAgIEZvciB0aGVuIHNoZSBjb3VsZCBzdGFuZCBhbG9uZTsgbmF5LCBieSB0aGUgcm9vZCwKICAgIFNoZSBjb3VsZCBoYXZlIHJ1biBhbmQgd2FkZGxlZCBhbGwgYWJvdXQ7CiAgICBGb3IgZXZlbiB0aGUgZGF5IGJlZm9yZSwgc2hlIGJyb2tlIGhlciBicm93OgogICAgQW5kIHRoZW4gbXkgaHVzYmFuZC0tR29kIGJlIHdpdGggaGlzIHNvdWwhCiAgICBBJyB3YXMgYSBtZXJyeSBtYW4tLXRvb2sgdXAgdGhlIGNoaWxkOgogICAgJ1llYSwnIHF1b3RoIGhlLCAnZG9zdCB0aG91IGZhbGwgdXBvbiB0aHkgZmFjZT8KICAgIFRob3Ugd2lsdCBmYWxsIGJhY2t3YXJkIHdoZW4gdGhvdSBoYXN0IG1vcmUgd2l0OwogICAgV2lsdCB0aG91IG5vdCwgSnVsZT8nIGFuZCwgYnkgbXkgaG9saWRhbWUsCiAgICBUaGUgcHJldHR5IHdyZXRjaCBsZWZ0IGNyeWluZyBhbmQgc2FpZCAnQXkuJwogICAgVG8gc2VlLCBub3csIGhvdyBhIGplc3Qgc2hhbGwgY29tZSBhYm91dCEKICAgIEkgd2FycmFudCwgYW4gSSBzaG91bGQgbGl2ZSBhIHRob3VzYW5kIHllYXJzLAogICAgSSBuZXZlciBzaG91bGQgZm9yZ2V0IGl0OiAnV2lsdCB0aG91IG5vdCwgSnVsZT8nIHF1b3RoIGhlOwogICAgQW5kLCBwcmV0dHkgZm9vbCwgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKTEFEWSBDQVBVTEVUCgogICAgRW5vdWdoIG9mIHRoaXM7IEkgcHJheSB0aGVlLCBob2xkIHRoeSBwZWFjZS4KCk51cnNlCgogICAgWWVzLCBtYWRhbTogeWV0IEkgY2Fubm90IGNob29zZSBidXQgbGF1Z2gsCiAgICBUbyB0aGluayBpdCBzaG91bGQgbGVhdmUgY3J5aW5nIGFuZCBzYXkgJ0F5LicKICAgIEFuZCB5ZXQsIEkgd2FycmFudCwgaXQgaGFkIHVwb24gaXRzIGJyb3cKICAgIEEgYnVtcCBhcyBiaWcgYXMgYSB5b3VuZyBjb2NrZXJlbCdzIHN0b25lOwogICAgQSBwYXJsb3VzIGtub2NrOyBhbmQgaXQgY3JpZWQgYml0dGVybHk6CiAgICAnWWVhLCcgcXVvdGggbXkgaHVzYmFuZCwnZmFsbCdzdCB1cG9uIHRoeSBmYWNlPwogICAgVGhvdSB3aWx0IGZhbGwgYmFja3dhcmQgd2hlbiB0aG91IGNvbWVzdCB0byBhZ2U7CiAgICBXaWx0IHRob3Ugbm90LCBKdWxlPycgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKSlVMSUVUCgogICAgQW5kIHN0aW50IHRob3UgdG9vLCBJIHByYXkgdGhlZSwgbnVyc2UsIHNheSBJLgoKTnVyc2UKCiAgICBQZWFjZSwgSSBoYXZlIGRvbmUuIEdvZCBtYXJrIHRoZWUgdG8gaGlzIGdyYWNlIQogICAgVGhvdSB3YXN0IHRoZSBwcmV0dGllc3QgYmFiZSB0aGF0IGUnZXIgSSBudXJzZWQ6CiAgICBBbiBJIG1pZ2h0IGxpdmUgdG8gc2VlIHRoZWUgbWFycmllZCBvbmNlLAogICAgSSBoYXZlIG15IHdpc2guCgpMQURZIENBUFVMRVQKCiAgICBNYXJyeSwgdGhhdCAnbWFycnknIGlzIHRoZSB2ZXJ5IHRoZW1lCiAgICBJIGNhbWUgdG8gdGFsayBvZi4gVGVsbCBtZSwgZGF1Z2h0ZXIgSnVsaWV0LAogICAgSG93IHN0YW5kcyB5b3VyIGRpc3Bvc2l0aW9uIHRvIGJlIG1hcnJpZWQCgpKVUxJRVQKCiAgICBJdCBpcyBhbiBob25vdXIgdGhhdCBJIGRyZWFtIG5vdCBvZi4KCk51cnNlCgogICAgQW4gaG9ub3VyISB3ZXJlIG5vdCBJIHRoaW5lIG9ubHkgbnVyc2UsCiAgICBJIHdvdWxkIHNheSB0aG91IGhhZHN0IHN1Y2snZCB3aXNkb20gZnJvbSB0aHkgdGVhdC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHRoaW5rIG9mIG1hcnJpYWdlIG5vdzsgeW91bmdlciB0aGFuIHlvdSwKICAgIEhlcmUgaW4gVmVyb25hLCBsYWRpZXMgb2YgZXN0ZWVtLAogICAgQXJlIG1hZGUgYWxyZWFkeSBtb3RoZXJzOiBieSBteSBjb3VudCwKICAgIEkgd2FzIHlvdXIgbW90aGVyIG11Y2ggdXBvbiB0aGVzZSB5ZWFycwogICAgVGhhdCB5b3UgYXJlIG5vdyBhIG1haWQuIFRodXMgdGhlbiBpbiBicmllZjoKICAgIFRoZSB2YWxpYW50IFBhcmlzIHNlZWtzIHlvdSBmb3IgaGlzIGxvdmUuCgpOdXJzZQoKICAgIEEgbWFuLCB5b3VuZyBsYWR5ISBsYWR5LCBzdWNoIGEgbWFuCiAgICBBcyBhbGwgdGhlIHdvcmxkLS13aHksIGhlJ3MgYSBtYW4gb2Ygd2F4LgoKTEFEWSBDQVBVTEVUCgogICAgVmVyb25hJ3Mgc3VtbWVyIGhhdGggbm90IHN1Y2ggYSBmbG93ZXIuCgpOdXJzZQoKICAgIE5heSwgaGUncyBhIGZsb3dlcjsgaW4gZmFpdGgsIGEgdmVyeSBmbG93ZXIuCgpMQURZIENBUFVMRVQKCiAgICBXaGF0IHNheSB5b3UIGNhbiB5b3UgbG92ZSB0aGUgZ2VudGxlbWFuPwogICAgVGhpcyBuaWdodCB5b3Ugc2hhbGwgYmVob2xkIGhpbSBhdCBvdXIgZmVhc3Q7CiAgICBSZWFkIG8nZXIgdGhlIHZvbHVtZSBvZiB5b3VuZyBQYXJpcycgZmFjZSwKICAgIEFuZCBmaW5kIGRlbGlnaHQgd3JpdCB0aGVyZSB3aXRoIGJlYXV0eSdzIHBlbjsKICAgIEV4YW1pbmUgZXZlcnkgbWFycmllZCBsaW5lYW1lbnQsCiAgICBBbmQgc2VlIGhvdyBvbmUgYW5vdGhlciBsZW5kcyBjb250ZW50CiAgICBBbmQgd2hhdCBvYnNjdXJlZCBpbiB0aGlzIGZhaXIgdm9sdW1lIGxpZXMKICAgIEZpbmQgd3JpdHRlbiBpbiB0aGUgbWFyZ2VudCBvZiBoaXMgZXllcy4KICAgIFRoaXMgcHJlY2lvdXMgYm9vayBvZiBsb3ZlLCB0aGlzIHVuYm91bmQgbG92ZXIsCiAgICBUbyBiZWF1dGlmeSBoaW0sIG9ubHkgbGFja3MgYSBjb3ZlcjoKICAgIFRoZSBmaXNoIGxpdmVzIGluIHRoZSBzZWEsIGFuZCAndGlzIG11Y2ggcHJpZGUKICAgIEZvciBmYWlyIHdpdGhvdXQgdGhlIGZhaXIgd2l0aGluIHRvIGhpZGU6CiAgICBUaGF0IGJvb2sgaW4gbWFueSdzIGV5ZXMgZG90aCBzaGFyZSB0aGUgZ2xvcnksCiAgICBUaGF0IGluIGdvbGQgY2xhc3BzIGxvY2tzIGluIHRoZSBnb2xkZW4gc3Rvcnk7CiAgICBTbyBzaGFsbCB5b3Ugc2hhcmUgYWxsIHRoYXQgaGUgZG90aCBwb3NzZXNzLAogICAgQnkgaGF2aW5nIGhpbSwgbWFraW5nIHlvdXJzZWxmIG5vIGxlc3MuCgpOdXJzZQoKICAgIE5vIGxlc3MhIG5heSwgYmlnZ2VyOyB3b21lbiBncm93IGJ5IG1lbi4KCkxBRFkgQ0FQVUxFVAoKICAgIFNwZWFrIGJyaWVmbHksIGNhbiB5b3UgbGlrZSBvZiBQYXJpcycgbG92ZT8KCkpVTElFVAoKICAgIEknbGwgbG9vayB0byBsaWtlLCBpZiBsb29raW5nIGxpa2luZyBtb3ZlOgogICAgQnV0IG5vIG1vcmUgZGVlcCB3aWxsIEkgZW5kYXJ0IG1pbmUgZXllCiAgICBUaGFuIHlvdXIgY29uc2VudCBnaXZlcyBzdHJlbmd0aCB0byBtYWtlIGl0IGZseS4KCiAgICBFbnRlciBhIFNlcnZhbnQKClNlcnZhbnQKCiAgICBNYWRhbSwgdGhlIGd1ZXN0cyBhcmUgY29tZSwgc3VwcGVyIHNlcnZlZCB1cCwgeW91CiAgICBjYWxsZWQsIG15IHlvdW5nIGxhZHkgYXNrZWQgZm9yLCB0aGUgbnVyc2UgY3Vyc2VkIGluCiAgICB0aGUgcGFudHJ5LCBhbmQgZXZlcnkgdGhpbmcgaW4gZXh0cmVtaXR5LiBJIG11c3QKICAgIGhlbmNlIHRvIHdhaXQ7IEkgYmVzZWVjaCB5b3UsIGZvbGxvdyBzdHJhaWdodC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlIGZvbGxvdyB0aGVlLgoKICAgIEV4aXQgU2VydmFudAogICAgSnVsaWV0LCB0aGUgY291bnR5IHN0YXlzLgoKTnVyc2UKCiAgICBHbywgZ2lybCwgc2VlayBoYXBweSBuaWdodHMgdG8gaGFwcHkgZGF5cy4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBST01FTywgTUVSQ1VUSU8sIEJFTlZPTElPLCB3aXRoIGZpdmUgb3Igc2l4IE1hc2tlcnMsIFRvcmNoLWJlYXJlcnMsIGFuZCBvdGhlcnMgCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIHRoaXMgc3BlZWNoIGJlIHNwb2tlIGZvciBvdXIgZXhjdXNlPwogICAgT3Igc2hhbGwgd2Ugb24gd2l0aG91dCBhIGFwb2xvZ3kCgpCRU5WT0xJTwoKICAgIFRoZSBkYXRlIGlzIG91dCBvZiBzdWNoIHByb2xpeGl0eToKICAgIFdlJ2xsIGhhdmUgbm8gQ3VwaWQgaG9vZHdpbmsnZCB3aXRoIGEgc2NhcmYsCiAgICBCZWFyaW5nIGEgVGFydGFyJ3MgcGFpbnRlZCBib3cgb2YgbGF0aCwKICAgIFNjYXJpbmcgdGhlIGxhZGllcyBsaWtlIGEgY3Jvdy1rZWVwZXI7CiAgICBOb3Igbm8gd2l0aG91dC1ib29rIHByb2xvZ3VlLCBmYWludGx5IHNwb2tlCiAgICBBZnRlciB0aGUgcHJvbXB0ZXIsIGZvciBvdXIgZW50cmFuY2U6CiAgICBCdXQgbGV0IHRoZW0gbWVhc3VyZSB1cyBieSB3aGF0IHRoZXkgd2lsbDsKICAgIFdlJ2xsIG1lYXN1cmUgdGhlbSBhIG1lYXN1cmUsIGFuZCBiZSBnb25lLgoKUk9NRU8KCiAgICBHaXZlIG1lIGEgdG9yY2g6IEkgYW0gbm90IGZvciB0aGlzIGFtYmxpbmc7CiAgICBCZWluZyBidXQgaGVhdnksIEkgd2lsbCBiZWFyIHRoZSBsaWdodC4KCk1FUkNVVElPCgogICAgTmF5LCBnZW50bGUgUm9tZW8sIHdlIG11c3QgaGF2ZSB5b3UgZGFuY2UuCgpST01FTwoKICAgIE5vdCBJLCBiZWxpZXZlIG1lOiB5b3UgaGF2ZSBkYW5jaW5nIHNob2VzCiAgICBXaXRoIG5pbWJsZSBzb2xlczogSSBoYXZlIGEgc291bCBvZiBsZWFkCiAgICBTbyBzdGFrZXMgbWUgdG8gdGhlIGdyb3VuZCBJIGNhbm5vdCBtb3ZlLgoKTUVSQ1VUSU8KCiAgICBZb3UgYXJlIGEgbG92ZXI7IGJvcnJvdyBDdXBpZCdzIHdpbmdzLAogICAgQW5kIHNvYXIgd2l0aCB0aGVtIGFib3ZlIGEgY29tbW9uIGJvdW5kLgoKUk9NRU8KCiAgICBJIGFtIHRvbyBzb3JlIGVucGllcmNlZCB3aXRoIGhpcyBzaGFmdAogICAgVG8gc29hciB3aXRoIGhpcyBsaWdodCBmZWF0aGVycywgYW5kIHNvIGJvdW5kLAogICAgSSBjYW5ub3QgYm91bmQgYSBwaXRjaCBhYm92ZSBkdWxsIHdvZToKICAgIFVuZGVyIGxvdmUncyBoZWF2eSBidXJkZW4gZG8gSSBzaW5rLgoKTUVSQ1VUSU8KCiAgICBBbmQsIHRvIHNpbmsgaW4gaXQsIHNob3VsZCB5b3UgYnVyZGVuIGxvdmU7CiAgICBUb28gZ3JlYXQgb3BwcmVzc2lvbiBmb3IgYSB0ZW5kZXIgdGhpbmcuCgpST01FTwoKICAgIElzIGxvdmUgYSB0ZW5kZXIgdGhpbmcIGl0IGlzIHRvbyByb3VnaCwKICAgIFRvbyBydWRlLCB0b28gYm9pc3Rlcm91cywgYW5kIGl0IHByaWNrcyBsaWtlIHRob3JuLgoKTUVSQ1VUSU8KCiAgICBJZiBsb3ZlIGJlIHJvdWdoIHdpdGggeW91LCBiZSByb3VnaCB3aXRoIGxvdmU7CiAgICBQcmljayBsb3ZlIGZvciBwcmlja2luZywgYW5kIHlvdSBiZWF0IGxvdmUgZG93bi4KICAgIEdpdmUgbWUgYSBjYXNlIHRvIHB1dCBteSB2aXNhZ2UgaW46CiAgICBBIHZpc29yIGZvciBhIHZpc29yISB3aGF0IGNhcmUgSQogICAgV2hhdCBjdXJpb3VzIGV5ZSBkb3RoIHF1b3RlIGRlZm9ybWl0aWVzPwogICAgSGVyZSBhcmUgdGhlIGJlZXRsZSBicm93cyBzaGFsbCBibHVzaCBmb3IgbWUuCgpCRU5WT0xJTwoKICAgIENvbWUsIGtub2NrIGFuZCBlbnRlcjsgYW5kIG5vIHNvb25lciBpbiwKICAgIEJ1dCBldmVyeSBtYW4gYmV0YWtlIGhpbSB0byBoaXMgbGVncy4KClJPTUVPCgogICAgQSB0b3JjaCBmb3IgbWU6IGxldCB3YW50b25zIGxpZ2h0IG9mIGhlYXJ0CiAgICBUaWNrbGUgdGhlIHNlbnNlbGVzcyBydXNoZXMgd2l0aCB0aGVpciBoZWVscywKICAgIEZvciBJIGFtIHByb3ZlcmInZCB3aXRoIGEgZ3JhbmRzaXJlIHBocmFzZTsKICAgIEknbGwgYmUgYSBjYW5kbGUtaG9sZGVyLCBhbmQgbG9vayBvbi4KICAgIFRoZSBnYW1lIHdhcyBuZSdlciBzbyBmYWlyLCBhbmQgSSBhbSBkb25lLgoKTUVSQ1VUSU8KCiAgICBUdXQsIGR1bidzIHRoZSBtb3VzZSwgdGhlIGNvbnN0YWJsZSdzIG93biB3b3JkOgogICAgSWYgdGhvdSBhcnQgZHVuLCB3ZSdsbCBkcmF3IHRoZWUgZnJvbSB0aGUgbWlyZQogICAgT2YgdGhpcyBzaXItcmV2ZXJlbmNlIGxvdmUsIHdoZXJlaW4gdGhvdSBzdGljaydzdAogICAgVXAgdG8gdGhlIGVhcnMuIENvbWUsIHdlIGJ1cm4gZGF5bGlnaHQsIGhvIQoKUk9NRU8KCiAgICBOYXksIHRoYXQncyBub3Qgc28uCgpNRVJDVVRJTwoKICAgIEkgbWVhbiwgc2lyLCBpbiBkZWxheQogICAgV2Ugd2FzdGUgb3VyIGxpZ2h0cyBpbiB2YWluLCBsaWtlIGxhbXBzIGJ5IGRheS4KICAgIFRha2Ugb3VyIGdvb2QgbWVhbmluZywgZm9yIG91ciBqdWRnbWVudCBzaXRzCiAgICBGaXZlIHRpbWVzIGluIHRoYXQgZXJlIG9uY2UgaW4gb3VyIGZpdmUgd2l0cy4KClJPTUVPCgogICAgQW5kIHdlIG1lYW4gd2VsbCBpbiBnb2luZyB0byB0aGlzIG1hc2s7CiAgICBCdXQgJ3RpcyBubyB3aXQgdG8gZ28uCgpNRVJDVVRJTwoKICAgIFdoeSwgbWF5IG9uZSBhc2sCgpST01FTwoKICAgIEkgZHJlYW0nZCBhIGRyZWFtIHRvLW5pZ2h0LgoKTUVSQ1VUSU8KCiAgICBBbmQgc28gZGlkIEkuCgpST01FTwoKICAgIFdlbGwsIHdoYXQgd2FzIHlvdXJzPwoKTUVSQ1VUSU8KCiAgICBUaGF0IGRyZWFtZXJzIG9mdGVuIGxpZS4KClJPTUVPCgogICAgSW4gYmVkIGFzbGVlcCwgd2hpbGUgdGhleSBkbyBkcmVhbSB0aGluZ3MgdHJ1ZS4KCk1FUkNVVElPCgogICAgTywgdGhlbiwgSSBzZWUgUXVlZW4gTWFiIGhhdGggYmVlbiB3aXRoIHlvdS4KICAgIFNoZSBpcyB0aGUgZmFpcmllcycgbWlkd2lmZSwgYW5kIHNoZSBjb21lcwogICAgSW4gc2hhcGUgbm8gYmlnZ2VyIHRoYW4gYW4gYWdhdGUtc3RvbmUKICAgIE9uIHRoZSBmb3JlLWZpbmdlciBvZiBhbiBhbGRlcm1hbiwKICAgIERyYXduIHdpdGggYSB0ZWFtIG9mIGxpdHRsZSBhdG9taWVzCiAgICBBdGh3YXJ0IG1lbidzIG5vc2VzIGFzIHRoZXkgbGllIGFzbGVlcDsKICAgIEhlciB3YWdvbi1zcG9rZXMgbWFkZSBvZiBsb25nIHNwaWRlcnMnIGxlZ3MsCiAgICBUaGUgY292ZXIgb2YgdGhlIHdpbmdzIG9mIGdyYXNzaG9wcGVycywKICAgIFRoZSB0cmFjZXMgb2YgdGhlIHNtYWxsZXN0IHNwaWRlcidzIHdlYiwKICAgIFRoZSBjb2xsYXJzIG9mIHRoZSBtb29uc2hpbmUncyB3YXRlcnkgYmVhbXMsCiAgICBIZXIgd2hpcCBvZiBjcmlja2V0J3MgYm9uZSwgdGhlIGxhc2ggb2YgZmlsbSwKICAgIEhlciB3YWdvbmVyIGEgc21hbGwgZ3JleS1jb2F0ZWQgZ25hdCwKICAgIE5vdCBzbyBiaWcgYXMgYSByb3VuZCBsaXR0bGUgd29ybQogICAgUHJpY2snZCBmcm9tIHRoZSBsYXp5IGZpbmdlciBvZiBhIG1haWQ7CiAgICBIZXIgY2hhcmlvdCBpcyBhbiBlbXB0eSBoYXplbC1udXQKICAgIE1hZGUgYnkgdGhlIGpvaW5lciBzcXVpcnJlbCBvciBvbGQgZ3J1YiwKICAgIFRpbWUgb3V0IG8nIG1pbmQgdGhlIGZhaXJpZXMnIGNvYWNobWFrZXJzLgogICAgQW5kIGluIHRoaXMgc3RhdGUgc2hlIGdhbGxvcHMgbmlnaHQgYnkgbmlnaHQKICAgIFRocm91Z2ggbG92ZXJzJyBicmFpbnMsIGFuZCB0aGVuIHRoZXkgZHJlYW0gb2YgbG92ZTsKICAgIE8nZXIgY291cnRpZXJzJyBrbmVlcywgdGhhdCBkcmVhbSBvbiBjb3VydCdzaWVzIHN0cmFpZ2h0LAogICAgTydlciBsYXd5ZXJzJyBmaW5nZXJzLCB3aG8gc3RyYWlnaHQgZHJlYW0gb24gZmVlcywKICAgIE8nZXIgbGFkaWVzICcgbGlwcywgd2hvIHN0cmFpZ2h0IG9uIGtpc3NlcyBkcmVhbSwKICAgIFdoaWNoIG9mdCB0aGUgYW5ncnkgTWFiIHdpdGggYmxpc3RlcnMgcGxhZ3VlcywKICAgIEJlY2F1c2UgdGhlaXIgYnJlYXRocyB3aXRoIHN3ZWV0bWVhdHMgdGFpbnRlZCBhcmU6CiAgICBTb21ldGltZSBzaGUgZ2FsbG9wcyBvJ2VyIGEgY291cnRpZXIncyBub3NlLAogICAgQW5kIHRoZW4gZHJlYW1zIGhlIG9mIHNtZWxsaW5nIG91dCBhIHN1aXQ7CiAgICBBbmQgc29tZXRpbWUgY29tZXMgc2hlIHdpdGggYSB0aXRoZS1waWcncyB0YWlsCiAgICBUaWNrbGluZyBhIHBhcnNvbidzIG5vc2UgYXMgYScgbGllcyBhc2xlZXAsCiAgICBUaGVuIGRyZWFtcywgaGUgb2YgYW5vdGhlciBiZW5lZmljZToKICAgIFNvbWV0aW1lIHNoZSBkcml2ZXRoIG8nZXIgYSBzb2xkaWVyJ3MgbmVjaywKICAgIEFuZCB0aGVuIGRyZWFtcyBoZSBvZiBjdXR0aW5nIGZvcmVpZ24gdGhyb2F0cywKICAgIE9mIGJyZWFjaGVzLCBhbWJ1c2NhZG9lcywgU3BhbmlzaCBibGFkZXMsCiAgICBPZiBoZWFsdGhzIGZpdmUtZmF0aG9tIGRlZXA7IGFuZCB0aGVuIGFub24KICAgIERydW1zIGluIGhpcyBlYXIsIGF0IHdoaWNoIGhlIHN0YXJ0cyBhbmQgd2FrZXMsCiAgICBBbmQgYmVpbmcgdGh1cyBmcmlnaHRlZCBzd2VhcnMgYSBwcmF5ZXIgb3IgdHdvCiAgICBBbmQgc2xlZXBzIGFnYWluLiBUaGlzIGlzIHRoYXQgdmVyeSBNYWIKICAgIFRoYXQgcGxhdHMgdGhlIG1hbmVzIG9mIGhvcnNlcyBpbiB0aGUgbmlnaHQsCiAgICBBbmQgYmFrZXMgdGhlIGVsZmxvY2tzIGluIGZvdWwgc2x1dHRpc2ggaGFpcnMsCiAgICBXaGljaCBvbmNlIHVudGFuZ2xlZCwgbXVjaCBtaXNmb3J0dW5lIGJvZGVzOgogICAgVGhpcyBpcyB0aGUgaGFnLCB3aGVuIG1haWRzIGxpZSBvbiB0aGVpciBiYWNrcywKICAgIFRoYXQgcHJlc3NlcyB0aGVtIGFuZCBsZWFybnMgdGhlbSBmaXJzdCB0byBiZWFyLAogICAgTWFraW5nIHRoZW0gd29tZW4gb2YgZ29vZCBjYXJyaWFnZToKICAgIFRoaXMgaXMgc2hlLS0KClJPTUVPCgogICAgUGVhY2UsIHBlYWNlLCBNZXJjdXRpbywgcGVhY2UhCiAgICBUaG91IHRhbGsnc3Qgb2Ygbm90aGluZy4KCk1FUkNVVElPCgogICAgVHJ1ZSwgSSB0YWxrIG9mIGRyZWFtcywKICAgIFdoaWNoIGFyZSB0aGUgY2hpbGRyZW4gb2YgYW4gaWRsZSBicmFpbiwKICAgIEJlZ290IG9mIG5vdGhpbmcgYnV0IHZhaW4gZmFudGFzeSwKICAgIFdoaWNoIGlzIGFzIHRoaW4gb2Ygc3Vic3RhbmNlIGFzIHRoZSBhaXIKICAgIEFuZCBtb3JlIGluY29uc3RhbnQgdGhhbiB0aGUgd2luZCwgd2hvIHdvb2VzCiAgICBFdmVuIG5vdyB0aGUgZnJvemVuIGJvc29tIG9mIHRoZSBub3J0aCwKICAgIEFuZCwgYmVpbmcgYW5nZXInZCwgcHVmZnMgYXdheSBmcm9tIHRoZW5jZSwKICAgIFR1cm5pbmcgaGlzIGZhY2UgdG8gdGhlIGRldy1kcm9wcGluZyBzb3V0aC4KCkJFTlZPTElPCgogICAgVGhpcyB3aW5kLCB5b3UgdGFsayBvZiwgYmxvd3MgdXMgZnJvbSBvdXJzZWx2ZXM7CiAgICBTdXBwZXIgaXMgZG9uZSwgYW5kIHdlIHNoYWxsIGNvbWUgdG9vIGxhdGUuCgpST01FTwoKICAgIEkgZmVhciwgdG9vIGVhcmx5OiBmb3IgbXkgbWluZCBtaXNnaXZlcwogICAgU29tZSBjb25zZXF1ZW5jZSB5ZXQgaGFuZ2luZyBpbiB0aGUgc3RhcnMKICAgIFNoYWxsIGJpdHRlcmx5IGJlZ2luIGhpcyBmZWFyZnVsIGRhdGUKICAgIFdpdGggdGhpcyBuaWdodCdzIHJldmVscyBhbmQgZXhwaXJlIHRoZSB0ZXJtCiAgICBPZiBhIGRlc3Bpc2VkIGxpZmUgY2xvc2VkIGluIG15IGJyZWFzdAogICAgQnkgc29tZSB2aWxlIGZvcmZlaXQgb2YgdW50aW1lbHkgZGVhdGguCiAgICBCdXQgSGUsIHRoYXQgaGF0aCB0aGUgc3RlZXJhZ2Ugb2YgbXkgY291cnNlLAogICAgRGlyZWN0IG15IHNhaWwhIE9uLCBsdXN0eSBnZW50bGVtZW4uCgpCRU5WT0xJTwoKICAgIFN0cmlrZSwgZHJ1bS4KCiAgICBFeGV1bnQKClNDRU5FIFYuIEEgaGFsbCBpbiBDYXB1bGV0J3MgaG91c2UuCgogICAgTXVzaWNpYW5zIHdhaXRpbmcuIEVudGVyIFNlcnZpbmdtZW4gd2l0aCBuYXBraW5zIAoKRmlyc3QgU2VydmFudAoKICAgIFdoZXJlJ3MgUG90cGFuLCB0aGF0IGhlIGhlbHBzIG5vdCB0byB0YWtlIGF3YXkIEhlCiAgICBzaGlmdCBhIHRyZW5jaGVyPyBoZSBzY3JhcGUgYSB0cmVuY2hlciEKClNlY29uZCBTZXJ2YW50CgogICAgV2hlbiBnb29kIG1hbm5lcnMgc2hhbGwgbGllIGFsbCBpbiBvbmUgb3IgdHdvIG1lbidzCiAgICBoYW5kcyBhbmQgdGhleSB1bndhc2hlZCB0b28sICd0aXMgYSBmb3VsIHRoaW5nLgoKRmlyc3QgU2VydmFudAoKICAgIEF3YXkgd2l0aCB0aGUgam9pbnQtc3Rvb2xzLCByZW1vdmUgdGhlCiAgICBjb3VydC1jdXBib2FyZCwgbG9vayB0byB0aGUgcGxhdGUuIEdvb2QgdGhvdSwgc2F2ZQogICAgbWUgYSBwaWVjZSBvZiBtYXJjaHBhbmU7IGFuZCwgYXMgdGhvdSBsb3Zlc3QgbWUsIGxldAogICAgdGhlIHBvcnRlciBsZXQgaW4gU3VzYW4gR3JpbmRzdG9uZSBhbmQgTmVsbC4KICAgIEFudG9ueSwgYW5kIFBvdHBhbiEKClNlY29uZCBTZXJ2YW50CgogICAgQXksIGJveSwgcmVhZHkuCgpGaXJzdCBTZXJ2YW50CgogICAgWW91IGFyZSBsb29rZWQgZm9yIGFuZCBjYWxsZWQgZm9yLCBhc2tlZCBmb3IgYW5kCiAgICBzb3VnaHQgZm9yLCBpbiB0aGUgZ3JlYXQgY2hhbWJlci4KClNlY29uZCBTZXJ2YW50CgogICAgV2UgY2Fubm90IGJlIGhlcmUgYW5kIHRoZXJlIHRvby4gQ2hlZXJseSwgYm95czsgYmUKICAgIGJyaXNrIGF3aGlsZSwgYW5kIHRoZSBsb25nZXIgbGl2ZXIgdGFrZSBhbGwuCgogICAgRW50ZXIgQ0FQVUxFVCwgd2l0aCBKVUxJRVQgYW5kIG90aGVycyBvZiBoaXMgaG91c2UsIG1lZXRpbmcgdGhlIEd1ZXN0cyBhbmQgTWFza2VycwoKQ0FQVUxFVAoKICAgIFdlbGNvbWUsIGdlbnRsZW1lbiEgbGFkaWVzIHRoYXQgaGF2ZSB0aGVpciB0b2VzCiAgICBVbnBsYWd1ZWQgd2l0aCBjb3JucyB3aWxsIGhhdmUgYSBib3V0IHdpdGggeW91LgogICAgQWggaGEsIG15IG1pc3RyZXNzZXMhIHdoaWNoIG9mIHlvdSBhbGwKICAgIFdpbGwgbm93IGRlbnkgdG8gZGFuY2UIHNoZSB0aGF0IG1ha2VzIGRhaW50eSwKICAgIFNoZSwgSSdsbCBzd2VhciwgaGF0aCBjb3JuczsgYW0gSSBjb21lIG5lYXIgeWUgbm93PwogICAgV2VsY29tZSwgZ2VudGxlbWVuISBJIGhhdmUgc2VlbiB0aGUgZGF5CiAgICBUaGF0IEkgaGF2ZSB3b3JuIGEgdmlzb3IgYW5kIGNvdWxkIHRlbGwKICAgIEEgd2hpc3BlcmluZyB0YWxlIGluIGEgZmFpciBsYWR5J3MgZWFyLAogICAgU3VjaCBhcyB3b3VsZCBwbGVhc2U6ICd0aXMgZ29uZSwgJ3RpcyBnb25lLCAndGlzIGdvbmU6CiAgICBZb3UgYXJlIHdlbGNvbWUsIGdlbnRsZW1lbiEgY29tZSwgbXVzaWNpYW5zLCBwbGF5LgogICAgQSBoYWxsLCBhIGhhbGwhIGdpdmUgcm9vbSEgYW5kIGZvb3QgaXQsIGdpcmxzLgoKICAgIE11c2ljIHBsYXlzLCBhbmQgdGhleSBkYW5jZQogICAgTW9yZSBsaWdodCwgeW91IGtuYXZlczsgYW5kIHR1cm4gdGhlIHRhYmxlcyB1cCwKICAgIEFuZCBxdWVuY2ggdGhlIGZpcmUsIHRoZSByb29tIGlzIGdyb3duIHRvbyBob3QuCiAgICBBaCwgc2lycmFoLCB0aGlzIHVubG9vaydkLWZvciBzcG9ydCBjb21lcyB3ZWxsLgogICAgTmF5LCBzaXQsIG5heSwgc2l0LCBnb29kIGNvdXNpbiBDYXB1bGV0OwogICAgRm9yIHlvdSBhbmQgSSBhcmUgcGFzdCBvdXIgZGFuY2luZyBkYXlzOgogICAgSG93IGxvbmcgaXMndCBub3cgc2luY2UgbGFzdCB5b3Vyc2VsZiBhbmQgSQogICAgV2VyZSBpbiBhIG1hc2sCgpTZWNvbmQgQ2FwdWxldAoKICAgIEJ5J3IgbGFkeSwgdGhpcnR5IHllYXJzLgoKQ0FQVUxFVAoKICAgIFdoYXQsIG1hbiEgJ3RpcyBub3Qgc28gbXVjaCwgJ3RpcyBub3Qgc28gbXVjaDoKICAgICdUaXMgc2luY2UgdGhlIG51cHRpYWxzIG9mIEx1Y2VudGlvLAogICAgQ29tZSBwZW50ZWNvc3QgYXMgcXVpY2tseSBhcyBpdCB3aWxsLAogICAgU29tZSBmaXZlIGFuZCB0d2VudHkgeWVhcnM7IGFuZCB0aGVuIHdlIG1hc2snZC4KClNlY29uZCBDYXB1bGV0CgogICAgJ1RpcyBtb3JlLCAndGlzIG1vcmUsIGhpcyBzb24gaXMgZWxkZXIsIHNpcjsKICAgIEhpcyBzb24gaXMgdGhpcnR5LgoKQ0FQVUxFVAoKICAgIFdpbGwgeW91IHRlbGwgbWUgdGhhdD8KICAgIEhpcyBzb24gd2FzIGJ1dCBhIHdhcmQgdHdvIHllYXJzIGFnby4KClJPTUVPCgogICAgW1RvIGEgU2VydmluZ21hbl0gV2hhdCBsYWR5IGlzIHRoYXQsIHdoaWNoIGRvdGgKICAgIGVucmljaCB0aGUgaGFuZAogICAgT2YgeW9uZGVyIGtuaWdodD8KClNlcnZhbnQKCiAgICBJIGtub3cgbm90LCBzaXIuCgpST01FTwoKICAgIE8sIHNoZSBkb3RoIHRlYWNoIHRoZSB0b3JjaGVzIHRvIGJ1cm4gYnJpZ2h0IQogICAgSXQgc2VlbXMgc2hlIGhhbmdzIHVwb24gdGhlIGNoZWVrIG9mIG5pZ2h0CiAgICBMaWtlIGEgcmljaCBqZXdlbCBpbiBhbiBFdGhpb3BlJ3MgZWFyOwogICAgQmVhdXR5IHRvbyByaWNoIGZvciB1c2UsIGZvciBlYXJ0aCB0b28gZGVhciEKICAgIFNvIHNob3dzIGEgc25vd3kgZG92ZSB0cm9vcGluZyB3aXRoIGNyb3dzLAogICAgQXMgeW9uZGVyIGxhZHkgbydlciBoZXIgZmVsbG93cyBzaG93cy4KICAgIFRoZSBtZWFzdXJlIGRvbmUsIEknbGwgd2F0Y2ggaGVyIHBsYWNlIG9mIHN0YW5kLAogICAgQW5kLCB0b3VjaGluZyBoZXJzLCBtYWtlIGJsZXNzZWQgbXkgcnVkZSBoYW5kLgogICAgRGlkIG15IGhlYXJ0IGxvdmUgdGlsbCBub3cIGZvcnN3ZWFyIGl0LCBzaWdodCEKICAgIEZvciBJIG5lJ2VyIHNhdyB0cnVlIGJlYXV0eSB0aWxsIHRoaXMgbmlnaHQuCgpUWUJBTFQKCiAgICBUaGlzLCBieSBoaXMgdm9pY2UsIHNob3VsZCBiZSBhIE1vbnRhZ3VlLgogICAgRmV0Y2ggbWUgbXkgcmFwaWVyLCBib3kuIFdoYXQgZGFyZXMgdGhlIHNsYXZlCiAgICBDb21lIGhpdGhlciwgY292ZXInZCB3aXRoIGFuIGFudGljIGZhY2UsCiAgICBUbyBmbGVlciBhbmQgc2Nvcm4gYXQgb3VyIHNvbGVtbml0eT8KICAgIE5vdywgYnkgdGhlIHN0b2NrIGFuZCBob25vdXIgb2YgbXkga2luLAogICAgVG8gc3RyaWtlIGhpbSBkZWFkLCBJIGhvbGQgaXQgbm90IGEgc2luLgoKQ0FQVUxFVAoKICAgIFdoeSwgaG93IG5vdywga2luc21hbiEgd2hlcmVmb3JlIHN0b3JtIHlvdSBzbz8KClRZQkFMVAoKICAgIFVuY2xlLCB0aGlzIGlzIGEgTW9udGFndWUsIG91ciBmb2UsCiAgICBBIHZpbGxhaW4gdGhhdCBpcyBoaXRoZXIgY29tZSBpbiBzcGl0ZSwKICAgIFRvIHNjb3JuIGF0IG91ciBzb2xlbW5pdHkgdGhpcyBuaWdodC4KCkNBUFVMRVQKCiAgICBZb3VuZyBSb21lbyBpcyBpdD8KClRZQkFMVAoKICAgICdUaXMgaGUsIHRoYXQgdmlsbGFpbiBSb21lby4KCkNBUFVMRVQKCiAgICBDb250ZW50IHRoZWUsIGdlbnRsZSBjb3osIGxldCBoaW0gYWxvbmU7CiAgICBIZSBiZWFycyBoaW0gbGlrZSBhIHBvcnRseSBnZW50bGVtYW47CiAgICBBbmQsIHRvIHNheSB0cnV0aCwgVmVyb25hIGJyYWdzIG9mIGhpbQogICAgVG8gYmUgYSB2aXJ0dW91cyBhbmQgd2VsbC1nb3Zlcm4nZCB5b3V0aDoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd2VhbHRoIG9mIGFsbCB0aGUgdG93bgogICAgSGVyZSBpbiBteSBob3VzZSBkbyBoaW0gZGlzcGFyYWdlbWVudDoKICAgIFRoZXJlZm9yZSBiZSBwYXRpZW50LCB0YWtlIG5vIG5vdGUgb2YgaGltOgogICAgSXQgaXMgbXkgd2lsbCwgdGhlIHdoaWNoIGlmIHRob3UgcmVzcGVjdCwKICAgIFNob3cgYSBmYWlyIHByZXNlbmNlIGFuZCBwdXQgb2ZmIHRoZXNlIGZyb3ducywKICAgIEFuZCBpbGwtYmVzZWVtaW5nIHNlbWJsYW5jZSBmb3IgYSBmZWFzdC4KClRZQkFMVAoKICAgIEl0IGZpdHMsIHdoZW4gc3VjaCBhIHZpbGxhaW4gaXMgYSBndWVzdDoKICAgIEknbGwgbm90IGVuZHVyZSBoaW0uCgpDQVBVTEVUCgogICAgSGUgc2hhbGwgYmUgZW5kdXJlZDoKICAgIFdoYXQsIGdvb2RtYW4gYm95ISBJIHNheSwgaGUgc2hhbGw6IGdvIHRvOwogICAgQW0gSSB0aGUgbWFzdGVyIGhlcmUsIG9yIHlvdT8gZ28gdG8uCiAgICBZb3UnbGwgbm90IGVuZHVyZSBoaW0hIEdvZCBzaGFsbCBtZW5kIG15IHNvdWwhCiAgICBZb3UnbGwgbWFrZSBhIG11dGlueSBhbW9uZyBteSBndWVzdHMhCiAgICBZb3Ugd2lsbCBzZXQgY29jay1hLWhvb3AhIHlvdSdsbCBiZSB0aGUgbWFuIQoKVFlCQUxUCgogICAgV2h5LCB1bmNsZSwgJ3RpcyBhIHNoYW1lLgoKQ0FQVUxFVAoKICAgIEdvIHRvLCBnbyB0bzsKICAgIFlvdSBhcmUgYSBzYXVjeSBib3k6IGlzJ3Qgc28sIGluZGVlZD8KICAgIFRoaXMgdHJpY2sgbWF5IGNoYW5jZSB0byBzY2F0aGUgeW91LCBJIGtub3cgd2hhdDoKICAgIFlvdSBtdXN0IGNvbnRyYXJ5IG1lISBtYXJyeSwgJ3RpcyB0aW1lLgogICAgV2VsbCBzYWlkLCBteSBoZWFydHMhIFlvdSBhcmUgYSBwcmluY294OyBnbzoKICAgIEJlIHF1aWV0LCBvci0tTW9yZSBsaWdodCwgbW9yZSBsaWdodCEgRm9yIHNoYW1lIQogICAgSSdsbCBtYWtlIHlvdSBxdWlldC4gV2hhdCwgY2hlZXJseSwgbXkgaGVhcnRzIQoKVFlCQUxUCgogICAgUGF0aWVuY2UgcGVyZm9yY2Ugd2l0aCB3aWxmdWwgY2hvbGVyIG1lZXRpbmcKICAgIE1ha2VzIG15IGZsZXNoIHRyZW1ibGUgaW4gdGhlaXIgZGlmZmVyZW50IGdyZWV0aW5nLgogICAgSSB3aWxsIHdpdGhkcmF3OiBidXQgdGhpcyBpbnRydXNpb24gc2hhbGwKICAgIE5vdyBzZWVtaW5nIHN3ZWV0IGNvbnZlcnQgdG8gYml0dGVyIGdhbGwuCgogICAgRXhpdAoKUk9NRU8KCiAgICBbVG8gSlVMSUVUXSBJZiBJIHByb2ZhbmUgd2l0aCBteSB1bndvcnRoaWVzdCBoYW5kCiAgICBUaGlzIGhvbHkgc2hyaW5lLCB0aGUgZ2VudGxlIGZpbmUgaXMgdGhpczoKICAgIE15IGxpcHMsIHR3byBibHVzaGluZyBwaWxncmltcywgcmVhZHkgc3RhbmQKICAgIFRvIHNtb290aCB0aGF0IHJvdWdoIHRvdWNoIHdpdGggYSB0ZW5kZXIga2lzcy4KCkpVTElFVAoKICAgIEdvb2QgcGlsZ3JpbSwgeW91IGRvIHdyb25nIHlvdXIgaGFuZCB0b28gbXVjaCwKICAgIFdoaWNoIG1hbm5lcmx5IGRldm90aW9uIHNob3dzIGluIHRoaXM7CiAgICBGb3Igc2FpbnRzIGhhdmUgaGFuZHMgdGhhdCBwaWxncmltcycgaGFuZHMgZG8gdG91Y2gsCiAgICBBbmQgcGF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lIGJlIG1hcnJpZWQuCiAgICBNeSBncmF2ZSBpcyBsaWtlIHRvIGJlIG15IHdlZGRpbmcgYmVkLgoKTnVyc2UKCiAgICBIaXMgbmFtZSBpcyBSb21lbywgYW5kIGEgTW9udGFndWU7CiAgICBUaGUgb25seSBzb24gb2YgeW91ciBncmVhdCBlbmVteS4KCkpVTElFVAoKICAgIE15IG9ubHkgbG92ZSBzcHJ1bmcgZnJvbSBteSBvbmx5IGhhdGUhCiAgICBUb28gZWFybHkgc2VlbiB1bmtub3duLCBhbmQga25vd24gdG9vIGxhdGUhCiAgICBQcm9kaWdpb3VzIGJpcnRoIG9mIGxvdmUgaXQgaXMgdG8gbWUsCiAgICBUaGF0IEkgbXVzdCBsb3ZlIGEgbG9hdGhlZCBlbmVteS4KCk51cnNlCgogICAgV2hhdCdzIHRoaXMIHdoYXQncyB0aGlzPwoKSlVMSUVUCgogICAgQSByaHltZSBJIGxlYXJuJ2QgZXZlbiBub3cKICAgIE9mIG9uZSBJIGRhbmNlZCB3aXRoYWwuCgogICAgT25lIGNhbGxzIHdpdGhpbiAnSnVsaWV0LicKCk51cnNlCgogICAgQW5vbiwgYW5vbiEKICAgIENvbWUsIGxldCdzIGF3YXk7IHRoZSBzdHJhbmdlcnMgYWxsIGFyZSBnb25lLgoKICAgIEV4ZXVudAoKQUNUIElJClBST0xPR1VFCgogICAgRW50ZXIgQ2hvcnVzIAoKQ2hvcnVzCgogICAgTm93IG9sZCBkZXNpcmUgZG90aCBpbiBoaXMgZGVhdGgtYmVkIGxpZSwKICAgIEFuZCB5b3VuZyBhZmZlY3Rpb24gZ2FwZXMgdG8gYmUgaGlzIGhlaXI7CiAgICBUaGF0IGZhaXIgZm9yIHdoaWNoIGxvdmUgZ3JvYW4nZCBmb3IgYW5kIHdvdWxkIGRpZSwKICAgIFdpdGggdGVuZGVyIEp1bGlldCBtYXRjaCdkLCBpcyBub3cgbm90IGZhaXIuCiAgICBOb3cgUm9tZW8gaXMgYmVsb3ZlZCBhbmQgbG92ZXMgYWdhaW4sCiAgICBBbGlrZSBiZXR3aXRjaGVkIGJ5IHRoZSBjaGFybSBvZiBsb29rcywKICAgIEJ1dCB0byBoaXMgZm9lIHN1cHBvc2VkIGhlIG11c3QgY29tcGxhaW4sCiAgICBBbmQgc2hlIHN0ZWFsIGxvdmUncyBzd2VldCBiYWl0IGZyb20gZmVhcmZ1bCBob29rczoKICAgIEJlaW5nIGhlbGQgYSBmb2UsIGhlIG1heSBub3QgaGF2ZSBhY2Nlc3MKICAgIFRvIGJyZWF0aGUgc3VjaCB2b3dzIGFzIGxvdmVycyB1c2UgdG8gc3dlYXI7CiAgICBBbmQgc2hlIGFzIG11Y2ggaW4gbG92ZSwgaGVyIG1lYW5zIG11Y2ggbGVzcwogICAgVG8gbWVldCBoZXIgbmV3LWJlbG92ZWQgYW55IHdoZXJlOgogICAgQnV0IHBhc3Npb24gbGVuZHMgdGhlbSBwb3dlciwgdGltZSBtZWFucywgdG8gbWVldAogICAgVGVtcGVyaW5nIGV4dHJlbWl0aWVzIHdpdGggZXh0cmVtZSBzd2VldC4KCiAgICBFeGl0CgpTQ0VORSBJLiBBIGxhbmUgYnkgdGhlIHdhbGwgb2YgQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gCgpST01FTwoKICAgIENhbiBJIGdvIGZvcndhcmQgd2hlbiBteSBoZWFydCBpcyBoZXJlPwogICAgVHVybiBiYWNrLCBkdWxsIGVhcnRoLCBhbmQgZmluZCB0aHkgY2VudHJlIG91dC4KCiAgICBIZSBjbGltYnMgdGhlIHdhbGwsIGFuZCBsZWFwcyBkb3duIHdpdGhpbiBpdAoKICAgIEVudGVyIEJFTlZPTElPIGFuZCBNRVJDVVRJTwoKQkVOVk9MSU8KCiAgICBSb21lbyEgbXkgY291c2luIFJvbWVvIQoKTUVSQ1VUSU8KCiAgICBIZSBpcyB3aXNlOwogICAgQW5kLCBvbiBteSBsaWUsIGhhdGggc3RvbCduIGhpbSBob21lIHRvIGJlZC4KCkJFTlZPTElPCgogICAgSGUgcmFuIHRoaXMgd2F5LCBhbmQgbGVhcCdkIHRoaXMgb3JjaGFyZCB3YWxsOgogICAgQ2FsbCwgZ29vZCBNZXJjdXRpby4KCk1FUkNVVElPCgogICAgTmF5LCBJJ2xsIGNvbmp1cmUgdG9vLgogICAgUm9tZW8hIGh1bW91cnMhIG1hZG1hbiEgcGFzc2lvbiEgbG92ZXIhCiAgICBBcHBlYXIgdGhvdSBpbiB0aGUgbGlrZW5lc3Mgb2YgYSBzaWdoOgogICAgU3BlYWsgYnV0IG9uZSByaHltZSwgYW5kIEkgYW0gc2F0aXNmaWVkOwogICAgQ3J5IGJ1dCAnQXkgbWUhJyBwcm9ub3VuY2UgYnV0ICdsb3ZlJyBhbmQgJ2RvdmU7JwogICAgU3BlYWsgdG8gbXkgZ29zc2lwIFZlbnVzIG9uZSBmYWlyIHdvcmQsCiAgICBPbmUgbmljay1uYW1lIGZvciBoZXIgcHVyYmxpbmQgc29uIGFuZCBoZWlyLAogICAgWW91bmcgQWRhbSBDdXBpZCwgaGUgdGhhdCBzaG90IHNvIHRyaW0sCiAgICBXaGVuIEtpbmcgQ29waGV0dWEgbG92ZWQgdGhlIGJlZ2dhci1tYWlkIQogICAgSGUgaGVhcmV0aCBub3QsIGhlIHN0aXJyZXRoIG5vdCwgaGUgbW92ZXRoIG5vdDsKICAgIFRoZSBhcGUgaXMgZGVhZCwgYW5kIEkgbXVzdCBjb25qdXJlIGhpbS4KICAgIEkgY29uanVyZSB0aGVlIGJ5IFJvc2FsaW5lJ3MgYnJpZ2h0IGV5ZXMsCiAgICBCeSBoZXIgaGlnaCBmb3JlaGVhZCBhbmQgaGVyIHNjYXJsZXQgbGlwLAogICAgQnkgaGVyIGZpbmUgZm9vdCwgc3RyYWlnaHQgbGVnIGFuZCBxdWl2ZXJpbmcgdGhpZ2gKICAgIEFuZCB0aGUgZGVtZXNuZXMgdGhhdCB0aGVyZSBhZGphY2VudCBsaWUsCiAgICBUaGF0IGluIHRoeSBsaWtlbmVzcyB0aG91IGFwcGVhciB0byB1cyEKCkJFTlZPTElPCgogICAgQW5kIGlmIGhlIGhlYXIgdGhlZSwgdGhvdSB3aWx0IGFuZ2VyIGhpbS4KCk1FUkNVVElPCgogICAgVGhpcyBjYW5ub3QgYW5nZXIgaGltOiAndHdvdWxkIGFuZ2VyIGhpbQogICAgVG8gcmFpc2UgYSBzcGlyaXQgaW4gaGlzIG1pc3RyZXNzJyBjaXJjbGUKICAgIE9mIHNvbWUgc3RyYW5nZSBuYXR1cmUsIGxldHRpbmcgaXQgdGhlcmUgc3RhbmQKICAgIFRpbGwgc2hlIGhhZCBsYWlkIGl0IGFuZCBjb25qdXJlZCBpdCBkb3duOwogICAgVGhhdCB3ZXJlIHNvbWUgc3BpdGU6IG15IGludm9jYXRpb24KICAgIElzIGZhaXIgYW5kIGhvbmVzdCwgYW5kIGluIGhpcyBtaXN0cmVzIHMnIG5hbWUKICAgIEkgY29uanVyZSBvbmx5IGJ1dCB0byByYWlzZSB1cCBoaW0uCgpCRU5WT0xJTwoKICAgIENvbWUsIGhlIGhhdGggaGlkIGhpbXNlbGYgYW1vbmcgdGhlc2UgdHJlZXMsCiAgICBUbyBiZSBjb25zb3J0ZWQgd2l0aCB0aGUgaHVtb3JvdXMgbmlnaHQ6CiAgICBCbGluZCBpcyBoaXMgbG92ZSBhbmQgYmVzdCBiZWZpdHMgdGhlIGRhcmsuCgpNRVJDVVRJTwoKICAgIElmIGxvdmUgYmUgYmxpbmQsIGxvdmUgY2Fubm90IGhpdCB0aGUgbWFyay4KICAgIE5vdyB3aWxsIGhlIHNpdCB1bmRlciBhIG1lZGxhciB0cmVlLAogICAgQW5kIHdpc2ggaGlzIG1pc3RyZXNzIHdlcmUgdGhhdCBraW5kIG9mIGZydWl0CiAgICBBcyBtYWlkcyBjYWxsIG1lZGxhcnMsIHdoZW4gdGhleSBsYXVnaCBhbG9uZS4KICAgIFJvbWVvLCB0aGF0IHNoZSB3ZXJlLCBPLCB0aGF0IHNoZSB3ZXJlCiAgICBBbiBvcGVuIGV0IGNhZXRlcmEsIHRob3UgYSBwb3BlcmluIHBlYXIhCiAgICBSb21lbywgZ29vZCBuaWdodDogSSdsbCB0byBteSB0cnVja2xlLWJlZDsKICAgIFRoaXMgZmllbGQtYmVkIGlzIHRvbyBjb2xkIGZvciBtZSB0byBzbGVlcDoKICAgIENvbWUsIHNoYWxsIHdlIGdvPwoKQkVOVk9MSU8KCiAgICBHbywgdGhlbjsgZm9yICd0aXMgaW4gdmFpbgogICAgVG8gc2VlayBoaW0gaGVyZSB0aGF0IG1lYW5zIG5vdCB0byBiZSBmb3VuZC4KCiAgICBFeGV1bnQKClNDRU5FIElJLiBDYXB1bGV0J3Mgb3JjaGFyZC4KCiAgICBFbnRlciBST01FTyAKClJPTUVPCgogICAgSGUgamVzdHMgYXQgc2NhcnMgdGhhdCBuZXZlciBmZWx0IGEgd291bmQuCgogICAgSlVMSUVUIGFwcGVhcnMgYWJvdmUgYXQgYSB3aW5kb3cKICAgIEJ1dCwgc29mdCEgd2hhdCBsaWdodCB0aHJvdWdoIHlvbmRlciB3aW5kb3cgYnJlYWtzPwogICAgSXQgaXMgdGhlIGVhc3QsIGFuZCBKdWxpZXQgaXMgdGhlIHN1bi4KICAgIEFyaXNlLCBmYWlyIHN1biwgYW5kIGtpbGwgdGhlIGVudmlvdXMgbW9vbiwKICAgIFdobyBpcyBhbHJlYWR5IHNpY2sgYW5kIHBhbGUgd2l0aCBncmllZiwKICAgIFRoYXQgdGhvdSBoZXIgbWFpZCBhcnQgZmFyIG1vcmUgZmFpciB0aGFuIHNoZToKICAgIEJlIG5vdCBoZXIgbWFpZCwgc2luY2Ugc2hlIGlzIGVudmlvdXM7CiAgICBIZXIgdmVzdGFsIGxpdmVyeSBpcyBidXQgc2ljayBhbmQgZ3JlZW4KICAgIEFuZCBub25lIGJ1dCBmb29scyBkbyB3ZWFyIGl0OyBjYXN0IGl0IG9mZi4KICAgIEl0IGlzIG15IGxhZHksIE8sIGl0IGlzIG15IGxvdmUhCiAgICBPLCB0aGF0IHNoZSBrbmV3IHNoZSB3ZXJlIQogICAgU2hlIHNwZWFrcyB5ZXQgc2hlIHNheXMgbm90aGluZzogd2hhdCBvZiB0aGF0PwogICAgSGVyIGV5ZSBkaXNjb3Vyc2VzOyBJIHdpbGwgYW5zd2VyIGl0LgogICAgSSBhbSB0b28gYm9sZCwgJ3RpcyBub3QgdG8gbWUgc2hlIHNwZWFrczoKICAgIFR3byBvZiB0aGUgZmFpcmVzdCBzdGFycyBpbiBhbGwgdGhlIGhlYXZlbiwKICAgIEhhdmluZyBzb21lIGJ1c2luZXNzLCBkbyBlbnRyZWF0IGhlciBleWVzCiAgICBUbyB0d2lua2xlIGluIHRoZWlyIHNwaGVyZXMgdGlsbCB0aGV5IHJldHVybi4KICAgIFdoYXQgaWYgaGVyIGV5ZXMgd2VyZSB0aGVyZSwgdGhleSBpbiBoZXIgaGVhZD8KICAgIFRoZSBicmlnaHRuZXNzIG9mIGhlciBjaGVlayB3b3VsZCBzaGFtZSB0aG9zZSBzdGFycywKICAgIEFzIGRheWxpZ2h0IGRvdGggYSBsYW1wOyBoZXIgZXllcyBpbiBoZWF2ZW4KICAgIFdvdWxkIHRocm91Z2ggdGhlIGFpcnkgcmVnaW9uIHN0cmVhbSBzbyBicmlnaHQKICAgIFRoYXQgYmlyZHMgd291bGQgc2luZyBhbmQgdGhpbmsgaXQgd2VyZSBub3QgbmlnaHQuCiAgICBTZWUsIGhvdyBzaGUgbGVhbnMgaGVyIGNoZWVrIHVwb24gaGVyIGhhbmQhCiAgICBPLCB0aGF0IEkgd2VyZSBhIGdsb3ZlIHVwb24gdGhhdCBoYW5kLAogICAgVGhhdCBJIG1pZ2h0IHRvdWNoIHRoYXQgY2hlZWshCgpKVUxJRVQKCiAgICBBeSBtZSEKClJPTUVPCgogICAgU2hlIHNwZWFrczoKICAgIE8sIHNwZWFrIGFnYWluLCBicmlnaHQgYW5nZWwhIGZvciB0aG91IGFydAogICAgQXMgZ2xvcmlvdXMgdG8gdGhpcyBuaWdodCwgYmVpbmcgbydlciBteSBoZWFkCiAgICBBcyBpcyBhIHdpbmdlZCBtZXNzZW5nZXIgb2YgaGVhdmVuCiAgICBVbnRvIHRoZSB3aGl0ZS11cHR1cm5lZCB3b25kZXJpbmcgZXllcwogICAgT2YgbW9ydGFscyB0aGF0IGZhbGwgYmFjayB0byBnYXplIG9uIGhpbQogICAgV2hlbiBoZSBiZXN0cmlkZXMgdGhlIGxhenktcGFjaW5nIGNsb3VkcwogICAgQW5kIHNhaWxzIHVwb24gdGhlIGJvc29tIG9mIHRoZSBhaXIuCgpKVUxJRVQKCiAgICBPIFJvbWVvLCBSb21lbyEgd2hlcmVmb3JlIGFydCB0aG91IFJvbWVvPwogICAgRGVueSB0aHkgZmF0aGVyIGFuZCByZWZ1c2UgdGh5IG5hbWU7CiAgICBPciwgaWYgdGhvdSB3aWx0IG5vdCwgYmUgYnV0IHN3b3JuIG15IGxvdmUsCiAgICBBbmQgSSdsbCBubyBsb25nZXIgYmUgYSBDYXB1bGV0LgoKUk9NRU8KCiAgICBbQXNpZGVdIFNoYWxsIEkgaGVhciBtb3JlLCBvciBzaGFsbCBJIHNwZWFrIGF0IHRoaXMCgpKVUxJRVQKCiAgICAnVGlzIGJ1dCB0aHkgbmFtZSB0aGF0IGlzIG15IGVuZW15OwogICAgVGhvdSBhcnQgdGh5c2VsZiwgdGhvdWdoIG5vdCBhIE1vbnRhZ3VlLgogICAgV2hhdCdzIE1vbnRhZ3VlPyBpdCBpcyBub3IgaGFuZCwgbm9yIGZvb3QsCiAgICBOb3IgYXJtLCBub3IgZmFjZSwgbm9yIGFueSBvdGhlciBwYXJ0CiAgICBCZWxvbmdpbmcgdG8gYSBtYW4uIE8sIGJlIHNvbWUgb3RoZXIgbmFtZSEKICAgIFdoYXQncyBpbiBhIG5hbWUIHRoYXQgd2hpY2ggd2UgY2FsbCBhIHJvc2UKICAgIEJ5IGFueSBvdGhlciBuYW1lIHdvdWxkIHNtZWxsIGFzIHN3ZWV0OwogICAgU28gUm9tZW8gd291bGQsIHdlcmUgaGUgbm90IFJvbWVvIGNhbGwnZCwKICAgIFJldGFpbiB0aGF0IGRlYXIgcGVyZmVjdGlvbiB3aGljaCBoZSBvd2VzCiAgICBXaXRob3V0IHRoYXQgdGl0bGUuIFJvbWVvLCBkb2ZmIHRoeSBuYW1lLAogICAgQW5kIGZvciB0aGF0IG5hbWUgd2hpY2ggaXMgbm8gcGFydCBvZiB0aGVlCiAgICBUYWtlIGFsbCBteXNlbGYuCgpST01FTwoKICAgIEkgdGFrZSB0aGVlIGF0IHRoeSB3b3JkOgogICAgQ2FsbCBtZSBidXQgbG92ZSwgYW5kIEknbGwgYmUgbmV3IGJhcHRpemVkOwogICAgSGVuY2Vmb3J0aCBJIG5ldmVyIHdpbGwgYmUgUm9tZW8uCgpKVUxJRVQKCiAgICBXaGF0IG1hbiBhcnQgdGhvdSB0aGF0IHRodXMgYmVzY3JlZW4nZCBpbiBuaWdodAogICAgU28gc3R1bWJsZXN0IG9uIG15IGNvdW5zZWwCgpST01FTwoKICAgIEJ5IGEgbmFtZQogICAgSSBrbm93IG5vdCBob3cgdG8gdGVsbCB0aGVlIHdobyBJIGFtOgogICAgTXkgbmFtZSwgZGVhciBzYWludCwgaXMgaGF0ZWZ1bCB0byBteXNlbGYsCiAgICBCZWNhdXNlIGl0IGlzIGFuIGVuZW15IHRvIHRoZWU7CiAgICBIYWQgSSBpdCB3cml0dGVuLCBJIHdvdWxkIHRlYXIgdGhlIHdvcmQuCgpKVUxJRVQKCiAgICBNeSBlYXJzIGhhdmUgbm90IHlldCBkcnVuayBhIGh1bmRyZWQgd29yZHMKICAgIE9mIHRoYXQgdG9uZ3VlJ3MgdXR0ZXJhbmNlLCB5ZXQgSSBrbm93IHRoZSBzb3VuZDoKICAgIEFydCB0aG91IG5vdCBSb21lbyBhbmQgYSBNb250YWd1ZT8KClJPTUVPCgogICAgTmVpdGhlciwgZmFpciBzYWludCwgaWYgZWl0aGVyIHRoZWUgZGlzbGlrZS4KCkpVTElFVAoKICAgIEhvdyBjYW1lc3QgdGhvdSBoaXRoZXIsIHRlbGwgbWUsIGFuZCB3aGVyZWZvcmUCiAgICBUaGUgb3JjaGFyZCB3YWxscyBhcmUgaGlnaCBhbmQgaGFyZCB0byBjbGltYiwKICAgIEFuZCB0aGUgcGxhY2UgZGVhdGgsIGNvbnNpZGVyaW5nIHdobyB0aG91IGFydCwKICAgIElmIGFueSBvZiBteSBraW5zbWVuIGZpbmQgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBXaXRoIGxvdmUncyBsaWdodCB3aW5ncyBkaWQgSSBvJ2VyLXBlcmNoIHRoZXNlIHdhbGxzOwogICAgRm9yIHN0b255IGxpbWl0cyBjYW5ub3QgaG9sZCBsb3ZlIG91dCwKICAgIEFuZCB3aGF0IGxvdmUgY2FuIGRvIHRoYXQgZGFyZXMgbG92ZSBhdHRlbXB0OwogICAgVGhlcmVmb3JlIHRoeSBraW5zbWVuIGFyZSBubyBsZXQgdG8gbWUuCgpKVUxJRVQKCiAgICBJZiB0aGV5IGRvIHNlZSB0aGVlLCB0aGV5IHdpbGwgbXVyZGVyIHRoZWUuCgpST01FTwoKICAgIEFsYWNrLCB0aGVyZSBsaWVzIG1vcmUgcGVyaWwgaW4gdGhpbmUgZXllCiAgICBUaGFuIHR3ZW50eSBvZiB0aGVpciBzd29yZHM6IGxvb2sgdGhvdSBidXQgc3dlZXQsCiAgICBBbmQgSSBhbSBwcm9vZiBhZ2FpbnN0IHRoZWlyIGVubWl0eS4KCkpVTElFVAoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd29ybGQgdGhleSBzYXcgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBJIGhhdmUgbmlnaHQncyBjbG9hayB0byBoaWRlIG1lIGZyb20gdGhlaXIgc2lnaHQ7CiAgICBBbmQgYnV0IHRob3UgbG92ZSBtZSwgbGV0IHRoZW0gZmluZCBtZSBoZXJlOgogICAgTXkgbGlmZSB3ZXJlIGJldHRlciBlbmRlZCBieSB0aGVpciBoYXRlLAogICAgVGhhbiBkZWF0aCBwcm9yb2d1ZWQsIHdhbnRpbmcgb2YgdGh5IGxvdmUuCgpKVUxJRVQKCiAgICBCeSB3aG9zZSBkaXJlY3Rpb24gZm91bmQnc3QgdGhvdSBvdXQgdGhpcyBwbGFjZT8KClJPTUVPCgogICAgQnkgbG92ZSwgd2hvIGZpcnN0IGRpZCBwcm9tcHQgbWUgdG8gaW5xdWlyZTsKICAgIEhlIGxlbnQgbWUgY291bnNlbCBhbmQgSSBsZW50IGhpbSBleWVzLgogICAgSSBhbSBubyBwaWxvdDsgeWV0LCB3ZXJ0IHRob3UgYXMgZmFyCiAgICBBcyB0aGF0IHZhc3Qgc2hvcmUgd2FzaCdkIHdpdGggdGhlIGZhcnRoZXN0IHNlYSwKICAgIEkgd291bGQgYWR2ZW50dXJlIGZvciBzdWNoIG1lcmNoYW5kaXNlLgoKSlVMSUVUCgogICAgVGhvdSBrbm93J3N0IHRoZSBtYXNrIG9mIG5pZ2h0IGlzIG9uIG15IGZhY2UsCiAgICBFbHNlIHdvdWxkIGEgbWFpZGVuIGJsdXNoIGJlcGFpbnQgbXkgY2hlZWsKICAgIEZvciB0aGF0IHdoaWNoIHRob3UgaGFzdCBoZWFyZCBtZSBzcGVhayB0by1uaWdodAogICAgRmFpbiB3b3VsZCBJIGR3ZWxsIG9uIGZvcm0sIGZhaW4sIGZhaW4gZGVueQogICAgV2hhdCBJIGhhdmUgc3Bva2U6IGJ1dCBmYXJld2VsbCBjb21wbGltZW50IQogICAgRG9zdCB0aG91IGxvdmUgbWUIEkga25vdyB0aG91IHdpbHQgc2F5ICdBeSwnCiAgICBBbmQgSSB3aWxsIHRha2UgdGh5IHdvcmQ6IHlldCBpZiB0aG91IHN3ZWFyJ3N0LAogICAgVGhvdSBtYXlzdCBwcm92ZSBmYWxzZTsgYXQgbG92ZXJzJyBwZXJqdXJpZXMKICAgIFRoZW4gc2F5LCBKb3ZlIGxhdWdocy4gTyBnZW50bGUgUm9tZW8sCiAgICBJZiB0aG91IGRvc3QgbG92ZSwgcHJvbm91bmNlIGl0IGZhaXRoZnVsbHk6CiAgICBPciBpZiB0aG91IHRoaW5rJ3N0IEkgYW0gdG9vIHF1aWNrbHkgd29uLAogICAgSSdsbCBmcm93biBhbmQgYmUgcGVydmVyc2UgYW4gc2F5IHRoZWUgbmF5LAogICAgU28gdGhvdSB3aWx0IHdvbzsgYnV0IGVsc2UsIG5vdCBmb3IgdGhlIHdvcmxkLgogICAgSW4gdHJ1dGgsIGZhaXIgTW9udGFndWUsIEkgYW0gdG9vIGZvbmQsCiAgICBBbmQgdGhlcmVmb3JlIHRob3UgbWF5c3QgdGhpbmsgbXkgJ2hhdmlvciBsaWdodDoKICAgIEJ1dCB0cnVzdCBtZSwgZ2VudGxlbWFuLCBJJ2xsIHByb3ZlIG1vcmUgdHJ1ZQogICAgVGhhbiB0aG9zZSB0aGF0IGhhdmUgbW9yZSBjdW5uaW5nIHRvIGJlIHN0cmFuZ2UuCiAgICBJIHNob3VsZCBoYXZlIGJlZW4gbW9yZSBzdHJhbmdlLCBJIG11c3QgY29uZmVzcywKICAgIEJ1dCB0aGF0IHRob3Ugb3ZlcmhlYXJkJ3N0LCBlcmUgSSB3YXMgd2FyZSwKICAgIE15IHRydWUgbG92ZSdzIHBhc3Npb246IHRoZXJlZm9yZSBwYXJkb24gbWUsCiAgICBBbmQgbm90IGltcHV0ZSB0aGlzIHlpZWxkaW5nIHRvIGxpZ2h0IGxvdmUsCiAgICBXaGljaCB0aGUgZGFyayBuaWdodCBoYXRoIHNvIGRpc2NvdmVyZWQuCgpST01FTwoKICAgIExhZHksIGJ5IHlvbmRlciBibGVzc2VkIG1vb24gSSBzd2VhcgogICAgVGhhdCB0aXBzIHdpdGggc2lsdmVyIGFsbCB0aGVzZSBmcnVpdC10cmVlIHRvcHMtLQoKSlVMSUVUCgogICAgTywgc3dlYXIgbm90IGJ5IHRoZSBtb29uLCB0aGUgaW5jb25zdGFudCBtb29uLAogICAgVGhhdCBtb250aGx5IGNoYW5nZXMgaW4gaGVyIGNpcmNsZWQgb3JiLAogICAgTGVzdCB0aGF0IHRoeSBsb3ZlIHByb3ZlIGxpa2V3aXNlIHZhcmlhYmxlLgoKUk9NRU8KCiAgICBXaGF0IHNoYWxsIEkgc3dlYXIgYnkCgpKVUxJRVQKCiAgICBEbyBub3Qgc3dlYXIgYXQgYWxsOwogICAgT3IsIGlmIHRob3Ugd2lsdCwgc3dlYXIgYnkgdGh5IGdyYWNpb3VzIHNlbGYsCiAgICBXaGljaCBpcyB0aGUgZ29kIG9mIG15IGlkb2xhdHJ5LAogICAgQW5kIEknbGwgYmVsaWV2ZSB0aGVlLgoKUk9NRU8KCiAgICBJZiBteSBoZWFydCdzIGRlYXIgbG92ZS0tCgpKVUxJRVQKCiAgICBXZWxsLCBkbyBub3Qgc3dlYXI6IGFsdGhvdWdoIEkgam95IGluIHRoZWUsCiAgICBJIGhhdmUgbm8gam95IG9mIHRoaXMgY29udHJhY3QgdG8tbmlnaHQ6CiAgICBJdCBpcyB0b28gcmFzaCwgdG9vIHVuYWR2aXNlZCwgdG9vIHN1ZGRlbjsKICAgIFRvbyBsaWtlIHRoZSBsaWdodG5pbmcsIHdoaWNoIGRvdGggY2Vhc2UgdG8gYmUKICAgIEVyZSBvbmUgY2FuIHNheSAnSXQgbGlnaHRlbnMuJyBTd2VldCwgZ29vZCBuaWdodCEKICAgIFRoaXMgYnVkIG9mIGxvdmUsIGJ5IHN1bW1lcidzIHJpcGVuaW5nIGJyZWF0aCwKICAgIE1heSBwcm92ZSBhIGJlYXV0ZW91cyBmbG93ZXIgd2hlbiBuZXh0IHdlIG1lZXQuCiAgICBHb29kIG5pZ2h0LCBnb29kIG5pZ2h0ISBhcyBzd2VldCByZXBvc2UgYW5kIHJlc3QKICAgIENvbWUgdG8gdGh5IGhlYXJ0IGFzIHRoYXQgd2l0aGluIG15IGJyZWFzdCEKClJPTUVPCgogICAgTywgd2lsdCB0aG91IGxlYXZlIG1lIHNvIHVuc2F0aXNmaWVkPwoKSlVMSUVUCgogICAgV2hhdCBzYXRpc2ZhY3Rpb24gY2Fuc3QgdGhvdSBoYXZlIHRvLW5pZ2h0PwoKUk9NRU8KCiAgICBUaGUgZXhjaGFuZ2Ugb2YgdGh5IGxvdmUncyBmYWl0aGZ1bCB2b3cgZm9yIG1pbmUuCgpKVUxJRVQKCiAgICBJIGdhdmUgdGhlZSBtaW5lIGJlZm9yZSB0aG91IGRpZHN0IHJlcXVlc3QgaXQ6CiAgICBBbmQgeWV0IEkgd291bGQgaXQgd2VyZSB0byBnaXZlIGFnYWluLgoKUk9NRU8KCiAgICBXb3VsZHN0IHRob3Ugd2l0aGRyYXcgaXQIGZvciB3aGF0IHB1cnBvc2UsIGxvdmUCgpKVUxJRVQKCiAgICBCdXQgdG8gYmUgZnJhbmssIGFuZCBnaXZlIGl0IHRoZWUgYWdhaW4uCiAgICBBbmQgeWV0IEkgd2lzaCBidXQgZm9yIHRoZSB0aGluZyBJIGhhdmU6CiAgICBNeSBib3VudHkgaXMgYXMgYm91bmRsZXNzIGFzIHRoZSBzZWEsCiAgICBNeSBsb3ZlIGFzIGRlZXA7IHRoZSBtb3JlIEkgZ2l2ZSB0byB0aGVlLAogICAgVGhlIG1vcmUgSSBoYXZlLCBmb3IgYm90aCBhcmUgaW5maW5pdGUuCgogICAgTnVyc2UgY2FsbHMgd2l0aGluCiAgICBJIGhlYXIgc29tZSBub2lzZSB3aXRoaW47IGRlYXIgbG92ZSwgYWRpZXUhCiAgICBBbm9uLCBnb29kIG51cnNlISBTd2VldCBNb250YWd1ZSwgYmUgdHJ1ZS4KICAgIFN0YXkgYnV0IGEgbGl0dGxlLCBJIHdpbGwgY29tZSBhZ2Fpbi4KCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBPIGJsZXNzZWQsIGJsZXNzZWQgbmlnaHQhIEkgYW0gYWZlYXJkLgogICAgQmVpbmcgaW4gbmlnaHQsIGFsbCB0aGlzIGlzIGJ1dCBhIGRyZWFtLAogICAgVG9vIGZsYXR0ZXJpbmctc3dlZXQgdG8gYmUgc3Vic3RhbnRpYWwuCgogICAgUmUtZW50ZXIgSlVMSUVULCBhYm92ZQoKSlVMSUVUCgogICAgVGhyZWUgd29yZHMsIGRlYXIgUm9tZW8sIGFuZCBnb29kIG5pZ2h0IGluZGVlZC4KICAgIElmIHRoYXQgdGh5IGJlbnQgb2YgbG92ZSBiZSBob25vdXJhYmxlLAogICAgVGh5IHB1cnBvc2UgbWFycmlhZ2UsIHNlbmQgbWUgd29yZCB0by1tb3Jyb3csCiAgICBCeSBvbmUgdGhhdCBJJ2xsIHByb2N1cmUgdG8gY29tZSB0byB0aGVlLAogICAgV2hlcmUgYW5kIHdoYXQgdGltZSB0aG91IHdpbHQgcGVyZm9ybSB0aGUgcml0ZTsKICAgIEFuZCBhbGwgbXkgZm9ydHVuZXMgYXQgdGh5IGZvb3QgSSdsbCBsYXkKICAgIEFuZCBmb2xsb3cgdGhlZSBteSBsb3JkIHRocm91Z2hvdXQgdGhlIHdvcmxkLgoKTnVyc2UKCiAgICBbV2l0aGluXSBNYWRhbSEKCkpVTElFVAoKICAgIEkgY29tZSwgYW5vbi4tLUJ1dCBpZiB0aG91IG1lYW4nc3Qgbm90IHdlbGwsCiAgICBJIGRvIGJlc2VlY2ggdGhlZS0tCgpOdXJzZQoKICAgIFtXaXRoaW5dIE1hZGFtIQoKSlVMSUVUCgogICAgQnkgYW5kIGJ5LCBJIGNvbWU6LS0KICAgIFRvIGNlYXNlIHRoeSBzdWl0LCBhbmQgbGVhdmUgbWUgdG8gbXkgZ3JpZWY6CiAgICBUby1tb3Jyb3cgd2lsbCBJIHNlbmQuCgpST01FTwoKICAgIFNvIHRocml2ZSBteSBzb3VsLS0KCkpVTElFVAoKICAgIEEgdGhvdXNhbmQgdGltZXMgZ29vZCBuaWdodCEKCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBBIHRob3VzYW5kIHRpbWVzIHRoZSB3b3JzZSwgdG8gd2FudCB0aHkgbGlnaHQuCiAgICBMb3ZlIGdvZXMgdG93YXJkIGxvdmUsIGFzIHNjaG9vbGJveXMgZnJvbQogICAgdGhlaXIgYm9va3MsCiAgICBCdXQgbG92ZSBmcm9tIGxvdmUsIHRvd2FyZCBzY2hvb2wgd2l0aCBoZWF2eSBsb29rcy4KCiAgICBSZXRpcmluZwoKICAgIFJlLWVudGVyIEpVTElFVCwgYWJvdmUKCkpVTElFVAoKICAgIEhpc3QhIFJvbWVvLCBoaXN0ISBPLCBmb3IgYSBmYWxjb25lcidzIHZvaWNlLAogICAgVG8gbHVyZSB0aGlzIHRhc3NlbC1nZW50bGUgYmFjayBhZ2FpbiEKICAgIEJvbmRhZ2UgaXMgaG9hcnNlLCBhbmQgbWF5IG5vdCBzcGVhayBhbG91ZDsKICAgIEVsc2Ugd291bGQgSSB0ZWFyIHRoZSBjYXZlIHdoZXJlIEVjaG8gbGllcywKICAgIEFuZCBtYWtlIGhlciBhaXJ5IHRvbmd1ZSBtb3JlIGhvYXJzZSB0aGFuIG1pbmUsCiAgICBXaXRoIHJlcGV0aXRpb24gb2YgbXkgUm9tZW8ncyBuYW1lLgoKUk9NRU8KCiAgICBJdCBpcyBteSBzb3VsIHRoYXQgY2FsbHMgdXBvbiBteSBuYW1lOgogICAgSG93IHNpbHZlci1zd2VldCBzb3VuZCBsb3ZlcnMnIHRvbmd1ZXMgYnkgbmlnaHQsCiAgICBMaWtlIHNvZnRlc3QgbXVzaWMgdG8gYXR0ZW5kaW5nIGVhcnMhCgpKVUxJRVQKCiAgICBSb21lbyEKClJPTUVPCgogICAgTXkgZGVhcj8KCkpVTElFVAoKICAgIEF0IHdoYXQgbydjbG9jayB0by1tb3Jyb3cKICAgIFNoYWxsIEkgc2VuZCB0byB0aGVlPwoKUk9NRU8KCiAgICBBdCB0aGUgaG91ciBvZiBuaW5lLgoKSlVMSUVUCgogICAgSSB3aWxsIG5vdCBmYWlsOiAndGlzIHR3ZW50eSB5ZWFycyB0aWxsIHRoZW4uCiAgICBJIGhhdmUgZm9yZ290IHdoeSBJIGRpZCBjYWxsIHRoZWUgYmFjay4KClJPTUVPCgogICAgTGV0IG1lIHN0YW5kIGhlcmUgdGlsbCB0aG91IHJlbWVtYmVyIGl0LgoKSlVMSUVUCgogICAgSSBzaGFsbCBmb3JnZXQsIHRvIGhhdmUgdGhlZSBzdGlsbCBzdGFuZCB0aGVyZSwKICAgIFJlbWVtYmVyaW5nIGhvdyBJIGxvdmUgdGh5IGNvbXBhbnkuCgpST01FTwoKICAgIEFuZCBJJ2xsIHN0aWxsIHN0YXksIHRvIGhhdmUgdGhlZSBzdGlsbCBmb3JnZXQsCiAgICBGb3JnZXR0aW5nIGFueSBvdGhlciBob21lIGJ1dCB0aGlzLgoKSlVMSUVUCgogICAgJ1RpcyBhbG1vc3QgbW9ybmluZzsgSSB3b3VsZCBoYXZlIHRoZWUgZ29uZToKICAgIEFuZCB5ZXQgbm8gZnVydGhlciB0aGFuIGEgd2FudG9uJ3MgYmlyZDsKICAgIFdobyBsZXRzIGl0IGhvcCBhIGxpdHRsZSBmcm9tIGhlciBoYW5kLAogICAgTGlrZSBhIHBvb3IgcHJpc29uZXIgaW4gaGlzIHR3aXN0ZWQgZ3l2ZXMsCiAgICBBbmQgd2l0aCBhIHNpbGsgdGhyZWFkIHBsdWNrcyBpdCBiYWNrIGFnYWluLAogICAgU28gbG92aW5nLWplYWxvdXMgb2YgaGlzIGxpYmVydHkuCgpST01FTwoKICAgIEkgd291bGQgSSB3ZXJlIHRoeSBiaXJkLgoKSlVMSUVUCgogICAgU3dlZXQsIHNvIHdvdWxkIEk6CiAgICBZZXQgSSBzaG91bGQga2lsbCB0aGVlIHdpdGggbXVjaCBjaGVyaXNoaW5nLgogICAgR29vZCBuaWdodCwgZ29vZCBuaWdodCEgcGFydGluZyBpcyBzdWNoCiAgICBzd2VldCBzb3Jyb3csCiAgICBUaGF0IEkgc2hhbGwgc2F5IGdvb2QgbmlnaHQgdGlsbCBpdCBiZSBtb3Jyb3cuCgogICAgRXhpdCBhYm92ZQoKUk9NRU8KCiAgICBTbGVlcCBkd2VsbCB1cG9uIHRoaW5lIGV5ZXMsIHBlYWNlIGluIHRoeSBicmVhc3QhCiAgICBXb3VsZCBJIHdlcmUgc2xlZXAgYW5kIHBlYWNlLCBzbyBzd2VldCB0byByZXN0IQogICAgSGVuY2Ugd2lsbCBJIHRvIG15IGdob3N0bHkgZmF0aGVyJ3MgY2VsbCwKICAgIEhpcyBoZWxwIHRvIGNyYXZlLCBhbmQgbXkgZGVhciBoYXAgdG8gdGVsbC4KCiAgICBFeGl0CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSwgd2l0aCBhIGJhc2tldCAKCkZSSUFSIExBVVJFTkNFCgogICAgVGhlIGdyZXktZXllZCBtb3JuIHNtaWxlcyBvbiB0aGUgZnJvd25pbmcgbmlnaHQsCiAgICBDaGVxdWVyaW5nIHRoZSBlYXN0ZXJuIGNsb3VkcyB3aXRoIHN0cmVha3Mgb2YgbGlnaHQsCiAgICBBbmQgZmxlY2tlZCBkYXJrbmVzcyBsaWtlIGEgZHJ1bmthcmQgcmVlbHMKICAgIEZyb20gZm9ydGggZGF5J3MgcGF0aCBhbmQgVGl0YW4ncyBmaWVyeSB3aGVlbHM6CiAgICBOb3csIGVyZSB0aGUgc3VuIGFkdmFuY2UgaGlzIGJ1cm5pbmcgZXllLAogICAgVGhlIGRheSB0byBjaGVlciBhbmQgbmlnaHQncyBkYW5rIGRldyB0byBkcnksCiAgICBJIG11c3QgdXAtZmlsbCB0aGlzIG9zaWVyIGNhZ2Ugb2Ygb3VycwogICAgV2l0aCBiYWxlZnVsIHdlZWRzIGFuZCBwcmVjaW91cy1qdWljZWQgZmxvd2Vycy4KICAgIFRoZSBlYXJ0aCB0aGF0J3MgbmF0dXJlJ3MgbW90aGVyIGlzIGhlciB0b21iOwogICAgV2hhdCBpcyBoZXIgYnVyeWluZyBncmF2ZSB0aGF0IGlzIGhlciB3b21iLAogICAgQW5kIGZyb20gaGVyIHdvbWIgY2hpbGRyZW4gb2YgZGl2ZXJzIGtpbmQKICAgIFdlIHN1Y2tpbmcgb24gaGVyIG5hdHVyYWwgYm9zb20gZmluZCwKICAgIE1hbnkgZm9yIG1hbnkgdmlydHVlcyBleGNlbGxlbnQsCiAgICBOb25lIGJ1dCBmb3Igc29tZSBhbmQgeWV0IGFsbCBkaWZmZXJlbnQuCiAgICBPLCBtaWNrbGUgaXMgdGhlIHBvd2VyZnVsIGdyYWNlIHRoYXQgbGllcwogICAgSW4gaGVyYnMsIHBsYW50cywgc3RvbmVzLCBhbmQgdGhlaXIgdHJ1ZSBxdWFsaXRpZXM6CiAgICBGb3Igbm91Z2h0IHNvIHZpbGUgdGhhdCBvbiB0aGUgZWFydGggZG90aCBsaXZlCiAgICBCdXQgdG8gdGhlIGVhcnRoIHNvbWUgc3BlY2lhbCBnb29kIGRvdGggZ2l2ZSwKICAgIE5vciBhdWdodCBzbyBnb29kIGJ1dCBzdHJhaW4nZCBmcm9tIHRoYXQgZmFpciB1c2UKICAgIFJldm9sdHMgZnJvbSB0cnVlIGJpcnRoLCBzdHVtYmxpbmcgb24gYWJ1c2U6CiAgICBWaXJ0dWUgaXRzZWxmIHR1cm5zIHZpY2UsIGJlaW5nIG1pc2FwcGxpZWQ7CiAgICBBbmQgdmljZSBzb21ldGltZXMgYnkgYWN0aW9uIGRpZ25pZmllZC4KICAgIFdpdGhpbiB0aGUgaW5mYW50IHJpbmQgb2YgdGhpcyBzbWFsbCBmbG93ZXIKICAgIFBvaXNvbiBoYXRoIHJlc2lkZW5jZSBhbmQgbWVkaWNpbmUgcG93ZXI6CiAgICBGb3IgdGhpcywgYmVpbmcgc21lbHQsIHdpdGggdGhhdCBwYXJ0IGNoZWVycyBlYWNoIHBhcnQ7CiAgICBCZWluZyB0YXN0ZWQsIHNsYXlzIGFsbCBzZW5zZXMgd2l0aCB0aGUgaGVhcnQuCiAgICBUd28gc3VjaCBvcHBvc2VkIGtpbmdzIGVuY2FtcCB0aGVtIHN0aWxsCiAgICBJbiBtYW4gYXMgd2VsbCBhcyBoZXJicywgZ3JhY2UgYW5kIHJ1ZGUgd2lsbDsKICAgIEFuZCB3aGVyZSB0aGUgd29yc2VyIGlzIHByZWRvbWluYW50LAogICAgRnVsbCBzb29uIHRoZSBjYW5rZXIgZGVhdGggZWF0cyB1cCB0aGF0IHBsYW50LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEdvb2QgbW9ycm93LCBmYXRoZXIuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlbmVkaWNpdGUhCiAgICBXaGF0IGVhcmx5IHRvbmd1ZSBzbyBzd2VldCBzYWx1dGV0aCBtZT8KICAgIFlvdW5nIHNvbiwgaXQgYXJndWVzIGEgZGlzdGVtcGVyJ2QgaGVhZAogICAgU28gc29vbiB0byBiaWQgZ29vZCBtb3Jyb3cgdG8gdGh5IGJlZDoKICAgIENhcmUga2VlcHMgaGlzIHdhdGNoIGluIGV2ZXJ5IG9sZCBtYW4ncyBleWUsCiAgICBBbmQgd2hlcmUgY2FyZSBsb2RnZXMsIHNsZWVwIHdpbGwgbmV2ZXIgbGllOwogICAgQnV0IHdoZXJlIHVuYnJ1aXNlZCB5b3V0aCB3aXRoIHVuc3R1ZmYnZCBicmFpbgogICAgRG90aCBjb3VjaCBoaXMgbGltYnMsIHRoZXJlIGdvbGRlbiBzbGVlcCBkb3RoIHJlaWduOgogICAgVGhlcmVmb3JlIHRoeSBlYXJsaW5lc3MgZG90aCBtZSBhc3N1cmUKICAgIFRob3UgYXJ0IHVwLXJvdXNlZCBieSBzb21lIGRpc3RlbXBlcmF0dXJlOwogICAgT3IgaWYgbm90IHNvLCB0aGVuIGhlcmUgSSBoaXQgaXQgcmlnaHQsCiAgICBPdXIgUm9tZW8gaGF0aCBub3QgYmVlbiBpbiBiZWQgdG8tbmlnaHQuCgpST01FTwoKICAgIFRoYXQgbGFzdCBpcyB0cnVlOyB0aGUgc3dlZXRlciByZXN0IHdhcyBtaW5lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHb2QgcGFyZG9uIHNpbiEgd2FzdCB0aG91IHdpdGggUm9zYWxpbmUCgpST01FTwoKICAgIFdpdGggUm9zYWxpbmUsIG15IGdob3N0bHkgZmF0aGVyPyBubzsKICAgIEkgaGF2ZSBmb3Jnb3QgdGhhdCBuYW1lLCBhbmQgdGhhdCBuYW1lJ3Mgd29lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGF0J3MgbXkgZ29vZCBzb246IGJ1dCB3aGVyZSBoYXN0IHRob3UgYmVlbiwgdGhlbj8KClJPTUVPCgogICAgSSdsbCB0ZWxsIHRoZWUsIGVyZSB0aG91IGFzayBpdCBtZSBhZ2Fpbi4KICAgIEkgaGF2ZSBiZWVuIGZlYXN0aW5nIHdpdGggbWluZSBlbmVteSwKICAgIFdoZXJlIG9uIGEgc3VkZGVuIG9uZSBoYXRoIHdvdW5kZWQgbWUsCiAgICBUaGF0J3MgYnkgbWUgd291bmRlZDogYm90aCBvdXIgcmVtZWRpZXMKICAgIFdpdGhpbiB0aHkgaGVscCBhbmQgaG9seSBwaHlzaWMgbGllczoKICAgIEkgYmVhciBubyBoYXRyZWQsIGJsZXNzZWQgbWFuLCBmb3IsIGxvLAogICAgTXkgaW50ZXJjZXNzaW9uIGxpa2V3aXNlIHN0ZWFkcyBteSBmb2UuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlIHBsYWluLCBnb29kIHNvbiwgYW5kIGhvbWVseSBpbiB0aHkgZHJpZnQ7CiAgICBSaWRkbGluZyBjb25mZXNzaW9uIGZpbmRzIGJ1dCByaWRkbGluZyBzaHJpZnQuCgpST01FTwoKICAgIFRoZW4gcGxhaW5seSBrbm93IG15IGhlYXJ0J3MgZGVhciBsb3ZlIGlzIHNldAogICAgT24gdGhlIGZhaXIgZGF1Z2h0ZXIgb2YgcmljaCBDYXB1bGV0OgogICAgQXMgbWluZSBvbiBoZXJzLCBzbyBoZXJzIGlzIHNldCBvbiBtaW5lOwogICAgQW5kIGFsbCBjb21iaW5lZCwgc2F2ZSB3aGF0IHRob3UgbXVzdCBjb21iaW5lCiAgICBCeSBob2x5IG1hcnJpYWdlOiB3aGVuIGFuZCB3aGVyZSBhbmQgaG93CiAgICBXZSBtZXQsIHdlIHdvbydkIGFuZCBtYWRlIGV4Y2hhbmdlIG9mIHZvdywKICAgIEknbGwgdGVsbCB0aGVlIGFzIHdlIHBhc3M7IGJ1dCB0aGlzIEkgcHJheSwKICAgIFRoYXQgdGhvdSBjb25zZW50IHRvIG1hcnJ5IHVzIHRvLWRheS4KCkZSSUFSIExBVVJFTkNFCgogICAgSG9seSBTYWludCBGcmFuY2lzLCB3aGF0IGEgY2hhbmdlIGlzIGhlcmUhCiAgICBJcyBSb3NhbGluZSwgd2hvbSB0aG91IGRpZHN0IGxvdmUgc28gZGVhciwKICAgIFNvIHNvb24gZm9yc2FrZW4IHlvdW5nIG1lbidzIGxvdmUgdGhlbiBsaWVzCiAgICBOb3QgdHJ1bHkgaW4gdGhlaXIgaGVhcnRzLCBidXQgaW4gdGhlaXIgZXllcy4KICAgIEplc3UgTWFyaWEsIHdoYXQgYSBkZWFsIG9mIGJyaW5lCiAgICBIYXRoIHdhc2gnZCB0aHkgc2FsbG93IGNoZWVrcyBmb3IgUm9zYWxpbmUhCiAgICBIb3cgbXVjaCBzYWx0IHdhdGVyIHRocm93biBhd2F5IGluIHdhc3RlLAogICAgVG8gc2Vhc29uIGxvdmUsIHRoYXQgb2YgaXQgZG90aCBub3QgdGFzdGUhCiAgICBUaGUgc3VuIG5vdCB5ZXQgdGh5IHNpZ2hzIGZyb20gaGVhdmVuIGNsZWFycywKICAgIFRoeSBvbGQgZ3JvYW5zIHJpbmcgeWV0IGluIG15IGFuY2llbnQgZWFyczsKICAgIExvLCBoZXJlIHVwb24gdGh5IGNoZWVrIHRoZSBzdGFpbiBkb3RoIHNpdAogICAgT2YgYW4gb2xkIHRlYXIgdGhhdCBpcyBub3Qgd2FzaCdkIG9mZiB5ZXQ6CiAgICBJZiBlJ2VyIHRob3Ugd2FzdCB0aHlzZWxmIGFuZCB0aGVzZSB3b2VzIHRoaW5lLAogICAgVGhvdSBhbmQgdGhlc2Ugd29lcyB3ZXJlIGFsbCBmb3IgUm9zYWxpbmU6CiAgICBBbmQgYXJ0IHRob3UgY2hhbmdlZD8gcHJvbm91bmNlIHRoaXMgc2VudGVuY2UgdGhlbiwKICAgIFdvbWVuIG1heSBmYWxsLCB3aGVuIHRoZXJlJ3Mgbm8gc3RyZW5ndGggaW4gbWVuLgoKUk9NRU8KCiAgICBUaG91IGNoaWQnc3QgbWUgb2Z0IGZvciBsb3ZpbmcgUm9zYWxpbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIEZvciBkb3RpbmcsIG5vdCBmb3IgbG92aW5nLCBwdXBpbCBtaW5lLgoKUk9NRU8KCiAgICBBbmQgYmFkJ3N0IG1lIGJ1cnkgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTm90IGluIGEgZ3JhdmUsCiAgICBUbyBsYXkgb25lIGluLCBhbm90aGVyIG91dCB0byBoYXZlLgoKUk9NRU8KCiAgICBJIHByYXkgdGhlZSwgY2hpZGUgbm90OyBzaGUgd2hvbSBJIGxvdmUgbm93CiAgICBEb3RoIGdyYWNlIGZvciBncmFjZSBhbmQgbG92ZSBmb3IgbG92ZSBhbGxvdzsKICAgIFRoZSBvdGhlciBkaWQgbm90IHNvLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBPLCBzaGUga25ldyB3ZWxsCiAgICBUaHkgbG92ZSBkaWQgcmVhZCBieSByb3RlIGFuZCBjb3VsZCBub3Qgc3BlbGwuCiAgICBCdXQgY29tZSwgeW91bmcgd2F2ZXJlciwgY29tZSwgZ28gd2l0aCBtZSwKICAgIEluIG9uZSByZXNwZWN0IEknbGwgdGh5IGFzc2lzdGFudCBiZTsKICAgIEZvciB0aGlzIGFsbGlhbmNlIG1heSBzbyBoYXBweSBwcm92ZSwKICAgIFRvIHR1cm4geW91ciBob3VzZWhvbGRzJyByYW5jb3VyIHRvIHB1cmUgbG92ZS4KClJPTUVPCgogICAgTywgbGV0IHVzIGhlbmNlOyBJIHN0YW5kIG9uIHN1ZGRlbiBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2lzZWx5IGFuZCBzbG93OyB0aGV5IHN0dW1ibGUgdGhhdCBydW4gZmFzdC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBCRU5WT0xJTyBhbmQgTUVSQ1VUSU8gCgpNRVJDVVRJTwoKICAgIFdoZXJlIHRoZSBkZXZpbCBzaG91bGQgdGhpcyBSb21lbyBiZT8KICAgIENhbWUgaGUgbm90IGhvbWUgdG8tbmlnaHQCgpCRU5WT0xJTwoKICAgIE5vdCB0byBoaXMgZmF0aGVyJ3M7IEkgc3Bva2Ugd2l0aCBoaXMgbWFuLgoKTUVSQ1VUSU8KCiAgICBBaCwgdGhhdCBzYW1lIHBhbGUgaGFyZC1oZWFydGVkIHdlbmNoLCB0aGF0IFJvc2FsaW5lLgogICAgVG9ybWVudHMgaGltIHNvLCB0aGF0IGhlIHdpbGwgc3VyZSBydW4gbWFkLgoKQkVOVk9MSU8KCiAgICBUeWJhbHQsIHRoZSBraW5zbWFuIG9mIG9sZCBDYXB1bGV0LAogICAgSGF0aCBzZW50IGEgbGV0dGVyIHRvIGhpcyBmYXRoZXIncyBob3VzZS4KCk1FUkNVVElPCgogICAgQSBjaGFsbGVuZ2UsIG9uIG15IGxpZmUuCgpCRU5WT0xJTwoKICAgIFJvbWVvIHdpbGwgYW5zd2VyIGl0LgoKTUVSQ1VUSU8KCiAgICBBbnkgbWFuIHRoYXQgY2FuIHdyaXRlIG1heSBhbnN3ZXIgYSBsZXR0ZXIuCgpCRU5WT0xJTwoKICAgIE5heSwgaGUgd2lsbCBhbnN3ZXIgdGhlIGxldHRlcidzIG1hc3RlciwgaG93IGhlCiAgICBkYXJlcywgYmVpbmcgZGFyZWQuCgpNRVJDVVRJTwoKICAgIEFsYXMgcG9vciBSb21lbyEgaGUgaXMgYWxyZWFkeSBkZWFkOyBzdGFiYmVkIHdpdGggYQogICAgd2hpdGUgd2VuY2gncyBibGFjayBleWU7IHNob3QgdGhyb3VnaCB0aGUgZWFyIHdpdGggYQogICAgbG92ZS1zb25nOyB0aGUgdmVyeSBwaW4gb2YgaGlzIGhlYXJ0IGNsZWZ0IHdpdGggdGhlCiAgICBibGluZCBib3ctYm95J3MgYnV0dC1zaGFmdDogYW5kIGlzIGhlIGEgbWFuIHRvCiAgICBlbmNvdW50ZXIgVHliYWx0PwoKQkVOVk9MSU8KCiAgICBXaHksIHdoYXQgaXMgVHliYWx0PwoKTUVSQ1VUSU8KCiAgICBNb3JlIHRoYW4gcHJpbmNlIG9mIGNhdHMsIEkgY2FuIHRlbGwgeW91LiBPLCBoZSBpcwogICAgdGhlIGNvdXJhZ2VvdXMgY2FwdGFpbiBvZiBjb21wbGltZW50cy4gSGUgZmlnaHRzIGFzCiAgICB5b3Ugc2luZyBwcmljay1zb25nLCBrZWVwcyB0aW1lLCBkaXN0YW5jZSwgYW5kCiAgICBwcm9wb3J0aW9uOyByZXN0cyBtZSBoaXMgbWluaW0gcmVzdCwgb25lLCB0d28sIGFuZAogICAgdGhlIHRoaXJkIGluIHlvdXIgYm9zb206IHRoZSB2ZXJ5IGJ1dGNoZXIgb2YgYSBzaWxrCiAgICBidXR0b24sIGEgZHVlbGxpc3QsIGEgZHVlbGxpc3Q7IGEgZ2VudGxlbWFuIG9mIHRoZQogICAgdmVyeSBmaXJzdCBob3VzZSwgb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2F1c2U6CiAgICBhaCwgdGhlIGltbW9ydGFsIHBhc3NhZG8hIHRoZSBwdW50byByZXZlcnNvISB0aGUKICAgIGhhaSEKCkJFTlZPTElPCgogICAgVGhlIHdoYXQCgpNRVJDVVRJTwoKICAgIFRoZSBwb3ggb2Ygc3VjaCBhbnRpYywgbGlzcGluZywgYWZmZWN0aW5nCiAgICBmYW50YXN0aWNvZXM7IHRoZXNlIG5ldyB0dW5lcnMgb2YgYWNjZW50cyEgJ0J5IEplc3UsCiAgICBhIHZlcnkgZ29vZCBibGFkZSEgYSB2ZXJ5IHRhbGwgbWFuISBhIHZlcnkgZ29vZAogICAgd2hvcmUhJyBXaHksIGlzIG5vdCB0aGlzIGEgbGFtZW50YWJsZSB0aGluZywKICAgIGdyYW5kc2lyZSwgdGhhdCB3ZSBzaG91bGQgYmUgdGh1cyBhZmZsaWN0ZWQgd2l0aAogICAgdGhlc2Ugc3RyYW5nZSBmbGllcywgdGhlc2UgZmFzaGlvbi1tb25nZXJzLCB0aGVzZQogICAgcGVyZG9uYS1taSdzLCB3aG8gc3RhbmQgc28gbXVjaCBvbiB0aGUgbmV3IGZvcm0sCiAgICB0aGF0IHRoZXkgY2Fubm90IGF0IGVhc2Ugb24gdGhlIG9sZCBiZW5jaD8gTywgdGhlaXIKICAgIGJvbmVzLCB0aGVpciBib25lcyEKCiAgICBFbnRlciBST01FTwoKQkVOVk9MSU8KCiAgICBIZXJlIGNvbWVzIFJvbWVvLCBoZXJlIGNvbWVzIFJvbWVvLgoKTUVSQ1VUSU8KCiAgICBXaXRob3V0IGhpcyByb2UsIGxpa2UgYSBkcmllZCBoZXJyaW5nOiBmbGVzaCwgZmxlc2gsCiAgICBob3cgYXJ0IHRob3UgZmlzaGlmaWVkISBOb3cgaXMgaGUgZm9yIHRoZSBudW1iZXJzCiAgICB0aGF0IFBldHJhcmNoIGZsb3dlZCBpbjogTGF1cmEgdG8gaGlzIGxhZHkgd2FzIGJ1dCBhCiAgICBraXRjaGVuLXdlbmNoOyBtYXJyeSwgc2hlIGhhZCBhIGJldHRlciBsb3ZlIHRvCiAgICBiZS1yaHltZSBoZXI7IERpZG8gYSBkb3dkeTsgQ2xlb3BhdHJhIGEgZ2lwc3k7CiAgICBIZWxlbiBhbmQgSGVybyBoaWxkaW5ncyBhbmQgaGFybG90czsgVGhpc2JlIGEgZ3JleQogICAgZXllIG9yIHNvLCBidXQgbm90IHRvIHRoZSBwdXJwb3NlLiBTaWduaW9yCiAgICBSb21lbywgYm9uIGpvdXIhIHRoZXJlJ3MgYSBGcmVuY2ggc2FsdXRhdGlvbgogICAgdG8geW91ciBGcmVuY2ggc2xvcC4gWW91IGdhdmUgdXMgdGhlIGNvdW50ZXJmZWl0CiAgICBmYWlybHkgbGFzdCBuaWdodC4KClJPTUVPCgogICAgR29vZCBtb3Jyb3cgdG8geW91IGJvdGguIFdoYXQgY291bnRlcmZlaXQgZGlkIEkgZ2l2ZSB5b3UCgpNRVJDVVRJTwoKICAgIFRoZSBzaGlwLCBzaXIsIHRoZSBzbGlwOyBjYW4geW91IG5vdCBjb25jZWl2ZT8KClJPTUVPCgogICAgUGFyZG9uLCBnb29kIE1lcmN1dGlvLCBteSBidXNpbmVzcyB3YXMgZ3JlYXQ7IGFuZCBpbgogICAgc3VjaCBhIGNhc2UgYXMgbWluZSBhIG1hbiBtYXkgc3RyYWluIGNvdXJ0ZXN5LgoKTUVSQ1VUSU8KCiAgICBUaGF0J3MgYXMgbXVjaCBhcyB0byBzYXksIHN1Y2ggYSBjYXNlIGFzIHlvdXJzCiAgICBjb25zdHJhaW5zIGEgbWFuIHRvIGJvdyBpbiB0aGUgaGFtcy4KClJPTUVPCgogICAgTWVhbmluZywgdG8gY291cnQnc3kuCgpNRVJDVVRJTwoKICAgIFRob3UgaGFzdCBtb3N0IGtpbmRseSBoaXQgaXQuCgpST01FTwoKICAgIEEgbW9zdCBjb3VydGVvdXMgZXhwb3NpdGlvbi4KCk1FUkNVVElPCgogICAgTmF5LCBJIGFtIHRoZSB2ZXJ5IHBpbmsgb2YgY291cnRlc3kuCgpST01FTwoKICAgIFBpbmsgZm9yIGZsb3dlci4KCk1FUkNVVElPCgogICAgUmlnaHQuCgpST01FTwoKICAgIFdoeSwgdGhlbiBpcyBteSBwdW1wIHdlbGwgZmxvd2VyZWQuCgpNRVJDVVRJTwoKICAgIFdlbGwgc2FpZDogZm9sbG93IG1lIHRoaXMgamVzdCBub3cgdGlsbCB0aG91IGhhc3QKICAgIHdvcm4gb3V0IHRoeSBwdW1wLCB0aGF0IHdoZW4gdGhlIHNpbmdsZSBzb2xlIG9mIGl0CiAgICBpcyB3b3JuLCB0aGUgamVzdCBtYXkgcmVtYWluIGFmdGVyIHRoZSB3ZWFyaW5nIHNvbGUgc2luZ3VsYXIuCgpST01FTwoKICAgIE8gc2luZ2xlLXNvbGVkIGplc3QsIHNvbGVseSBzaW5ndWxhciBmb3IgdGhlCiAgICBzaW5nbGVuZXNzLgoKTUVSQ1VUSU8KCiAgICBDb21lIGJldHdlZW4gdXMsIGdvb2QgQmVudm9saW87IG15IHdpdHMgZmFpbnQuCgpST01FTwoKICAgIFN3aXRjaCBhbmQgc3B1cnMsIHN3aXRjaCBhbmQgc3B1cnM7IG9yIEknbGwgY3J5IGEgbWF0Y2guCgpNRVJDVVRJTwoKICAgIE5heSwgaWYgdGh5IHdpdHMgcnVuIHRoZSB3aWxkLWdvb3NlIGNoYXNlLCBJIGhhdmUKICAgIGRvbmUsIGZvciB0aG91IGhhc3QgbW9yZSBvZiB0aGUgd2lsZC1nb29zZSBpbiBvbmUgb2YKICAgIHRoeSB3aXRzIHRoYW4sIEkgYW0gc3VyZSwgSSBoYXZlIGluIG15IHdob2xlIGZpdmU6CiAgICB3YXMgSSB3aXRoIHlvdSB0aGVyZSBmb3IgdGhlIGdvb3NlPwoKUk9NRU8KCiAgICBUaG91IHdhc3QgbmV2ZXIgd2l0aCBtZSBmb3IgYW55IHRoaW5nIHdoZW4gdGhvdSB3YXN0CiAgICBub3QgdGhlcmUgZm9yIHRoZSBnb29zZS4KCk1FUkNVVElPCgogICAgSSB3aWxsIGJpdGUgdGhlZSBieSB0aGUgZWFyIGZvciB0aGF0IGplc3QuCgpST01FTwoKICAgIE5heSwgZ29vZCBnb29zZSwgYml0ZSBub3QuCgpNRVJDVVRJTwoKICAgIFRoeSB3aXQgaXMgYSB2ZXJ5IGJpdHRlciBzd2VldGluZzsgaXQgaXMgYSBtb3N0CiAgICBzaGFycCBzYXVjZS4KClJPTUVPCgogICAgQW5kIGlzIGl0IG5vdCB3ZWxsIHNlcnZlZCBpbiB0byBhIHN3ZWV0IGdvb3NlPwoKTUVSQ1VUSU8KCiAgICBPIGhlcmUncyBhIHdpdCBvZiBjaGV2ZXJpbCwgdGhhdCBzdHJldGNoZXMgZnJvbSBhbgogICAgaW5jaCBuYXJyb3cgdG8gYW4gZWxsIGJyb2FkIQoKUk9NRU8KCiAgICBJIHN0cmV0Y2ggaXQgb3V0IGZvciB0aGF0IHdvcmQgJ2Jyb2FkOycgd2hpY2ggYWRkZWQKICAgIHRvIHRoZSBnb29zZSwgcHJvdmVzIHRoZWUgZmFyIGFuZCB3aWRlIGEgYnJvYWQgZ29vc2UuCgpNRVJDVVRJTwoKICAgIFdoeSwgaXMgbm90IHRoaXMgYmV0dGVyIG5vdyB0aGFuIGdyb2FuaW5nIGZvciBsb3ZlPwogICAgbm93IGFydCB0aG91IHNvY2lhYmxlLCBub3cgYXJ0IHRob3UgUm9tZW87IG5vdyBhcnQKICAgIHRob3Ugd2hhdCB0aG91IGFydCwgYnkgYXJ0IGFzIHdlbGwgYXMgYnkgbmF0dXJlOgogICAgZm9yIHRoaXMgZHJpdmVsbGluZyBsb3ZlIGlzIGxpa2UgYSBncmVhdCBuYXR1cmFsLAogICAgdGhhdCBydW5zIGxvbGxpbmcgdXAgYW5kIGRvd24gdG8gaGlkZSBoaXMgYmF1YmxlIGluIGEgaG9sZS4KCkJFTlZPTElPCgogICAgU3RvcCB0aGVyZSwgc3RvcCB0aGVyZS4KCk1FUkNVVElPCgogICAgVGhvdSBkZXNpcmVzdCBtZSB0byBzdG9wIGluIG15IHRhbGUgYWdhaW5zdCB0aGUgaGFpci4KCkJFTlZPTElPCgogICAgVGhvdSB3b3VsZHN0IGVsc2UgaGF2ZSBtYWRlIHRoeSB0YWxlIGxhcmdlLgoKTUVSQ1VUSU8KCiAgICBPLCB0aG91IGFydCBkZWNlaXZlZDsgSSB3b3VsZCBoYXZlIG1hZGUgaXQgc2hvcnQ6CiAgICBmb3IgSSB3YXMgY29tZSB0byB0aGUgd2hvbGUgZGVwdGggb2YgbXkgdGFsZTsgYW5kCiAgICBtZWFudCwgaW5kZWVkLCB0byBvY2N1cHkgdGhlIGFyZ3VtZW50IG5vIGxvbmdlci4KClJPTUVPCgogICAgSGVyZSdzIGdvb2RseSBnZWFyIQoKICAgIEVudGVyIE51cnNlIGFuZCBQRVRFUgoKTUVSQ1VUSU8KCiAgICBBIHNhaWwsIGEgc2FpbCEKCkJFTlZPTElPCgogICAgVHdvLCB0d287IGEgc2hpcnQgYW5kIGEgc21vY2suCgpOdXJzZQoKICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBNeSBmYW4sIFBldGVyLgoKTUVSQ1VUSU8KCiAgICBHb29kIFBldGVyLCB0byBoaWRlIGhlciBmYWNlOyBmb3IgaGVyIGZhbidzIHRoZQogICAgZmFpcmVyIGZhY2UuCgpOdXJzZQoKICAgIEdvZCB5ZSBnb29kIG1vcnJvdywgZ2VudGxlbWVuLgoKTUVSQ1VUSU8KCiAgICBHb2QgeWUgZ29vZCBkZW4sIGZhaXIgZ2VudGxld29tYW4uCgpOdXJzZQoKICAgIElzIGl0IGdvb2QgZGVuPwoKTUVSQ1VUSU8KCiAgICAnVGlzIG5vIGxlc3MsIEkgdGVsbCB5b3UsIGZvciB0aGUgYmF3ZHkgaGFuZCBvZiB0aGUKICAgIGRpYWwgaXMgbm93IHVwb24gdGhlIHByaWNrIG9mIG5vb24uCgpOdXJzZQoKICAgIE91dCB1cG9uIHlvdSEgd2hhdCBhIG1hbiBhcmUgeW91IQoKUk9NRU8KCiAgICBPbmUsIGdlbnRsZXdvbWFuLCB0aGF0IEdvZCBoYXRoIG1hZGUgZm9yIGhpbXNlbGYgdG8KICAgIG1hci4KCk51cnNlCgogICAgQnkgbXkgdHJvdGgsIGl0IGlzIHdlbGwgc2FpZDsgJ2ZvciBoaW1zZWxmIHRvIG1hciwnCiAgICBxdW90aCBhJz8gR2VudGxlbWVuLCBjYW4gYW55IG9mIHlvdSB0ZWxsIG1lIHdoZXJlIEkKICAgIG1heSBmaW5kIHRoZSB5b3VuZyBSb21lbz8KClJPTUVPCgogICAgSSBjYW4gdGVsbCB5b3U7IGJ1dCB5b3VuZyBSb21lbyB3aWxsIGJlIG9sZGVyIHdoZW4KICAgIHlvdSBoYXZlIGZvdW5kIGhpbSB0aGFuIGhlIHdhcyB3aGVuIHlvdSBzb3VnaHQgaGltOgogICAgSSBhbSB0aGUgeW91bmdlc3Qgb2YgdGhhdCBuYW1lLCBmb3IgZmF1bHQgb2YgYSB3b3JzZS4KCk51cnNlCgogICAgWW91IHNheSB3ZWxsLgoKTUVSQ1VUSU8KCiAgICBZZWEsIGlzIHRoZSB3b3JzdCB3ZWxsPyB2ZXJ5IHdlbGwgdG9vaywgaScgZmFpdGg7CiAgICB3aXNlbHksIHdpc2VseS4KCk51cnNlCgogICAgaWYgeW91IGJlIGhlLCBzaXIsIEkgZGVzaXJlIHNvbWUgY29uZmlkZW5jZSB3aXRoCiAgICB5b3UuCgpCRU5WT0xJTwoKICAgIFNoZSB3aWxsIGluZGl0ZSBoaW0gdG8gc29tZSBzdXBwZXIuCgpNRVJDVVRJTwoKICAgIEEgYmF3ZCwgYSBiYXdkLCBhIGJhd2QhIHNvIGhvIQoKUk9NRU8KCiAgICBXaGF0IGhhc3QgdGhvdSBmb3VuZD8KCk1FUkNVVElPCgogICAgTm8gaGFyZSwgc2lyOyB1bmxlc3MgYSBoYXJlLCBzaXIsIGluIGEgbGVudGVuIHBpZSwKICAgIHRoYXQgaXMgc29tZXRoaW5nIHN0YWxlIGFuZCBob2FyIGVyZSBpdCBiZSBzcGVudC4KCiAgICBTaW5ncwogICAgQW4gb2xkIGhhcmUgaG9hciwKICAgIEFuZCBhbiBvbGQgaGFyZSBob2FyLAogICAgSXMgdmVyeSBnb29kIG1lYXQgaW4gbGVudAogICAgQnV0IGEgaGFyZSB0aGF0IGlzIGhvYXIKICAgIElzIHRvbyBtdWNoIGZvciBhIHNjb3JlLAogICAgV2hlbiBpdCBob2FycyBlcmUgaXQgYmUgc3BlbnQuCiAgICBSb21lbywgd2lsbCB5b3UgY29tZSB0byB5b3VyIGZhdGhlcidzPyB3ZSdsbAogICAgdG8gZGlubmVyLCB0aGl0aGVyLgoKUk9NRU8KCiAgICBJIHdpbGwgZm9sbG93IHlvdS4KCk1FUkNVVElPCgogICAgRmFyZXdlbGwsIGFuY2llbnQgbGFkeTsgZmFyZXdlbGwsCgogICAgU2luZ2luZwogICAgJ2xhZHksIGxhZHksIGxhZHkuJwoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KCk51cnNlCgogICAgTWFycnksIGZhcmV3ZWxsISBJIHByYXkgeW91LCBzaXIsIHdoYXQgc2F1Y3kKICAgIG1lcmNoYW50IHdhcyB0aGlzLCB0aGF0IHdhcyBzbyBmdWxsIG9mIGhpcyByb3BlcnkCgpST01FTwoKICAgIEEgZ2VudGxlbWFuLCBudXJzZSwgdGhhdCBsb3ZlcyB0byBoZWFyIGhpbXNlbGYgdGFsaywKICAgIGFuZCB3aWxsIHNwZWFrIG1vcmUgaW4gYSBtaW51dGUgdGhhbiBoZSB3aWxsIHN0YW5kCiAgICB0byBpbiBhIG1vbnRoLgoKTnVyc2UKCiAgICBBbiBhJyBzcGVhayBhbnkgdGhpbmcgYWdhaW5zdCBtZSwgSSdsbCB0YWtlIGhpbQogICAgZG93biwgYW4gYScgd2VyZSBsdXN0aWVyIHRoYW4gaGUgaXMsIGFuZCB0d2VudHkgc3VjaAogICAgSmFja3M7IGFuZCBpZiBJIGNhbm5vdCwgSSdsbCBmaW5kIHRob3NlIHRoYXQgc2hhbGwuCiAgICBTY3Vydnkga25hdmUhIEkgYW0gbm9uZSBvZiBoaXMgZmxpcnQtZ2lsbHM7IEkgYW0KICAgIG5vbmUgb2YgaGlzIHNrYWlucy1tYXRlcy4gQW5kIHRob3UgbXVzdCBzdGFuZCBieQogICAgdG9vLCBhbmQgc3VmZmVyIGV2ZXJ5IGtuYXZlIHRvIHVzZSBtZSBhdCBoaXMgcGxlYXN1cmUCgpQRVRFUgoKICAgIEkgc2F3IG5vIG1hbiB1c2UgeW91IGEgcGxlYXN1cmU7IGlmIEkgaGFkLCBteSB3ZWFwb24KICAgIHNob3VsZCBxdWlja2x5IGhhdmUgYmVlbiBvdXQsIEkgd2FycmFudCB5b3U6IEkgZGFyZQogICAgZHJhdyBhcyBzb29uIGFzIGFub3RoZXIgbWFuLCBpZiBJIHNlZSBvY2Nhc2lvbiBpbiBhCiAgICBnb29kIHF1YXJyZWwsIGFuZCB0aGUgbGF3IG9uIG15IHNpZGUuCgpOdXJzZQoKICAgIE5vdywgYWZvcmUgR29kLCBJIGFtIHNvIHZleGVkLCB0aGF0IGV2ZXJ5IHBhcnQgYWJvdXQKICAgIG1lIHF1aXZlcnMuIFNjdXJ2eSBrbmF2ZSEgUHJheSB5b3UsIHNpciwgYSB3b3JkOgogICAgYW5kIGFzIEkgdG9sZCB5b3UsIG15IHlvdW5nIGxhZHkgYmFkZSBtZSBpbnF1aXJlIHlvdQogICAgb3V0OyB3aGF0IHNoZSBiYWRlIG1lIHNheSwgSSB3aWxsIGtlZXAgdG8gbXlzZWxmOgogICAgYnV0IGZpcnN0IGxldCBtZSB0ZWxsIHllLCBpZiB5ZSBzaG91bGQgbGVhZCBoZXIgaW50bwogICAgYSBmb29sJ3MgcGFyYWRpc2UsIGFzIHRoZXkgc2F5LCBpdCB3ZXJlIGEgdmVyeSBncm9zcwogICAga2luZCBvZiBiZWhhdmlvciwgYXMgdGhleSBzYXk6IGZvciB0aGUgZ2VudGxld29tYW4KICAgIGlzIHlvdW5nOyBhbmQsIHRoZXJlZm9yZSwgaWYgeW91IHNob3VsZCBkZWFsIGRvdWJsZQogICAgd2l0aCBoZXIsIHRydWx5IGl0IHdlcmUgYW4gaWxsIHRoaW5nIHRvIGJlIG9mZmVyZWQKICAgIHRvIGFueSBnZW50bGV3b21hbiwgYW5kIHZlcnkgd2VhayBkZWFsaW5nLgoKUk9NRU8KCiAgICBOdXJzZSwgY29tbWVuZCBtZSB0byB0aHkgbGFkeSBhbmQgbWlzdHJlc3MuIEkKICAgIHByb3Rlc3QgdW50byB0aGVlLS0KCk51cnNlCgogICAgR29vZCBoZWFydCwgYW5kLCBpJyBmYWl0aCwgSSB3aWxsIHRlbGwgaGVyIGFzIG11Y2g6CiAgICBMb3JkLCBMb3JkLCBzaGUgd2lsbCBiZSBhIGpveWZ1bCB3b21hbi4KClJPTUVPCgogICAgV2hhdCB3aWx0IHRob3UgdGVsbCBoZXIsIG51cnNlPyB0aG91IGRvc3Qgbm90IG1hcmsgbWUuCgpOdXJzZQoKICAgIEkgd2lsbCB0ZWxsIGhlciwgc2lyLCB0aGF0IHlvdSBkbyBwcm90ZXN0OyB3aGljaCwgYXMKICAgIEkgdGFrZSBpdCwgaXMgYSBnZW50bGVtYW5saWtlIG9mZmVyLgoKUk9NRU8KCiAgICBCaWQgaGVyIGRldmlzZQogICAgU29tZSBtZWFucyB0byBjb21lIHRvIHNocmlmdCB0aGlzIGFmdGVybm9vbjsKICAgIEFuZCB0aGVyZSBzaGUgc2hhbGwgYXQgRnJpYXIgTGF1cmVuY2UnIGNlbGwKICAgIEJlIHNocml2ZWQgYW5kIG1hcnJpZWQuIEhlcmUgaXMgZm9yIHRoeSBwYWlucy4KCk51cnNlCgogICAgTm8gdHJ1bHkgc2lyOyBub3QgYSBwZW5ueS4KClJPTUVPCgogICAgR28gdG87IEkgc2F5IHlvdSBzaGFsbC4KCk51cnNlCgogICAgVGhpcyBhZnRlcm5vb24sIHNpcj8gd2VsbCwgc2hlIHNoYWxsIGJlIHRoZXJlLgoKUk9NRU8KCiAgICBBbmQgc3RheSwgZ29vZCBudXJzZSwgYmVoaW5kIHRoZSBhYmJleSB3YWxsOgogICAgV2l0aGluIHRoaXMgaG91ciBteSBtYW4gc2hhbGwgYmUgd2l0aCB0aGVlCiAgICBBbmQgYnJpbmcgdGhlZSBjb3JkcyBtYWRlIGxpa2UgYSB0YWNrbGVkIHN0YWlyOwogICAgV2hpY2ggdG8gdGhlIGhpZ2ggdG9wLWdhbGxhbnQgb2YgbXkgam95CiAgICBNdXN0IGJlIG15IGNvbnZveSBpbiB0aGUgc2VjcmV0IG5pZ2h0LgogICAgRmFyZXdlbGw7IGJlIHRydXN0eSwgYW5kIEknbGwgcXVpdCB0aHkgcGFpbnM6CiAgICBGYXJld2VsbDsgY29tbWVuZCBtZSB0byB0aHkgbWlzdHJlc3MuCgpOdXJzZQoKICAgIE5vdyBHb2QgaW4gaGVhdmVuIGJsZXNzIHRoZWUhIEhhcmsgeW91LCBzaXIuCgpST01FTwoKICAgIFdoYXQgc2F5J3N0IHRob3UsIG15IGRlYXIgbnVyc2UCgpOdXJzZQoKICAgIElzIHlvdXIgbWFuIHNlY3JldD8gRGlkIHlvdSBuZSdlciBoZWFyIHNheSwKICAgIFR3byBtYXkga2VlcCBjb3Vuc2VsLCBwdXR0aW5nIG9uZSBhd2F5PwoKUk9NRU8KCiAgICBJIHdhcnJhbnQgdGhlZSwgbXkgbWFuJ3MgYXMgdHJ1ZSBhcyBzdGVlbC4KCk5VUlNFCgogICAgV2VsbCwgc2lyOyBteSBtaXN0cmVzcyBpcyB0aGUgc3dlZXRlc3QgbGFkeS0tTG9yZCwKICAgIExvcmQhIHdoZW4gJ3R3YXMgYSBsaXR0bGUgcHJhdGluZyB0aGluZzotLU8sIHRoZXJlCiAgICBpcyBhIG5vYmxlbWFuIGluIHRvd24sIG9uZSBQYXJpcywgdGhhdCB3b3VsZCBmYWluCiAgICBsYXkga25pZmUgYWJvYXJkOyBidXQgc2hlLCBnb29kIHNvdWwsIGhhZCBhcyBsaWVmCiAgICBzZWUgYSB0b2FkLCBhIHZlcnkgdG9hZCwgYXMgc2VlIGhpbS4gSSBhbmdlciBoZXIKICAgIHNvbWV0aW1lcyBhbmQgdGVsbCBoZXIgdGhhdCBQYXJpcyBpcyB0aGUgcHJvcGVyZXIKICAgIG1hbjsgYnV0LCBJJ2xsIHdhcnJhbnQgeW91LCB3aGVuIEkgc2F5IHNvLCBzaGUgbG9va3MKICAgIGFzIHBhbGUgYXMgYW55IGNsb3V0IGluIHRoZSB2ZXJzYWwgd29ybGQuIERvdGggbm90CiAgICByb3NlbWFyeSBhbmQgUm9tZW8gYmVnaW4gYm90aCB3aXRoIGEgbGV0dGVyPwoKUk9NRU8KCiAgICBBeSwgbnVyc2U7IHdoYXQgb2YgdGhhdD8gYm90aCB3aXRoIGFuIFIuCgpOdXJzZQoKICAgIEFoLiBtb2NrZXIhIHRoYXQncyB0aGUgZG9nJ3MgbmFtZTsgUiBpcyBmb3IKICAgIHRoZS0tTm87IEkga25vdyBpdCBiZWdpbnMgd2l0aCBzb21lIG90aGVyCiAgICBsZXR0ZXI6LS1hbmQgc2hlIGhhdGggdGhlIHByZXR0aWVzdCBzZW50ZW50aW91cyBvZgogICAgaXQsIG9mIHlvdSBhbmQgcm9zZW1hcnksIHRoYXQgaXQgd291bGQgZG8geW91IGdvb2QKICAgIHRvIGhlYXIgaXQuCgpST01FTwoKICAgIENvbW1lbmQgbWUgdG8gdGh5IGxhZHkuCgpOdXJzZQoKICAgIEF5LCBhIHRob3VzYW5kIHRpbWVzLgoKICAgIEV4aXQgUm9tZW8KICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBQZXRlciwgdGFrZSBteSBmYW4sIGFuZCBnbyBiZWZvcmUgYW5kIGFwYWNlLgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgSlVMSUVUIAoKSlVMSUVUCgogICAgVGhlIGNsb2NrIHN0cnVjayBuaW5lIHdoZW4gSSBkaWQgc2VuZCB0aGUgbnVyc2U7CiAgICBJbiBoYWxmIGFuIGhvdXIgc2hlIHByb21pc2VkIHRvIHJldHVybi4KICAgIFBlcmNoYW5jZSBzaGUgY2Fubm90IG1lZXQgaGltOiB0aGF0J3Mgbm90IHNvLgogICAgTywgc2hlIGlzIGxhbWUhIGxvdmUncyBoZXJhbGRzIHNob3VsZCBiZSB0aG91Z2h0cywKICAgIFdoaWNoIHRlbiB0aW1lcyBmYXN0ZXIgZ2xpZGUgdGhhbiB0aGUgc3VuJ3MgYmVhbXMsCiAgICBEcml2aW5nIGJhY2sgc2hhZG93cyBvdmVyIGxvdXJpbmcgaGlsbHM6CiAgICBUaGVyZWZvcmUgZG8gbmltYmxlLXBpbmlvbidkIGRvdmVzIGRyYXcgbG92ZSwKICAgIEFuZCB0aGVyZWZvcmUgaGF0aCB0aGUgd2luZC1zd2lmdCBDdXBpZCB3aW5ncy4KICAgIE5vdyBpcyB0aGUgc3VuIHVwb24gdGhlIGhpZ2htb3N0IGhpbGwKICAgIE9mIHRoaXMgZGF5J3Mgam91cm5leSwgYW5kIGZyb20gbmluZSB0aWxsIHR3ZWx2ZQogICAgSXMgdGhyZWUgbG9uZyBob3VycywgeWV0IHNoZSBpcyBub3QgY29tZS4KICAgIEhhZCBzaGUgYWZmZWN0aW9ucyBhbmQgd2FybSB5b3V0aGZ1bCBibG9vZCwKICAgIFNoZSB3b3VsZCBiZSBhcyBzd2lmdCBpbiBtb3Rpb24gYXMgYSBiYWxsOwogICAgTXkgd29yZHMgd291bGQgYmFuZHkgaGVyIHRvIG15IHN3ZWV0IGxvdmUsCiAgICBBbmQgaGlzIHRvIG1lOgogICAgQnV0IG9sZCBmb2xrcywgbWFueSBmZWlnbiBhcyB0aGV5IHdlcmUgZGVhZDsKICAgIFVud2llbGR5LCBzbG93LCBoZWF2eSBhbmQgcGFsZSBhcyBsZWFkLgogICAgTyBHb2QsIHNoZSBjb21lcyEKCiAgICBFbnRlciBOdXJzZSBhbmQgUEVURVIKICAgIE8gaG9uZXkgbnVyc2UsIHdoYXQgbmV3cz8KICAgIEhhc3QgdGhvdSBtZXQgd2l0aCBoaW0IFNlbmQgdGh5IG1hbiBhd2F5LgoKTnVyc2UKCiAgICBQZXRlciwgc3RheSBhdCB0aGUgZ2F0ZS4KCiAgICBFeGl0IFBFVEVSCgpKVUxJRVQKCiAgICBOb3csIGdvb2Qgc3dlZXQgbnVyc2UsLS1PIExvcmQsIHdoeSBsb29rJ3N0IHRob3Ugc2FkPwogICAgVGhvdWdoIG5ld3MgYmUgc2FkLCB5ZXQgdGVsbCB0aGVtIG1lcnJpbHk7CiAgICBJZiBnb29kLCB0aG91IHNoYW1lc3QgdGhlIG11c2ljIG9mIHN3ZWV0IG5ld3MKICAgIEJ5IHBsYXlpbmcgaXQgdG8gbWUgd2l0aCBzbyBzb3VyIGEgZmFjZS4KCk51cnNlCgogICAgSSBhbSBhLXdlYXJ5LCBnaXZlIG1lIGxlYXZlIGF3aGlsZToKICAgIEZpZSwgaG93IG15IGJvbmVzIGFjaGUhIHdoYXQgYSBqYXVudCBoYXZlIEkgaGFkIQoKSlVMSUVUCgogICAgSSB3b3VsZCB0aG91IGhhZHN0IG15IGJvbmVzLCBhbmQgSSB0aHkgbmV3czoKICAgIE5heSwgY29tZSwgSSBwcmF5IHRoZWUsIHNwZWFrOyBnb29kLCBnb29kIG51cnNlLCBzcGVhay4KCk51cnNlCgogICAgSmVzdSwgd2hhdCBoYXN0ZT8gY2FuIHlvdSBub3Qgc3RheSBhd2hpbGUCiAgICBEbyB5b3Ugbm90IHNlZSB0aGF0IEkgYW0gb3V0IG9mIGJyZWF0aD8KCkpVTElFVAoKICAgIEhvdyBhcnQgdGhvdSBvdXQgb2YgYnJlYXRoLCB3aGVuIHRob3UgaGFzdCBicmVhdGgKICAgIFRvIHNheSB0byBtZSB0aGF0IHRob3UgYXJ0IG91dCBvZiBicmVhdGgCiAgICBUaGUgZXhjdXNlIHRoYXQgdGhvdSBkb3N0IG1ha2UgaW4gdGhpcyBkZWxheQogICAgSXMgbG9uZ2VyIHRoYW4gdGhlIHRhbGUgdGhvdSBkb3N0IGV4Y3VzZS4KICAgIElzIHRoeSBuZXdzIGdvb2QsIG9yIGJhZD8gYW5zd2VyIHRvIHRoYXQ7CiAgICBTYXkgZWl0aGVyLCBhbmQgSSdsbCBzdGF5IHRoZSBjaXJjdW1zdGFuY2U6CiAgICBMZXQgbWUgYmUgc2F0aXNmaWVkLCBpcyd0IGdvb2Qgb3IgYmFkPwoKTnVyc2UKCiAgICBXZWxsLCB5b3UgaGF2ZSBtYWRlIGEgc2ltcGxlIGNob2ljZTsgeW91IGtub3cgbm90CiAgICBob3cgdG8gY2hvb3NlIGEgbWFuOiBSb21lbyEgbm8sIG5vdCBoZTsgdGhvdWdoIGhpcwogICAgZmFjZSBiZSBiZXR0ZXIgdGhhbiBhbnkgbWFuJ3MsIHlldCBoaXMgbGVnIGV4Y2VscwogICAgYWxsIG1lbidzOyBhbmQgZm9yIGEgaGFuZCwgYW5kIGEgZm9vdCwgYW5kIGEgYm9keSwKICAgIHRob3VnaCB0aGV5IGJlIG5vdCB0byBiZSB0YWxrZWQgb24sIHlldCB0aGV5IGFyZQogICAgcGFzdCBjb21wYXJlOiBoZSBpcyBub3QgdGhlIGZsb3dlciBvZiBjb3VydGVzeSwKICAgIGJ1dCwgSSdsbCB3YXJyYW50IGhpbSwgYXMgZ2VudGxlIGFzIGEgbGFtYi4gR28gdGh5CiAgICB3YXlzLCB3ZW5jaDsgc2VydmUgR29kLiBXaGF0LCBoYXZlIHlvdSBkaW5lZCBhdCBob21lPwoKSlVMSUVUCgogICAgTm8sIG5vOiBidXQgYWxsIHRoaXMgZGlkIEkga25vdyBiZWZvcmUuCiAgICBXaGF0IHNheXMgaGUgb2Ygb3VyIG1hcnJpYWdlPyB3aGF0IG9mIHRoYXQCgpOdXJzZQoKICAgIExvcmQsIGhvdyBteSBoZWFkIGFjaGVzISB3aGF0IGEgaGVhZCBoYXZlIEkhCiAgICBJdCBiZWF0cyBhcyBpdCB3b3VsZCBmYWxsIGluIHR3ZW50eSBwaWVjZXMuCiAgICBNeSBiYWNrIG8nIHQnIG90aGVyIHNpZGUsLS1PLCBteSBiYWNrLCBteSBiYWNrIQogICAgQmVzaHJldyB5b3VyIGhlYXJ0IGZvciBzZW5kaW5nIG1lIGFib3V0LAogICAgVG8gY2F0Y2ggbXkgZGVhdGggd2l0aCBqYXVudGluZyB1cCBhbmQgZG93biEKCkpVTElFVAoKICAgIEknIGZhaXRoLCBJIGFtIHNvcnJ5IHRoYXQgdGhvdSBhcnQgbm90IHdlbGwuCiAgICBTd2VldCwgc3dlZXQsIHN3ZWV0IG51cnNlLCB0ZWxsIG1lLCB3aGF0IHNheXMgbXkgbG92ZT8KCk51cnNlCgogICAgWW91ciBsb3ZlIHNheXMsIGxpa2UgYW4gaG9uZXN0IGdlbnRsZW1hbiwgYW5kIGEKICAgIGNvdXJ0ZW91cywgYW5kIGEga2luZCwgYW5kIGEgaGFuZHNvbWUsIGFuZCwgSQogICAgd2FycmFudCwgYSB2aXJ0dW91cywtLVdoZXJlIGlzIHlvdXIgbW90aGVyPwoKSlVMSUVUCgogICAgV2hlcmUgaXMgbXkgbW90aGVyISB3aHksIHNoZSBpcyB3aXRoaW47CiAgICBXaGVyZSBzaG91bGQgc2hlIGJlPyBIb3cgb2RkbHkgdGhvdSByZXBsaWVzdCEKICAgICdZb3VyIGxvdmUgc2F5cywgbGlrZSBhbiBob25lc3QgZ2VudGxlbWFuLAogICAgV2hlcmUgaXMgeW91ciBtb3RoZXIJwoKTnVyc2UKCiAgICBPIEdvZCdzIGxhZHkgZGVhciEKICAgIEFyZSB5b3Ugc28gaG90PyBtYXJyeSwgY29tZSB1cCwgSSB0cm93OwogICAgSXMgdGhpcyB0aGUgcG91bHRpY2UgZm9yIG15IGFjaGluZyBib25lcz8KICAgIEhlbmNlZm9yd2FyZCBkbyB5b3VyIG1lc3NhZ2VzIHlvdXJzZWxmLgoKSlVMSUVUCgogICAgSGVyZSdzIHN1Y2ggYSBjb2lsISBjb21lLCB3aGF0IHNheXMgUm9tZW8CgpOdXJzZQoKICAgIEhhdmUgeW91IGdvdCBsZWF2ZSB0byBnbyB0byBzaHJpZnQgdG8tZGF5PwoKSlVMSUVUCgogICAgSSBoYXZlLgoKTnVyc2UKCiAgICBUaGVuIGhpZSB5b3UgaGVuY2UgdG8gRnJpYXIgTGF1cmVuY2UnIGNlbGw7CiAgICBUaGVyZSBzdGF5cyBhIGh1c2JhbmQgdG8gbWFrZSB5b3UgYSB3aWZlOgogICAgTm93IGNvbWVzIHRoZSB3YW50b24gYmxvb2QgdXAgaW4geW91ciBjaGVla3MsCiAgICBUaGV5J2xsIGJlIGluIHNjYXJsZXQgc3RyYWlnaHQgYXQgYW55IG5ld3MuCiAgICBIaWUgeW91IHRvIGNodXJjaDsgSSBtdXN0IGFub3RoZXIgd2F5LAogICAgVG8gZmV0Y2ggYSBsYWRkZXIsIGJ5IHRoZSB3aGljaCB5b3VyIGxvdmUKICAgIE11c3QgY2xpbWIgYSBiaXJkJ3MgbmVzdCBzb29uIHdoZW4gaXQgaXMgZGFyazoKICAgIEkgYW0gdGhlIGRydWRnZSBhbmQgdG9pbCBpbiB5b3VyIGRlbGlnaHQsCiAgICBCdXQgeW91IHNoYWxsIGJlYXIgdGhlIGJ1cmRlbiBzb29uIGF0IG5pZ2h0LgogICAgR287IEknbGwgdG8gZGlubmVyOiBoaWUgeW91IHRvIHRoZSBjZWxsLgoKSlVMSUVUCgogICAgSGllIHRvIGhpZ2ggZm9ydHVuZSEgSG9uZXN0IG51cnNlLCBmYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIFZJLiBGcmlhciBMYXVyZW5jZSdzIGNlbGwuCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UgYW5kIFJPTUVPIAoKRlJJQVIgTEFVUkVOQ0UKCiAgICBTbyBzbWlsZSB0aGUgaGVhdmVucyB1cG9uIHRoaXMgaG9seSBhY3QsCiAgICBUaGF0IGFmdGVyIGhvdXJzIHdpdGggc29ycm93IGNoaWRlIHVzIG5vdCEKClJPTUVPCgogICAgQW1lbiwgYW1lbiEgYnV0IGNvbWUgd2hhdCBzb3Jyb3cgY2FuLAogICAgSXQgY2Fubm90IGNvdW50ZXJ2YWlsIHRoZSBleGNoYW5nZSBvZiBqb3kKICAgIFRoYXQgb25lIHNob3J0IG1pbnV0ZSBnaXZlcyBtZSBpbiBoZXIgc2lnaHQ6CiAgICBEbyB0aG91IGJ1dCBjbG9zZSBvdXIgaGFuZHMgd2l0aCBob2x5IHdvcmRzLAogICAgVGhlbiBsb3ZlLWRldm91cmluZyBkZWF0aCBkbyB3aGF0IGhlIGRhcmU7CiAgICBJdCBpcyBlbm91Z2ggSSBtYXkgYnV0IGNhbGwgaGVyIG1pbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFRoZXNlIHZpb2xlbnQgZGVsaWdodHMgaGF2ZSB2aW9sZW50IGVuZHMKICAgIEFuZCBpbiB0aGVpciB0cml1bXBoIGRpZSwgbGlrZSBmaXJlIGFuZCBwb3dkZXIsCiAgICBXaGljaCBhcyB0aGV5IGtpc3MgY29uc3VtZTogdGhlIHN3ZWV0ZXN0IGhvbmV5CiAgICBJcyBsb2F0aHNvbWUgaW4gaGlzIG93biBkZWxpY2lvdXNuZXNzCiAgICBBbmQgaW4gdGhlIHRhc3RlIGNvbmZvdW5kcyB0aGUgYXBwZXRpdGU6CiAgICBUaGVyZWZvcmUgbG92ZSBtb2RlcmF0ZWx5OyBsb25nIGxvdmUgZG90aCBzbzsKICAgIFRvbyBzd2lmdCBhcnJpdmVzIGFzIHRhcmR5IGFzIHRvbyBzbG93LgoKICAgIEVudGVyIEpVTElFVAogICAgSGVyZSBjb21lcyB0aGUgbGFkeTogTywgc28gbGlnaHQgYSBmb290CiAgICBXaWxsIG5lJ2VyIHdlYXIgb3V0IHRoZSBldmVybGFzdGluZyBmbGludDoKICAgIEEgbG92ZXIgbWF5IGJlc3RyaWRlIHRoZSBnb3NzYW1lcgogICAgVGhhdCBpZGxlcyBpbiB0aGUgd2FudG9uIHN1bW1lciBhaXIsCiAgICBBbmQgeWV0IG5vdCBmYWxsOyBzbyBsaWdodCBpcyB2YW5pdHkuCgpKVUxJRVQKCiAgICBHb29kIGV2ZW4gdG8gbXkgZ2hvc3RseSBjb25mZXNzb3IuCgpGUklBUiBMQVVSRU5DRQoKICAgIFJvbWVvIHNoYWxsIHRoYW5rIHRoZWUsIGRhdWdodGVyLCBmb3IgdXMgYm90aC4KCkpVTElFVAoKICAgIEFzIG11Y2ggdG8gaGltLCBlbHNlIGlzIGhpcyB0aGFua3MgdG9vIG11Y2guCgpST01FTwoKICAgIEFoLCBKdWxpZXQsIGlmIHRoZSBtZWFzdXJlIG9mIHRoeSBqb3kKICAgIEJlIGhlYXAnZCBsaWtlIG1pbmUgYW5kIHRoYXQgdGh5IHNraWxsIGJlIG1vcmUKICAgIFRvIGJsYXpvbiBpdCwgdGhlbiBzd2VldGVuIHdpdGggdGh5IGJyZWF0aAogICAgVGhpcyBuZWlnaGJvdXIgYWlyLCBhbmQgbGV0IHJpY2ggbXVzaWMncyB0b25ndWUKICAgIFVuZm9sZCB0aGUgaW1hZ2luZWQgaGFwcGluZXNzIHRoYXQgYm90aAogICAgUmVjZWl2ZSBpbiBlaXRoZXIgYnkgdGhpcyBkZWFyIGVuY291bnRlci4KCkpVTElFVAoKICAgIENvbmNlaXQsIG1vcmUgcmljaCBpbiBtYXR0ZXIgdGhhbiBpbiB3b3JkcywKICAgIEJyYWdzIG9mIGhpcyBzdWJzdGFuY2UsIG5vdCBvZiBvcm5hbWVudDoKICAgIFRoZXkgYXJlIGJ1dCBiZWdnYXJzIHRoYXQgY2FuIGNvdW50IHRoZWlyIHdvcnRoOwogICAgQnV0IG15IHRydWUgbG92ZSBpcyBncm93biB0byBzdWNoIGV4Y2VzcwogICAgSSBjYW5ub3Qgc3VtIHVwIHN1bSBvZiBoYWxmIG15IHdlYWx0aC4KCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgY29tZSB3aXRoIG1lLCBhbmQgd2Ugd2lsbCBtYWtlIHNob3J0IHdvcms7CiAgICBGb3IsIGJ5IHlvdXIgbGVhdmVzLCB5b3Ugc2hhbGwgbm90IHN0YXkgYWxvbmUKICAgIFRpbGwgaG9seSBjaHVyY2ggaW5jb3Jwb3JhdGUgdHdvIGluIG9uZS4KCiAgICBFeGV1bnQKCkFDVCBJSUkKU0NFTkUgSS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgTUVSQ1VUSU8sIEJFTlZPTElPLCBQYWdlLCBhbmQgU2VydmFudHMgCgpCRU5WT0xJTwoKICAgIEkgcHJheSB0aGVlLCBnb29kIE1lcmN1dGlvLCBsZXQncyByZXRpcmU6CiAgICBUaGUgZGF5IGlzIGhvdCwgdGhlIENhcHVsZXRzIGFicm9hZCwKICAgIEFuZCwgaWYgd2UgbWVldCwgd2Ugc2hhbGwgbm90IHNjYXBlIGEgYnJhd2w7CiAgICBGb3Igbm93LCB0aGVzZSBob3QgZGF5cywgaXMgdGhlIG1hZCBibG9vZCBzdGlycmluZy4KCk1FUkNVVElPCgogICAgVGhvdSBhcnQgbGlrZSBvbmUgb2YgdGhvc2UgZmVsbG93cyB0aGF0IHdoZW4gaGUKICAgIGVudGVycyB0aGUgY29uZmluZXMgb2YgYSB0YXZlcm4gY2xhcHMgbWUgaGlzIHN3b3JkCiAgICB1cG9uIHRoZSB0YWJsZSBhbmQgc2F5cyAnR29kIHNlbmQgbWUgbm8gbmVlZCBvZgogICAgdGhlZSEnIGFuZCBieSB0aGUgb3BlcmF0aW9uIG9mIHRoZSBzZWNvbmQgY3VwIGRyYXdzCiAgICBpdCBvbiB0aGUgZHJhd2VyLCB3aGVuIGluZGVlZCB0aGVyZSBpcyBubyBuZWVkLgoKQkVOVk9MSU8KCiAgICBBbSBJIGxpa2Ugc3VjaCBhIGZlbGxvdz8KCk1FUkNVVElPCgogICAgQ29tZSwgY29tZSwgdGhvdSBhcnQgYXMgaG90IGEgSmFjayBpbiB0aHkgbW9vZCBhcwogICAgYW55IGluIEl0YWx5LCBhbmQgYXMgc29vbiBtb3ZlZCB0byBiZSBtb29keSwgYW5kIGFzCiAgICBzb29uIG1vb2R5IHRvIGJlIG1vdmVkLgoKQkVOVk9MSU8KCiAgICBBbmQgd2hhdCB0bz8KCk1FUkNVVElPCgogICAgTmF5LCBhbiB0aGVyZSB3ZXJlIHR3byBzdWNoLCB3ZSBzaG91bGQgaGF2ZSBub25lCiAgICBzaG9ydGx5LCBmb3Igb25lIHdvdWxkIGtpbGwgdGhlIG90aGVyLiBUaG91ISB3aHksCiAgICB0aG91IHdpbHQgcXVhcnJlbCB3aXRoIGEgbWFuIHRoYXQgaGF0aCBhIGhhaXIgbW9yZSwKICAgIG9yIGEgaGFpciBsZXNzLCBpbiBoaXMgYmVhcmQsIHRoYW4gdGhvdSBoYXN0OiB0aG91CiAgICB3aWx0IHF1YXJyZWwgd2l0aCBhIG1hbiBmb3IgY3JhY2tpbmcgbnV0cywgaGF2aW5nIG5vCiAgICBvdGhlciByZWFzb24gYnV0IGJlY2F1c2UgdGhvdSBoYXN0IGhhemVsIGV5ZXM6IHdoYXQKICAgIGV5ZSBidXQgc3VjaCBhbiBleWUgd291bGQgc3B5IG91dCBzdWNoIGEgcXVhcnJlbD8KICAgIFRoeSBoZWFkIGlzIGFzIGZ1biBvZiBxdWFycmVscyBhcyBhbiBlZ2cgaXMgZnVsbCBvZgogICAgbWVhdCwgYW5kIHlldCB0aHkgaGVhZCBoYXRoIGJlZW4gYmVhdGVuIGFzIGFkZGxlIGFzCiAgICBhbiBlZ2cgZm9yIHF1YXJyZWxsaW5nOiB0aG91IGhhc3QgcXVhcnJlbGxlZCB3aXRoIGEKICAgIG1hbiBmb3IgY291Z2hpbmcgaW4gdGhlIHN0cmVldCwgYmVjYXVzZSBoZSBoYXRoCiAgICB3YWtlbmVkIHRoeSBkb2cgdGhhdCBoYXRoIGxhaW4gYXNsZWVwIGluIHRoZSBzdW46CiAgICBkaWRzdCB0aG91IG5vdCBmYWxsIG91dCB3aXRoIGEgdGFpbG9yIGZvciB3ZWFyaW5nCiAgICBoaXMgbmV3IGRvdWJsZXQgYmVmb3JlIEVhc3Rlcj8gd2l0aCBhbm90aGVyLCBmb3IKICAgIHR5aW5nIGhpcyBuZXcgc2hvZXMgd2l0aCBvbGQgcmliYW5kPyBhbmQgeWV0IHRob3UKICAgIHdpbHQgdHV0b3IgbWUgZnJvbSBxdWFycmVsbGluZyEKCkJFTlZPTElPCgogICAgQW4gSSB3ZXJlIHNvIGFwdCB0byBxdWFycmVsIGFzIHRob3UgYXJ0LCBhbnkgbWFuCiAgICBzaG91bGQgYnV5IHRoZSBmZWUtc2ltcGxlIG9mIG15IGxpZmUgZm9yIGFuIGhvdXIgYW5kIGEgcXVhcnRlci4KCk1FUkNVVElPCgogICAgVGhlIGZlZS1zaW1wbGUhIE8gc2ltcGxlIQoKQkVOVk9MSU8KCiAgICBCeSBteSBoZWFkLCBoZXJlIGNvbWUgdGhlIENhcHVsZXRzLgoKTUVSQ1VUSU8KCiAgICBCeSBteSBoZWVsLCBJIGNhcmUgbm90LgoKICAgIEVudGVyIFRZQkFMVCBhbmQgb3RoZXJzCgpUWUJBTFQKCiAgICBGb2xsb3cgbWUgY2xvc2UsIGZvciBJIHdpbGwgc3BlYWsgdG8gdGhlbS4KICAgIEdlbnRsZW1lbiwgZ29vZCBkZW46IGEgd29yZCB3aXRoIG9uZSBvZiB5b3UuCgpNRVJDVVRJTwoKICAgIEFuZCBidXQgb25lIHdvcmQgd2l0aCBvbmUgb2YgdXMIGNvdXBsZSBpdCB3aXRoCiAgICBzb21ldGhpbmc7IG1ha2UgaXQgYSB3b3JkIGFuZCBhIGJsb3cuCgpUWUJBTFQKCiAgICBZb3Ugc2hhbGwgZmluZCBtZSBhcHQgZW5vdWdoIHRvIHRoYXQsIHNpciwgYW4geW91CiAgICB3aWxsIGdpdmUgbWUgb2NjYXNpb24uCgpNRVJDVVRJTwoKICAgIENvdWxkIHlvdSBub3QgdGFrZSBzb21lIG9jY2FzaW9uIHdpdGhvdXQgZ2l2aW5nPwoKVFlCQUxUCgogICAgTWVyY3V0aW8sIHRob3UgY29uc29ydCdzdCB3aXRoIFJvbWVvLC0tCgpNRVJDVVRJTwoKICAgIENvbnNvcnQhIHdoYXQsIGRvc3QgdGhvdSBtYWtlIHVzIG1pbnN0cmVscz8gYW4KICAgIHRob3UgbWFrZSBtaW5zdHJlbHMgb2YgdXMsIGxvb2sgdG8gaGVhciBub3RoaW5nIGJ1dAogICAgZGlzY29yZHM6IGhlcmUncyBteSBmaWRkbGVzdGljazsgaGVyZSdzIHRoYXQgc2hhbGwKICAgIG1ha2UgeW91IGRhbmNlLiAnWm91bmRzLCBjb25zb3J0IQoKQkVOVk9MSU8KCiAgICBXZSB0YWxrIGhlcmUgaW4gdGhlIHB1YmxpYyBoYXVudCBvZiBtZW46CiAgICBFaXRoZXIgd2l0aGRyYXcgdW50byBzb21lIHByaXZhdGUgcGxhY2UsCiAgICBBbmQgcmVhc29uIGNvbGRseSBvZiB5b3VyIGdyaWV2YW5jZXMsCiAgICBPciBlbHNlIGRlcGFydDsgaGVyZSBhbGwgZXllcyBnYXplIG9uIHVzLgoKTUVSQ1VUSU8KCiAgICBNZW4ncyBleWVzIHdlcmUgbWFkZSB0byBsb29rLCBhbmQgbGV0IHRoZW0gZ2F6ZTsKICAgIEkgd2lsbCBub3QgYnVkZ2UgZm9yIG5vIG1hbidzIHBsZWFzdXJlLCBJLgoKICAgIEVudGVyIFJPTUVPCgpUWUJBTFQKCiAgICBXZWxsLCBwZWFjZSBiZSB3aXRoIHlvdSwgc2lyOiBoZXJlIGNvbWVzIG15IG1hbi4KCk1FUkNVVElPCgogICAgQnV0IEknbGwgYmUgaGFuZ2VkLCBzaXIsIGlmIGhlIHdlYXIgeW91ciBsaXZlcnk6CiAgICBNYXJyeSwgZ28gYmVmb3JlIHRvIGZpZWxkLCBoZSdsbCBiZSB5b3VyIGZvbGxvd2VyOwogICAgWW91ciB3b3JzaGlwIGluIHRoYXQgc2Vuc2UgbWF5IGNhbGwgaGltICdtYW4uJwoKVFlCQUxUCgogICAgUm9tZW8sIHRoZSBoYXRlIEkgYmVhciB0aGVlIGNhbiBhZmZvcmQKICAgIE5vIGJldHRlciB0ZXJtIHRoYW4gdGhpcywtLXRob3UgYXJ0IGEgdmlsbGFpbi4KClJPTUVPCgogICAgVHliYWx0LCB0aGUgcmVhc29uIHRoYXQgSSBoYXZlIHRvIGxvdmUgdGhlZQogICAgRG90aCBtdWNoIGV4Y3VzZSB0aGUgYXBwZXJ0YWluaW5nIHJhZ2UKICAgIFRvIHN1Y2ggYSBncmVldGluZzogdmlsbGFpbiBhbSBJIG5vbmU7CiAgICBUaGVyZWZvcmUgZmFyZXdlbGw7IEkgc2VlIHRob3Uga25vdydzdCBtZSBub3QuCgpUWUJBTFQKCiAgICBCb3ksIHRoaXMgc2hhbGwgbm90IGV4Y3VzZSB0aGUgaW5qdXJpZXMKICAgIFRoYXQgdGhvdSBoYXN0IGRvbmUgbWU7IHRoZXJlZm9yZSB0dXJuIGFuZCBkcmF3LgoKUk9NRU8KCiAgICBJIGRvIHByb3Rlc3QsIEkgbmV2ZXIgaW5qdXJlZCB0aGVlLAogICAgQnV0IGxvdmUgdGhlZSBiZXR0ZXIgdGhhbiB0aG91IGNhbnN0IGRldmlzZSwKICAgIFRpbGwgdGhvdSBzaGFsdCBrbm93IHRoZSByZWFzb24gb2YgbXkgbG92ZToKICAgIEFuZCBzbywgZ29vZCBDYXB1bGV0LC0td2hpY2ggbmFtZSBJIHRlbmRlcgogICAgQXMgZGVhcmx5IGFzIG15IG93biwtLWJlIHNhdGlzZmllZC4KCk1FUkNVVElPCgogICAgTyBjYWxtLCBkaXNob25vdXJhYmxlLCB2aWxlIHN1Ym1pc3Npb24hCiAgICBBbGxhIHN0b2NjYXRhIGNhcnJpZXMgaXQgYXdheS4KCiAgICBEcmF3cwogICAgVHliYWx0LCB5b3UgcmF0LWNhdGNoZXIsIHdpbGwgeW91IHdhbGsCgpUWUJBTFQKCiAgICBXaGF0IHdvdWxkc3QgdGhvdSBoYXZlIHdpdGggbWUCgpNRVJDVVRJTwoKICAgIEdvb2Qga2luZyBvZiBjYXRzLCBub3RoaW5nIGJ1dCBvbmUgb2YgeW91ciBuaW5lCiAgICBsaXZlczsgdGhhdCBJIG1lYW4gdG8gbWFrZSBib2xkIHdpdGhhbCwgYW5kIGFzIHlvdQogICAgc2hhbGwgdXNlIG1lIGhlcmVhZnRlciwgZHJ5YmVhdCB0aGUgcmVzdCBvZiB0aGUKICAgIGVpZ2h0LiBXaWxsIHlvdSBwbHVjayB5b3VyIHN3b3JkIG91dCBvZiBoaXMgcGl0Y2hlcgogICAgYnkgdGhlIGVhcnMIG1ha2UgaGFzdGUsIGxlc3QgbWluZSBiZSBhYm91dCB5b3VyCiAgICBlYXJzIGVyZSBpdCBiZSBvdXQuCgpUWUJBTFQKCiAgICBJIGFtIGZvciB5b3UuCgogICAgRHJhd2luZwoKUk9NRU8KCiAgICBHZW50bGUgTWVyY3V0aW8sIHB1dCB0aHkgcmFwaWVyIHVwLgoKTUVSQ1VUSU8KCiAgICBDb21lLCBzaXIsIHlvdXIgcGFzc2Fkby4KCiAgICBUaGV5IGZpZ2h0CgpST01FTwoKICAgIERyYXcsIEJlbnZvbGlvOyBiZWF0IGRvd24gdGhlaXIgd2VhcG9ucy4KICAgIEdlbnRsZW1lbiwgZm9yIHNoYW1lLCBmb3JiZWFyIHRoaXMgb3V0cmFnZSEKICAgIFR5YmFsdCwgTWVyY3V0aW8sIHRoZSBwcmluY2UgZXhwcmVzc2x5IGhhdGgKICAgIEZvcmJpZGRlbiBiYW5keWluZyBpbiBWZXJvbmEgc3RyZWV0czoKICAgIEhvbGQsIFR5YmFsdCEgZ29vZCBNZXJjdXRpbyEKCiAgICBUWUJBTFQgdW5kZXIgUk9NRU8ncyBhcm0gc3RhYnMgTUVSQ1VUSU8sIGFuZCBmbGllcyB3aXRoIGhpcyBmb2xsb3dlcnMKCk1FUkNVVElPCgogICAgSSBhbSBodXJ0LgogICAgQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEgSSBhbSBzcGVkLgogICAgSXMgaGUgZ29uZSwgYW5kIGhhdGggbm90aGluZz8KCkJFTlZPTElPCgogICAgV2hhdCwgYXJ0IHRob3UgaHVydD8KCk1FUkNVVElPCgogICAgQXksIGF5LCBhIHNjcmF0Y2gsIGEgc2NyYXRjaDsgbWFycnksICd0aXMgZW5vdWdoLgogICAgV2hlcmUgaXMgbXkgcGFnZT8gR28sIHZpbGxhaW4sIGZldGNoIGEgc3VyZ2Vvbi4KCiAgICBFeGl0IFBhZ2UKClJPTUVPCgogICAgQ291cmFnZSwgbWFuOyB0aGUgaHVydCBjYW5ub3QgYmUgbXVjaC4KCk1FUkNVVElPCgogICAgTm8sICd0aXMgbm90IHNvIGRlZXAgYXMgYSB3ZWxsLCBub3Igc28gd2lkZSBhcyBhCiAgICBjaHVyY2gtZG9vcjsgYnV0ICd0aXMgZW5vdWdoLCd0d2lsbCBzZXJ2ZTogYXNrIGZvcgogICAgbWUgdG8tbW9ycm93LCBhbmQgeW91IHNoYWxsIGZpbmQgbWUgYSBncmF2ZSBtYW4uIEkKICAgIGFtIHBlcHBlcmVkLCBJIHdhcnJhbnQsIGZvciB0aGlzIHdvcmxkLiBBIHBsYWd1ZSBvJwogICAgYm90aCB5b3VyIGhvdXNlcyEgJ1pvdW5kcywgYSBkb2csIGEgcmF0LCBhIG1vdXNlLCBhCiAgICBjYXQsIHRvIHNjcmF0Y2ggYSBtYW4gdG8gZGVhdGghIGEgYnJhZ2dhcnQsIGEKICAgIHJvZ3VlLCBhIHZpbGxhaW4sIHRoYXQgZmlnaHRzIGJ5IHRoZSBib29rIG9mCiAgICBhcml0aG1ldGljISBXaHkgdGhlIGRldmlsIGNhbWUgeW91IGJldHdlZW4gdXMIEkKICAgIHdhcyBodXJ0IHVuZGVyIHlvdXIgYXJtLgoKUk9NRU8KCiAgICBJIHRob3VnaHQgYWxsIGZvciB0aGUgYmVzdC4KCk1FUkNVVElPCgogICAgSGVscCBtZSBpbnRvIHNvbWUgaG91c2UsIEJlbnZvbGlvLAogICAgT3IgSSBzaGFsbCBmYWludC4gQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEKICAgIFRoZXkgaGF2ZSBtYWRlIHdvcm1zJyBtZWF0IG9mIG1lOiBJIGhhdmUgaXQsCiAgICBBbmQgc291bmRseSB0b286IHlvdXIgaG91c2VzIQoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KClJPTUVPCgogICAgVGhpcyBnZW50bGVtYW4sIHRoZSBwcmluY2UncyBuZWFyIGFsbHksCiAgICBNeSB2ZXJ5IGZyaWVuZCwgaGF0aCBnb3QgaGlzIG1vcnRhbCBodXJ0CiAgICBJbiBteSBiZWhhbGY7IG15IHJlcHV0YXRpb24gc3RhaW4nZAogICAgV2l0aCBUeWJhbHQncyBzbGFuZGVyLC0tVHliYWx0LCB0aGF0IGFuIGhvdXIKICAgIEhhdGggYmVlbiBteSBraW5zbWFuISBPIHN3ZWV0IEp1bGlldCwKICAgIFRoeSBiZWF1dHkgaGF0aCBtYWRlIG1lIGVmZmVtaW5hdGUKICAgIEFuZCBpbiBteSB0ZW1wZXIgc29mdGVuJ2QgdmFsb3VyJ3Mgc3RlZWwhCgogICAgUmUtZW50ZXIgQkVOVk9MSU8KCkJFTlZPTElPCgogICAgTyBSb21lbywgUm9tZW8sIGJyYXZlIE1lcmN1dGlvJ3MgZGVhZCEKICAgIFRoYXQgZ2FsbGFudCBzcGlyaXQgaGF0aCBhc3BpcmVkIHRoZSBjbG91ZHMsCiAgICBXaGljaCB0b28gdW50aW1lbHkgaGVyZSBkaWQgc2Nvcm4gdGhlIGVhcnRoLgoKUk9NRU8KCiAgICBUaGlzIGRheSdzIGJsYWNrIGZhdGUgb24gbW9yZSBkYXlzIGRvdGggZGVwZW5kOwogICAgVGhpcyBidXQgYmVnaW5zIHRoZSB3b2UsIG90aGVycyBtdXN0IGVuZC4KCkJFTlZPTElPCgogICAgSGVyZSBjb21lcyB0aGUgZnVyaW91cyBUeWJhbHQgYmFjayBhZ2Fpbi4KClJPTUVPCgogICAgQWxpdmUsIGluIHRyaXVtcGghIGFuZCBNZXJjdXRpbyBzbGFpbiEKICAgIEF3YXkgdG8gaGVhdmVuLCByZXNwZWN0aXZlIGxlbml0eSwKICAgIEFuZCBmaXJlLWV5ZWQgZnVyeSBiZSBteSBjb25kdWN0IG5vdyEKCiAgICBSZS1lbnRlciBUWUJBTFQKICAgIE5vdywgVHliYWx0LCB0YWtlIHRoZSB2aWxsYWluIGJhY2sgYWdhaW4sCiAgICBUaGF0IGxhdGUgdGhvdSBnYXZlc3QgbWU7IGZvciBNZXJjdXRpbydzIHNvdWwKICAgIElzIGJ1dCBhIGxpdHRsZSB3YXkgYWJvdmUgb3VyIGhlYWRzLAogICAgU3RheWluZyBmb3IgdGhpbmUgdG8ga2VlcCBoaW0gY29tcGFueToKICAgIEVpdGhlciB0aG91LCBvciBJLCBvciBib3RoLCBtdXN0IGdvIHdpdGggaGltLgoKVFlCQUxUCgogICAgVGhvdSwgd3JldGNoZWQgYm95LCB0aGF0IGRpZHN0IGNvbnNvcnQgaGltIGhlcmUsCiAgICBTaGFsdCB3aXRoIGhpbSBoZW5jZS4KClJPTUVPCgogICAgVGhpcyBzaGFsbCBkZXRlcm1pbmUgdGhhdC4KCiAgICBUaGV5IGZpZ2h0OyBUWUJBTFQgZmFsbHMKCkJFTlZPTElPCgogICAgUm9tZW8sIGF3YXksIGJlIGdvbmUhCiAgICBUaGUgY2l0aXplbnMgYXJlIHVwLCBhbmQgVHliYWx0IHNsYWluLgogICAgU3RhbmQgbm90IGFtYXplZDogdGhlIHByaW5jZSB3aWxsIGRvb20gdGhlZSBkZWF0aCwKICAgIElmIHRob3UgYXJ0IHRha2VuOiBoZW5jZSwgYmUgZ29uZSwgYXdheSEKClJPTUVPCgogICAgTywgSSBhbSBmb3J0dW5lJ3MgZm9vbCEKCkJFTlZPTElPCgogICAgV2h5IGRvc3QgdGhvdSBzdGF5PwoKICAgIEV4aXQgUk9NRU8KCiAgICBFbnRlciBDaXRpemVucywgJiBjCgpGaXJzdCBDaXRpemVuCgogICAgV2hpY2ggd2F5IHJhbiBoZSB0aGF0IGtpbGwnZCBNZXJjdXRpbz8KICAgIFR5YmFsdCwgdGhhdCBtdXJkZXJlciwgd2hpY2ggd2F5IHJhbiBoZT8KCkJFTlZPTElPCgogICAgVGhlcmUgbGllcyB0aGF0IFR5YmFsdC4KCkZpcnN0IENpdGl6ZW4KCiAgICBVcCwgc2lyLCBnbyB3aXRoIG1lOwogICAgSSBjaGFyZ2UgdGhlZSBpbiB0aGUgcHJpbmNlcyBuYW1lLCBvYmV5LgoKICAgIEVudGVyIFByaW5jZSwgYXR0ZW5kZWQ7IE1PTlRBR1VFLCBDQVBVTEVULCB0aGVpciBXaXZlcywgYW5kIG90aGVycwoKUFJJTkNFCgogICAgV2hlcmUgYXJlIHRoZSB2aWxlIGJlZ2lubmVycyBvZiB0aGlzIGZyYXkCgpCRU5WT0xJTwoKICAgIE8gbm9ibGUgcHJpbmNlLCBJIGNhbiBkaXNjb3ZlciBhbGwKICAgIFRoZSB1bmx1Y2t5IG1hbmFnZSBvZiB0aGlzIGZhdGFsIGJyYXdsOgogICAgVGhlcmUgbGllcyB0aGUgbWFuLCBzbGFpbiBieSB5b3VuZyBSb21lbywKICAgIFRoYXQgc2xldyB0aHkga2luc21hbiwgYnJhdmUgTWVyY3V0aW8uCgpMQURZIENBUFVMRVQKCiAgICBUeWJhbHQsIG15IGNvdXNpbiEgTyBteSBicm90aGVyJ3MgY2hpbGQhCiAgICBPIHByaW5jZSEgTyBjb3VzaW4hIGh1c2JhbmQhIE8sIHRoZSBibG9vZCBpcyBzcGlsdAogICAgTyBteSBkZWFyIGtpbnNtYW4hIFByaW5jZSwgYXMgdGhvdSBhcnQgdHJ1ZSwKICAgIEZvciBibG9vZCBvZiBvdXJzLCBzaGVkIGJsb29kIG9mIE1vbnRhZ3VlLgogICAgTyBjb3VzaW4sIGNvdXNpbiEKClBSSU5DRQoKICAgIEJlbnZvbGlvLCB3aG8gYmVnYW4gdGhpcyBibG9vZHkgZnJheT8KCkJFTlZPTElPCgogICAgVHliYWx0LCBoZXJlIHNsYWluLCB3aG9tIFJvbWVvJ3MgaGFuZCBkaWQgc2xheTsKICAgIFJvbWVvIHRoYXQgc3Bva2UgaGltIGZhaXIsIGJhZGUgaGltIGJldGhpbmsKICAgIEhvdyBuaWNlIHRoZSBxdWFycmVsIHdhcywgYW5kIHVyZ2VkIHdpdGhhbAogICAgWW91ciBoaWdoIGRpc3BsZWFzdXJlOiBhbGwgdGhpcyB1dHRlcmVkCiAgICBXaXRoIGdlbnRsZSBicmVhdGgsIGNhbG0gbG9vaywga25lZXMgaHVtYmx5IGJvdydkLAogICAgQ291bGQgbm90IHRha2UgdHJ1Y2Ugd2l0aCB0aGUgdW5ydWx5IHNwbGVlbgogICAgT2YgVHliYWx0IGRlYWYgdG8gcGVhY2UsIGJ1dCB0aGF0IGhlIHRpbHRzCiAgICBXaXRoIHBpZXJjaW5nIHN0ZWVsIGF0IGJvbGQgTWVyY3V0aW8ncyBicmVhc3QsCiAgICBXaG8gYWxsIGFzIGhvdCwgdHVybnMgZGVhZGx5IHBvaW50IHRvIHBvaW50LAogICAgQW5kLCB3aXRoIGEgbWFydGlhbCBzY29ybiwgd2l0aCBvbmUgaGFuZCBiZWF0cwogICAgQ29sZCBkZWF0aCBhc2lkZSwgYW5kIHdpdGggdGhlIG90aGVyIHNlbmRzCiAgICBJdCBiYWNrIHRvIFR5YmFsdCwgd2hvc2UgZGV4dGVyaXR5LAogICAgUmV0b3J0cyBpdDogUm9tZW8gaGUgY3JpZXMgYWxvdWQsCiAgICAnSG9sZCwgZnJpZW5kcyEgZnJpZW5kcywgcGFydCEnIGFuZCwgc3dpZnRlciB0aGFuCiAgICBoaXMgdG9uZ3VlLAogICAgSGlzIGFnaWxlIGFybSBiZWF0cyBkb3duIHRoZWlyIGZhdGFsIHBvaW50cywKICAgIEFuZCAndHdpeHQgdGhlbSBydXNoZXM7IHVuZGVybmVhdGggd2hvc2UgYXJtCiAgICBBbiBlbnZpb3VzIHRocnVzdCBmcm9tIFR5YmFsdCBoaXQgdGhlIGxpZmUKICAgIE9mIHN0b3V0IE1lcmN1dGlvLCBhbmQgdGhlbiBUeWJhbHQgZmxlZDsKICAgIEJ1dCBieSBhbmQgYnkgY29tZXMgYmFjayB0byBSb21lbywKICAgIFdobyBoYWQgYnV0IG5ld2x5IGVudGVydGFpbidkIHJldmVuZ2UsCiAgICBBbmQgdG8gJ3QgdGhleSBnbyBsaWtlIGxpZ2h0bmluZywgZm9yLCBlcmUgSQogICAgQ291bGQgZHJhdyB0byBwYXJ0IHRoZW0sIHdhcyBzdG91dCBUeWJhbHQgc2xhaW4uCiAgICBBbmQsIGFzIGhlIGZlbGwsIGRpZCBSb21lbyB0dXJuIGFuZCBmbHkuCiAgICBUaGlzIGlzIHRoZSB0cnV0aCwgb3IgbGV0IEJlbnZvbGlvIGRpZS4KCkxBRFkgQ0FQVUxFVAoKICAgIEhlIGlzIGEga2luc21hbiB0byB0aGUgTW9udGFndWU7CiAgICBBZmZlY3Rpb24gbWFrZXMgaGltIGZhbHNlOyBoZSBzcGVha3Mgbm90IHRydWU6CiAgICBTb21lIHR3ZW50eSBvZiB0aGVtIGZvdWdodCBpbiB0aGlzIGJsYWNrIHN0cmlmZSwKICAgIEFuZCBhbGwgdGhvc2UgdHdlbnR5IGNvdWxkIGJ1dCBraWxsIG9uZSBsaWZlLgogICAgSSBiZWcgZm9yIGp1c3RpY2UsIHdoaWNoIHRob3UsIHByaW5jZSwgbXVzdCBnaXZlOwogICAgUm9tZW8gc2xldyBUeWJhbHQsIFJvbWVvIG11c3Qgbm90IGxpdmUuCgpQUklOQ0UKCiAgICBSb21lbyBzbGV3IGhpbSwgaGUgc2xldyBNZXJjdXRpbzsKICAgIFdobyBub3cgdGhlIHByaWNlIG9mIGhpcyBkZWFyIGJsb29kIGRvdGggb3dlPwoKTU9OVEFHVUUKCiAgICBOb3QgUm9tZW8sIHByaW5jZSwgaGUgd2FzIE1lcmN1dGlvJ3MgZnJpZW5kOwogICAgSGlzIGZhdWx0IGNvbmNsdWRlcyBidXQgd2hhdCB0aGUgbGF3IHNob3VsZCBlbmQsCiAgICBUaGUgbGlmZSBvZiBUeWJhbHQuCgpQUklOQ0UKCiAgICBBbmQgZm9yIHRoYXQgb2ZmZW5jZQogICAgSW1tZWRpYXRlbHkgd2UgZG8gZXhpbGUgaGltIGhlbmNlOgogICAgSSBoYXZlIGFuIGludGVyZXN0IGluIHlvdXIgaGF0ZSdzIHByb2NlZWRpbmcsCiAgICBNeSBibG9vZCBmb3IgeW91ciBydWRlIGJyYXdscyBkb3RoIGxpZSBhLWJsZWVkaW5nOwogICAgQnV0IEknbGwgYW1lcmNlIHlvdSB3aXRoIHNvIHN0cm9uZyBhIGZpbmUKICAgIFRoYXQgeW91IHNoYWxsIGFsbCByZXBlbnQgdGhlIGxvc3Mgb2YgbWluZToKICAgIEkgd2lsbCBiZSBkZWFmIHRvIHBsZWFkaW5nIGFuZCBleGN1c2VzOwogICAgTm9yIHRlYXJzIG5vciBwcmF5ZXJzIHNoYWxsIHB1cmNoYXNlIG91dCBhYnVzZXM6CiAgICBUaGVyZWZvcmUgdXNlIG5vbmU6IGxldCBSb21lbyBoZW5jZSBpbiBoYXN0ZSwKICAgIEVsc2UsIHdoZW4gaGUncyBmb3VuZCwgdGhhdCBob3VyIGlzIGhpcyBsYXN0LgogICAgQmVhciBoZW5jZSB0aGlzIGJvZHkgYW5kIGF0dGVuZCBvdXIgd2lsbDoKICAgIE1lcmN5IGJ1dCBtdXJkZXJzLCBwYXJkb25pbmcgdGhvc2UgdGhhdCBraWxsLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIENhcHVsZXQncyBvcmNoYXJkLgoKICAgIEVudGVyIEpVTElFVCAKCkpVTElFVAoKICAgIEdhbGxvcCBhcGFjZSwgeW91IGZpZXJ5LWZvb3RlZCBzdGVlZHMsCiAgICBUb3dhcmRzIFBob2VidXMnIGxvZGdpbmc6IHN1Y2ggYSB3YWdvbmVyCiAgICBBcyBQaGFldGhvbiB3b3VsZCB3aGlwIHlvdSB0byB0aGUgd2VzdCwKICAgIEFuZCBicmluZyBpbiBjbG91ZHkgbmlnaHQgaW1tZWRpYXRlbHkuCiAgICBTcHJlYWQgdGh5IGNsb3NlIGN1cnRhaW4sIGxvdmUtcGVyZm9ybWluZyBuaWdodCwKICAgIFRoYXQgcnVuYXdheSdzIGV5ZXMgbWF5IHdpbmsgYW5kIFJvbWVvCiAgICBMZWFwIHRvIHRoZXNlIGFybXMsIHVudGFsaydkIG9mIGFuZCB1bnNlZW4uCiAgICBMb3ZlcnMgY2FuIHNlZSB0byBkbyB0aGVpciBhbW9yb3VzIHJpdGVzCiAgICBCeSB0aGVpciBvd24gYmVhdXRpZXM7IG9yLCBpZiBsb3ZlIGJlIGJsaW5kLAogICAgSXQgYmVzdCBhZ3JlZXMgd2l0aCBuaWdodC4gQ29tZSwgY2l2aWwgbmlnaHQsCiAgICBUaG91IHNvYmVyLXN1aXRlZCBtYXRyb24sIGFsbCBpbiBibGFjaywKICAgIEFuZCBsZWFybiBtZSBob3cgdG8gbG9zZSBhIHdpbm5pbmcgbWF0Y2gsCiAgICBQbGF5J2QgZm9yIGEgcGFpciBvZiBzdGFpbmxlc3MgbWFpZGVuaG9vZHM6CiAgICBIb29kIG15IHVubWFubidkIGJsb29kLCBiYXRpbmcgaW4gbXkgY2hlZWtzLAogICAgV2l0aCB0aHkgYmxhY2sgbWFudGxlOyB0aWxsIHN0cmFuZ2UgbG92ZSwgZ3Jvd24gYm9sZCwKICAgIFRoaW5rIHRydWUgbG92ZSBhY3RlZCBzaW1wbGUgbW9kZXN0eS4KICAgIENvbWUsIG5pZ2h0OyBjb21lLCBSb21lbzsgY29tZSwgdGhvdSBkYXkgaW4gbmlnaHQ7CiAgICBGb3IgdGhvdSB3aWx0IGxpZSB1cG9uIHRoZSB3aW5ncyBvZiBuaWdodAogICAgV2hpdGVyIHRoYW4gbmV3IHNub3cgb24gYSByYXZlbidzIGJhY2suCiAgICBDb21lLCBnZW50bGUgbmlnaHQsIGNvbWUsIGxvdmluZywgYmxhY2stYnJvdydkIG5pZ2h0LAogICAgR2l2ZSBtZSBteSBSb21lbzsgYW5kLCB3aGVuIGhlIHNoYWxsIGRpZSwKICAgIFRha2UgaGltIGFuZCBjdXQgaGltIG91dCBpbiBsaXR0bGUgc3RhcnMsCiAgICBBbmQgaGUgd2lsbCBtYWtlIHRoZSBmYWNlIG9mIGhlYXZlbiBzbyBmaW5lCiAgICBUaGF0IGFsbCB0aGUgd29ybGQgd2lsbCBiZSBpbiBsb3ZlIHdpdGggbmlnaHQKICAgIEFuZCBwYXkgbm8gd29yc2hpcCB0byB0aGUgZ2FyaXNoIHN1bi4KICAgIE8sIEkgaGF2ZSBib3VnaHQgdGhlIG1hbnNpb24gb2YgYSBsb3ZlLAogICAgQnV0IG5vdCBwb3NzZXNzJ2QgaXQsIGFuZCwgdGhvdWdoIEkgYW0gc29sZCwKICAgIE5vdCB5ZXQgZW5qb3knZDogc28gdGVkaW91cyBpcyB0aGlzIGRheQogICAgQXMgaXMgdGhlIG5pZ2h0IGJlZm9yZSBzb21lIGZlc3RpdmFsCiAgICBUbyBhbiBpbXBhdGllbnQgY2hpbGQgdGhhdCBoYXRoIG5ldyByb2JlcwogICAgQW5kIG1heSBub3Qgd2VhciB0aGVtLiBPLCBoZXJlIGNvbWVzIG15IG51cnNlLAogICAgQW5kIHNoZSBicmluZ3MgbmV3czsgYW5kIGV2ZXJ5IHRvbmd1ZSB0aGF0IHNwZWFrcwogICAgQnV0IFJvbWVvJ3MgbmFtZSBzcGVha3MgaGVhdmVubHkgZWxvcXVlbmNlLgoKICAgIEVudGVyIE51cnNlLCB3aXRoIGNvcmRzCiAgICBOb3csIG51cnNlLCB3aGF0IG5ld3MIFdoYXQgaGFzdCB0aG91IHRoZXJlPyB0aGUgY29yZHMKICAgIFRoYXQgUm9tZW8gYmlkIHRoZWUgZmV0Y2gCgpOdXJzZQoKICAgIEF5LCBheSwgdGhlIGNvcmRzLgoKICAgIFRocm93cyB0aGVtIGRvd24KCkpVTElFVAoKICAgIEF5IG1lISB3aGF0IG5ld3MIHdoeSBkb3N0IHRob3Ugd3JpbmcgdGh5IGhhbmRzPwoKTnVyc2UKCiAgICBBaCwgd2VsbC1hLWRheSEgaGUncyBkZWFkLCBoZSdzIGRlYWQsIGhlJ3MgZGVhZCEKICAgIFdlIGFyZSB1bmRvbmUsIGxhZHksIHdlIGFyZSB1bmRvbmUhCiAgICBBbGFjayB0aGUgZGF5ISBoZSdzIGdvbmUsIGhlJ3Mga2lsbCdkLCBoZSdzIGRlYWQhCgpKVUxJRVQKCiAgICBDYW4gaGVhdmVuIGJlIHNvIGVudmlvdXMCgpOdXJzZQoKICAgIFJvbWVvIGNhbiwKICAgIFRob3VnaCBoZWF2ZW4gY2Fubm90OiBPIFJvbWVvLCBSb21lbyEKICAgIFdobyBldmVyIHdvdWxkIGhhdmUgdGhvdWdodCBpdD8gUm9tZW8hCgpKVUxJRVQKCiAgICBXaGF0IGRldmlsIGFydCB0aG91LCB0aGF0IGRvc3QgdG9ybWVudCBtZSB0aHVzPwogICAgVGhpcyB0b3J0dXJlIHNob3VsZCBiZSByb2FyJ2QgaW4gZGlzbWFsIGhlbGwuCiAgICBIYXRoIFJvbWVvIHNsYWluIGhpbXNlbGYIHNheSB0aG91IGJ1dCAnSSwnCiAgICBBbmQgdGhhdCBiYXJlIHZvd2VsICdJJyBzaGFsbCBwb2lzb24gbW9yZQogICAgVGhhbiB0aGUgZGVhdGgtZGFydGluZyBleWUgb2YgY29ja2F0cmljZToKICAgIEkgYW0gbm90IEksIGlmIHRoZXJlIGJlIHN1Y2ggYW4gSTsKICAgIE9yIHRob3NlIGV5ZXMgc2h1dCwgdGhhdCBtYWtlIHRoZWUgYW5zd2VyICdJLicKICAgIElmIGhlIGJlIHNsYWluLCBzYXkgJ0knOyBvciBpZiBub3QsIG5vOgogICAgQnJpZWYgc291bmRzIGRldGVybWluZSBvZiBteSB3ZWFsIG9yIHdvZS4KCk51cnNlCgogICAgSSBzYXcgdGhlIHdvdW5kLCBJIHNhdyBpdCB3aXRoIG1pbmUgZXllcywtLQogICAgR29kIHNhdmUgdGhlIG1hcmshLS1oZXJlIG9uIGhpcyBtYW5seSBicmVhc3Q6CiAgICBBIHBpdGVvdXMgY29yc2UsIGEgYmxvb2R5IHBpdGVvdXMgY29yc2U7CiAgICBQYWxlLCBwYWxlIGFzIGFzaGVzLCBhbGwgYmVkYXViJ2QgaW4gYmxvb2QsCiAgICBBbGwgaW4gZ29yZS1ibG9vZDsgSSBzd291bmRlZCBhdCB0aGUgc2lnaHQuCgpKVUxJRVQKCiAgICBPLCBicmVhaywgbXkgaGVhcnQhIHBvb3IgYmFua3J1cHQsIGJyZWFrIGF0IG9uY2UhCiAgICBUbyBwcmlzb24sIGV5ZXMsIG5lJ2VyIGxvb2sgb24gbGliZXJ0eSEKICAgIFZpbGUgZWFydGgsIHRvIGVhcnRoIHJlc2lnbjsgZW5kIG1vdGlvbiBoZXJlOwogICAgQW5kIHRob3UgYW5kIFJvbWVvIHByZXNzIG9uZSBoZWF2eSBiaWVyIQoKTnVyc2UKCiAgICBPIFR5YmFsdCwgVHliYWx0LCB0aGUgYmVzdCBmcmllbmQgSSBoYWQhCiAgICBPIGNvdXJ0ZW91cyBUeWJhbHQhIGhvbmVzdCBnZW50bGVtYW4hCiAgICBUaGF0IGV2ZXIgSSBzaG91bGQgbGl2ZSB0byBzZWUgdGhlZSBkZWFkIQoKSlVMSUVUCgogICAgV2hhdCBzdG9ybSBpcyB0aGlzIHRoYXQgYmxvd3Mgc28gY29udHJhcnkCiAgICBJcyBSb21lbyBzbGF1Z2h0ZXInZCwgYW5kIGlzIFR5YmFsdCBkZWFkPwogICAgTXkgZGVhci1sb3ZlZCBjb3VzaW4sIGFuZCBteSBkZWFyZXIgbG9yZD8KICAgIFRoZW4sIGRyZWFkZnVsIHRydW1wZXQsIHNvdW5kIHRoZSBnZW5lcmFsIGRvb20hCiAgICBGb3Igd2hvIGlzIGxpdmluZywgaWYgdGhvc2UgdHdvIGFyZSBnb25lPwoKTnVyc2UKCiAgICBUeWJhbHQgaXMgZ29uZSwgYW5kIFJvbWVvIGJhbmlzaGVkOwogICAgUm9tZW8gdGhhdCBraWxsJ2QgaGltLCBoZSBpcyBiYW5pc2hlZC4KCkpVTElFVAoKICAgIE8gR29kISBkaWQgUm9tZW8ncyBoYW5kIHNoZWQgVHliYWx0J3MgYmxvb2QCgpOdXJzZQoKICAgIEl0IGRpZCwgaXQgZGlkOyBhbGFzIHRoZSBkYXksIGl0IGRpZCEKCkpVTElFVAoKICAgIE8gc2VycGVudCBoZWFydCwgaGlkIHdpdGggYSBmbG93ZXJpbmcgZmFjZSEKICAgIERpZCBldmVyIGRyYWdvbiBrZWVwIHNvIGZhaXIgYSBjYXZlPwogICAgQmVhdXRpZnVsIHR5cmFudCEgZmllbmQgYW5nZWxpY2FsIQogICAgRG92ZS1mZWF0aGVyJ2QgcmF2ZW4hIHdvbHZpc2gtcmF2ZW5pbmcgbGFtYiEKICAgIERlc3Bpc2VkIHN1YnN0YW5jZSBvZiBkaXZpbmVzdCBzaG93IQogICAgSnVzdCBvcHBvc2l0ZSB0byB3aGF0IHRob3UganVzdGx5IHNlZW0nc3QsCiAgICBBIGRhbW5lZCBzYWludCwgYW4gaG9ub3VyYWJsZSB2aWxsYWluIQogICAgTyBuYXR1cmUsIHdoYXQgaGFkc3QgdGhvdSB0byBkbyBpbiBoZWxsLAogICAgV2hlbiB0aG91IGRpZHN0IGJvd2VyIHRoZSBzcGlyaXQgb2YgYSBmaWVuZAogICAgSW4gbW9yYWwgcGFyYWRpc2Ugb2Ygc3VjaCBzd2VldCBmbGVzaD8KICAgIFdhcyBldmVyIGJvb2sgY29udGFpbmluZyBzdWNoIHZpbGUgbWF0dGVyCiAgICBTbyBmYWlybHkgYm91bmQIE8gdGhhdCBkZWNlaXQgc2hvdWxkIGR3ZWxsCiAgICBJbiBzdWNoIGEgZ29yZ2VvdXMgcGFsYWNlIQoKTnVyc2UKCiAgICBUaGVyZSdzIG5vIHRydXN0LAogICAgTm8gZmFpdGgsIG5vIGhvbmVzdHkgaW4gbWVuOyBhbGwgcGVyanVyZWQsCiAgICBBbGwgZm9yc3dvcm4sIGFsbCBuYXVnaHQsIGFsbCBkaXNzZW1ibGVycy4KICAgIEFoLCB3aGVyZSdzIG15IG1hbj8gZ2l2ZSBtZSBzb21lIGFxdWEgdml0YWU6CiAgICBUaGVzZSBncmllZnMsIHRoZXNlIHdvZXMsIHRoZXNlIHNvcnJvd3MgbWFrZSBtZSBvbGQuCiAgICBTaGFtZSBjb21lIHRvIFJvbWVvIQoKSlVMSUVUCgogICAgQmxpc3RlcidkIGJlIHRoeSB0b25ndWUKICAgIEZvciBzdWNoIGEgd2lzaCEgaGUgd2FzIG5vdCBib3JuIHRvIHNoYW1lOgogICAgVXBvbiBoaXMgYnJvdyBzaGFtZSBpcyBhc2hhbWVkIHRvIHNpdDsKICAgIEZvciAndGlzIGEgdGhyb25lIHdoZXJlIGhvbm91ciBtYXkgYmUgY3Jvd24nZAogICAgU29sZSBtb25hcmNoIG9mIHRoZSB1bml2ZXJzYWwgZWFydGguCiAgICBPLCB3aGF0IGEgYmVhc3Qgd2FzIEkgdG8gY2hpZGUgYXQgaGltIQoKTnVyc2UKCiAgICBXaWxsIHlvdSBzcGVhayB3ZWxsIG9mIGhpbSB0aGF0IGtpbGwnZCB5b3VyIGNvdXNpbj8KCkpVTElFVAoKICAgIFNoYWxsIEkgc3BlYWsgaWxsIG9mIGhpbSB0aGF0IGlzIG15IGh1c2JhbmQCiAgICBBaCwgcG9vciBteSBsb3JkLCB3aGF0IHRvbmd1ZSBzaGFsbCBzbW9vdGggdGh5IG5hbWUsCiAgICBXaGVuIEksIHRoeSB0aHJlZS1ob3VycyB3aWZlLCBoYXZlIG1hbmdsZWQgaXQCiAgICBCdXQsIHdoZXJlZm9yZSwgdmlsbGFpbiwgZGlkc3QgdGhvdSBraWxsIG15IGNvdXNpbj8KICAgIFRoYXQgdmlsbGFpbiBjb3VzaW4gd291bGQgaGF2ZSBraWxsJ2QgbXkgaHVzYmFuZDoKICAgIEJhY2ssIGZvb2xpc2ggdGVhcnMsIGJhY2sgdG8geW91ciBuYXRpdmUgc3ByaW5nOwogICAgWW91ciB0cmlidXRhcnkgZHJvcHMgYmVsb25nIHRvIHdvZSwKICAgIFdoaWNoIHlvdSwgbWlzdGFraW5nLCBvZmZlciB1cCB0byBqb3kuCiAgICBNeSBodXNiYW5kIGxpdmVzLCB0aGF0IFR5YmFsdCB3b3VsZCBoYXZlIHNsYWluOwogICAgQW5kIFR5YmFsdCdzIGRlYWQsIHRoYXQgd291bGQgaGF2ZSBzbGFpbiBteSBodXNiYW5kOgogICAgQWxsIHRoaXMgaXMgY29tZm9ydDsgd2hlcmVmb3JlIHdlZXAgSSB0aGVuPwogICAgU29tZSB3b3JkIHRoZXJlIHdhcywgd29yc2VyIHRoYW4gVHliYWx0J3MgZGVhdGgsCiAgICBUaGF0IG11cmRlcidkIG1lOiBJIHdvdWxkIGZvcmdldCBpdCBmYWluOwogICAgQnV0LCBPLCBpdCBwcmVzc2VzIHRvIG15IG1lbW9yeSwKICAgIExpa2UgZGFtbmVkIGd1aWx0eSBkZWVkcyB0byBzaW5uZXJzJyBtaW5kczoKICAgICdUeWJhbHQgaXMgZGVhZCwgYW5kIFJvbWVvLS1iYW5pc2hlZDsnCiAgICBUaGF0ICdiYW5pc2hlZCwnIHRoYXQgb25lIHdvcmQgJ2JhbmlzaGVkLCcKICAgIEhhdGggc2xhaW4gdGVuIHRob3VzYW5kIFR5YmFsdHMuIFR5YmFsdCdzIGRlYXRoCiAgICBXYXMgd29lIGVub3VnaCwgaWYgaXQgaGFkIGVuZGVkIHRoZXJlOgogICAgT3IsIGlmIHNvdXIgd29lIGRlbGlnaHRzIGluIGZlbGxvd3NoaXAKICAgIEFuZCBuZWVkbHkgd2lsbCBiZSByYW5rJ2Qgd2l0aCBvdGhlciBncmllZnMsCiAgICBXaHkgZm9sbG93J2Qgbm90LCB3aGVuIHNoZSBzYWlkICdUeWJhbHQncyBkZWFkLCcKICAgIFRoeSBmYXRoZXIsIG9yIHRoeSBtb3RoZXIsIG5heSwgb3IgYm90aCwKICAgIFdoaWNoIG1vZGVybiBsYW1lbnRhdGlvbnMgbWlnaHQgaGF2ZSBtb3ZlZD8KICAgIEJ1dCB3aXRoIGEgcmVhci13YXJkIGZvbGxvd2luZyBUeWJhbHQncyBkZWF0aCwKICAgICdSb21lbyBpcyBiYW5pc2hlZCwnIHRvIHNwZWFrIHRoYXQgd29yZCwKICAgIElzIGZhdGhlciwgbW90aGVyLCBUeWJhbHQsIFJvbWVvLCBKdWxpZXQsCiAgICBBbGwgc2xhaW4sIGFsbCBkZWFkLiAnUm9tZW8gaXMgYmFuaXNoZWQhJwogICAgVGhlcmUgaXMgbm8gZW5kLCBubyBsaW1pdCwgbWVhc3VyZSwgYm91bmQsCiAgICBJbiB0aGF0IHdvcmQncyBkZWF0aDsgbm8gd29yZHMgY2FuIHRoYXQgd29lIHNvdW5kLgogICAgV2hlcmUgaXMgbXkgZmF0aGVyLCBhbmQgbXkgbW90aGVyLCBudXJzZT8KCk51cnNlCgogICAgV2VlcGluZyBhbmQgd2FpbGluZyBvdmVyIFR5YmFsdCdzIGNvcnNlOgogICAgV2lsbCB5b3UgZ28gdG8gdGhlbT8gSSB3aWxsIGJyaW5nIHlvdSB0aGl0aGVyLgoKSlVMSUVUCgogICAgV2FzaCB0aGV5IGhpcyB3b3VuZHMgd2l0aCB0ZWFyczogbWluZSBzaGFsbCBiZSBzcGVudCwKICAgIFdoZW4gdGhlaXJzIGFyZSBkcnksIGZvciBSb21lbydzIGJhbmlzaG1lbnQuCiAgICBUYWtlIHVwIHRob3NlIGNvcmRzOiBwb29yIHJvcGVzLCB5b3UgYXJlIGJlZ3VpbGVkLAogICAgQm90aCB5b3UgYW5kIEk7IGZvciBSb21lbyBpcyBleGlsZWQ6CiAgICBIZSBtYWRlIHlvdSBmb3IgYSBoaWdod2F5IHRvIG15IGJlZDsKICAgIEJ1dCBJLCBhIG1haWQsIGRpZSBtYWlkZW4td2lkb3dlZC4KICAgIENvbWUsIGNvcmRzLCBjb21lLCBudXJzZTsgSSdsbCB0byBteSB3ZWRkaW5nLWJlZDsKICAgIEFuZCBkZWF0aCwgbm90IFJvbWVvLCB0YWtlIG15IG1haWRlbmhlYWQhCgpOdXJzZQoKICAgIEhpZSB0byB5b3VyIGNoYW1iZXI6IEknbGwgZmluZCBSb21lbwogICAgVG8gY29tZm9ydCB5b3U6IEkgd290IHdlbGwgd2hlcmUgaGUgaXMuCiAgICBIYXJrIHllLCB5b3VyIFJvbWVvIHdpbGwgYmUgaGVyZSBhdCBuaWdodDoKICAgIEknbGwgdG8gaGltOyBoZSBpcyBoaWQgYXQgTGF1cmVuY2UnIGNlbGwuCgpKVUxJRVQKCiAgICBPLCBmaW5kIGhpbSEgZ2l2ZSB0aGlzIHJpbmcgdG8gbXkgdHJ1ZSBrbmlnaHQsCiAgICBBbmQgYmlkIGhpbSBjb21lIHRvIHRha2UgaGlzIGxhc3QgZmFyZXdlbGwuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSAKCkZSSUFSIExBVVJFTkNFCgogICAgUm9tZW8sIGNvbWUgZm9ydGg7IGNvbWUgZm9ydGgsIHRob3UgZmVhcmZ1bCBtYW46CiAgICBBZmZsaWN0aW9uIGlzIGVuYW1vdXInZCBvZiB0aHkgcGFydHMsCiAgICBBbmQgdGhvdSBhcnQgd2VkZGVkIHRvIGNhbGFtaXR5LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEZhdGhlciwgd2hhdCBuZXdzPyB3aGF0IGlzIHRoZSBwcmluY2UncyBkb29tPwogICAgV2hhdCBzb3Jyb3cgY3JhdmVzIGFjcXVhaW50YW5jZSBhdCBteSBoYW5kLAogICAgVGhhdCBJIHlldCBrbm93IG5vdD8KCkZSSUFSIExBVVJFTkNFCgogICAgVG9vIGZhbWlsaWFyCiAgICBJcyBteSBkZWFyIHNvbiB3aXRoIHN1Y2ggc291ciBjb21wYW55OgogICAgSSBicmluZyB0aGVlIHRpZGluZ3Mgb2YgdGhlIHByaW5jZSdzIGRvb20uCgpST01FTwoKICAgIFdoYXQgbGVzcyB0aGFuIGRvb21zLWRheSBpcyB0aGUgcHJpbmNlJ3MgZG9vbT8KCkZSSUFSIExBVVJFTkNFCgogICAgQSBnZW50bGVyIGp1ZGdtZW50IHZhbmlzaCdkIGZyb20gaGlzIGxpcHMsCiAgICBOb3QgYm9keSdzIGRlYXRoLCBidXQgYm9keSdzIGJhbmlzaG1lbnQuCgpST01FTwoKICAgIEhhLCBiYW5pc2htZW50ISBiZSBtZXJjaWZ1bCwgc2F5ICdkZWF0aDsnCiAgICBGb3IgZXhpbGUgaGF0aCBtb3JlIHRlcnJvciBpbiBoaXMgbG9vaywKICAgIE11Y2ggbW9yZSB0aGFuIGRlYXRoOiBkbyBub3Qgc2F5ICdiYW5pc2htZW50LicKCkZSSUFSIExBVVJFTkNFCgogICAgSGVuY2UgZnJvbSBWZXJvbmEgYXJ0IHRob3UgYmFuaXNoZWQ6CiAgICBCZSBwYXRpZW50LCBmb3IgdGhlIHdvcmxkIGlzIGJyb2FkIGFuZCB3aWRlLgoKUk9NRU8KCiAgICBUaGVyZSBpcyBubyB3b3JsZCB3aXRob3V0IFZlcm9uYSB3YWxscywKICAgIEJ1dCBwdXJnYXRvcnksIHRvcnR1cmUsIGhlbGwgaXRzZWxmLgogICAgSGVuY2UtYmFuaXNoZWQgaXMgYmFuaXNoJ2QgZnJvbSB0aGUgd29ybGQsCiAgICBBbmQgd29ybGQncyBleGlsZSBpcyBkZWF0aDogdGhlbiBiYW5pc2hlZCwKICAgIElzIGRlYXRoIG1pcy10ZXJtJ2Q6IGNhbGxpbmcgZGVhdGggYmFuaXNobWVudCwKICAgIFRob3UgY3V0dCdzdCBteSBoZWFkIG9mZiB3aXRoIGEgZ29sZGVuIGF4ZSwKICAgIEFuZCBzbWlsZXN0IHVwb24gdGhlIHN0cm9rZSB0aGF0IG11cmRlcnMgbWUuCgpGUklBUiBMQVVSRU5DRQoKICAgIE8gZGVhZGx5IHNpbiEgTyBydWRlIHVudGhhbmtmdWxuZXNzIQogICAgVGh5IGZhdWx0IG91ciBsYXcgY2FsbHMgZGVhdGg7IGJ1dCB0aGUga2luZCBwcmluY2UsCiAgICBUYWtpbmcgdGh5IHBhcnQsIGhhdGggcnVzaCdkIGFzaWRlIHRoZSBsYXcsCiAgICBBbmQgdHVybidkIHRoYXQgYmxhY2sgd29yZCBkZWF0aCB0byBiYW5pc2htZW50OgogICAgVGhpcyBpcyBkZWFyIG1lcmN5LCBhbmQgdGhvdSBzZWVzdCBpdCBub3QuCgpST01FTwoKICAgICdUaXMgdG9ydHVyZSwgYW5kIG5vdCBtZXJjeTogaGVhdmVuIGlzIGhlcmUsCiAgICBXaGVyZSBKdWxpZXQgbGl2ZXM7IGFuZCBldmVyeSBjYXQgYW5kIGRvZwogICAgQW5kIGxpdHRsZSBtb3VzZSwgZXZlcnkgdW53b3J0aHkgdGhpbmcsCiAgICBMaXZlIGhlcmUgaW4gaGVhdmVuIGFuZCBtYXkgbG9vayBvbiBoZXI7CiAgICBCdXQgUm9tZW8gbWF5IG5vdDogbW9yZSB2YWxpZGl0eSwKICAgIE1vcmUgaG9ub3VyYWJsZSBzdGF0ZSwgbW9yZSBjb3VydHNoaXAgbGl2ZXMKICAgIEluIGNhcnJpb24tZmxpZXMgdGhhbiBSb21lbzogdGhleSBteSBzZWl6ZQogICAgT24gdGhlIHdoaXRlIHdvbmRlciBvZiBkZWFyIEp1bGlldCdzIGhhbmQKICAgIEFuZCBzdGVhbCBpbW1vcnRhbCBibGVzc2luZyBmcm9tIGhlciBsaXBzLAogICAgV2hvIGV2ZW4gaW4gcHVyZSBhbmQgdmVzdGFsIG1vZGVzdHksCiAgICBTdGlsbCBibHVzaCwgYXMgdGhpbmtpbmcgdGhlaXIgb3duIGtpc3NlcyBzaW47CiAgICBCdXQgUm9tZW8gbWF5IG5vdDsgaGUgaXMgYmFuaXNoZWQ6CiAgICBGbGllcyBtYXkgZG8gdGhpcywgYnV0IEkgZnJvbSB0aGlzIG11c3QgZmx5OgogICAgVGhleSBhcmUgZnJlZSBtZW4sIGJ1dCBJIGFtIGJhbmlzaGVkLgogICAgQW5kIHNheSdzdCB0aG91IHlldCB0aGF0IGV4aWxlIGlzIG5vdCBkZWF0aD8KICAgIEhhZHN0IHRob3Ugbm8gcG9pc29uIG1peCdkLCBubyBzaGFycC1ncm91bmQga25pZmUsCiAgICBObyBzdWRkZW4gbWVhbiBvZiBkZWF0aCwgdGhvdWdoIG5lJ2VyIHNvIG1lYW4sCiAgICBCdXQgJ2JhbmlzaGVkJyB0byBraWxsIG1lPy0tJ2JhbmlzaGVkJz8KICAgIE8gZnJpYXIsIHRoZSBkYW1uZWQgdXNlIHRoYXQgd29yZCBpbiBoZWxsOwogICAgSG93bGluZ3MgYXR0ZW5kIGl0OiBob3cgaGFzdCB0aG91IHRoZSBoZWFydCwKICAgIEJlaW5nIGEgZGl2aW5lLCBhIGdob3N0bHkgY29uZmVzc29yLAogICAgQSBzaW4tYWJzb2x2ZXIsIGFuZCBteSBmcmllbmQgcHJvZmVzcydkLAogICAgVG8gbWFuZ2xlIG1lIHdpdGggdGhhdCB3b3JkICdiYW5pc2hlZCcCgpGUklBUiBMQVVSRU5DRQoKICAgIFRob3UgZm9uZCBtYWQgbWFuLCBoZWFyIG1lIGJ1dCBzcGVhayBhIHdvcmQuCgpST01FTwoKICAgIE8sIHRob3Ugd2lsdCBzcGVhayBhZ2FpbiBvZiBiYW5pc2htZW50LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJJ2xsIGdpdmUgdGhlZSBhcm1vdXIgdG8ga2VlcCBvZmYgdGhhdCB3b3JkOgogICAgQWR2ZXJzaXR5J3Mgc3dlZXQgbWlsaywgcGhpbG9zb3BoeSwKICAgIFRvIGNvbWZvcnQgdGhlZSwgdGhvdWdoIHRob3UgYXJ0IGJhbmlzaGVkLgoKUk9NRU8KCiAgICBZZXQgJ2JhbmlzaGVkJz8gSGFuZyB1cCBwaGlsb3NvcGh5IQogICAgVW5sZXNzIHBoaWxvc29waHkgY2FuIG1ha2UgYSBKdWxpZXQsCiAgICBEaXNwbGFudCBhIHRvd24sIHJldmVyc2UgYSBwcmluY2UncyBkb29tLAogICAgSXQgaGVscHMgbm90LCBpdCBwcmV2YWlscyBub3Q6IHRhbGsgbm8gbW9yZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTywgdGhlbiBJIHNlZSB0aGF0IG1hZG1lbiBoYXZlIG5vIGVhcnMuCgpST01FTwoKICAgIEhvdyBzaG91bGQgdGhleSwgd2hlbiB0aGF0IHdpc2UgbWVuIGhhdmUgbm8gZXllcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTGV0IG1lIGRpc3B1dGUgd2l0aCB0aGVlIG9mIHRoeSBlc3RhdGUuCgpST01FTwoKICAgIFRob3UgY2Fuc3Qgbm90IHNwZWFrIG9mIHRoYXQgdGhvdSBkb3N0IG5vdCBmZWVsOgogICAgV2VydCB0aG91IGFzIHlvdW5nIGFzIEksIEp1bGlldCB0aHkgbG92ZSwKICAgIEFuIGhvdXIgYnV0IG1hcnJpZWQsIFR5YmFsdCBtdXJkZXJlZCwKICAgIERvdGluZyBsaWtlIG1lIGFuZCBsaWtlIG1lIGJhbmlzaGVkLAogICAgVGhlbiBtaWdodHN0IHRob3Ugc3BlYWssIHRoZW4gbWlnaHRzdCB0aG91IHRlYXIgdGh5IGhhaXIsCiAgICBBbmQgZmFsbCB1cG9uIHRoZSBncm91bmQsIGFzIEkgZG8gbm93LAogICAgVGFraW5nIHRoZSBtZWFzdXJlIG9mIGFuIHVubWFkZSBncmF2ZS4KCiAgICBLbm9ja2luZyB3aXRoaW4KCkZSSUFSIExBVVJFTkNFCgogICAgQXJpc2U7IG9uZSBrbm9ja3M7IGdvb2QgUm9tZW8sIGhpZGUgdGh5c2VsZi4KClJPTUVPCgogICAgTm90IEk7IHVubGVzcyB0aGUgYnJlYXRoIG9mIGhlYXJ0c2ljayBncm9hbnMsCiAgICBNaXN0LWxpa2UsIGluZm9sZCBtZSBmcm9tIHRoZSBzZWFyY2ggb2YgZXllcy4KCiAgICBLbm9ja2luZwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIYXJrLCBob3cgdGhleSBrbm9jayEgV2hvJ3MgdGhlcmUIFJvbWVvLCBhcmlzZTsKICAgIFRob3Ugd2lsdCBiZSB0YWtlbi4gU3RheSBhd2hpbGUhIFN0YW5kIHVwOwoKICAgIEtub2NraW5nCiAgICBSdW4gdG8gbXkgc3R1ZHkuIEJ5IGFuZCBieSEgR29kJ3Mgd2lsbCwKICAgIFdoYXQgc2ltcGxlbmVzcyBpcyB0aGlzISBJIGNvbWUsIEkgY29tZSEKCiAgICBLbm9ja2luZwogICAgV2hvIGtub2NrcyBzbyBoYXJkPyB3aGVuY2UgY29tZSB5b3UIHdoYXQncyB5b3VyIHdpbGwCgpOdXJzZQoKICAgIFtXaXRoaW5dIExldCBtZSBjb21lIGluLCBhbmQgeW91IHNoYWxsIGtub3cKICAgIG15IGVycmFuZDsKICAgIEkgY29tZSBmcm9tIExhZHkgSnVsaWV0LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXZWxjb21lLCB0aGVuLgoKICAgIEVudGVyIE51cnNlCgpOdXJzZQoKICAgIE8gaG9seSBmcmlhciwgTywgdGVsbCBtZSwgaG9seSBmcmlhciwKICAgIFdoZXJlIGlzIG15IGxhZHkncyBsb3JkLCB3aGVyZSdzIFJvbWVvPwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGVyZSBvbiB0aGUgZ3JvdW5kLCB3aXRoIGhpcyBvd24gdGVhcnMgbWFkZSBkcnVuay4KCk51cnNlCgogICAgTywgaGUgaXMgZXZlbiBpbiBteSBtaXN0cmVzcycgY2FzZSwKICAgIEp1c3QgaW4gaGVyIGNhc2UhIE8gd29mdWwgc3ltcGF0aHkhCiAgICBQaXRlb3VzIHByZWRpY2FtZW50ISBFdmVuIHNvIGxpZXMgc2hlLAogICAgQmx1YmJlcmluZyBhbmQgd2VlcGluZywgd2VlcGluZyBhbmQgYmx1YmJlcmluZy4KICAgIFN0YW5kIHVwLCBzdGFuZCB1cDsgc3RhbmQsIGFuZCB5b3UgYmUgYSBtYW46CiAgICBGb3IgSnVsaWV0J3Mgc2FrZSwgZm9yIGhlciBzYWtlLCByaXNlIGFuZCBzdGFuZDsKICAgIFdoeSBzaG91bGQgeW91IGZhbGwgaW50byBzbyBkZWVwIGFuIE8CgpST01FTwoKICAgIE51cnNlIQoKTnVyc2UKCiAgICBBaCBzaXIhIGFoIHNpciEgV2VsbCwgZGVhdGgncyB0aGUgZW5kIG9mIGFsbC4KClJPTUVPCgogICAgU3Bha2VzdCB0aG91IG9mIEp1bGlldD8gaG93IGlzIGl0IHdpdGggaGVyPwogICAgRG90aCBzaGUgbm90IHRoaW5rIG1lIGFuIG9sZCBtdXJkZXJlciwKICAgIE5vdyBJIGhhdmUgc3RhaW4nZCB0aGUgY2hpbGRob29kIG9mIG91ciBqb3kKICAgIFdpdGggYmxvb2QgcmVtb3ZlZCBidXQgbGl0dGxlIGZyb20gaGVyIG93bj8KICAgIFdoZXJlIGlzIHNoZT8gYW5kIGhvdyBkb3RoIHNoZT8gYW5kIHdoYXQgc2F5cwogICAgTXkgY29uY2VhbCdkIGxhZHkgdG8gb3VyIGNhbmNlbGwnZCBsb3ZlPwoKTnVyc2UKCiAgICBPLCBzaGUgc2F5cyBub3RoaW5nLCBzaXIsIGJ1dCB3ZWVwcyBhbmQgd2VlcHM7CiAgICBBbmQgbm93IGZhbGxzIG9uIGhlciBiZWQ7IGFuZCB0aGVuIHN0YXJ0cyB1cCwKICAgIEFuZCBUeWJhbHQgY2FsbHM7IGFuZCB0aGVuIG9uIFJvbWVvIGNyaWVzLAogICAgQW5kIHRoZW4gZG93biBmYWxscyBhZ2Fpbi4KClJPTUVPCgogICAgQXMgaWYgdGhhdCBuYW1lLAogICAgU2hvdCBmcm9tIHRoZSBkZWFkbHkgbGV2ZWwgb2YgYSBndW4sCiAgICBEaWQgbXVyZGVyIGhlcjsgYXMgdGhhdCBuYW1lJ3MgY3Vyc2VkIGhhbmQKICAgIE11cmRlcidkIGhlciBraW5zbWFuLiBPLCB0ZWxsIG1lLCBmcmlhciwgdGVsbCBtZSwKICAgIEluIHdoYXQgdmlsZSBwYXJ0IG9mIHRoaXMgYW5hdG9teQogICAgRG90aCBteSBuYW1lIGxvZGdlPyB0ZWxsIG1lLCB0aGF0IEkgbWF5IHNhY2sKICAgIFRoZSBoYXRlZnVsIG1hbnNpb24uCgogICAgRHJhd2luZyBoaXMgc3dvcmQKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZCB0aHkgZGVzcGVyYXRlIGhhbmQ6CiAgICBBcnQgdGhvdSBhIG1hbj8gdGh5IGZvcm0gY3JpZXMgb3V0IHRob3UgYXJ0OgogICAgVGh5IHRlYXJzIGFyZSB3b21hbmlzaDsgdGh5IHdpbGQgYWN0cyBkZW5vdGUKICAgIFRoZSB1bnJlYXNvbmFibGUgZnVyeSBvZiBhIGJlYXN0OgogICAgVW5zZWVtbHkgd29tYW4gaW4gYSBzZWVtaW5nIG1hbiEKICAgIE9yIGlsbC1iZXNlZW1pbmcgYmVhc3QgaW4gc2VlbWluZyBib3RoIQogICAgVGhvdSBoYXN0IGFtYXplZCBtZTogYnkgbXkgaG9seSBvcmRlciwKICAgIEkgdGhvdWdodCB0aHkgZGlzcG9zaXRpb24gYmV0dGVyIHRlbXBlcidkLgogICAgSGFzdCB0aG91IHNsYWluIFR5YmFsdD8gd2lsdCB0aG91IHNsYXkgdGh5c2VsZj8KICAgIEFuZCBzdGF5IHRoeSBsYWR5IHRvbyB0aGF0IGxpdmVzIGluIHRoZWUsCiAgICBCeSBkb2luZyBkYW1uZWQgaGF0ZSB1cG9uIHRoeXNlbGYCiAgICBXaHkgcmFpbCdzdCB0aG91IG9uIHRoeSBiaXJ0aCwgdGhlIGhlYXZlbiwgYW5kIGVhcnRoPwogICAgU2luY2UgYmlydGgsIGFuZCBoZWF2ZW4sIGFuZCBlYXJ0aCwgYWxsIHRocmVlIGRvIG1lZXQKICAgIEluIHRoZWUgYXQgb25jZTsgd2hpY2ggdGhvdSBhdCBvbmNlIHdvdWxkc3QgbG9zZS4KICAgIEZpZSwgZmllLCB0aG91IHNoYW1lc3QgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDsKICAgIFdoaWNoLCBsaWtlIGEgdXN1cmVyLCBhYm91bmQnc3QgaW4gYWxsLAogICAgQW5kIHVzZXN0IG5vbmUgaW4gdGhhdCB0cnVlIHVzZSBpbmRlZWQKICAgIFdoaWNoIHNob3VsZCBiZWRlY2sgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDoKICAgIFRoeSBub2JsZSBzaGFwZSBpcyBidXQgYSBmb3JtIG9mIHdheCwKICAgIERpZ3Jlc3NpbmcgZnJvbSB0aGUgdmFsb3VyIG9mIGEgbWFuOwogICAgVGh5IGRlYXIgbG92ZSBzd29ybiBidXQgaG9sbG93IHBlcmp1cnksCiAgICBLaWxsaW5nIHRoYXQgbG92ZSB3aGljaCB0aG91IGhhc3Qgdm93J2QgdG8gY2hlcmlzaDsKICAgIFRoeSB3aXQsIHRoYXQgb3JuYW1lbnQgdG8gc2hhcGUgYW5kIGxvdmUsCiAgICBNaXNzaGFwZW4gaW4gdGhlIGNvbmR1Y3Qgb2YgdGhlbSBib3RoLAogICAgTGlrZSBwb3dkZXIgaW4gYSBza2l0bGVzcyBzb2xkaWVyJ3MgZmxhc2ssCiAgICBJcyBzZXQgYWZpcmUgYnkgdGhpbmUgb3duIGlnbm9yYW5jZSwKICAgIEFuZCB0aG91IGRpc21lbWJlcidkIHdpdGggdGhpbmUgb3duIGRlZmVuY2UuCiAgICBXaGF0LCByb3VzZSB0aGVlLCBtYW4hIHRoeSBKdWxpZXQgaXMgYWxpdmUsCiAgICBGb3Igd2hvc2UgZGVhciBzYWtlIHRob3Ugd2FzdCBidXQgbGF0ZWx5IGRlYWQ7CiAgICBUaGVyZSBhcnQgdGhvdSBoYXBweTogVHliYWx0IHdvdWxkIGtpbGwgdGhlZSwKICAgIEJ1dCB0aG91IHNsZXcnc3QgVHliYWx0OyB0aGVyZSBhcmUgdGhvdSBoYXBweSB0b286CiAgICBUaGUgbGF3IHRoYXQgdGhyZWF0ZW4nZCBkZWF0aCBiZWNvbWVzIHRoeSBmcmllbmQKICAgIEFuZCB0dXJucyBpdCB0byBleGlsZTsgdGhlcmUgYXJ0IHRob3UgaGFwcHk6CiAgICBBIHBhY2sgb2YgYmxlc3NpbmdzIGxpZ2h0cyB1cCB1cG9uIHRoeSBiYWNrOwogICAgSGFwcGluZXNzIGNvdXJ0cyB0aGVlIGluIGhlciBiZXN0IGFycmF5OwogICAgQnV0LCBsaWtlIGEgbWlzYmVoYXZlZCBhbmQgc3VsbGVuIHdlbmNoLAogICAgVGhvdSBwb3V0J3N0IHVwb24gdGh5IGZvcnR1bmUgYW5kIHRoeSBsb3ZlOgogICAgVGFrZSBoZWVkLCB0YWtlIGhlZWQsIGZvciBzdWNoIGRpZSBtaXNlcmFibGUuCiAgICBHbywgZ2V0IHRoZWUgdG8gdGh5IGxvdmUsIGFzIHdhcyBkZWNyZWVkLAogICAgQXNjZW5kIGhlciBjaGFtYmVyLCBoZW5jZSBhbmQgY29tZm9ydCBoZXI6CiAgICBCdXQgbG9vayB0aG91IHN0YXkgbm90IHRpbGwgdGhlIHdhdGNoIGJlIHNldCwKICAgIEZvciB0aGVuIHRob3UgY2Fuc3Qgbm90IHBhc3MgdG8gTWFudHVhOwogICAgV2hlcmUgdGhvdSBzaGFsdCBsaXZlLCB0aWxsIHdlIGNhbiBmaW5kIGEgdGltZQogICAgVG8gYmxhemUgeW91ciBtYXJyaWFnZSwgcmVjb25jaWxlIHlvdXIgZnJpZW5kcywKICAgIEJlZyBwYXJkb24gb2YgdGhlIHByaW5jZSwgYW5kIGNhbGwgdGhlZSBiYWNrCiAgICBXaXRoIHR3ZW50eSBodW5kcmVkIHRob3VzYW5kIHRpbWVzIG1vcmUgam95CiAgICBUaGFuIHRob3Ugd2VudCdzdCBmb3J0aCBpbiBsYW1lbnRhdGlvbi4KICAgIEdvIGJlZm9yZSwgbnVyc2U6IGNvbW1lbmQgbWUgdG8gdGh5IGxhZHk7CiAgICBBbmQgYmlkIGhlciBoYXN0ZW4gYWxsIHRoZSBob3VzZSB0byBiZWQsCiAgICBXaGljaCBoZWF2eSBzb3Jyb3cgbWFrZXMgdGhlbSBhcHQgdW50bzoKICAgIFJvbWVvIGlzIGNvbWluZy4KCk51cnNlCgogICAgTyBMb3JkLCBJIGNvdWxkIGhhdmUgc3RheSdkIGhlcmUgYWxsIHRoZSBuaWdodAogICAgVG8gaGVhciBnb29kIGNvdW5zZWw6IE8sIHdoYXQgbGVhcm5pbmcgaXMhCiAgICBNeSBsb3JkLCBJJ2xsIHRlbGwgbXkgbGFkeSB5b3Ugd2lsbCBjb21lLgoKUk9NRU8KCiAgICBEbyBzbywgYW5kIGJpZCBteSBzd2VldCBwcmVwYXJlIHRvIGNoaWRlLgoKTnVyc2UKCiAgICBIZXJlLCBzaXIsIGEgcmluZyBzaGUgYmlkIG1lIGdpdmUgeW91LCBzaXI6CiAgICBIaWUgeW91LCBtYWtlIGhhc3RlLCBmb3IgaXQgZ3Jvd3MgdmVyeSBsYXRlLgoKICAgIEV4aXQKClJPTUVPCgogICAgSG93IHdlbGwgbXkgY29tZm9ydCBpcyByZXZpdmVkIGJ5IHRoaXMhCgpGUklBUiBMQVVSRU5DRQoKICAgIEdvIGhlbmNlOyBnb29kIG5pZ2h0OyBhbmQgaGVyZSBzdGFuZHMgYWxsIHlvdXIgc3RhdGU6CiAgICBFaXRoZXIgYmUgZ29uZSBiZWZvcmUgdGhlIHdhdGNoIGJlIHNldCwKICAgIE9yIGJ5IHRoZSBicmVhayBvZiBkYXkgZGlzZ3Vpc2VkIGZyb20gaGVuY2U6CiAgICBTb2pvdXJuIGluIE1hbnR1YTsgSSdsbCBmaW5kIG91dCB5b3VyIG1hbiwKICAgIEFuZCBoZSBzaGFsbCBzaWduaWZ5IGZyb20gdGltZSB0byB0aW1lCiAgICBFdmVyeSBnb29kIGhhcCB0byB5b3UgdGhhdCBjaGFuY2VzIGhlcmU6CiAgICBHaXZlIG1lIHRoeSBoYW5kOyAndGlzIGxhdGU6IGZhcmV3ZWxsOyBnb29kIG5pZ2h0LgoKUk9NRU8KCiAgICBCdXQgdGhhdCBhIGpveSBwYXN0IGpveSBjYWxscyBvdXQgb24gbWUsCiAgICBJdCB3ZXJlIGEgZ3JpZWYsIHNvIGJyaWVmIHRvIHBhcnQgd2l0aCB0aGVlOiBGYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHJvb20gaW4gQ2FwdWxldCdzIGhvdXNlLgoKICAgIEVudGVyIENBUFVMRVQsIExBRFkgQ0FQVUxFVCwgYW5kIFBBUklTIAoKQ0FQVUxFVAoKICAgIFRoaW5ncyBoYXZlIGZhbGwnbiBvdXQsIHNpciwgc28gdW5sdWNraWx5LAogICAgVGhhdCB3ZSBoYXZlIGhhZCBubyB0aW1lIHRvIG1vdmUgb3VyIGRhdWdodGVyOgogICAgTG9vayB5b3UsIHNoZSBsb3ZlZCBoZXIga2luc21hbiBUeWJhbHQgZGVhcmx5LAogICAgQW5kIHNvIGRpZCBJOi0tV2VsbCwgd2Ugd2VyZSBib3JuIHRvIGRpZS4KICAgICdUaXMgdmVyeSBsYXRlLCBzaGUnbGwgbm90IGNvbWUgZG93biB0by1uaWdodDoKICAgIEkgcHJvbWlzZSB5b3UsIGJ1dCBmb3IgeW91ciBjb21wYW55LAogICAgSSB3b3VsZCBoYXZlIGJlZW4gYS1iZWQgYW4gaG91ciBhZ28uCgpQQVJJUwoKICAgIFRoZXNlIHRpbWVzIG9mIHdvZSBhZmZvcmQgbm8gdGltZSB0byB3b28uCiAgICBNYWRhbSwgZ29vZCBuaWdodDogY29tbWVuZCBtZSB0byB5b3VyIGRhdWdodGVyLgoKTEFEWSBDQVBVTEVUCgogICAgSSB3aWxsLCBhbmQga25vdyBoZXIgbWluZCBlYXJseSB0by1tb3Jyb3c7CiAgICBUby1uaWdodCBzaGUgaXMgbWV3J2QgdXAgdG8gaGVyIGhlYXZpbmVzcy4KCkNBUFVMRVQKCiAgICBTaXIgUGFyaXMsIEkgd2lsbCBtYWtlIGEgZGVzcGVyYXRlIHRlbmRlcgogICAgT2YgbXkgY2hpbGQncyBsb3ZlOiBJIHRoaW5rIHNoZSB3aWxsIGJlIHJ1bGVkCiAgICBJbiBhbGwgcmVzcGVjdHMgYnkgbWU7IG5heSwgbW9yZSwgSSBkb3VidCBpdCBub3QuCiAgICBXaWZlLCBnbyB5b3UgdG8gaGVyIGVyZSB5b3UgZ28gdG8gYmVkOwogICAgQWNxdWFpbnQgaGVyIGhlcmUgb2YgbXkgc29uIFBhcmlzJyBsb3ZlOwogICAgQW5kIGJpZCBoZXIsIG1hcmsgeW91IG1lLCBvbiBXZWRuZXNkYXkgbmV4dC0tCiAgICBCdXQsIHNvZnQhIHdoYXQgZGF5IGlzIHRoaXMCgpQQVJJUwoKICAgIE1vbmRheSwgbXkgbG9yZCwKCkNBUFVMRVQKCiAgICBNb25kYXkhIGhhLCBoYSEgV2VsbCwgV2VkbmVzZGF5IGlzIHRvbyBzb29uLAogICAgTycgVGh1cnNkYXkgbGV0IGl0IGJlOiBvJyBUaHVyc2RheSwgdGVsbCBoZXIsCiAgICBTaGUgc2hhbGwgYmUgbWFycmllZCB0byB0aGlzIG5vYmxlIGVhcmwuCiAgICBXaWxsIHlvdSBiZSByZWFkeT8gZG8geW91IGxpa2UgdGhpcyBoYXN0ZT8KICAgIFdlJ2xsIGtlZXAgbm8gZ3JlYXQgYWRvLC0tYSBmcmllbmQgb3IgdHdvOwogICAgRm9yLCBoYXJrIHlvdSwgVHliYWx0IGJlaW5nIHNsYWluIHNvIGxhdGUsCiAgICBJdCBtYXkgYmUgdGhvdWdodCB3ZSBoZWxkIGhpbSBjYXJlbGVzc2x5LAogICAgQmVpbmcgb3VyIGtpbnNtYW4sIGlmIHdlIHJldmVsIG11Y2g6CiAgICBUaGVyZWZvcmUgd2UnbGwgaGF2ZSBzb21lIGhhbGYgYSBkb3plbiBmcmllbmRzLAogICAgQW5kIHRoZXJlIGFuIGVuZC4gQnV0IHdoYXQgc2F5IHlvdSB0byBUaHVyc2RheT8KClBBUklTCgogICAgTXkgbG9yZCwgSSB3b3VsZCB0aGF0IFRodXJzZGF5IHdlcmUgdG8tbW9ycm93LgoKQ0FQVUxFVAoKICAgIFdlbGwgZ2V0IHlvdSBnb25lOiBvJyBUaHVyc2RheSBiZSBpdCwgdGhlbi4KICAgIEdvIHlvdSB0byBKdWxpZXQgZXJlIHlvdSBnbyB0byBiZWQsCiAgICBQcmVwYXJlIGhlciwgd2lmZSwgYWdhaW5zdCB0aGlzIHdlZGRpbmctZGF5LgogICAgRmFyZXdlbGwsIG15IGxvcmQuIExpZ2h0IHRvIG15IGNoYW1iZXIsIGhvIQogICAgQWZvcmUgbWUhIGl0IGlzIHNvIHZlcnkgdmVyeSBsYXRlLAogICAgVGhhdCB3ZSBtYXkgY2FsbCBpdCBlYXJseSBieSBhbmQgYnkuCiAgICBHb29kIG5pZ2h0LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gYW5kIEpVTElFVCBhYm92ZSwgYXQgdGhlIHdpbmRvdyAKCkpVTElFVAoKICAgIFdpbHQgdGhvdSBiZSBnb25lPyBpdCBpcyBub3QgeWV0IG5lYXIgZGF5OgogICAgSXQgd2FzIHRoZSBuaWdodGluZ2FsZSwgYW5kIG5vdCB0aGUgbGFyaywKICAgIFRoYXQgcGllcmNlZCB0aGUgZmVhcmZ1bCBob2xsb3cgb2YgdGhpbmUgZWFyOwogICAgTmlnaHRseSBzaGUgc2luZ3Mgb24geW9uIHBvbWVncmFuYXRlLXRyZWU6CiAgICBCZWxpZXZlIG1lLCBsb3ZlLCBpdCB3YXMgdGhlIG5pZ2h0aW5nYWxlLgoKUk9NRU8KCiAgICBJdCB3YXMgdGhlIGxhcmssIHRoZSBoZXJhbGQgb2YgdGhlIG1vcm4sCiAgICBObyBuaWdodGluZ2FsZTogbG9vaywgbG92ZSwgd2hhdCBlbnZpb3VzIHN0cmVha3MKICAgIERvIGxhY2UgdGhlIHNldmVyaW5nIGNsb3VkcyBpbiB5b25kZXIgZWFzdDoKICAgIE5pZ2h0J3MgY2FuZGxlcyBhcmUgYnVybnQgb3V0LCBhbmQgam9jdW5kIGRheQogICAgU3RhbmRzIHRpcHRvZSBvbiB0aGUgbWlzdHkgbW91bnRhaW4gdG9wcy4KICAgIEkgbXVzdCBiZSBnb25lIGFuZCBsaXZlLCBvciBzdGF5IGFuZCBkaWUuCgpKVUxJRVQKCiAgICBZb24gbGlnaHQgaXMgbm90IGRheS1saWdodCwgSSBrbm93IGl0LCBJOgogICAgSXQgaXMgc29tZSBtZXRlb3IgdGhhdCB0aGUgc3VuIGV4aGFsZXMsCiAgICBUbyBiZSB0byB0aGVlIHRoaXMgbmlnaHQgYSB0b3JjaC1iZWFyZXIsCiAgICBBbmQgbGlnaHQgdGhlZSBvbiB0aHkgd2F5IHRvIE1hbnR1YToKICAgIFRoZXJlZm9yZSBzdGF5IHlldDsgdGhvdSBuZWVkJ3N0IG5vdCB0byBiZSBnb25lLgoKUk9NRU8KCiAgICBMZXQgbWUgYmUgdGEnZW4sIGxldCBtZSBiZSBwdXQgdG8gZGVhdGg7CiAgICBJIGFtIGNvbnRlbnQsIHNvIHRob3Ugd2lsdCBoYXZlIGl0IHNvLgogICAgSSdsbCBzYXkgeW9uIGdyZXkgaXMgbm90IHRoZSBtb3JuaW5nJ3MgZXllLAogICAgJ1RpcyBidXQgdGhlIHBhbGUgcmVmbGV4IG9mIEN5bnRoaWEncyBicm93OwogICAgTm9yIHRoYXQgaXMgbm90IHRoZSBsYXJrLCB3aG9zZSBub3RlcyBkbyBiZWF0CiAgICBUaGUgdmF1bHR5IGhlYXZlbiBzbyBoaWdoIGFib3ZlIG91ciBoZWFkczoKICAgIEkgaGF2ZSBtb3JlIGNhcmUgdG8gc3RheSB0aGFuIHdpbGwgdG8gZ286CiAgICBDb21lLCBkZWF0aCwgYW5kIHdlbGNvbWUhIEp1bGlldCB3aWxscyBpdCBzby4KICAgIEhvdyBpcyd0LCBteSBzb3VsPyBsZXQncyB0YWxrOyBpdCBpcyBub3QgZGF5LgoKSlVMSUVUCgogICAgSXQgaXMsIGl0IGlzOiBoaWUgaGVuY2UsIGJlIGdvbmUsIGF3YXkhCiAgICBJdCBpcyB0aGUgbGFyayB0aGF0IHNpbmdzIHNvIG91dCBvZiB0dW5lLAogICAgU3RyYWluaW5nIGhhcnNoIGRpc2NvcmRzIGFuZCB1bnBsZWFzaW5nIHNoYXJwcy4KICAgIFNvbWUgc2F5IHRoZSBsYXJrIG1ha2VzIHN3ZWV0IGRpdmlzaW9uOwogICAgVGhpcyBkb3RoIG5vdCBzbywgZm9yIHNoZSBkaXZpZGV0aCB1czoKICAgIFNvbWUgc2F5IHRoZSBsYXJrIGFuZCBsb2F0aGVkIHRvYWQgY2hhbmdlIGV5ZXMsCiAgICBPLCBub3cgSSB3b3VsZCB0aGV5IGhhZCBjaGFuZ2VkIHZvaWNlcyB0b28hCiAgICBTaW5jZSBhcm0gZnJvbSBhcm0gdGhhdCB2b2ljZSBkb3RoIHVzIGFmZnJheSwKICAgIEh1bnRpbmcgdGhlZSBoZW5jZSB3aXRoIGh1bnQnc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cmUgd2VlcGluZyBmb3IgeW91ciBjb3VzaW4ncyBkZWF0aD8KICAgIFdoYXQsIHdpbHQgdGhvdSB3YXNoIGhpbSBmcm9tIGhpcyBncmF2ZSB3aXRoIHRlYXJzPwogICAgQW4gaWYgdGhvdSBjb3VsZHN0LCB0aG91IGNvdWxkc3Qgbm90IG1ha2UgaGltIGxpdmU7CiAgICBUaGVyZWZvcmUsIGhhdmUgZG9uZTogc29tZSBncmllZiBzaG93cyBtdWNoIG9mIGxvdmU7CiAgICBCdXQgbXVjaCBvZiBncmllZiBzaG93cyBzdGlsbCBzb21lIHdhbnQgb2Ygd2l0LgoKSlVMSUVUCgogICAgWWV0IGxldCBtZSB3ZWVwIGZvciBzdWNoIGEgZmVlbGluZyBsb3NzLgoKTEFEWSBDQVBVTEVUCgogICAgU28gc2hhbGwgeW91IGZlZWwgdGhlIGxvc3MsIGJ1dCBub3QgdGhlIGZyaWVuZAogICAgV2hpY2ggeW91IHdlZXAgZm9yLgoKSlVMSUVUCgogICAgRmVlbGluZyBzbyB0aGUgbG9zcywKICAgIENhbm5vdCBjaG9vc2UgYnV0IGV2ZXIgd2VlcCB0aGUgZnJpZW5kLgoKTEFEWSBDQVBVTEVUCgogICAgV2VsbCwgZ2lybCwgdGhvdSB3ZWVwJ3N0IG5vdCBzbyBtdWNoIGZvciBoaXMgZGVhdGgsCiAgICBBcyB0aGF0IHRoZSB2aWxsYWluIGxpdmVzIHdoaWNoIHNsYXVnaHRlcidkIGhpbS4KCkpVTElFVAoKICAgIFdoYXQgdmlsbGFpbiBtYWRhbT8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoYXQgc2FtZSB2aWxsYWluLCBSb21lby4KCkpVTElFVAoKICAgIFtBc2lkZV0gVmlsbGFpbiBhbmQgaGUgYmUgbWFueSBtaWxlcyBhc3VuZGVyLi0tCiAgICBHb2QgUGFyZG9uIGhpbSEgSSBkbywgd2l0aCBhbGwgbXkgaGVhcnQ7CiAgICBBbmQgeWV0IG5vIG1hbiBsaWtlIGhlIGRvdGggZ3JpZXZlIG15IGhlYXJ0LgoKTEFEWSBDQVBVTEVUCgogICAgVGhhdCBpcywgYmVjYXVzZSB0aGUgdHJhaXRvciBtdXJkZXJlciBsaXZlcy4KCkpVTElFVAoKICAgIEF5LCBtYWRhbSwgZnJvbSB0aGUgcmVhY2ggb2YgdGhlc2UgbXkgaGFuZHM6CiAgICBXb3VsZCBub25lIGJ1dCBJIG1pZ2h0IHZlbmdlIG15IGNvdXNpbidzIGRlYXRoIQoKTEFEWSBDQVBVTEVUCgogICAgV2Ugd2lsbCBoYXZlIHZlbmdlYW5jZSBmb3IgaXQsIGZlYXIgdGhvdSBub3Q6CiAgICBUaGVuIHdlZXAgbm8gbW9yZS4gSSdsbCBzZW5kIHRvIG9uZSBpbiBNYW50dWEsCiAgICBXaGVyZSB0aGF0IHNhbWUgYmFuaXNoJ2QgcnVuYWdhdGUgZG90aCBsaXZlLAogICAgU2hhbGwgZ2l2ZSBoaW0gc3VjaCBhbiB1bmFjY3VzdG9tJ2QgZHJhbSwKICAgIFRoYXQgaGUgc2hhbGwgc29vbiBrZWVwIFR5YmFsdCBjb21wYW55OgogICAgQW5kIHRoZW4sIEkgaG9wZSwgdGhvdSB3aWx0IGJlIHNhdGlzZmllZC4KCkpVTElFVAoKICAgIEluZGVlZCwgSSBuZXZlciBzaGFsbCBiZSBzYXRpc2ZpZWQKICAgIFdpdGggUm9tZW8sIHRpbGwgSSBiZWhvbGQgaGltLS1kZWFkLS0KICAgIElzIG15IHBvb3IgaGVhcnQgZm9yIGEga2luc21hbiB2ZXgnZC4KICAgIE1hZGFtLCBpZiB5b3UgY291bGQgZmluZCBvdXQgYnV0IGEgbWFuCiAgICBUbyBiZWFyIGEgcG9pc29uLCBJIHdvdWxkIHRlbXBlciBpdDsKICAgIFRoYXQgUm9tZW8gc2hvdWxkLCB1cG9uIHJlY2VpcHQgdGhlcmVvZiwKICAgIFNvb24gc2xlZXAgaW4gcXVpZXQuIE8sIGhvdyBteSBoZWFydCBhYmhvcnMKICAgIFRvIGhlYXIgaGltIG5hbWVkLCBhbmQgY2Fubm90IGNvbWUgdG8gaGltLgogICAgVG8gd3JlYWsgdGhlIGxvdmUgSSBib3JlIG15IGNvdXNpbgogICAgVXBvbiBoaXMgYm9keSB0aGF0IHNsYXVnaHRlcidkIGhpbSEKCkxBRFkgQ0FQVUxFVAoKICAgIEZpbmQgdGhvdSB0aGUgbWVhbnMsIGFuZCBJJ2xsIGZpbmQgc3VjaCBhIG1hbi4KICAgIEJ1dCBub3cgSSdsbCB0ZWxsIHRoZWUgam95ZnVsIHRpZGluZ3MsIGdpcmwuCgpKVUxJRVQKCiAgICBBbmQgam95IGNvbWVzIHdlbGwgaW4gc3VjaCBhIG5lZWR5IHRpbWU6CiAgICBXaGF0IGFyZSB0aGV5LCBJIGJlc2VlY2ggeW91ciBsYWR5c2hpcD8KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHdlbGwsIHRob3UgaGFzdCBhIGNhcmVmdWwgZmF0aGVyLCBjaGlsZDsKICAgIE9uZSB3aG8sIHRvIHB1dCB0aGVlIGZyb20gdGh5IGhlYXZpbmVzcywKICAgIEhhdGggc29ydGVkIG91dCBhIHN1ZGRlbiBkYXkgb2Ygam95LAogICAgVGhhdCB0aG91IGV4cGVjdCdzdCBub3Qgbm9yIEkgbG9vaydkIG5vdCBmb3IuCgpKVUxJRVQKCiAgICBNYWRhbSwgaW4gaGFwcHkgdGltZSwgd2hhdCBkYXkgaXMgdGhhdD8KCkxBRFkgQ0FQVUxFVAoKICAgIE1hcnJ5LCBteSBjaGlsZCwgZWFybHkgbmV4dCBUaHVyc2RheSBtb3JuLAogICAgVGhlIGdhbGxhbnQsIHlvdW5nIGFuZCBub2JsZSBnZW50bGVtYW4sCiAgICBUaGUgQ291bnR5IFBhcmlzLCBhdCBTYWludCBQZXRlcidzIENodXJjaCwKICAgIFNoYWxsIGhhcHBpbHkgbWFrZSB0aGVlIHRoZXJlIGEgam95ZnVsIGJyaWRlLgoKSlVMSUVUCgogICAgTm93LCBieSBTYWludCBQZXRlcidzIENodXJjaCBhbmQgUGV0ZXIgdG9vLAogICAgSGUgc2hhbGwgbm90IG1ha2UgbWUgdGhlcmUgYSBqb3lmdWwgYnJpZGUuCiAgICBJIHdvbmRlciBhdCB0aGlzIGhhc3RlOyB0aGF0IEkgbXVzdCB3ZWQKICAgIEVyZSBoZSwgdGhhdCBzaG91bGQgYmUgaHVzYmFuZCwgY29tZXMgdG8gd29vLgogICAgSSBwcmF5IHlvdSwgdGVsbCBteSBsb3JkIGFuZCBmYXRoZXIsIG1hZGFtLAogICAgSSB3aWxsIG5vdCBtYXJyeSB5ZXQ7IGFuZCwgd2hlbiBJIGRvLCBJIHN3ZWFyLAogICAgSXQgc2hhbGwgYmUgUm9tZW8sIHdob20geW91IGtub3cgSSBoYXRlLAogICAgUmF0aGVyIHRoYW4gUGFyaXMuIFRoZXNlIGFyZSBuZXdzIGluZGVlZCEKCkxBRFkgQ0FQVUxFVAoKICAgIEhlcmUgY29tZXMgeW91ciBmYXRoZXI7IHRlbGwgaGltIHNvIHlvdXJzZWxmLAogICAgQW5kIHNlZSBob3cgaGUgd2lsbCB0YWtlIGl0IGF0IHlvdXIgaGFuZHMuCgogICAgRW50ZXIgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBXaGVuIHRoZSBzdW4gc2V0cywgdGhlIGFpciBkb3RoIGRyaXp6bGUgZGV3OwogICAgQnV0IGZvciB0aGUgc3Vuc2V0IG9mIG15IGJyb3RoZXIncyBzb24KICAgIEl0IHJhaW5zIGRvd25yaWdodC4KICAgIEhvdyBub3chIGEgY29uZHVpdCwgZ2lybD8gd2hhdCwgc3RpbGwgaW4gdGVhcnMCiAgICBFdmVybW9yZSBzaG93ZXJpbmcIEluIG9uZSBsaXR0bGUgYm9keQogICAgVGhvdSBjb3VudGVyZmVpdCdzdCBhIGJhcmssIGEgc2VhLCBhIHdpbmQ7CiAgICBGb3Igc3RpbGwgdGh5IGV5ZXMsIHdoaWNoIEkgbWF5IGNhbGwgdGhlIHNlYSwKICAgIERvIGViYiBhbmQgZmxvdyB3aXRoIHRlYXJzOyB0aGUgYmFyayB0aHkgYm9keSBpcywKICAgIFNhaWxpbmcgaW4gdGhpcyBzYWx0IGZsb29kOyB0aGUgd2luZHMsIHRoeSBzaWdoczsKICAgIFdobywgcmFnaW5nIHdpdGggdGh5IHRlYXJzLCBhbmQgdGhleSB3aXRoIHRoZW0sCiAgICBXaXRob3V0IGEgc3VkZGVuIGNhbG0sIHdpbGwgb3ZlcnNldAogICAgVGh5IHRlbXBlc3QtdG9zc2VkIGJvZHkuIEhvdyBub3csIHdpZmUhCiAgICBIYXZlIHlvdSBkZWxpdmVyJ2QgdG8gaGVyIG91ciBkZWNyZWUCgpMQURZIENBUFVMRVQKCiAgICBBeSwgc2lyOyBidXQgc2hlIHdpbGwgbm9uZSwgc2hlIGdpdmVzIHlvdSB0aGFua3MuCiAgICBJIHdvdWxkIHRoZSBmb29sIHdlcmUgbWFycmllZCB0byBoZXIgZ3JhdmUhCgpDQVBVTEVUCgogICAgU29mdCEgdGFrZSBtZSB3aXRoIHlvdSwgdGFrZSBtZSB3aXRoIHlvdSwgd2lmZS4KICAgIEhvdyEgd2lsbCBzaGUgbm9uZT8gZG90aCBzaGUgbm90IGdpdmUgdXMgdGhhbmtzPwogICAgSXMgc2hlIG5vdCBwcm91ZD8gZG90aCBzaGUgbm90IGNvdW50IGhlciBibGVzdCwKICAgIFVud29ydGh5IGFzIHNoZSBpcywgdGhhdCB3ZSBoYXZlIHdyb3VnaHQKICAgIFNvIHdvcnRoeSBhIGdlbnRsZW1hbiB0byBiZSBoZXIgYnJpZGVncm9vbT8KCkpVTElFVAoKICAgIE5vdCBwcm91ZCwgeW91IGhhdmU7IGJ1dCB0aGFua2Z1bCwgdGhhdCB5b3UgaGF2ZToKICAgIFByb3VkIGNhbiBJIG5ldmVyIGJlIG9mIHdoYXQgSSBoYXRlOwogICAgQnV0IHRoYW5rZnVsIGV2ZW4gZm9yIGhhdGUsIHRoYXQgaXMgbWVhbnQgbG92ZS4KCkNBUFVMRVQKCiAgICBIb3cgbm93LCBob3cgbm93LCBjaG9wLWxvZ2ljISBXaGF0IGlzIHRoaXMCiAgICAnUHJvdWQsJyBhbmQgJ0kgdGhhbmsgeW91LCcgYW5kICdJIHRoYW5rIHlvdSBub3Q7JwogICAgQW5kIHlldCAnbm90IHByb3VkLCcgbWlzdHJlc3MgbWluaW9uLCB5b3UsCiAgICBUaGFuayBtZSBubyB0aGFua2luZ3MsIG5vciwgcHJvdWQgbWUgbm8gcHJvdWRzLAogICAgQnV0IGZldHRsZSB5b3VyIGZpbmUgam9pbnRzICdnYWluc3QgVGh1cnNkYXkgbmV4dCwKICAgIFRvIGdvIHdpdGggUGFyaXMgdG8gU2FpbnQgUGV0ZXIncyBDaHVyY2gsCiAgICBPciBJIHdpbGwgZHJhZyB0aGVlIG9uIGEgaHVyZGxlIHRoaXRoZXIuCiAgICBPdXQsIHlvdSBncmVlbi1zaWNrbmVzcyBjYXJyaW9uISBvdXQsIHlvdSBiYWdnYWdlIQogICAgWW91IHRhbGxvdy1mYWNlIQoKTEFEWSBDQVBVTEVUCgogICAgRmllLCBmaWUhIHdoYXQsIGFyZSB5b3UgbWFkPwoKSlVMSUVUCgogICAgR29vZCBmYXRoZXIsIEkgYmVzZWVjaCB5b3Ugb24gbXkga25lZXMsCiAgICBIZWFyIG1lIHdpdGggcGF0aWVuY2UgYnV0IHRvIHNwZWFrIGEgd29yZC4KCkNBUFVMRVQKCiAgICBIYW5nIHRoZWUsIHlvdW5nIGJhZ2dhZ2UhIGRpc29iZWRpZW50IHdyZXRjaCEKICAgIEkgdGVsbCB0aGVlIHdoYXQ6IGdldCB0aGVlIHRvIGNodXJjaCBvJyBUaHVyc2RheSwKICAgIE9yIG5ldmVyIGFmdGVyIGxvb2sgbWUgaW4gdGhlIGZhY2U6CiAgICBTcGVhayBub3QsIHJlcGx5IG5vdCwgZG8gbm90IGFuc3dlciBtZTsKICAgIE15IGZpbmdlcnMgaXRjaC4gV2lmZSwgd2Ugc2NhcmNlIHRob3VnaHQgdXMgYmxlc3QKICAgIFRoYXQgR29kIGhhZCBsZW50IHVzIGJ1dCB0aGlzIG9ubHkgY2hpbGQ7CiAgICBCdXQgbm93IEkgc2VlIHRoaXMgb25lIGlzIG9uZSB0b28gbXVjaCwKICAgIEFuZCB0aGF0IHdlIGhhdmUgYSBjdXJzZSBpbiBoYXZpbmcgaGVyOgogICAgT3V0IG9uIGhlciwgaGlsZGluZyEKCk51cnNlCgogICAgR29kIGluIGhlYXZlbiBibGVzcyBoZXIhCiAgICBZb3UgYXJlIHRvIGJsYW1lLCBteSBsb3JkLCB0byByYXRlIGhlciBzby4KCkNBUFVMRVQKCiAgICBBbmQgd2h5LCBteSBsYWR5IHdpc2RvbT8gaG9sZCB5b3VyIHRvbmd1ZSwKICAgIEdvb2QgcHJ1ZGVuY2U7IHNtYXR0ZXIgd2l0aCB5b3VyIGdvc3NpcHMsIGdvLgoKTnVyc2UKCiAgICBJIHNwZWFrIG5vIHRyZWFzb24uCgpDQVBVTEVUCgogICAgTywgR29kIHllIGdvZC1kZW4uCgpOdXJzZQoKICAgIE1heSBub3Qgb25lIHNwZWFrPwoKQ0FQVUxFVAoKICAgIFBlYWNlLCB5b3UgbXVtYmxpbmcgZm9vbCEKICAgIFV0dGVyIHlvdXIgZ3Jhdml0eSBvJ2VyIGEgZ29zc2lwJ3MgYm93bDsKICAgIEZvciBoZXJlIHdlIG5lZWQgaXQgbm90LgoKTEFEWSBDQVBVTEVUCgogICAgWW91IGFyZSB0b28gaG90LgoKQ0FQVUxFVAoKICAgIEdvZCdzIGJyZWFkISBpdCBtYWtlcyBtZSBtYWQ6CiAgICBEYXksIG5pZ2h0LCBob3VyLCB0aWRlLCB0aW1lLCB3b3JrLCBwbGF5LAogICAgQWxvbmUsIGluIGNvbXBhbnksIHN0aWxsIG15IGNhcmUgaGF0aCBiZWVuCiAgICBUbyBoYXZlIGhlciBtYXRjaCdkOiBhbmQgaGF2aW5nIG5vdyBwcm92aWRlZAogICAgQSBnZW50bGVtYW4gb2Ygbm9ibGUgcGFyZW50YWdlLAogICAgT2YgZmFpciBkZW1lc25lcywgeW91dGhmdWwsIGFuZCBub2JseSB0cmFpbidkLAogICAgU3R1ZmYnZCwgYXMgdGhleSBzYXksIHdpdGggaG9ub3VyYWJsZSBwYXJ0cywKICAgIFByb3BvcnRpb24nZCBhcyBvbmUncyB0aG91Z2h0IHdvdWxkIHdpc2ggYSBtYW47CiAgICBBbmQgdGhlbiB0byBoYXZlIGEgd3JldGNoZWQgcHVsaW5nIGZvb2wsCiAgICBBIHdoaW5pbmcgbWFtbWV0LCBpbiBoZXIgZm9ydHVuZSdzIHRlbmRlciwKICAgIFRvIGFuc3dlciAnSSdsbCBub3Qgd2VkOyBJIGNhbm5vdCBsb3ZlLAogICAgSSBhbSB0b28geW91bmc7IEkgcHJheSB5b3UsIHBhcmRvbiBtZS4nCiAgICBCdXQsIGFzIHlvdSB3aWxsIG5vdCB3ZWQsIEknbGwgcGFyZG9uIHlvdToKICAgIEdyYXplIHdoZXJlIHlvdSB3aWxsIHlvdSBzaGFsbCBub3QgaG91c2Ugd2l0aCBtZToKICAgIExvb2sgdG8ndCwgdGhpbmsgb24ndCwgSSBkbyBub3QgdXNlIHRvIGplc3QuCiAgICBUaHVyc2RheSBpcyBuZWFyOyBsYXkgaGFuZCBvbiBoZWFydCwgYWR2aXNlOgogICAgQW4geW91IGJlIG1pbmUsIEknbGwgZ2l2ZSB5b3UgdG8gbXkgZnJpZW5kOwogICAgQW5kIHlvdSBiZSBub3QsIGhhbmcsIGJlZywgc3RhcnZlLCBkaWUgaW4KICAgIHRoZSBzdHJlZXRzLAogICAgRm9yLCBieSBteSBzb3VsLCBJJ2xsIG5lJ2VyIGFja25vd2xlZGdlIHRoZWUsCiAgICBOb3Igd2hhdCBpcyBtaW5lIHNoYWxsIG5ldmVyIGRvIHRoZWUgZ29vZDoKICAgIFRydXN0IHRvJ3QsIGJldGhpbmsgeW91OyBJJ2xsIG5vdCBiZSBmb3Jzd29ybi4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBJcyB0aGVyZSBubyBwaXR5IHNpdHRpbmcgaW4gdGhlIGNsb3VkcywKICAgIFRoYXQgc2VlcyBpbnRvIHRoZSBib3R0b20gb2YgbXkgZ3JpZWYCiAgICBPLCBzd2VldCBteSBtb3RoZXIsIGNhc3QgbWUgbm90IGF3YXkhCiAgICBEZWxheSB0aGlzIG1hcnJpYWdlIGZvciBhIG1vbnRoLCBhIHdlZWs7CiAgICBPciwgaWYgeW91IGRvIG5vdCwgbWFrZSB0aGUgYnJpZGFsIGJlZAogICAgSW4gdGhhdCBkaW0gbW9udW1lbnQgd2hlcmUgVHliYWx0IGxpZXMuCgpMQURZIENBUFVMRVQKCiAgICBUYWxrIG5vdCB0byBtZSwgZm9yIEknbGwgbm90IHNwZWFrIGEgd29yZDoKICAgIERvIGFzIHRob3Ugd2lsdCwgZm9yIEkgaGF2ZSBkb25lIHdpdGggdGhlZS4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIEdvZCEtLU8gbnVyc2UsIGhvdyBzaGFsbCB0aGlzIGJlIHByZXZlbnRlZD8KICAgIE15IGh1c2JhbmQgaXMgb24gZWFydGgsIG15IGZhaXRoIGluIGhlYXZlbjsKICAgIEhvdyBzaGFsbCB0aGF0IGZhaXRoIHJldHVybiBhZ2FpbiB0byBlYXJ0aCwKICAgIFVubGVzcyB0aGF0IGh1c2JhbmQgc2VuZCBpdCBtZSBmcm9tIGhlYXZlbgogICAgQnkgbGVhdmluZyBlYXJ0aD8gY29tZm9ydCBtZSwgY291bnNlbCBtZS4KICAgIEFsYWNrLCBhbGFjaywgdGhhdCBoZWF2ZW4gc2hvdWxkIHByYWN0aXNlIHN0cmF0YWdlbXMKICAgIFVwb24gc28gc29mdCBhIHN1YmplY3QgYXMgbXlzZWxmIQogICAgV2hhdCBzYXknc3QgdGhvdT8gaGFzdCB0aG91IG5vdCBhIHdvcmQgb2Ygam95PwogICAgU29tZSBjb21mb3J0LCBudXJzZS4KCk51cnNlCgogICAgRmFpdGgsIGhlcmUgaXQgaXMuCiAgICBSb21lbyBpcyBiYW5pc2gnZDsgYW5kIGFsbCB0aGUgd29ybGQgdG8gbm90aGluZywKICAgIFRoYXQgaGUgZGFyZXMgbmUnZXIgY29tZSBiYWNrIHRvIGNoYWxsZW5nZSB5b3U7CiAgICBPciwgaWYgaGUgZG8sIGl0IG5lZWRzIG11c3QgYmUgYnkgc3RlYWx0aC4KICAgIFRoZW4sIHNpbmNlIHRoZSBjYXNlIHNvIHN0YW5kcyBhcyBub3cgaXQgZG90aCwKICAgIEkgdGhpbmsgaXQgYmVzdCB5b3UgbWFycmllZCB3aXRoIHRoZSBjb3VudHkuCiAgICBPLCBoZSdzIGEgbG92ZWx5IGdlbnRsZW1hbiEKICAgIFJvbWVvJ3MgYSBkaXNoY2xvdXQgdG8gaGltOiBhbiBlYWdsZSwgbWFkYW0sCiAgICBIYXRoIG5vdCBzbyBncmVlbiwgc28gcXVpY2ssIHNvIGZhaXIgYW4gZXllCiAgICBBcyBQYXJpcyBoYXRoLiBCZXNocmV3IG15IHZlcnkgaGVhcnQsCiAgICBJIHRoaW5rIHlvdSBhcmUgaGFwcHkgaW4gdGhpcyBzZWNvbmQgbWF0Y2gsCiAgICBGb3IgaXQgZXhjZWxzIHlvdXIgZmlyc3Q6IG9yIGlmIGl0IGRpZCBub3QsCiAgICBZb3VyIGZpcnN0IGlzIGRlYWQ7IG9yICd0d2VyZSBhcyBnb29kIGhlIHdlcmUsCiAgICBBcyBsaXZpbmcgaGVyZSBhbmQgeW91IG5vIHVzZSBvZiBoaW0uCgpKVUxJRVQKCiAgICBTcGVha2VzdCB0aG91IGZyb20gdGh5IGhlYXJ0PwoKTnVyc2UKCiAgICBBbmQgZnJvbSBteSBzb3VsIHRvbzsKICAgIE9yIGVsc2UgYmVzaHJldyB0aGVtIGJvdGguCgpKVUxJRVQKCiAgICBBbWVuIQoKTnVyc2UKCiAgICBXaGF0PwoKSlVMSUVUCgogICAgV2VsbCwgdGhvdSBoYXN0IGNvbWZvcnRlZCBtZSBtYXJ2ZWxsb3VzIG11Y2guCiAgICBHbyBpbjogYW5kIHRlbGwgbXkgbGFkeSBJIGFtIGdvbmUsCiAgICBIYXZpbmcgZGlzcGxlYXNlZCBteSBmYXRoZXIsIHRvIExhdXJlbmNlJyBjZWxsLAogICAgVG8gbWFrZSBjb25mZXNzaW9uIGFuZCB0byBiZSBhYnNvbHZlZC4KCk51cnNlCgogICAgTWFycnksIEkgd2lsbDsgYW5kIHRoaXMgaXMgd2lzZWx5IGRvbmUuCgogICAgRXhpdAoKSlVMSUVUCgogICAgQW5jaWVudCBkYW1uYXRpb24hIE8gbW9zdCB3aWNrZWQgZmllbmQhCiAgICBJcyBpdCBtb3JlIHNpbiB0byB3aXNoIG1lIHRodXMgZm9yc3dvcm4sCiAgICBPciB0byBkaXNwcmFpc2UgbXkgbG9yZCB3aXRoIHRoYXQgc2FtZSB0b25ndWUKICAgIFdoaWNoIHNoZSBoYXRoIHByYWlzZWQgaGltIHdpdGggYWJvdmUgY29tcGFyZQogICAgU28gbWFueSB0aG91c2FuZCB0aW1lcz8gR28sIGNvdW5zZWxsb3I7CiAgICBUaG91IGFuZCBteSBib3NvbSBoZW5jZWZvcnRoIHNoYWxsIGJlIHR3YWluLgogICAgSSdsbCB0byB0aGUgZnJpYXIsIHRvIGtub3cgaGlzIHJlbWVkeToKICAgIElmIGFsbCBlbHNlIGZhaWwsIG15c2VsZiBoYXZlIHBvd2VyIHRvIGRpZS4KCiAgICBFeGl0CgpBQ1QgSVYKU0NFTkUgSS4gRnJpYXIgTGF1cmVuY2UncyBjZWxsLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUyAKCkZSSUFSIExBVVJFTkNFCgogICAgT24gVGh1cnNkYXksIHNpcj8gdGhlIHRpbWUgaXMgdmVyeSBzaG9ydC4KClBBUklTCgogICAgTXkgZmF0aGVyIENhcHVsZXQgd2lsbCBoYXZlIGl0IHNvOwogICAgQW5kIEkgYW0gbm90aGluZyBzbG93IHRvIHNsYWNrIGhpcyBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgWW91IHNheSB5b3UgZG8gbm90IGtub3cgdGhlIGxhZHkncyBtaW5kOgogICAgVW5ldmVuIGlzIHRoZSBjb3Vyc2UsIEkgbGlrZSBpdCBub3QuCgpQQVJJUwoKICAgIEltbW9kZXJhdGVseSBzaGUgd2VlcHMgZm9yIFR5YmFsdCdzIGRlYXRoLAogICAgQW5kIHRoZXJlZm9yZSBoYXZlIEkgbGl0dGxlIHRhbGsnZCBvZiBsb3ZlOwogICAgRm9yIFZlbnVzIHNtaWxlcyBub3QgaW4gYSBob3VzZSBvZiB0ZWFycy4KICAgIE5vdywgc2lyLCBoZXIgZmF0aGVyIGNvdW50cyBpdCBkYW5nZXJvdXMKICAgIFRoYXQgc2hlIGRvdGggZ2l2ZSBoZXIgc29ycm93IHNvIG11Y2ggc3dheSwKICAgIEFuZCBpbiBoaXMgd2lzZG9tIGhhc3RlcyBvdXIgbWFycmlhZ2UsCiAgICBUbyBzdG9wIHRoZSBpbnVuZGF0aW9uIG9mIGhlciB0ZWFyczsKICAgIFdoaWNoLCB0b28gbXVjaCBtaW5kZWQgYnkgaGVyc2VsZiBhbG9uZSwKICAgIE1heSBiZSBwdXQgZnJvbSBoZXIgYnkgc29jaWV0eToKICAgIE5vdyBkbyB5b3Uga25vdyB0aGUgcmVhc29uIG9mIHRoaXMgaGFzdGUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFtBc2lkZV0gSSB3b3VsZCBJIGtuZXcgbm90IHdoeSBpdCBzaG91bGQgYmUgc2xvdydkLgogICAgTG9vaywgc2lyLCBoZXJlIGNvbWVzIHRoZSBsYWR5IHRvd2FyZHMgbXkgY2VsbC4KCiAgICBFbnRlciBKVUxJRVQKClBBUklTCgogICAgSGFwcGlseSBtZXQsIG15IGxhZHkgYW5kIG15IHdpZmUhCgpKVUxJRVQKCiAgICBUaGF0IG1heSBiZSwgc2lyLCB3aGVuIEkgbWF5IGJlIGEgd2lmZS4KClBBUklTCgogICAgVGhhdCBtYXkgYmUgbXVzdCBiZSwgbG92ZSwgb24gVGh1cnNkYXkgbmV4dC4KCkpVTElFVAoKICAgIFdoYXQgbXVzdCBiZSBzaGFsbCBiZS4KCkZSSUFSIExBVVJFTkNFCgogICAgVGhhdCdzIGEgY2VydGFpbiB0ZXh0LgoKUEFSSVMKCiAgICBDb21lIHlvdSB0byBtYWtlIGNvbmZlc3Npb24gdG8gdGhpcyBmYXRoZXICgpKVUxJRVQKCiAgICBUbyBhbnN3ZXIgdGhhdCwgSSBzaG91bGQgY29uZmVzcyB0byB5b3UuCgpQQVJJUwoKICAgIERvIG5vdCBkZW55IHRvIGhpbSB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSSB3aWxsIGNvbmZlc3MgdG8geW91IHRoYXQgSSBsb3ZlIGhpbS4KClBBUklTCgogICAgU28gd2lsbCB5ZSwgSSBhbSBzdXJlLCB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSWYgSSBkbyBzbywgaXQgd2lsbCBiZSBvZiBtb3JlIHByaWNlLAogICAgQmVpbmcgc3Bva2UgYmVoaW5kIHlvdXIgYmFjaywgdGhhbiB0byB5b3VyIGZhY2UuCgpQQVJJUwoKICAgIFBvb3Igc291bCwgdGh5IGZhY2UgaXMgbXVjaCBhYnVzZWQgd2l0aCB0ZWFycy4KCkpVTElFVAoKICAgIFRoZSB0ZWFycyBoYXZlIGdvdCBzbWFsbCB2aWN0b3J5IGJ5IHRoYXQ7CiAgICBGb3IgaXQgd2FzIGJhZCBlbm91Z2ggYmVmb3JlIHRoZWlyIHNwaXRlLgoKUEFSSVMKCiAgICBUaG91IHdyb25nJ3N0IGl0LCBtb3JlIHRoYW4gdGVhcnMsIHdpdGggdGhhdCByZXBvcnQuCgpKVUxJRVQKCiAgICBUaGF0IGlzIG5vIHNsYW5kZXIsIHNpciwgd2hpY2ggaXMgYSB0cnV0aDsKICAgIEFuZCB3aGF0IEkgc3Bha2UsIEkgc3Bha2UgaXQgdG8gbXkgZmFjZS4KClBBUklTCgogICAgVGh5IGZhY2UgaXMgbWluZSwgYW5kIHRob3UgaGFzdCBzbGFuZGVyJ2QgaXQuCgpKVUxJRVQKCiAgICBJdCBtYXkgYmUgc28sIGZvciBpdCBpcyBub3QgbWluZSBvd24uCiAgICBBcmUgeW91IGF0IGxlaXN1cmUsIGhvbHkgZmF0aGVyLCBub3c7CiAgICBPciBzaGFsbCBJIGNvbWUgdG8geW91IGF0IGV2ZW5pbmcgbWFzcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTXkgbGVpc3VyZSBzZXJ2ZXMgbWUsIHBlbnNpdmUgZGF1Z2h0ZXIsIG5vdy4KICAgIE15IGxvcmQsIHdlIG11c3QgZW50cmVhdCB0aGUgdGltZSBhbG9uZS4KClBBUklTCgogICAgR29kIHNoaWVsZCBJIHNob3VsZCBkaXN0dXJiIGRldm90aW9uIQogICAgSnVsaWV0LCBvbiBUaHVyc2RheSBlYXJseSB3aWxsIEkgcm91c2UgeWU6CiAgICBUaWxsIHRoZW4sIGFkaWV1OyBhbmQga2VlcCB0aGlzIGhvbHkga2lzcy4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIHNodXQgdGhlIGRvb3IhIGFuZCB3aGVuIHRob3UgaGFzdCBkb25lIHNvLAogICAgQ29tZSB3ZWVwIHdpdGggbWU7IHBhc3QgaG9wZSwgcGFzdCBjdXJlLCBwYXN0IGhlbHAhCgpGUklBUiBMQVVSRU5DRQoKICAgIEFoLCBKdWxpZXQsIEkgYWxyZWFkeSBrbm93IHRoeSBncmllZjsKICAgIEl0IHN0cmFpbnMgbWUgcGFzdCB0aGUgY29tcGFzcyBvZiBteSB3aXRzOgogICAgSSBoZWFyIHRob3UgbXVzdCwgYW5kIG5vdGhpbmcgbWF5IHByb3JvZ3VlIGl0LAogICAgT24gVGh1cnNkYXkgbmV4dCBiZSBtYXJyaWVkIHRvIHRoaXMgY291bnR5LgoKSlVMSUVUCgogICAgVGVsbCBtZSBub3QsIGZyaWFyLCB0aGF0IHRob3UgaGVhcidzdCBvZiB0aGlzLAogICAgVW5sZXNzIHRob3UgdGVsbCBtZSBob3cgSSBtYXkgcHJldmVudCBpdDoKICAgIElmLCBpbiB0aHkgd2lzZG9tLCB0aG91IGNhbnN0IGdpdmUgbm8gaGVscCwKICAgIERvIHRob3UgYnV0IGNhbGwgbXkgcmVzb2x1dGlvbiB3aXNlLAogICAgQW5kIHdpdGggdGhpcyBrbmlmZSBJJ2xsIGhlbHAgaXQgcHJlc2VudGx5LgogICAgR29kIGpvaW4nZCBteSBoZWFydCBhbmQgUm9tZW8ncywgdGhvdSBvdXIgaGFuZHM7CiAgICBBbmQgZXJlIHRoaXMgaGFuZCwgYnkgdGhlZSB0byBSb21lbyBzZWFsJ2QsCiAgICBTaGFsbCBiZSB0aGUgbGFiZWwgdG8gYW5vdGhlciBkZWVkLAogICAgT3IgbXkgdHJ1ZSBoZWFydCB3aXRoIHRyZWFjaGVyb3VzIHJldm9sdAogICAgVHVybiB0byBhbm90aGVyLCB0aGlzIHNoYWxsIHNsYXkgdGhlbSBib3RoOgogICAgVGhlcmVmb3JlLCBvdXQgb2YgdGh5IGxvbmctZXhwZXJpZW5jZWQgdGltZSwKICAgIEdpdmUgbWUgc29tZSBwcmVzZW50IGNvdW5zZWwsIG9yLCBiZWhvbGQsCiAgICAnVHdpeHQgbXkgZXh0cmVtZXMgYW5kIG1lIHRoaXMgYmxvb2R5IGtuaWZlCiAgICBTaGFsbCBwbGF5IHRoZSB1bXBpcmUsIGFyYml0cmF0aW5nIHRoYXQKICAgIFdoaWNoIHRoZSBjb21taXNzaW9uIG9mIHRoeSB5ZWFycyBhbmQgYXJ0CiAgICBDb3VsZCB0byBubyBpc3N1ZSBvZiB0cnVlIGhvbm91ciBicmluZy4KICAgIEJlIG5vdCBzbyBsb25nIHRvIHNwZWFrOyBJIGxvbmcgdG8gZGllLAogICAgSWYgd2hhdCB0aG91IHNwZWFrJ3N0IHNwZWFrIG5vdCBvZiByZW1lZHkuCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvbGQsIGRhdWdodGVyOiBJIGRvIHNweSBhIGtpbmQgb2YgaG9wZSwKICAgIFdoaWNoIGNyYXZlcyBhcyBkZXNwZXJhdGUgYW4gZXhlY3V0aW9uLgogICAgQXMgdGhhdCBpcyBkZXNwZXJhdGUgd2hpY2ggd2Ugd291bGQgcHJldmVudC4KICAgIElmLCByYXRoZXIgdGhhbiB0byBtYXJyeSBDb3VudHkgUGFyaXMsCiAgICBUaG91IGhhc3QgdGhlIHN0cmVuZ3RoIG9mIHdpbGwgdG8gc2xheSB0aHlzZWxmLAogICAgVGhlbiBpcyBpdCBsaWtlbHkgdGhvdSB3aWx0IHVuZGVydGFrZQogICAgQSB0aGluZyBsaWtlIGRlYXRoIHRvIGNoaWRlIGF3YXkgdGhpcyBzaGFtZSwKICAgIFRoYXQgY29wZXN0IHdpdGggZGVhdGggaGltc2VsZiB0byBzY2FwZSBmcm9tIGl0OgogICAgQW5kLCBpZiB0aG91IGRhcmVzdCwgSSdsbCBnaXZlIHRoZWUgcmVtZWR5LgoKSlVMSUVUCgogICAgTywgYmlkIG1lIGxlYXAsIHJhdGhlciB0aGFuIG1hcnJ5IFBhcmlzLAogICAgRnJvbSBvZmYgdGhlIGJhdHRsZW1lbnRzIG9mIHlvbmRlciB0b3dlcjsKICAgIE9yIHdhbGsgaW4gdGhpZXZpc2ggd2F5czsgb3IgYmlkIG1lIGx1cmsKICAgIFdoZXJlIHNlcnBlbnRzIGFyZTsgY2hhaW4gbWUgd2l0aCByb2FyaW5nIGJlYXJzOwogICAgT3Igc2h1dCBtZSBuaWdodGx5IGluIGEgY2hhcm5lbC1ob3VzZSwKICAgIE8nZXItY292ZXInZCBxdWl0ZSB3aXRoIGRlYWQgbWVuJ3MgcmF0dGxpbmcgYm9uZXMsCiAgICBXaXRoIHJlZWt5IHNoYW5rcyBhbmQgeWVsbG93IGNoYXBsZXNzIHNrdWxsczsKICAgIE9yIGJpZCBtZSBnbyBpbnRvIGEgbmV3LW1hZGUgZ3JhdmUKICAgIEFuZCBoaWRlIG1lIHdpdGggYSBkZWFkIG1hbiBpbiBoaXMgc2hyb3VkOwogICAgVGhpbmdzIHRoYXQsIHRvIGhlYXIgdGhlbSB0b2xkLCBoYXZlIG1hZGUgbWUgdHJlbWJsZTsKICAgIEFuZCBJIHdpbGwgZG8gaXQgd2l0aG91dCBmZWFyIG9yIGRvdWJ0LAogICAgVG8gbGl2ZSBhbiB1bnN0YWluJ2Qgd2lmZSB0byBteSBzd2VldCBsb3ZlLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIb2xkLCB0aGVuOyBnbyBob21lLCBiZSBtZXJyeSwgZ2l2ZSBjb25zZW50CiAgICBUbyBtYXJyeSBQYXJpczogV2VkbmVzZGF5IGlzIHRvLW1vcnJvdzoKICAgIFRvLW1vcnJvdyBuaWdodCBsb29rIHRoYXQgdGhvdSBsaWUgYWxvbmU7CiAgICBMZXQgbm90IHRoeSBudXJzZSBsaWUgd2l0aCB0aGVlIGluIHRoeSBjaGFtYmVyOgogICAgVGFrZSB0aG91IHRoaXMgdmlhbCwgYmVpbmcgdGhlbiBpbiBiZWQsCiAgICBBbmQgdGhpcyBkaXN0aWxsZWQgbGlxdW9yIGRyaW5rIHRob3Ugb2ZmOwogICAgV2hlbiBwcmVzZW50bHkgdGhyb3VnaCBhbGwgdGh5IHZlaW5zIHNoYWxsIHJ1bgogICAgQSBjb2xkIGFuZCBkcm93c3kgaHVtb3VyLCBmb3Igbm8gcHVsc2UKICAgIFNoYWxsIGtlZXAgaGlzIG5hdGl2ZSBwcm9ncmVzcywgYnV0IHN1cmNlYXNlOgogICAgTm8gd2FybXRoLCBubyBicmVhdGgsIHNoYWxsIHRlc3RpZnkgdGhvdSBsaXZlc3Q7CiAgICBUaGUgcm9zZXMgaW4gdGh5IGxpcHMgYW5kIGNoZWVrcyBzaGFsbCBmYWRlCiAgICBUbyBwYWx5IGFzaGVzLCB0aHkgZXllcycgd2luZG93cyBmYWxsLAogICAgTGlrZSBkZWF0aCwgd2hlbiBoZSBzaHV0cyB1cCB0aGUgZGF5IG9mIGxpZmU7CiAgICBFYWNoIHBhcnQsIGRlcHJpdmVkIG9mIHN1cHBsZSBnb3Zlcm5tZW50LAogICAgU2hhbGwsIHN0aWZmIGFuZCBzdGFyayBhbmQgY29sZCwgYXBwZWFyIGxpa2UgZGVhdGg6CiAgICBBbmQgaW4gdGhpcyBib3Jyb3cnZCBsaWtlbmVzcyBvZiBzaHJ1bmsgZGVhdGgKICAgIFRob3Ugc2hhbHQgY29udGludWUgdHdvIGFuZCBmb3J0eSBob3VycywKICAgIEFuZCB0aGVuIGF3YWtlIGFzIGZyb20gYSBwbGVhc2FudCBzbGVlcC4KICAgIE5vdywgd2hlbiB0aGUgYnJpZGVncm9vbSBpbiB0aGUgbW9ybmluZyBjb21lcwogICAgVG8gcm91c2UgdGhlZSBmcm9tIHRoeSBiZWQsIHRoZXJlIGFydCB0aG91IGRlYWQ6CiAgICBUaGVuLCBhcyB0aGUgbWFubmVyIG9mIG91ciBjb3VudHJ5IGlzLAogICAgSW4gdGh5IGJlc3Qgcm9iZXMgdW5jb3ZlcidkIG9uIHRoZSBiaWVyCiAgICBUaG91IHNoYWx0IGJlIGJvcm5lIHRvIHRoYXQgc2FtZSBhbmNpZW50IHZhdWx0CiAgICBXaGVyZSBhbGwgdGhlIGtpbmRyZWQgb2YgdGhlIENhcHVsZXRzIGxpZS4KICAgIEluIHRoZSBtZWFuIHRpbWUsIGFnYWluc3QgdGhvdSBzaGFsdCBhd2FrZSwKICAgIFNoYWxsIFJvbWVvIGJ5IG15IGxldHRlcnMga25vdyBvdXIgZHJpZnQsCiAgICBBbmQgaGl0aGVyIHNoYWxsIGhlIGNvbWU6IGFuZCBoZSBhbmQgSQogICAgV2lsbCB3YXRjaCB0aHkgd2FraW5nLCBhbmQgdGhhdCB2ZXJ5IG5pZ2h0CiAgICBTaGFsbCBSb21lbyBiZWFyIHRoZWUgaGVuY2UgdG8gTWFudHVhLgogICAgQW5kIHRoaXMgc2hhbGwgZnJlZSB0aGVlIGZyb20gdGhpcyBwcmVzZW50IHNoYW1lOwogICAgSWYgbm8gaW5jb25zdGFudCB0b3ksIG5vciB3b21hbmlzaCBmZWFyLAogICAgQWJhdGUgdGh5IHZhbG91ciBpbiB0aGUgYWN0aW5nIGl0LgoKSlVMSUVUCgogICAgR2l2ZSBtZSwgZ2l2ZSBtZSEgTywgdGVsbCBub3QgbWUgb2YgZmVhciEKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZDsgZ2V0IHlvdSBnb25lLCBiZSBzdHJvbmcgYW5kIHByb3NwZXJvdXMKICAgIEluIHRoaXMgcmVzb2x2ZTogSSdsbCBzZW5kIGEgZnJpYXIgd2l0aCBzcGVlZAogICAgVG8gTWFudHVhLCB3aXRoIG15IGxldHRlcnMgdG8gdGh5IGxvcmQuCgpKVUxJRVQKCiAgICBMb3ZlIGdpdmUgbWUgc3RyZW5ndGghIGFuZCBzdHJlbmd0aCBzaGFsbCBoZWxwIGFmZm9yZC4KICAgIEZhcmV3ZWxsLCBkZWFyIGZhdGhlciEKCiAgICBFeGV1bnQKClNDRU5FIElJLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIE51cnNlLCBhbmQgdHdvIFNlcnZpbmdtZW4gCgpDQVBVTEVUCgogICAgU28gbWFueSBndWVzdHMgaW52aXRlIGFzIGhlcmUgYXJlIHdyaXQuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGdvIGhpcmUgbWUgdHdlbnR5IGN1bm5pbmcgY29va3MuCgpTZWNvbmQgU2VydmFudAoKICAgIFlvdSBzaGFsbCBoYXZlIG5vbmUgaWxsLCBzaXI7IGZvciBJJ2xsIHRyeSBpZiB0aGV5CiAgICBjYW4gbGljayB0aGVpciBmaW5nZXJzLgoKQ0FQVUxFVAoKICAgIEhvdyBjYW5zdCB0aG91IHRyeSB0aGVtIHNvPwoKU2Vjb25kIFNlcnZhbnQKCiAgICBNYXJyeSwgc2lyLCAndGlzIGFuIGlsbCBjb29rIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBvd24gZmluZ2VyczogdGhlcmVmb3JlIGhlIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBmaW5nZXJzIGdvZXMgbm90IHdpdGggbWUuCgpDQVBVTEVUCgogICAgR28sIGJlIGdvbmUuCgogICAgRXhpdCBTZWNvbmQgU2VydmFudAogICAgV2Ugc2hhbGwgYmUgbXVjaCB1bmZ1cm5pc2hlZCBmb3IgdGhpcyB0aW1lLgogICAgV2hhdCwgaXMgbXkgZGF1Z2h0ZXIgZ29uZSB0byBGcmlhciBMYXVyZW5jZT8KCk51cnNlCgogICAgQXksIGZvcnNvb3RoLgoKQ0FQVUxFVAoKICAgIFdlbGwsIGhlIG1heSBjaGFuY2UgdG8gZG8gc29tZSBnb29kIG9uIGhlcjoKICAgIEEgcGVldmlzaCBzZWxmLXdpbGwnZCBoYXJsb3RyeSBpdCBpcy4KCk51cnNlCgogICAgU2VlIHdoZXJlIHNoZSBjb21lcyBmcm9tIHNocmlmdCB3aXRoIG1lcnJ5IGxvb2suCgogICAgRW50ZXIgSlVMSUVUCgpDQVBVTEVUCgogICAgSG93IG5vdywgbXkgaGVhZHN0cm9uZyEgd2hlcmUgaGF2ZSB5b3UgYmVlbiBnYWRkaW5nPwoKSlVMSUVUCgogICAgV2hlcmUgSSBoYXZlIGxlYXJuJ2QgbWUgdG8gcmVwZW50IHRoZSBzaW4KICAgIE9mIGRpc29iZWRpZW50IG9wcG9zaXRpb24KICAgIFRvIHlvdSBhbmQgeW91ciBiZWhlc3RzLCBhbmQgYW0gZW5qb2luJ2QKICAgIEJ5IGhvbHkgTGF1cmVuY2UgdG8gZmFsbCBwcm9zdHJhdGUgaGVyZSwKICAgIEFuZCBiZWcgeW91ciBwYXJkb246IHBhcmRvbiwgSSBiZXNlZWNoIHlvdSEKICAgIEhlbmNlZm9yd2FyZCBJIGFtIGV2ZXIgcnVsZWQgYnkgeW91LgoKQ0FQVUxFVAoKICAgIFNlbmQgZm9yIHRoZSBjb3VudHk7IGdvIHRlbGwgaGltIG9mIHRoaXM6CiAgICBJJ2xsIGhhdmUgdGhpcyBrbm90IGtuaXQgdXAgdG8tbW9ycm93IG1vcm5pbmcuCgpKVUxJRVQKCiAgICBJIG1ldCB0aGUgeW91dGhmdWwgbG9yZCBhdCBMYXVyZW5jZScgY2VsbDsKICAgIEFuZCBnYXZlIGhpbSB3aGF0IGJlY29tZWQgbG92ZSBJIG1pZ2h0LAogICAgTm90IHN0ZXAgbydlciB0aGUgYm91bmRzIG9mIG1vZGVzdHkuCgpDQVBVTEVUCgogICAgV2h5LCBJIGFtIGdsYWQgb24ndDsgdGhpcyBpcyB3ZWxsOiBzdGFuZCB1cDoKICAgIFRoaXMgaXMgYXMndCBzaG91bGQgYmUuIExldCBtZSBzZWUgdGhlIGNvdW50eTsKICAgIEF5LCBtYXJyeSwgZ28sIEkgc2F5LCBhbmQgZmV0Y2ggaGltIGhpdGhlci4KICAgIE5vdywgYWZvcmUgR29kISB0aGlzIHJldmVyZW5kIGhvbHkgZnJpYXIsCiAgICBPdXIgd2hvbGUgY2l0eSBpcyBtdWNoIGJvdW5kIHRvIGhpbS4KCkpVTElFVAoKICAgIE51cnNlLCB3aWxsIHlvdSBnbyB3aXRoIG1lIGludG8gbXkgY2xvc2V0LAogICAgVG8gaGVscCBtZSBzb3J0IHN1Y2ggbmVlZGZ1bCBvcm5hbWVudHMKICAgIEFzIHlvdSB0aGluayBmaXQgdG8gZnVybmlzaCBtZSB0by1tb3Jyb3cCgpMQURZIENBUFVMRVQKCiAgICBObywgbm90IHRpbGwgVGh1cnNkYXk7IHRoZXJlIGlzIHRpbWUgZW5vdWdoLgoKQ0FQVUxFVAoKICAgIEdvLCBudXJzZSwgZ28gd2l0aCBoZXI6IHdlJ2xsIHRvIGNodXJjaCB0by1tb3Jyb3cuCgogICAgRXhldW50IEpVTElFVCBhbmQgTnVyc2UKCkxBRFkgQ0FQVUxFVAoKICAgIFdlIHNoYWxsIGJlIHNob3J0IGluIG91ciBwcm92aXNpb246CiAgICAnVGlzIG5vdyBuZWFyIG5pZ2h0LgoKQ0FQVUxFVAoKICAgIFR1c2gsIEkgd2lsbCBzdGlyIGFib3V0LAogICAgQW5kIGFsbCB0aGluZ3Mgc2hhbGwgYmUgd2VsbCwgSSB3YXJyYW50IHRoZWUsIHdpZmU6CiAgICBHbyB0aG91IHRvIEp1bGlldCwgaGVscCB0byBkZWNrIHVwIGhlcjsKICAgIEknbGwgbm90IHRvIGJlZCB0by1uaWdodDsgbGV0IG1lIGFsb25lOwogICAgSSdsbCBwbGF5IHRoZSBob3VzZXdpZmUgZm9yIHRoaXMgb25jZS4gV2hhdCwgaG8hCiAgICBUaGV5IGFyZSBhbGwgZm9ydGguIFdlbGwsIEkgd2lsbCB3YWxrIG15c2VsZgogICAgVG8gQ291bnR5IFBhcmlzLCB0byBwcmVwYXJlIGhpbSB1cAogICAgQWdhaW5zdCB0by1tb3Jyb3c6IG15IGhlYXJ0IGlzIHdvbmRyb3VzIGxpZ2h0LAogICAgU2luY2UgdGhpcyBzYW1lIHdheXdhcmQgZ2lybCBpcyBzbyByZWNsYWltJ2QuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEp1bGlldCdzIGNoYW1iZXIuCgogICAgRW50ZXIgSlVMSUVUIGFuZCBOdXJzZSAKCkpVTElFVAoKICAgIEF5LCB0aG9zZSBhdHRpcmVzIGFyZSBiZXN0OiBidXQsIGdlbnRsZSBudXJzZSwKICAgIEkgcHJheSB0aGVlLCBsZWF2ZSBtZSB0byBteSBzZWxmIHRvLW5pZ2h0LAogICAgRm9yIEkgaGF2ZSBuZWVkIG9mIG1hbnkgb3Jpc29ucwogICAgVG8gbW92ZSB0aGUgaGVhdmVucyB0byBzbWlsZSB1cG9uIG15IHN0YXRlLAogICAgV2hpY2gsIHdlbGwgdGhvdSBrbm93J3N0LCBpcyBjcm9zcywgYW5kIGZ1bGwgb2Ygc2luLgoKICAgIEVudGVyIExBRFkgQ0FQVUxFVAoKTEFEWSBDQVBVTEVUCgogICAgV2hhdCwgYXJlIHlvdSBidXN5LCBobz8gbmVlZCB5b3UgbXkgaGVscD8KCkpVTElFVAoKICAgIE5vLCBtYWRhbTsgd2UgaGF2ZSBjdWxsJ2Qgc3VjaCBuZWNlc3NhcmllcwogICAgQXMgYXJlIGJlaG92ZWZ1bCBmb3Igb3VyIHN0YXRlIHRvLW1vcnJvdzoKICAgIFNvIHBsZWFzZSB5b3UsIGxldCBtZSBub3cgYmUgbGVmdCBhbG9uZSwKICAgIEFuZCBsZXQgdGhlIG51cnNlIHRoaXMgbmlnaHQgc2l0IHVwIHdpdGggeW91OwogICAgRm9yLCBJIGFtIHN1cmUsIHlvdSBoYXZlIHlvdXIgaGFuZHMgZnVsbCBhbGwsCiAgICBJbiB0aGlzIHNvIHN1ZGRlbiBidXNpbmVzcy4KCkxBRFkgQ0FQVUxFVAoKICAgIEdvb2QgbmlnaHQ6CiAgICBHZXQgdGhlZSB0byBiZWQsIGFuZCByZXN0OyBmb3IgdGhvdSBoYXN0IG5lZWQuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkpVTElFVAoKICAgIEZhcmV3ZWxsISBHb2Qga25vd3Mgd2hlbiB3ZSBzaGFsbCBtZWV0IGFnYWluLgogICAgSSBoYXZlIGEgZmFpbnQgY29sZCBmZWFyIHRocmlsbHMgdGhyb3VnaCBteSB2ZWlucywKICAgIFRoYXQgYWxtb3N0IGZyZWV6ZXMgdXAgdGhlIGhlYXQgb2YgbGlmZToKICAgIEknbGwgY2FsbCB0aGVtIGJhY2sgYWdhaW4gdG8gY29tZm9ydCBtZToKICAgIE51cnNlISBXaGF0IHNob3VsZCBzaGUgZG8gaGVyZT8KICAgIE15IGRpc21hbCBzY2VuZSBJIG5lZWRzIG11c3QgYWN0IGFsb25lLgogICAgQ29tZSwgdmlhbC4KICAgIFdoYXQgaWYgdGhpcyBtaXh0dXJlIGRvIG5vdCB3b3JrIGF0IGFsbD8KICAgIFNoYWxsIEkgYmUgbWFycmllZCB0aGVuIHRvLW1vcnJvdyBtb3JuaW5nPwogICAgTm8sIG5vOiB0aGlzIHNoYWxsIGZvcmJpZCBpdDogbGllIHRob3UgdGhlcmUuCgogICAgTGF5aW5nIGRvd24gaGVyIGRhZ2dlcgogICAgV2hhdCBpZiBpdCBiZSBhIHBvaXNvbiwgd2hpY2ggdGhlIGZyaWFyCiAgICBTdWJ0bHkgaGF0aCBtaW5pc3RlcidkIHRvIGhhdmUgbWUgZGVhZCwKICAgIExlc3QgaW4gdGhpcyBtYXJyaWFnZSBoZSBzaG91bGQgYmUgZGlzaG9ub3VyJ2QsCiAgICBCZWNhdXNlIGhlIG1hcnJpZWQgbWUgYmVmb3JlIHRvIFJvbWVvPwogICAgSSBmZWFyIGl0IGlzOiBhbmQgeWV0LCBtZXRoaW5rcywgaXQgc2hvdWxkIG5vdCwKICAgIEZvciBoZSBoYXRoIHN0aWxsIGJlZW4gdHJpZWQgYSBob2x5IG1hbi4KICAgIEhvdyBpZiwgd2hlbiBJIGFtIGxhaWQgaW50byB0aGUgdG9tYiwKICAgIEkgd2FrZSBiZWZvcmUgdGhlIHRpbWUgdGhhdCBSb21lbwogICAgQ29tZSB0byByZWRlZW0gbWUIHRoZXJlJ3MgYSBmZWFyZnVsIHBvaW50IQogICAgU2hhbGwgSSBub3QsIHRoZW4sIGJlIHN0aWZsZWQgaW4gdGhlIHZhdWx0LAogICAgVG8gd2hvc2UgZm91bCBtb3V0aCBubyBoZWFsdGhzb21lIGFpciBicmVhdGhlcyBpbiwKICAgIEFuZCB0aGVyZSBkaWUgc3RyYW5nbGVkIGVyZSBteSBSb21lbyBjb21lcz8KICAgIE9yLCBpZiBJIGxpdmUsIGlzIGl0IG5vdCB2ZXJ5IGxpa2UsCiAgICBUaGUgaG9ycmlibGUgY29uY2VpdCBvZiBkZWF0aCBhbmQgbmlnaHQsCiAgICBUb2dldGhlciB3aXRoIHRoZSB0ZXJyb3Igb2YgdGhlIHBsYWNlLC0tCiAgICBBcyBpbiBhIHZhdWx0LCBhbiBhbmNpZW50IHJlY2VwdGFjbGUsCiAgICBXaGVyZSwgZm9yIHRoZXNlIG1hbnkgaHVuZHJlZCB5ZWFycywgdGhlIGJvbmVzCiAgICBPZiBhbGwgbXkgYnVyaWVkIGFuY2VzdG9ycyBhcmUgcGFja2VkOgogICAgV2hlcmUgYmxvb2R5IFR5YmFsdCwgeWV0IGJ1dCBncmVlbiBpbiBlYXJ0aCwKICAgIExpZXMgZmVzdGVyaW5nIGluIGhpcyBzaHJvdWQ7IHdoZXJlLCBhcyB0aGV5IHNheSwKICAgIEF0IHNvbWUgaG91cnMgaW4gdGhlIG5pZ2h0IHNwaXJpdHMgcmVzb3J0Oy0tCiAgICBBbGFjaywgYWxhY2ssIGlzIGl0IG5vdCBsaWtlIHRoYXQgSSwKICAgIFNvIGVhcmx5IHdha2luZywgd2hhdCB3aXRoIGxvYXRoc29tZSBzbWVsbHMsCiAgICBBbmQgc2hyaWVrcyBsaWtlIG1hbmRyYWtlcycgdG9ybiBvdXQgb2YgdGhlIGVhcnRoLAogICAgVGhhdCBsaXZpbmcgbW9ydGFscywgaGVhcmluZyB0aGVtLCBydW4gbWFkOi0tCiAgICBPLCBpZiBJIHdha2UsIHNoYWxsIEkgbm90IGJlIGRpc3RyYXVnaHQsCiAgICBFbnZpcm9uZWQgd2l0aCBhbGwgdGhlc2UgaGlkZW91cyBmZWFycz8KICAgIEFuZCBtYWRseSBwbGF5IHdpdGggbXkgZm9yZWZhdGhlcidzIGpvaW50cz8KICAgIEFuZCBwbHVjayB0aGUgbWFuZ2xlZCBUeWJhbHQgZnJvbSBoaXMgc2hyb3VkPwogICAgQW5kLCBpbiB0aGlzIHJhZ2UsIHdpdGggc29tZSBncmVhdCBraW5zbWFuJ3MgYm9uZSwKICAgIEFzIHdpdGggYSBjbHViLCBkYXNoIG91dCBteSBkZXNwZXJhdGUgYnJhaW5zPwogICAgTywgbG9vayEgbWV0aGlua3MgSSBzZWUgbXkgY291c2luJ3MgZ2hvc3QKICAgIFNlZWtpbmcgb3V0IFJvbWVvLCB0aGF0IGRpZCBzcGl0IGhpcyBib2R5CiAgICBVcG9uIGEgcmFwaWVyJ3MgcG9pbnQ6IHN0YXksIFR5YmFsdCwgc3RheSEKICAgIFJvbWVvLCBJIGNvbWUhIHRoaXMgZG8gSSBkcmluayB0byB0aGVlLgoKICAgIFNoZSBmYWxscyB1cG9uIGhlciBiZWQsIHdpdGhpbiB0aGUgY3VydGFpbnMKClNDRU5FIElWLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgSG9sZCwgdGFrZSB0aGVzZSBrZXlzLCBhbmQgZmV0Y2ggbW9yZSBzcGljZXMsIG51cnNlLgoKTnVyc2UKCiAgICBUaGV5IGNhbGwgZm9yIGRhdGVzIGFuZCBxdWluY2VzIGluIHRoZSBwYXN0cnkuCgogICAgRW50ZXIgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIENvbWUsIHN0aXIsIHN0aXIsIHN0aXIhIHRoZSBzZWNvbmQgY29jayBoYXRoIGNyb3cnZCwKICAgIFRoZSBjdXJmZXctYmVsbCBoYXRoIHJ1bmcsICd0aXMgdGhyZWUgbydjbG9jazoKICAgIExvb2sgdG8gdGhlIGJha2VkIG1lYXRzLCBnb29kIEFuZ2VsaWNhOgogICAgU3BhcmUgbm90IGZvciB0aGUgY29zdC4KCk51cnNlCgogICAgR28sIHlvdSBjb3QtcXVlYW4sIGdvLAogICAgR2V0IHlvdSB0byBiZWQ7IGZhaXRoLCBZb3UnbGwgYmUgc2ljayB0by1tb3Jyb3cKICAgIEZvciB0aGlzIG5pZ2h0J3Mgd2F0Y2hpbmcuCgpDQVBVTEVUCgogICAgTm8sIG5vdCBhIHdoaXQ6IHdoYXQhIEkgaGF2ZSB3YXRjaCdkIGVyZSBub3cKICAgIEFsbCBuaWdodCBmb3IgbGVzc2VyIGNhdXNlLCBhbmQgbmUnZXIgYmVlbiBzaWNrLgoKTEFEWSBDQVBVTEVUCgogICAgQXksIHlvdSBoYXZlIGJlZW4gYSBtb3VzZS1odW50IGluIHlvdXIgdGltZTsKICAgIEJ1dCBJIHdpbGwgd2F0Y2ggeW91IGZyb20gc3VjaCB3YXRjaGluZyBub3cuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBBIGplYWxvdXMgaG9vZCwgYSBqZWFsb3VzIGhvb2QhCgogICAgRW50ZXIgdGhyZWUgb3IgZm91ciBTZXJ2aW5nbWVuLCB3aXRoIHNwaXRzLCBsb2dzLCBhbmQgYmFza2V0cwogICAgTm93LCBmZWxsb3csCiAgICBXaGF0J3MgdGhlcmUCgpGaXJzdCBTZXJ2YW50CgogICAgVGhpbmdzIGZvciB0aGUgY29vaywgc2lyOyBidXQgSSBrbm93IG5vdCB3aGF0LgoKQ0FQVUxFVAoKICAgIE1ha2UgaGFzdGUsIG1ha2UgaGFzdGUuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGZldGNoIGRyaWVyIGxvZ3M6CiAgICBDYWxsIFBldGVyLCBoZSB3aWxsIHNob3cgdGhlZSB3aGVyZSB0aGV5IGFyZS4KClNlY29uZCBTZXJ2YW50CgogICAgSSBoYXZlIGEgaGVhZCwgc2lyLCB0aGF0IHdpbGwgZmluZCBvdXQgbG9ncywKICAgIEFuZCBuZXZlciB0cm91YmxlIFBldGVyIGZvciB0aGUgbWF0dGVyLgoKICAgIEV4aXQKCkNBUFVMRVQKCiAgICBNYXNzLCBhbmQgd2VsbCBzYWlkOyBhIG1lcnJ5IHdob3Jlc29uLCBoYSEKICAgIFRob3Ugc2hhbHQgYmUgbG9nZ2VyLWhlYWQuIEdvb2QgZmFpdGgsICd0aXMgZGF5OgogICAgVGhlIGNvdW50eSB3aWxsIGJlIGhlcmUgd2l0aCBtdXNpYyBzdHJhaWdodCwKICAgIEZvciBzbyBoZSBzYWlkIGhlIHdvdWxkOiBJIGhlYXIgaGltIG5lYXIuCgogICAgTXVzaWMgd2l0aGluCiAgICBOdXJzZSEgV2lmZSEgV2hhdCwgaG8hIFdoYXQsIG51cnNlLCBJIHNheSEKCiAgICBSZS1lbnRlciBOdXJzZQogICAgR28gd2FrZW4gSnVsaWV0LCBnbyBhbmQgdHJpbSBoZXIgdXA7CiAgICBJJ2xsIGdvIGFuZCBjaGF0IHdpdGggUGFyaXM6IGhpZSwgbWFrZSBoYXN0ZSwKICAgIE1ha2UgaGFzdGU7IHRoZSBicmlkZWdyb29tIGhlIGlzIGNvbWUgYWxyZWFkeToKICAgIE1ha2UgaGFzdGUsIEkgc2F5LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gSnVsaWV0J3MgY2hhbWJlci4KCiAgICBFbnRlciBOdXJzZSAKCk51cnNlCgogICAgTWlzdHJlc3MhIHdoYXQsIG1pc3RyZXNzISBKdWxpZXQhIGZhc3QsIEkgd2FycmFudCBoZXIsIHNoZToKICAgIFdoeSwgbGFtYiEgd2h5LCBsYWR5ISBmaWUsIHlvdSBzbHVnLWEtYmVkIQogICAgV2h5LCBsb3ZlLCBJIHNheSEgbWFkYW0hIHN3ZWV0LWhlYXJ0ISB3aHksIGJyaWRlIQogICAgV2hhdCwgbm90IGEgd29yZD8geW91IHRha2UgeW91ciBwZW5ueXdvcnRocyBub3c7CiAgICBTbGVlcCBmb3IgYSB3ZWVrOyBmb3IgdGhlIG5leHQgbmlnaHQsIEkgd2FycmFudCwKICAgIFRoZSBDb3VudHkgUGFyaXMgaGF0aCBzZXQgdXAgaGlzIHJlc3QsCiAgICBUaGF0IHlvdSBzaGFsbCByZXN0IGJ1dCBsaXR0bGUuIEdvZCBmb3JnaXZlIG1lLAogICAgTWFycnksIGFuZCBhbWVuLCBob3cgc291bmQgaXMgc2hlIGFzbGVlcCEKICAgIEkgbXVzdCBuZWVkcyB3YWtlIGhlci4gTWFkYW0sIG1hZGFtLCBtYWRhbSEKICAgIEF5LCBsZXQgdGhlIGNvdW50eSB0YWtlIHlvdSBpbiB5b3VyIGJlZDsKICAgIEhlJ2xsIGZyaWdodCB5b3UgdXAsIGknIGZhaXRoLiBXaWxsIGl0IG5vdCBiZT8KCiAgICBVbmRyYXdzIHRoZSBjdXJ0YWlucwogICAgV2hhdCwgZHJlc3MnZCEgYW5kIGluIHlvdXIgY2xvdGhlcyEgYW5kIGRvd24gYWdhaW4hCiAgICBJIG11c3QgbmVlZHMgd2FrZSB5b3U7IExhZHkhIGxhZHkhIGxhZHkhCiAgICBBbGFzLCBhbGFzISBIZWxwLCBoZWxwISBteSBsYWR5J3MgZGVhZCEKICAgIE8sIHdlbGwtYS1kYXksIHRoYXQgZXZlciBJIHdhcyBib3JuIQogICAgU29tZSBhcXVhIHZpdGFlLCBobyEgTXkgbG9yZCEgbXkgbGFkeSEKCiAgICBFbnRlciBMQURZIENBUFVMRVQKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgaGVyZT8KCk51cnNlCgogICAgTyBsYW1lbnRhYmxlIGRheSEKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgaXMgdGhlIG1hdHRlcj8KCk51cnNlCgogICAgTG9vaywgbG9vayEgTyBoZWF2eSBkYXkhCgpMQURZIENBUFVMRVQKCiAgICBPIG1lLCBPIG1lISBNeSBjaGlsZCwgbXkgb25seSBsaWZlLAogICAgUmV2aXZlLCBsb29rIHVwLCBvciBJIHdpbGwgZGllIHdpdGggdGhlZSEKICAgIEhlbHAsIGhlbHAhIENhbGwgaGVscC4KCiAgICBFbnRlciBDQVBVTEVUCgpDQVBVTEVUCgogICAgRm9yIHNoYW1lLCBicmluZyBKdWxpZXQgZm9ydGg7IGhlciBsb3JkIGlzIGNvbWUuCgpOdXJzZQoKICAgIFNoZSdzIGRlYWQsIGRlY2Vhc2VkLCBzaGUncyBkZWFkOyBhbGFjayB0aGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgQWxhY2sgdGhlIGRheSwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCEKCkNBUFVMRVQKCiAgICBIYSEgbGV0IG1lIHNlZSBoZXI6IG91dCwgYWxhcyEgc2hlJ3MgY29sZDoKICAgIEhlciBibG9vZCBpcyBzZXR0bGVkLCBhbmQgaGVyIGpvaW50cyBhcmUgc3RpZmY7CiAgICBMaWZlIGFuZCB0aGVzZSBsaXBzIGhhdmUgbG9uZyBiZWVuIHNlcGFyYXRlZDoKICAgIERlYXRoIGxpZXMgb24gaGVyIGxpa2UgYW4gdW50aW1lbHkgZnJvc3QKICAgIFVwb24gdGhlIHN3ZWV0ZXN0IGZsb3dlciBvZiBhbGwgdGhlIGZpZWxkLgoKTnVyc2UKCiAgICBPIGxhbWVudGFibGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgTyB3b2Z1bCB0aW1lIQoKQ0FQVUxFVAoKICAgIERlYXRoLCB0aGF0IGhhdGggdGEnZW4gaGVyIGhlbmNlIHRvIG1ha2UgbWUgd2FpbCwKICAgIFRpZXMgdXAgbXkgdG9uZ3VlLCBhbmQgd2lsbCBub3QgbGV0IG1lIHNwZWFrLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUywgd2l0aCBNdXNpY2lhbnMKCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgaXMgdGhlIGJyaWRlIHJlYWR5IHRvIGdvIHRvIGNodXJjaD8KCkNBUFVMRVQKCiAgICBSZWFkeSB0byBnbywgYnV0IG5ldmVyIHRvIHJldHVybi4KICAgIE8gc29uISB0aGUgbmlnaHQgYmVmb3JlIHRoeSB3ZWRkaW5nLWRheQogICAgSGF0aCBEZWF0aCBsYWluIHdpdGggdGh5IHdpZmUuIFRoZXJlIHNoZSBsaWVzLAogICAgRmxvd2VyIGFzIHNoZSB3YXMsIGRlZmxvd2VyZWQgYnkgaGltLgogICAgRGVhdGggaXMgbXkgc29uLWluLWxhdywgRGVhdGggaXMgbXkgaGVpcjsKICAgIE15IGRhdWdodGVyIGhlIGhhdGggd2VkZGVkOiBJIHdpbGwgZGllLAogICAgQW5kIGxlYXZlIGhpbSBhbGw7IGxpZmUsIGxpdmluZywgYWxsIGlzIERlYXRoJ3MuCgpQQVJJUwoKICAgIEhhdmUgSSB0aG91Z2h0IGxvbmcgdG8gc2VlIHRoaXMgbW9ybmluZydzIGZhY2UsCiAgICBBbmQgZG90aCBpdCBnaXZlIG1lIHN1Y2ggYSBzaWdodCBhcyB0aGlzPwoKTEFEWSBDQVBVTEVUCgogICAgQWNjdXJzZWQsIHVuaGFwcHksIHdyZXRjaGVkLCBoYXRlZnVsIGRheSEKICAgIE1vc3QgbWlzZXJhYmxlIGhvdXIgdGhhdCBlJ2VyIHRpbWUgc2F3CiAgICBJbiBsYXN0aW5nIGxhYm91ciBvZiBoaXMgcGlsZ3JpbWFnZSEKICAgIEJ1dCBvbmUsIHBvb3Igb25lLCBvbmUgcG9vciBhbmQgbG92aW5nIGNoaWxkLAogICAgQnV0IG9uZSB0aGluZyB0byByZWpvaWNlIGFuZCBzb2xhY2UgaW4sCiAgICBBbmQgY3J1ZWwgZGVhdGggaGF0aCBjYXRjaCdkIGl0IGZyb20gbXkgc2lnaHQhCgpOdXJzZQoKICAgIE8gd29lISBPIHdvZnVsLCB3b2Z1bCwgd29mdWwgZGF5IQogICAgTW9zdCBsYW1lbnRhYmxlIGRheSwgbW9zdCB3b2Z1bCBkYXksCiAgICBUaGF0IGV2ZXIsIGV2ZXIsIEkgZGlkIHlldCBiZWhvbGQhCiAgICBPIGRheSEgTyBkYXkhIE8gZGF5ISBPIGhhdGVmdWwgZGF5IQogICAgTmV2ZXIgd2FzIHNlZW4gc28gYmxhY2sgYSBkYXkgYXMgdGhpczoKICAgIE8gd29mdWwgZGF5LCBPIHdvZnVsIGRheSEKClBBUklTCgogICAgQmVndWlsZWQsIGRpdm9yY2VkLCB3cm9uZ2VkLCBzcGl0ZWQsIHNsYWluIQogICAgTW9zdCBkZXRlc3RhYmxlIGRlYXRoLCBieSB0aGVlIGJlZ3VpbCdkLAogICAgQnkgY3J1ZWwgY3J1ZWwgdGhlZSBxdWl0ZSBvdmVydGhyb3duIQogICAgTyBsb3ZlISBPIGxpZmUhIG5vdCBsaWZlLCBidXQgbG92ZSBpbiBkZWF0aCEKCkNBUFVMRVQKCiAgICBEZXNwaXNlZCwgZGlzdHJlc3NlZCwgaGF0ZWQsIG1hcnR5cidkLCBraWxsJ2QhCiAgICBVbmNvbWZvcnRhYmxlIHRpbWUsIHdoeSBjYW1lc3QgdGhvdSBub3cKICAgIFRvIG11cmRlciwgbXVyZGVyIG91ciBzb2xlbW5pdHkCiAgICBPIGNoaWxkISBPIGNoaWxkISBteSBzb3VsLCBhbmQgbm90IG15IGNoaWxkIQogICAgRGVhZCBhcnQgdGhvdSEgQWxhY2shIG15IGNoaWxkIGlzIGRlYWQ7CiAgICBBbmQgd2l0aCBteSBjaGlsZCBteSBqb3lzIGFyZSBidXJpZWQuCgpGUklBUiBMQVVSRU5DRQoKICAgIFBlYWNlLCBobywgZm9yIHNoYW1lISBjb25mdXNpb24ncyBjdXJlIGxpdmVzIG5vdAogICAgSW4gdGhlc2UgY29uZnVzaW9ucy4gSGVhdmVuIGFuZCB5b3Vyc2VsZgogICAgSGFkIHBhcnQgaW4gdGhpcyBmYWlyIG1haWQ7IG5vdyBoZWF2ZW4gaGF0aCBhbGwsCiAgICBBbmQgYWxsIHRoZSBiZXR0ZXIgaXMgaXQgZm9yIHRoZSBtYWlkOgogICAgWW91ciBwYXJ0IGluIGhlciB5b3UgY291bGQgbm90IGtlZXAgZnJvbSBkZWF0aCwKICAgIEJ1dCBoZWF2ZW4ga2VlcHMgaGlzIHBhcnQgaW4gZXRlcm5hbCBsaWZlLgogICAgVGhlIG1vc3QgeW91IHNvdWdodCB3YXMgaGVyIHByb21vdGlvbjsKICAgIEZvciAndHdhcyB5b3VyIGhlYXZlbiBzaGUgc2hvdWxkIGJlIGFkdmFuY2VkOgogICAgQW5kIHdlZXAgeWUgbm93LCBzZWVpbmcgc2hlIGlzIGFkdmFuY2VkCiAgICBBYm92ZSB0aGUgY2xvdWRzLCBhcyBoaWdoIGFzIGhlYXZlbiBpdHNlbGYCiAgICBPLCBpbiB0aGlzIGxvdmUsIHlvdSBsb3ZlIHlvdXIgY2hpbGQgc28gaWxsLAogICAgVGhhdCB5b3UgcnVuIG1hZCwgc2VlaW5nIHRoYXQgc2hlIGlzIHdlbGw6CiAgICBTaGUncyBub3Qgd2VsbCBtYXJyaWVkIHRoYXQgbGl2ZXMgbWFycmllZCBsb25nOwogICAgQnV0IHNoZSdzIGJlc3QgbWFycmllZCB0aGF0IGRpZXMgbWFycmllZCB5b3VuZy4KICAgIERyeSB1cCB5b3VyIHRlYXJzLCBhbmQgc3RpY2sgeW91ciByb3NlbWFyeQogICAgT24gdGhpcyBmYWlyIGNvcnNlOyBhbmQsIGFzIHRoZSBjdXN0b20gaXMsCiAgICBJbiBhbGwgaGVyIGJlc3QgYXJyYXkgYmVhciBoZXIgdG8gY2h1cmNoOgogICAgRm9yIHRob3VnaCBmb25kIG5hdHVyZSBiaWRzIHVzIGFuIGxhbWVudCwKICAgIFlldCBuYXR1cmUncyB0ZWFycyBhcmUgcmVhc29uJ3MgbWVycmltZW50LgoKQ0FQVUxFVAoKICAgIEFsbCB0aGluZ3MgdGhhdCB3ZSBvcmRhaW5lZCBmZXN0aXZhbCwKICAgIFR1cm4gZnJvbSB0aGVpciBvZmZpY2UgdG8gYmxhY2sgZnVuZXJhbDsKICAgIE91ciBpbnN0cnVtZW50cyB0byBtZWxhbmNob2x5IGJlbGxzLAogICAgT3VyIHdlZGRpbmcgY2hlZXIgdG8gYSBzYWQgYnVyaWFsIGZlYXN0LAogICAgT3VyIHNvbGVtbiBoeW1ucyB0byBzdWxsZW4gZGlyZ2VzIGNoYW5nZSwKICAgIE91ciBicmlkYWwgZmxvd2VycyBzZXJ2ZSBmb3IgYSBidXJpZWQgY29yc2UsCiAgICBBbmQgYWxsIHRoaW5ncyBjaGFuZ2UgdGhlbSB0byB0aGUgY29udHJhcnkuCgpGUklBUiBMQVVSRU5DRQoKICAgIFNpciwgZ28geW91IGluOyBhbmQsIG1hZGFtLCBnbyB3aXRoIGhpbTsKICAgIEFuZCBnbywgU2lyIFBhcmlzOyBldmVyeSBvbmUgcHJlcGFyZQogICAgVG8gZm9sbG93IHRoaXMgZmFpciBjb3JzZSB1bnRvIGhlciBncmF2ZToKICAgIFRoZSBoZWF2ZW5zIGRvIGxvdXIgdXBvbiB5b3UgZm9yIHNvbWUgaWxsOwogICAgTW92ZSB0aGVtIG5vIG1vcmUgYnkgY3Jvc3NpbmcgdGhlaXIgaGlnaCB3aWxsLgoKICAgIEV4ZXVudCBDQVBVTEVULCBMQURZIENBUFVMRVQsIFBBUklTLCBhbmQgRlJJQVIgTEFVUkVOQ0UKCkZpcnN0IE11c2ljaWFuCgogICAgRmFpdGgsIHdlIG1heSBwdXQgdXAgb3VyIHBpcGVzLCBhbmQgYmUgZ29uZS4KCk51cnNlCgogICAgSG9uZXN0IGdvb2RmZWxsb3dzLCBhaCwgcHV0IHVwLCBwdXQgdXA7CiAgICBGb3IsIHdlbGwgeW91IGtub3csIHRoaXMgaXMgYSBwaXRpZnVsIGNhc2UuCgogICAgRXhpdAoKRmlyc3QgTXVzaWNpYW4KCiAgICBBeSwgYnkgbXkgdHJvdGgsIHRoZSBjYXNlIG1heSBiZSBhbWVuZGVkLgoKICAgIEVudGVyIFBFVEVSCgpQRVRFUgoKICAgIE11c2ljaWFucywgTywgbXVzaWNpYW5zLCAnSGVhcnQncyBlYXNlLCBIZWFydCdzCiAgICBlYXNlOicgTywgYW4geW91IHdpbGwgaGF2ZSBtZSBsaXZlLCBwbGF5ICdIZWFydCdzIGVhc2UuJwoKRmlyc3QgTXVzaWNpYW4KCiAgICBXaHkgJ0hlYXJ0J3MgZWFzZT8nCgpQRVRFUgoKICAgIE8sIG11c2ljaWFucywgYmVjYXVzZSBteSBoZWFydCBpdHNlbGYgcGxheXMgJ015CiAgICBoZWFydCBpcyBmdWxsIG9mIHdvZTonIE8sIHBsYXkgbWUgc29tZSBtZXJyeSBkdW1wLAogICAgdG8gY29tZm9ydCBtZS4KCkZpcnN0IE11c2ljaWFuCgogICAgTm90IGEgZHVtcCB3ZTsgJ3RpcyBubyB0aW1lIHRvIHBsYXkgbm93LgoKUEVURVIKCiAgICBZb3Ugd2lsbCBub3QsIHRoZW4CgpGaXJzdCBNdXNp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Rocm9uZTsKICAgIEFuZCBhbGwgdGhpcyBkYXkgYW4gdW5hY2N1c3RvbSdkIHNwaXJpdAogICAgTGlmdHMgbWUgYWJvdmUgdGhlIGdyb3VuZCB3aXRoIGNoZWVyZnVsIHRob3VnaHRzLgogICAgSSBkcmVhbXQgbXkgbGFkeSBjYW1lIGFuZCBmb3VuZCBtZSBkZWFkLS0KICAgIFN0cmFuZ2UgZHJlYW0sIHRoYXQgZ2l2ZXMgYSBkZWFkIG1hbiBsZWF2ZQogICAgdG8gdGhpbmshLS0KICAgIEFuZCBicmVhdGhlZCBzdWNoIGxpZmUgd2l0aCBraXNzZXMgaW4gbXkgbGlwcywKICAgIFRoYXQgSSByZXZpdmVkLCBhbmQgd2FzIGFuIGVtcGVyb3IuCiAgICBBaCBtZSEgaG93IHN3ZWV0IGlzIGxvdmUgaXRzZWxmIHBvc3Nlc3MnZCwKICAgIFdoZW4gYnV0IGxvdmUncyBzaGFkb3dzIGFyZSBzbyByaWNoIGluIGpveSEKCiAgICBFbnRlciBCQUxUSEFTQVIsIGJvb3RlZAogICAgTmV3cyBmcm9tIFZlcm9uYSEtLUhvdyBub3csIEJhbHRoYXNhciEKICAgIERvc3QgdGhvdSBub3QgYnJpbmcgbWUgbGV0dGVycyBmcm9tIHRoZSBmcmlhcj8KICAgIEhvdyBkb3RoIG15IGxhZHkIElzIG15IGZhdGhlciB3ZWxsPwogICAgSG93IGZhcmVzIG15IEp1bGlldD8gdGhhdCBJIGFzayBhZ2FpbjsKICAgIEZvciBub3RoaW5nIGNhbiBiZSBpbGwsIGlmIHNoZSBiZSB3ZWxsLgoKQkFMVEhBU0FSCgogICAgVGhlbiBzaGUgaXMgd2VsbCwgYW5kIG5vdGhpbmcgY2FuIGJlIGlsbDoKICAgIEhlciBib2R5IHNsZWVwcyBpbiBDYXBlbCdzIG1vbnVtZW50LAogICAgQW5kIGhlciBpbW1vcnRhbCBwYXJ0IHdpdGggYW5nZWxzIGxpdmVzLgogICAgSSBzYXcgaGVyIGxhaWQgbG93IGluIGhlciBraW5kcmVkJ3MgdmF1bHQsCiAgICBBbmQgcHJlc2VudGx5IHRvb2sgcG9zdCB0byB0ZWxsIGl0IHlvdToKICAgIE8sIHBhcmRvbiBtZSBmb3IgYnJpbmdpbmcgdGhlc2UgaWxsIG5ld3MsCiAgICBTaW5jZSB5b3UgZGlkIGxlYXZlIGl0IGZvciBteSBvZmZpY2UsIHNpci4KClJPTUVPCgogICAgSXMgaXQgZXZlbiBzbz8gdGhlbiBJIGRlZnkgeW91LCBzdGFycyEKICAgIFRob3Uga25vdydzdCBteSBsb2RnaW5nOiBnZXQgbWUgaW5rIGFuZCBwYXBlciwKICAgIEFuZCBoaXJlIHBvc3QtaG9yc2VzOyBJIHdpbGwgaGVuY2UgdG8tbmlnaHQuCgpCQUxUSEFTQVIKCiAgICBJIGRvIGJlc2VlY2ggeW91LCBzaXIsIGhhdmUgcGF0aWVuY2U6CiAgICBZb3VyIGxvb2tzIGFyZSBwYWxlIGFuZCB3aWxkLCBhbmQgZG8gaW1wb3J0CiAgICBTb21lIG1pc2FkdmVudHVyZS4KClJPTUVPCgogICAgVHVzaCwgdGhvdSBhcnQgZGVjZWl2ZWQ6CiAgICBMZWF2ZSBtZSwgYW5kIGRvIHRoZSB0aGluZyBJIGJpZCB0aGVlIGRvLgogICAgSGFzdCB0aG91IG5vIGxldHRlcnMgdG8gbWUgZnJvbSB0aGUgZnJpYXICgpCQUxUSEFTQVIKCiAgICBObywgbXkgZ29vZCBsb3JkLgoKUk9NRU8KCiAgICBObyBtYXR0ZXI6IGdldCB0aGVlIGdvbmUsCiAgICBBbmQgaGlyZSB0aG9zZSBob3JzZXM7IEknbGwgYmUgd2l0aCB0aGVlIHN0cmFpZ2h0LgoKICAgIEV4aXQgQkFMVEhBU0FSCiAgICBXZWxsLCBKdWxpZXQsIEkgd2lsbCBsaWUgd2l0aCB0aGVlIHRvLW5pZ2h0LgogICAgTGV0J3Mgc2VlIGZvciBtZWFuczogTyBtaXNjaGllZiwgdGhvdSBhcnQgc3dpZnQKICAgIFRvIGVudGVyIGluIHRoZSB0aG91Z2h0cyBvZiBkZXNwZXJhdGUgbWVuIQogICAgSSBkbyByZW1lbWJlciBhbiBhcG90aGVjYXJ5LC0tCiAgICBBbmQgaGVyZWFib3V0cyBoZSBkd2VsbHMsLS13aGljaCBsYXRlIEkgbm90ZWQKICAgIEluIHRhdHRlcidkIHdlZWRzLCB3aXRoIG92ZXJ3aGVsbWluZyBicm93cywKICAgIEN1bGxpbmcgb2Ygc2ltcGxlczsgbWVhZ3JlIHdlcmUgaGlzIGxvb2tzLAogICAgU2hhcnAgbWlzZXJ5IGhhZCB3b3JuIGhpbSB0byB0aGUgYm9uZXM6CiAgICBBbmQgaW4gaGlzIG5lZWR5IHNob3AgYSB0b3J0b2lzZSBodW5nLAogICAgQW4gYWxsaWdhdG9yIHN0dWZmJ2QsIGFuZCBvdGhlciBza2lucwogICAgT2YgaWxsLXNoYXBlZCBmaXNoZXM7IGFuZCBhYm91dCBoaXMgc2hlbHZlcwogICAgQSBiZWdnYXJseSBhY2NvdW50IG9mIGVtcHR5IGJveGVzLAogICAgR3JlZW4gZWFydGhlbiBwb3RzLCBibGFkZGVycyBhbmQgbXVzdHkgc2VlZHMsCiAgICBSZW1uYW50cyBvZiBwYWNrdGhyZWFkIGFuZCBvbGQgY2FrZXMgb2Ygcm9zZXMsCiAgICBXZXJlIHRoaW5seSBzY2F0dGVyJ2QsIHRvIG1ha2UgdXAgYSBzaG93LgogICAgTm90aW5nIHRoaXMgcGVudXJ5LCB0byBteXNlbGYgSSBzYWlkCiAgICAnQW4gaWYgYSBtYW4gZGlkIG5lZWQgYSBwb2lzb24gbm93LAogICAgV2hvc2Ugc2FsZSBpcyBwcmVzZW50IGRlYXRoIGluIE1hbnR1YSwKICAgIEhlcmUgbGl2ZXMgYSBjYWl0aWZmIHdyZXRjaCB3b3VsZCBzZWxsIGl0IGhpbS4nCiAgICBPLCB0aGlzIHNhbWUgdGhvdWdodCBkaWQgYnV0IGZvcmVydW4gbXkgbmVlZDsKICAgIEFuZCB0aGlzIHNhbWUgbmVlZHkgbWFuIG11c3Qgc2VsbCBpdCBtZS4KICAgIEFzIEkgcmVtZW1iZXIsIHRoaXMgc2hvdWxkIGJlIHRoZSBob3VzZS4KICAgIEJlaW5nIGhvbGlkYXksIHRoZSBiZWdnYXIncyBzaG9wIGlzIHNodXQuCiAgICBXaGF0LCBobyEgYXBvdGhlY2FyeSEKCiAgICBFbnRlciBBcG90aGVjYXJ5CgpBcG90aGVjYXJ5CgogICAgV2hvIGNhbGxzIHNvIGxvdWQCgpST01FTwoKICAgIENvbWUgaGl0aGVyLCBtYW4uIEkgc2VlIHRoYXQgdGhvdSBhcnQgcG9vcjoKICAgIEhvbGQsIHRoZXJlIGlzIGZvcnR5IGR1Y2F0czogbGV0IG1lIGhhdmUKICAgIEEgZHJhbSBvZiBwb2lzb24sIHN1Y2ggc29vbi1zcGVlZGluZyBnZWFyCiAgICBBcyB3aWxsIGRpc3BlcnNlIGl0c2VsZiB0aHJvdWdoIGFsbCB0aGUgdmVpbnMKICAgIFRoYXQgdGhlIGxpZmUtd2VhcnkgdGFrZXIgbWF5IGZhbGwgZGVhZAogICAgQW5kIHRoYXQgdGhlIHRydW5rIG1heSBiZSBkaXNjaGFyZ2VkIG9mIGJyZWF0aAogICAgQXMgdmlvbGVudGx5IGFzIGhhc3R5IHBvd2RlciBmaXJlZAogICAgRG90aCBodXJyeSBmcm9tIHRoZSBmYXRhbCBjYW5ub24ncyB3b21iLgoKQXBvdGhlY2FyeQoKICAgIFN1Y2ggbW9ydGFsIGRydWdzIEkgaGF2ZTsgYnV0IE1hbnR1YSdzIGxhdwogICAgSXMgZGVhdGggdG8gYW55IGhlIHRoYXQgdXR0ZXJzIHRoZW0uCgpST01FTwoKICAgIEFydCB0aG91IHNvIGJhcmUgYW5kIGZ1bGwgb2Ygd3JldGNoZWRuZXNzLAogICAgQW5kIGZlYXInc3QgdG8gZGllPyBmYW1pbmUgaXMgaW4gdGh5IGNoZWVrcywKICAgIE5lZWQgYW5kIG9wcHJlc3Npb24gc3RhcnZldGggaW4gdGhpbmUgZXllcywKICAgIENvbnRlbXB0IGFuZCBiZWdnYXJ5IGhhbmdzIHVwb24gdGh5IGJhY2s7CiAgICBUaGUgd29ybGQgaXMgbm90IHRoeSBmcmllbmQgbm9yIHRoZSB3b3JsZCdzIGxhdzsKICAgIFRoZSB3b3JsZCBhZmZvcmRzIG5vIGxhdyB0byBtYWtlIHRoZWUgcmljaDsKICAgIFRoZW4gYmUgbm90IHBvb3IsIGJ1dCBicmVhayBpdCwgYW5kIHRha2UgdGhpcy4KCkFwb3RoZWNhcnkKCiAgICBNeSBwb3ZlcnR5LCBidXQgbm90IG15IHdpbGwsIGNvbnNlbnRzLgoKUk9NRU8KCiAgICBJIHBheSB0aHkgcG92ZXJ0eSwgYW5kIG5vdCB0aHkgd2lsbC4KCkFwb3RoZWNhcnkKCiAgICBQdXQgdGhpcyBpbiBhbnkgbGlxdWlkIHRoaW5nIHlvdSB3aWxsLAogICAgQW5kIGRyaW5rIGl0IG9mZjsgYW5kLCBpZiB5b3UgaGFkIHRoZSBzdHJlbmd0aAogICAgT2YgdHdlbnR5IG1lbiwgaXQgd291bGQgZGlzcGF0Y2ggeW91IHN0cmFpZ2h0LgoKUk9NRU8KCiAgICBUaGVyZSBpcyB0aHkgZ29sZCwgd29yc2UgcG9pc29uIHRvIG1lbidzIHNvdWxzLAogICAgRG9pbmcgbW9yZSBtdXJkZXJzIGluIHRoaXMgbG9hdGhzb21lIHdvcmxkLAogICAgVGhhbiB0aGVzZSBwb29yIGNvbXBvdW5kcyB0aGF0IHRob3UgbWF5c3Qgbm90IHNlbGwuCiAgICBJIHNlbGwgdGhlZSBwb2lzb247IHRob3UgaGFzdCBzb2xkIG1lIG5vbmUuCiAgICBGYXJld2VsbDogYnV5IGZvb2QsIGFuZCBnZXQgdGh5c2VsZiBpbiBmbGVzaC4KICAgIENvbWUsIGNvcmRpYWwgYW5kIG5vdCBwb2lzb24sIGdvIHdpdGggbWUKICAgIFRvIEp1bGlldCdzIGdyYXZlOyBmb3IgdGhlcmUgbXVzdCBJIHVzZSB0aGVlLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBKT0hOIAoKRlJJQVIgSk9ITgoKICAgIEhvbHkgRnJhbmNpc2NhbiBmcmlhciEgYnJvdGhlciwgaG8hCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UKCkZSSUFSIExBVVJFTkNFCgogICAgVGhpcyBzYW1lIHNob3VsZCBiZSB0aGUgdm9pY2Ugb2YgRnJpYXIgSm9obi4KICAgIFdlbGNvbWUgZnJvbSBNYW50dWE6IHdoYXQgc2F5cyBSb21lbz8KICAgIE9yLCBpZiBoaXMgbWluZCBiZSB3cml0LCBnaXZlIG1lIGhpcyBsZXR0ZXIuCgpGUklBUiBKT0hOCgogICAgR29pbmcgdG8gZmluZCBhIGJhcmUtZm9vdCBicm90aGVyIG91dAogICAgT25lIG9mIG91ciBvcmRlciwgdG8gYXNzb2NpYXRlIG1lLAogICAgSGVyZSBpbiB0aGlzIGNpdHkgdmlzaXRpbmcgdGhlIHNpY2ssCiAgICBBbmQgZmluZGluZyBoaW0sIHRoZSBzZWFyY2hlcnMgb2YgdGhlIHRvd24sCiAgICBTdXNwZWN0aW5nIHRoYXQgd2UgYm90aCB3ZXJlIGluIGEgaG91c2UKICAgIFdoZXJlIHRoZSBpbmZlY3Rpb3VzIHBlc3RpbGVuY2UgZGlkIHJlaWduLAogICAgU2VhbCdkIHVwIHRoZSBkb29ycywgYW5kIHdvdWxkIG5vdCBsZXQgdXMgZm9ydGg7CiAgICBTbyB0aGF0IG15IHNwZWVkIHRvIE1hbnR1YSB0aGVyZSB3YXMgc3RheSdkLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXaG8gYmFyZSBteSBsZXR0ZXIsIHRoZW4sIHRvIFJvbWVvPwoKRlJJQVIgSk9ITgoKICAgIEkgY291bGQgbm90IHNlbmQgaXQsLS1oZXJlIGl0IGlzIGFnYWluLC0tCiAgICBOb3IgZ2V0IGEgbWVzc2VuZ2VyIHRvIGJyaW5nIGl0IHRoZWUsCiAgICBTbyBmZWFyZnVsIHdlcmUgdGhleSBvZiBpbmZlY3Rpb24uCgpGUklBUiBMQVVSRU5DRQoKICAgIFVuaGFwcHkgZm9ydHVuZSEgYnkgbXkgYnJvdGhlcmhvb2QsCiAgICBUaGUgbGV0dGVyIHdhcyBub3QgbmljZSBidXQgZnVsbCBvZiBjaGFyZ2UKICAgIE9mIGRlYXIgaW1wb3J0LCBhbmQgdGhlIG5lZ2xlY3RpbmcgaXQKICAgIE1heSBkbyBtdWNoIGRhbmdlci4gRnJpYXIgSm9obiwgZ28gaGVuY2U7CiAgICBHZXQgbWUgYW4gaXJvbiBjcm93LCBhbmQgYnJpbmcgaXQgc3RyYWlnaHQKICAgIFVudG8gbXkgY2VsbC4KCkZSSUFSIEpPSE4KCiAgICBCcm90aGVyLCBJJ2xsIGdvIGFuZCBicmluZyBpdCB0aGVlLgoKICAgIEV4aXQKCkZSSUFSIExBVVJFTkNFCgogICAgTm93IG11c3QgSSB0byB0aGUgbW9udW1lbnQgYWxvbmU7CiAgICBXaXRoaW4gdGhyZWUgaG91cnMgd2lsbCBmYWlyIEp1bGlldCB3YWtlOgogICAgU2hlIHdpbGwgYmVzaHJldyBtZSBtdWNoIHRoYXQgUm9tZW8KICAgIEhhdGggaGFkIG5vIG5vdGljZSBvZiB0aGVzZSBhY2NpZGVudHM7CiAgICBCdXQgSSB3aWxsIHdyaXRlIGFnYWluIHRvIE1hbnR1YSwKICAgIEFuZCBrZWVwIGhlciBhdCBteSBjZWxsIHRpbGwgUm9tZW8gY29tZTsKICAgIFBvb3IgbGl2aW5nIGNvcnNlLCBjbG9zZWQgaW4gYSBkZWFkIG1hbidzIHRvbWIhCgogICAgRXhpdAoKU0NFTkUgSUlJLiBBIGNodXJjaHlhcmQ7IGluIGl0IGEgdG9tYiBiZWxvbmdpbmcgdG8gdGhlIENhcHVsZXRzLgoKICAgIEVudGVyIFBBUklTLCBhbmQgaGlzIFBhZ2UgYmVhcmluZyBmbG93ZXJzIGFuZCBhIHRvcmNoIAoKUEFSSVMKCiAgICBHaXZlIG1lIHRoeSB0b3JjaCwgYm95OiBoZW5jZSwgYW5kIHN0YW5kIGFsb29mOgogICAgWWV0IHB1dCBpdCBvdXQsIGZvciBJIHdvdWxkIG5vdCBiZSBzZWVuLgogICAgVW5kZXIgeW9uZCB5ZXctdHJlZXMgbGF5IHRoZWUgYWxsIGFsb25nLAogICAgSG9sZGluZyB0aGluZSBlYXIgY2xvc2UgdG8gdGhlIGhvbGxvdyBncm91bmQ7CiAgICBTbyBzaGFsbCBubyBmb290IHVwb24gdGhlIGNodXJjaHlhcmQgdHJlYWQsCiAgICBCZWluZyBsb29zZSwgdW5maXJtLCB3aXRoIGRpZ2dpbmcgdXAgb2YgZ3JhdmVzLAogICAgQnV0IHRob3Ugc2hhbHQgaGVhciBpdDogd2hpc3RsZSB0aGVuIHRvIG1lLAogICAgQXMgc2lnbmFsIHRoYXQgdGhvdSBoZWFyJ3N0IHNvbWV0aGluZyBhcHByb2FjaC4KICAgIEdpdmUgbWUgdGhvc2UgZmxvd2Vycy4gRG8gYXMgSSBiaWQgdGhlZSwgZ28uCgpQQUdFCgogICAgW0FzaWRlXSBJIGFtIGFsbW9zdCBhZnJhaWQgdG8gc3RhbmQgYWxvbmUKICAgIEhlcmUgaW4gdGhlIGNodXJjaHlhcmQ7IHlldCBJIHdpbGwgYWR2ZW50dXJlLgoKICAgIFJldGlyZXMKClBBUklTCgogICAgU3dlZXQgZmxvd2VyLCB3aXRoIGZsb3dlcnMgdGh5IGJyaWRhbCBiZWQgSSBzdHJldywtLQogICAgTyB3b2UhIHRoeSBjYW5vcHkgaXMgZHVzdCBhbmQgc3RvbmVzOy0tCiAgICBXaGljaCB3aXRoIHN3ZWV0IHdhdGVyIG5pZ2h0bHkgSSB3aWxsIGRldywKICAgIE9yLCB3YW50aW5nIHRoYXQsIHdpdGggdGVhcnMgZGlzdGlsbCdkIGJ5IG1vYW5zOgogICAgVGhlIG9ic2VxdWllcyB0aGF0IEkgZm9yIHRoZWUgd2lsbCBrZWVwCiAgICBOaWdodGx5IHNoYWxsIGJlIHRvIHN0cmV3IHRoeSBncmF2ZSBhbmQgd2VlcC4KCiAgICBUaGUgUGFnZSB3aGlzdGxlcwogICAgVGhlIGJveSBnaXZlcyB3YXJuaW5nIHNvbWV0aGluZyBkb3RoIGFwcHJvYWNoLgogICAgV2hhdCBjdXJzZWQgZm9vdCB3YW5kZXJzIHRoaXMgd2F5IHRvLW5pZ2h0LAogICAgVG8gY3Jvc3MgbXkgb2JzZXF1aWVzIGFuZCB0cnVlIGxvdmUncyByaXRlPwogICAgV2hhdCB3aXRoIGEgdG9yY2ghIG11ZmZsZSBtZSwgbmlnaHQsIGF3aGlsZS4KCiAgICBSZXRpcmVzCgogICAgRW50ZXIgUk9NRU8gYW5kIEJBTFRIQVNBUiwgd2l0aCBhIHRvcmNoLCBtYXR0b2NrLCAmIGMKClJPTUVPCgogICAgR2l2ZSBtZSB0aGF0IG1hdHRvY2sgYW5kIHRoZSB3cmVuY2hpbmcgaXJvbi4KICAgIEhvbGQsIHRha2UgdGhpcyBsZXR0ZXI7IGVhcmx5IGluIHRoZSBtb3JuaW5nCiAgICBTZWUgdGhvdSBkZWxpdmVyIGl0IHRvIG15IGxvcmQgYW5kIGZhdGhlci4KICAgIEdpdmUgbWUgdGhlIGxpZ2h0OiB1cG9uIHRoeSBsaWZlLCBJIGNoYXJnZSB0aGVlLAogICAgV2hhdGUnZXIgdGhvdSBoZWFyJ3N0IG9yIHNlZXN0LCBzdGFuZCBhbGwgYWxvb2YsCiAgICBBbmQgZG8gbm90IGludGVycnVwdCBtZSBpbiBteSBjb3Vyc2UuCiAgICBXaHkgSSBkZXNjZW5kIGludG8gdGhpcyBiZWQgb2YgZGVhdGgsCiAgICBJcyBwYXJ0bHkgdG8gYmVob2xkIG15IGxhZHkncyBmYWNlOwogICAgQnV0IGNoaWVmbHkgdG8gdGFrZSB0aGVuY2UgZnJvbSBoZXIgZGVhZCBmaW5nZXIKICAgIEEgcHJlY2lvdXMgcmluZywgYSByaW5nIHRoYXQgSSBtdXN0IHVzZQogICAgSW4gZGVhciBlbXBsb3ltZW50OiB0aGVyZWZvcmUgaGVuY2UsIGJlIGdvbmU6CiAgICBCdXQgaWYgdGhvdSwgamVhbG91cywgZG9zdCByZXR1cm4gdG8gcHJ5CiAgICBJbiB3aGF0IEkgZnVydGhlciBzaGFsbCBpbnRlbmQgdG8gZG8sCiAgICBCeSBoZWF2ZW4sIEkgd2lsbCB0ZWFyIHRoZWUgam9pbnQgYnkgam9pbnQKICAgIEFuZCBzdHJldyB0aGlzIGh1bmdyeSBjaHVyY2h5YXJkIHdpdGggdGh5IGxpbWJzOgogICAgVGhlIHRpbWUgYW5kIG15IGludGVudHMgYXJlIHNhdmFnZS13aWxkLAogICAgTW9yZSBmaWVyY2UgYW5kIG1vcmUgaW5leG9yYWJsZSBmYXIKICAgIFRoYW4gZW1wdHkgdGlnZXJzIG9yIHRoZSByb2FyaW5nIHNlYS4KCkJBTFRIQVNBUgoKICAgIEkgd2lsbCBiZSBnb25lLCBzaXIsIGFuZCBub3QgdHJvdWJsZSB5b3UuCgpST01FTwoKICAgIFNvIHNoYWx0IHRob3Ugc2hvdyBtZSBmcmllbmRzaGlwLiBUYWtlIHRob3UgdGhhdDoKICAgIExpdmUsIGFuZCBiZSBwcm9zcGVyb3VzOiBhbmQgZmFyZXdlbGwsIGdvb2QgZmVsbG93LgoKQkFMVEhBU0FSCgogICAgW0FzaWRlXSBGb3IgYWxsIHRoaXMgc2FtZSwgSSdsbCBoaWRlIG1lIGhlcmVhYm91dDoKICAgIEhpcyBsb29rcyBJIGZlYXIsIGFuZCBoaXMgaW50ZW50cyBJIGRvdWJ0LgoKICAgIFJldGlyZXMKClJPTUVPCgogICAgVGhvdSBkZXRlc3RhYmxlIG1hdywgdGhvdSB3b21iIG9mIGRlYXRoLAogICAgR29yZ2VkIHdpdGggdGhlIGRlYXJlc3QgbW9yc2VsIG9mIHRoZSBlYXJ0aCwKICAgIFRodXMgSSBlbmZvcmNlIHRoeSByb3R0ZW4gamF3cyB0byBvcGVuLAogICAgQW5kLCBpbiBkZXNwaXRlLCBJJ2xsIGNyYW0gdGhlZSB3aXRoIG1vcmUgZm9vZCEKCiAgICBPcGVucyB0aGUgdG9tYgoKUEFSSVMKCiAgICBUaGlzIGlzIHRoYXQgYmFuaXNoJ2QgaGF1Z2h0eSBNb250YWd1ZSwKICAgIFRoYXQgbXVyZGVyJ2QgbXkgbG92ZSdzIGNvdXNpbiwgd2l0aCB3aGljaCBncmllZiwKICAgIEl0IGlzIHN1cHBvc2VkLCB0aGUgZmFpciBjcmVhdHVyZSBkaWVkOwogICAgQW5kIGhlcmUgaXMgY29tZSB0byBkbyBzb21lIHZpbGxhbm91cyBzaGFtZQogICAgVG8gdGhlIGRlYWQgYm9kaWVzOiBJIHdpbGwgYXBwcmVoZW5kIGhpbS4KCiAgICBDb21lcyBmb3J3YXJkCiAgICBTdG9wIHRoeSB1bmhhbGxvdydkIHRvaWwsIHZpbGUgTW9udGFndWUhCiAgICBDYW4gdmVuZ2VhbmNlIGJlIHB1cnN1ZWQgZnVydGhlciB0aGFuIGRlYXRoPwogICAgQ29uZGVtbmVkIHZpbGxhaW4sIEkgZG8gYXBwcmVoZW5kIHRoZWU6CiAgICBPYmV5LCBhbmQgZ28gd2l0aCBtZTsgZm9yIHRob3UgbXVzdCBkaWUuCgpST01FTwoKICAgIEkgbXVzdCBpbmRlZWQ7IGFuZCB0aGVyZWZvcmUgY2FtZSBJIGhpdGhlci4KICAgIEdvb2QgZ2VudGxlIHlvdXRoLCB0ZW1wdCBub3QgYSBkZXNwZXJhdGUgbWFuOwogICAgRmx5IGhlbmNlLCBhbmQgbGVhdmUgbWU6IHRoaW5rIHVwb24gdGhlc2UgZ29uZTsKICAgIExldCB0aGVtIGFmZnJpZ2h0IHRoZWUuIEkgYmVzZWVjaCB0aGVlLCB5b3V0aCwKICAgIFB1dCBub3QgYW5vdGhlciBzaW4gdXBvbiBteSBoZWFkLAogICAgQnkgdXJnaW5nIG1lIHRvIGZ1cnk6IE8sIGJlIGdvbmUhCiAgICBCeSBoZWF2ZW4sIEkgbG92ZSB0aGVlIGJldHRlciB0aGFuIG15c2VsZjsKICAgIEZvciBJIGNvbWUgaGl0aGVyIGFybSdkIGFnYWluc3QgbXlzZWxmOgogICAgU3RheSBub3QsIGJlIGdvbmU7IGxpdmUsIGFuZCBoZXJlYWZ0ZXIgc2F5LAogICAgQSBtYWRtYW4ncyBtZXJjeSBiYWRlIHRoZWUgcnVuIGF3YXkuCgpQQVJJUwoKICAgIEkgZG8gZGVmeSB0aHkgY29uanVyYXRpb25zLAogICAgQW5kIGFwcHJlaGVuZCB0aGVlIGZvciBhIGZlbG9uIGhlcmUuCgpST01FTwoKICAgIFdpbHQgdGhvdSBwcm92b2tlIG1lPyB0aGVuIGhhdmUgYXQgdGhlZSwgYm95IQoKICAgIFRoZXkgZmlnaHQKClBBR0UKCiAgICBPIExvcmQsIHRoZXkgZmlnaHQhIEkgd2lsbCBnbyBjYWxsIHRoZSB3YXRjaC4KCiAgICBFeGl0CgpQQVJJUwoKICAgIE8sIEkgYW0gc2xhaW4hCgogICAgRmFsbHMKICAgIElmIHRob3UgYmUgbWVyY2lmdWwsCiAgICBPcGVuIHRoZSB0b21iLCBsYXkgbWUgd2l0aCBKdWxpZXQuCgogICAgRGllcwoKUk9NRU8KCiAgICBJbiBmYWl0aCwgSSB3aWxsLiBMZXQgbWUgcGVydXNlIHRoaXMgZmFjZS4KICAgIE1lcmN1dGlvJ3Mga2luc21hbiwgbm9ibGUgQ291bnR5IFBhcmlzIQogICAgV2hhdCBzYWlkIG15IG1hbiwgd2hlbiBteSBiZXRvc3NlZCBzb3VsCiAgICBEaWQgbm90IGF0dGVuZCBoaW0gYXMgd2Ugcm9kZT8gSSB0aGluawogICAgSGUgdG9sZCBtZSBQYXJpcyBzaG91bGQgaGF2ZSBtYXJyaWVkIEp1bGlldDoKICAgIFNhaWQgaGUgbm90IHNvPyBvciBkaWQgSSBkcmVhbSBpdCBzbz8KICAgIE9yIGFtIEkgbWFkLCBoZWFyaW5nIGhpbSB0YWxrIG9mIEp1bGlldCwKICAgIFRvIHRoaW5rIGl0IHdhcyBzbz8gTywgZ2l2ZSBtZSB0aHkgaGFuZCwKICAgIE9uZSB3cml0IHdpdGggbWUgaW4gc291ciBtaXNmb3J0dW5lJ3MgYm9vayEKICAgIEknbGwgYnVyeSB0aGVlIGluIGEgdHJpdW1waGFudCBncmF2ZTsKICAgIEEgZ3JhdmUIE8gbm8hIGEgbGFudGVybiwgc2xhdWdodGVyJ2QgeW91dGgsCiAgICBGb3IgaGVyZSBsaWVzIEp1bGlldCwgYW5kIGhlciBiZWF1dHkgbWFrZXMKICAgIFRoaXMgdmF1bHQgYSBmZWFzdGluZyBwcmVzZW5jZSBmdWxsIG9mIGxpZ2h0LgogICAgRGVhdGgsIGxpZSB0aG91IHRoZXJlLCBieSBhIGRlYWQgbWFuIGludGVycidkLgoKICAgIExheWluZyBQQVJJUyBpbiB0aGUgdG9tYgogICAgSG93IG9mdCB3aGVuIG1lbiBhcmUgYXQgdGhlIHBvaW50IG9mIGRlYXRoCiAgICBIYXZlIHRoZXkgYmVlbiBtZXJyeSEgd2hpY2ggdGhlaXIga2VlcGVycyBjYWxsCiAgICBBIGxpZ2h0bmluZyBiZWZvcmUgZGVhdGg6IE8sIGhvdyBtYXkgSQogICAgQ2FsbCB0aGlzIGEgbGlnaHRuaW5nPyBPIG15IGxvdmUhIG15IHdpZmUhCiAgICBEZWF0aCwgdGhhdCBoYXRoIHN1Y2snZCB0aGUgaG9uZXkgb2YgdGh5IGJyZWF0aCwKICAgIEhhdGggaGFkIG5vIHBvd2VyIHlldCB1cG9uIHRoeSBiZWF1dHk6CiAgICBUaG91IGFydCBub3QgY29ucXVlcidkOyBiZWF1dHkncyBlbnNpZ24geWV0CiAgICBJcyBjcmltc29uIGluIHRoeSBsaXBzIGFuZCBpbiB0aHkgY2hlZWtzLAogICAgQW5kIGRlYXRoJ3MgcGFsZSBmbGFnIGlzIG5vdCBhZHZhbmNlZCB0aGVyZS4KICAgIFR5YmFsdCwgbGllc3QgdGhvdSB0aGVyZSBpbiB0aHkgYmxvb2R5IHNoZWV0PwogICAgTywgd2hhdCBtb3JlIGZhdm91ciBjYW4gSSBkbyB0byB0aGVlLAogICAgVGhhbiB3aXRoIHRoYXQgaGFuZCB0aGF0IGN1dCB0aHkgeW91dGggaW4gdHdhaW4KICAgIFRvIHN1bmRlciBoaXMgdGhhdCB3YXMgdGhpbmUgZW5lbXkCiAgICBGb3JnaXZlIG1lLCBjb3VzaW4hIEFoLCBkZWFyIEp1bGlldCwKICAgIFdoeSBhcnQgdGhvdSB5ZXQgc28gZmFpcj8gc2hhbGwgSSBiZWxpZXZlCiAgICBUaGF0IHVuc3Vic3RhbnRpYWwgZGVhdGggaXMgYW1vcm91cywKICAgIEFuZCB0aGF0IHRoZSBsZWFuIGFiaG9ycmVkIG1vbnN0ZXIga2VlcHMKICAgIFRoZWUgaGVyZSBpbiBkYXJrIHRvIGJlIGhpcyBwYXJhbW91cj8KICAgIEZvciBmZWFyIG9mIHRoYXQsIEkgc3RpbGwgd2lsbCBzdGF5IHdpdGggdGhlZTsKICAgIEFuZCBuZXZlciBmcm9tIHRoaXMgcGFsYWNlIG9mIGRpbSBuaWdodAogICAgRGVwYXJ0IGFnYWluOiBoZXJlLCBoZXJlIHdpbGwgSSByZW1haW4KICAgIFdpdGggd29ybXMgdGhhdCBhcmUgdGh5IGNoYW1iZXItbWFpZHM7IE8sIGhlcmUKICAgIFdpbGwgSSBzZXQgdXAgbXkgZXZlcmxhc3RpbmcgcmVzdCwKICAgIEFuZCBzaGFrZSB0aGUgeW9rZSBvZiBpbmF1c3BpY2lvdXMgc3RhcnMKICAgIEZyb20gdGhpcyB3b3JsZC13ZWFyaWVkIGZsZXNoLiBFeWVzLCBsb29rIHlvdXIgbGFzdCEKICAgIEFybXMsIHRha2UgeW91ciBsYXN0IGVtYnJhY2UhIGFuZCwgbGlwcywgTyB5b3UKICAgIFRoZSBkb29ycyBvZiBicmVhdGgsIHNlYWwgd2l0aCBhIHJpZ2h0ZW91cyBraXNzCiAgICBBIGRhdGVsZXNzIGJhcmdhaW4gdG8gZW5ncm9zc2luZyBkZWF0aCEKICAgIENvbWUsIGJpdHRlciBjb25kdWN0LCBjb21lLCB1bnNhdm91cnkgZ3VpZGUhCiAgICBUaG91IGRlc3BlcmF0ZSBwaWxvdCwgbm93IGF0IG9uY2UgcnVuIG9uCiAgICBUaGUgZGFzaGluZyByb2NrcyB0aHkgc2VhLXNpY2sgd2VhcnkgYmFyayEKICAgIEhlcmUncyB0byBteSBsb3ZlIQoKICAgIERyaW5rcwogICAgTyB0cnVlIGFwb3RoZWNhcnkhCiAgICBUaHkgZHJ1Z3MgYXJlIHF1aWNrLiBUaHVzIHdpdGggYSBraXNzIEkgZGllLgoKICAgIERpZXMKCiAgICBFbnRlciwgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgY2h1cmNoeWFyZCwgRlJJQVIgTEFVUkVOQ0UsIHdpdGggYSBsYW50ZXJuLCBjcm93LCBhbmQgc3BhZGUKCkZSSUFSIExBVVJFTkNFCgogICAgU2FpbnQgRnJhbmNpcyBiZSBteSBzcGVlZCEgaG93IG9mdCB0by1uaWdodAogICAgSGF2ZSBteSBvbGQgZmVldCBzdHVtYmxlZCBhdCBncmF2ZXMhIFdobydzIHRoZXJlPwoKQkFMVEhBU0FSCgogICAgSGVyZSdzIG9uZSwgYSBmcmllbmQsIGFuZCBvbmUgdGhhdCBrbm93cyB5b3Ugd2VsbC4KCkZSSUFSIExBVVJFTkNFCgogICAgQmxpc3MgYmUgdXBvbiB5b3UhIFRlbGwgbWUsIGdvb2QgbXkgZnJpZW5kLAogICAgV2hhdCB0b3JjaCBpcyB5b25kLCB0aGF0IHZhaW5seSBsZW5kcyBoaXMgbGlnaHQKICAgIFRvIGdydWJzIGFuZCBleWVsZXNzIHNrdWxscz8gYXMgSSBkaXNjZXJuLAogICAgSXQgYnVybmV0aCBpbiB0aGUgQ2FwZWwncyBtb251bWVudC4KCkJBTFRIQVNBUgoKICAgIEl0IGRvdGggc28sIGhvbHkgc2lyOyBhbmQgdGhlcmUncyBteSBtYXN0ZXIsCiAgICBPbmUgdGhhdCB5b3UgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2hvIGlzIGl0PwoKQkFMVEhBU0FSCgogICAgUm9tZW8uCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvdyBsb25nIGhhdGggaGUgYmVlbiB0aGVyZT8KCkJBTFRIQVNBUgoKICAgIEZ1bGwgaGFsZiBhbiBob3VyLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHbyB3aXRoIG1lIHRvIHRoZSB2YXVsdC4KCkJBTFRIQVNBUgoKICAgIEkgZGFyZSBub3QsIHNpcgogICAgTXkgbWFzdGVyIGtub3dzIG5vdCBidXQgSSBhbSB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CwgYm95OiB3aGljaCB3YXkCgpKVUxJRVQKCiAgICBZZWEsIG5vaXNlPyB0aGVuIEknbGwgYmUgYnJpZWYuIE8gaGFwcHkgZGFnZ2VyIQoKICAgIFNuYXRjaGluZyBST01FTydzIGRhZ2dlcgogICAgVGhpcyBpcyB0aHkgc2hlYXRoOwoKICAgIFN0YWJzIGhlcnNlbGYKICAgIHRoZXJlIHJ1c3QsIGFuZCBsZXQgbWUgZGllLgoKICAgIEZhbGxzIG9uIFJPTUVPJ3MgYm9keSwgYW5kIGRpZXMKCiAgICBFbnRlciBXYXRjaCwgd2l0aCB0aGUgUGFnZSBvZiBQQVJJUwoKUEFHRQoKICAgIFRoaXMgaXMgdGhlIHBsYWNlOyB0aGVyZSwgd2hlcmUgdGhlIHRvcmNoIGRvdGggYnVybi4KCkZpcnN0IFdhdGNobWFuCgogICAgVGhlIGdyb3VuZCBpcyBibG9vZHk7IHNlYXJjaCBhYm91dCB0aGUgY2h1cmNoeWFyZDoKICAgIEdvLCBzb21lIG9mIHlvdSwgd2hvZSdlciB5b3UgZmluZCBhdHRhY2guCiAgICBQaXRpZnVsIHNpZ2h0ISBoZXJlIGxpZXMgdGhlIGNvdW50eSBzbGFpbiwKICAgIEFuZCBKdWxpZXQgYmxlZWRpbmcsIHdhcm0sIGFuZCBuZXdseSBkZWFkLAogICAgV2hvIGhlcmUgaGF0aCBsYWluIHRoZXNlIHR3byBkYXlzIGJ1cmllZC4KICAgIEdvLCB0ZWxsIHRoZSBwcmluY2U6IHJ1biB0byB0aGUgQ2FwdWxldHM6CiAgICBSYWlzZSB1cCB0aGUgTW9udGFndWVzOiBzb21lIG90aGVycyBzZWFyY2g6CiAgICBXZSBzZWUgdGhlIGdyb3VuZCB3aGVyZW9uIHRoZXNlIHdvZXMgZG8gbGllOwogICAgQnV0IHRoZSB0cnVlIGdyb3VuZCBvZiBhbGwgdGhlc2UgcGl0ZW91cyB3b2VzCiAgICBXZSBjYW5ub3Qgd2l0aG91dCBjaXJjdW1zdGFuY2UgZGVzY3J5LgoKICAgIFJlLWVudGVyIHNvbWUgb2YgdGhlIFdhdGNoLCB3aXRoIEJBTFRIQVNBUgoKU2Vjb25kIFdhdGNobWFuCgogICAgSGVyZSdzIFJvbWVvJ3MgbWFuOyB3ZSBmb3VuZCBoaW0gaW4gdGhlIGNodXJjaHlhcmQuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhvbGQgaGltIGluIHNhZmV0eSwgdGlsbCB0aGUgcHJpbmNlIGNvbWUgaGl0aGVyLgoKICAgIFJlLWVudGVyIG90aGVycyBvZiB0aGUgV2F0Y2gsIHdpdGggRlJJQVIgTEFVUkVOQ0UKClRoaXJkIFdhdGNobWFuCgogICAgSGVyZSBpcyBhIGZyaWFyLCB0aGF0IHRyZW1ibGVzLCBzaWdocyBhbmQgd2VlcHM6CiAgICBXZSB0b29rIHRoaXMgbWF0dG9jayBhbmQgdGhpcyBzcGFkZSBmcm9tIGhpbSwKICAgIEFzIGhlIHdhcyBjb21pbmcgZnJvbSB0aGlzIGNodXJjaHlhcmQgc2lkZS4KCkZpcnN0IFdhdGNobWFuCgogICAgQSBncmVhdCBzdXNwaWNpb246IHN0YXkgdGhlIGZyaWFyIHRvby4KCiAgICBFbnRlciB0aGUgUFJJTkNFIGFuZCBBdHRlbmRhbnRzCgpQUklOQ0UKCiAgICBXaGF0IG1pc2FkdmVudHVyZSBpcyBzbyBlYXJseSB1cCwKICAgIFRoYXQgY2FsbHMgb3VyIHBlcnNvbiBmcm9tIG91ciBtb3JuaW5nJ3MgcmVzdD8KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIGFuZCBvdGhlcnMKCkNBUFVMRVQKCiAgICBXaGF0IHNob3VsZCBpdCBiZSwgdGhhdCB0aGV5IHNvIHNocmllayBhYnJvYWQCgpMQURZIENBUFVMRVQKCiAgICBUaGUgcGVvcGxlIGluIHRoZSBzdHJlZXQgY3J5IFJvbWVvLAogICAgU29tZSBKdWxpZXQsIGFuZCBzb21lIFBhcmlzOyBhbmQgYWxsIHJ1biwKICAgIFdpdGggb3BlbiBvdXRjcnkgdG93YXJkIG91ciBtb251bWVudC4KClBSSU5DRQoKICAgIFdoYXQgZmVhciBpcyB0aGlzIHdoaWNoIHN0YXJ0bGVzIGluIG91ciBlYXJzPwoKRmlyc3QgV2F0Y2htYW4KCiAgICBTb3ZlcmVpZ24sIGhlcmUgbGllcyB0aGUgQ291bnR5IFBhcmlzIHNsYWluOwogICAgQW5kIFJvbWVvIGRlYWQ7IGFuZCBKdWxpZXQsIGRlYWQgYmVmb3JlLAogICAgV2FybSBhbmQgbmV3IGtpbGwnZC4KClBSSU5DRQoKICAgIFNlYXJjaCwgc2VlaywgYW5kIGtub3cgaG93IHRoaXMgZm91bCBtdXJkZXIgY29tZXMuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhlcmUgaXMgYSBmcmlhciwgYW5kIHNsYXVnaHRlcidkIFJvbWVvJ3MgbWFuOwogICAgV2l0aCBpbnN0cnVtZW50cyB1cG9uIHRoZW0sIGZpdCB0byBvcGVuCiAgICBUaGVzZSBkZWFkIG1lbidzIHRvbWJzLgoKQ0FQVUxFVAoKICAgIE8gaGVhdmVucyEgTyB3aWZlLCBsb29rIGhvdyBvdXIgZGF1Z2h0ZXIgYmxlZWRzIQogICAgVGhpcyBkYWdnZXIgaGF0aCBtaXN0YSdlbi0tZm9yLCBsbywgaGlzIGhvdXNlCiAgICBJcyBlbXB0eSBvbiB0aGUgYmFjayBvZiBNb250YWd1ZSwtLQogICAgQW5kIGl0IG1pcy1zaGVhdGhlZCBpbiBteSBkYXVnaHRlcidzIGJvc29tIQoKTEFEWSBDQVBVTEVUCgogICAgTyBtZSEgdGhpcyBzaWdodCBvZiBkZWF0aCBpcyBhcyBhIGJlbGwsCiAgICBUaGF0IHdhcm5zIG15IG9sZCBhZ2UgdG8gYSBzZXB1bGNocmUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIG90aGVycwoKUFJJTkNFCgogICAgQ29tZSwgTW9udGFndWU7IGZvciB0aG91IGFydCBlYXJseSB1cCwKICAgIFRvIHNlZSB0aHkgc29uIGFuZCBoZWlyIG1vcmUgZWFybHkgZG93bi4KCk1PTlRBR1VFCgogICAgQWxhcywgbXkgbGllZ2UsIG15IHdpZmUgaXMgZGVhZCB0by1uaWdodDsKICAgIEdyaWVmIG9mIG15IHNvbidzIGV4aWxlIGhhdGggc3RvcHAnZCBoZXIgYnJlYXRoOgogICAgV2hhdCBmdXJ0aGVyIHdvZSBjb25zcGlyZXMgYWdhaW5zdCBtaW5lIGFnZT8KClBSSU5DRQoKICAgIExvb2ssIGFuZCB0aG91IHNoYWx0IHNlZS4KCk1PTlRBR1VFCgogICAgTyB0aG91IHVudGF1Z2h0ISB3aGF0IG1hbm5lcnMgaXMgaW4gdGhpcz8KICAgIFRvIHByZXNzIGJlZm9yZSB0aHkgZmF0aGVyIHRvIGEgZ3JhdmUCgpQUklOQ0UKCiAgICBTZWFsIHVwIHRoZSBtb3V0aCBvZiBvdXRyYWdlIGZvciBhIHdoaWxlLAogICAgVGlsbCB3ZSBjYW4gY2xlYXIgdGhlc2UgYW1iaWd1aXRpZXMsCiAgICBBbmQga25vdyB0aGVpciBzcHJpbmcsIHRoZWlyIGhlYWQsIHRoZWlyCiAgICB0cnVlIGRlc2NlbnQ7CiAgICBBbmQgdGhlbiB3aWxsIEkgYmUgZ2VuZXJhbCBvZiB5b3VyIHdvZXMsCiAgICBBbmQgbGVhZCB5b3UgZXZlbiB0byBkZWF0aDogbWVhbnRpbWUgZm9yYmVhciwKICAgIEFuZCBsZXQgbWlzY2hhbmNlIGJlIHNsYXZlIHRvIHBhdGllbmNlLgogICAgQnJpbmcgZm9ydGggdGhlIHBhcnRpZXMgb2Ygc3VzcGljaW9uLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJIGFtIHRoZSBncmVhdGVzdCwgYWJsZSB0byBkbyBsZWFzdCwKICAgIFlldCBtb3N0IHN1c3BlY3RlZCwgYXMgdGhlIHRpbWUgYW5kIHBsYWNlCiAgICBEb3RoIG1ha2UgYWdhaW5zdCBtZSBvZiB0aGlzIGRpcmVmdWwgbXVyZGVyOwogICAgQW5kIGhlcmUgSSBzdGFuZCwgYm90aCB0byBpbXBlYWNoIGFuZCBwdXJnZQogICAgTXlzZWxmIGNvbmRlbW5lZCBhbmQgbXlzZWxmIGV4Y3VzZWQuCgpQUklOQ0UKCiAgICBUaGVuIHNheSBhdCBvbmNlIHdoYXQgdGhvdSBkb3N0IGtub3cgaW4gdGhpcy4KCkZSSUFSIExBVVJFTkNFCgogICAgSSB3aWxsIGJlIGJyaWVmLCBmb3IgbXkgc2hvcnQgZGF0ZSBvZiBicmVhdGgKICAgIElzIG5vdCBzbyBsb25nIGFzIGlzIGEgdGVkaW91cyB0YWxlLgogICAgUm9tZW8sIHRoZXJlIGRlYWQsIHdhcyBodXNiYW5kIHRvIHRoYXQgSnVsaWV0OwogICAgQW5kIHNoZSwgdGhlcmUgZGVhZCwgdGhhdCBSb21lbydzIGZhaXRoZnVsIHdpZmU6CiAgICBJIG1hcnJpZWQgdGhlbTsgYW5kIHRoZWlyIHN0b2wnbiBtYXJyaWFnZS1kYXkKICAgIFdhcyBUeWJhbHQncyBkb29tcy1kYXksIHdob3NlIHVudGltZWx5IGRlYXRoCiAgICBCYW5pc2gnZCB0aGUgbmV3LW1hZGUgYnJpZGVncm9vbSBmcm9tIHRoZSBjaXR5LAogICAgRm9yIHdob20sIGFuZCBub3QgZm9yIFR5YmFsdCwgSnVsaWV0IHBpbmVkLgogICAgWW91LCB0byByZW1vdmUgdGhhdCBzaWVnZSBvZiBncmllZiBmcm9tIGhlciwKICAgIEJldHJvdGgnZCBhbmQgd291bGQgaGF2ZSBtYXJyaWVkIGhlciBwZXJmb3JjZQogICAgVG8gQ291bnR5IFBhcmlzOiB0aGVuIGNvbWVzIHNoZSB0byBtZSwKICAgIEFuZCwgd2l0aCB3aWxkIGxvb2tzLCBiaWQgbWUgZGV2aXNlIHNvbWUgbWVhbgogICAgVG8gcmlkIGhlciBmcm9tIHRoaXMgc2Vjb25kIG1hcnJpYWdlLAogICAgT3IgaW4gbXkgY2VsbCB0aGVyZSB3b3VsZCBzaGUga2lsbCBoZXJzZWxmLgogICAgVGhlbiBnYXZlIEkgaGVyLCBzbyB0dXRvcidkIGJ5IG15IGFydCwKICAgIEEgc2xlZXBpbmcgcG90aW9uOyB3aGljaCBzbyB0b29rIGVmZmVjdAogICAgQXMgSSBpbnRlbmRlZCwgZm9yIGl0IHdyb3VnaHQgb24gaGVyCiAgICBUaGUgZm9ybSBvZiBkZWF0aDogbWVhbnRpbWUgSSB3cml0IHRvIFJvbWVvLAogICAgVGhhdCBoZSBzaG91bGQgaGl0aGVyIGNvbWUgYXMgdGhpcyBkaXJlIG5pZ2h0LAogICAgVG8gaGVscCB0byB0YWtlIGhlciBmcm9tIGhlciBib3Jyb3cnZCBncmF2ZSwKICAgIEJlaW5nIHRoZSB0aW1lIHRoZSBwb3Rpb24ncyBmb3JjZSBzaG91bGQgY2Vhc2UuCiAgICBCdXQgaGUgd2hpY2ggYm9yZSBteSBsZXR0ZXIsIEZyaWFyIEpvaG4sCiAgICBXYXMgc3RheSdkIGJ5IGFjY2lkZW50LCBhbmQgeWVzdGVybmlnaHQKICAgIFJldHVybidkIG15IGxldHRlciBiYWNrLiBUaGVuIGFsbCBhbG9uZQogICAgQXQgdGhlIHByZWZpeGVkIGhvdXIgb2YgaGVyIHdha2luZywKICAgIENhbWUgSSB0byB0YWtlIGhlciBmcm9tIGhlciBraW5kcmVkJ3MgdmF1bHQ7CiAgICBNZWFuaW5nIHRvIGtlZXAgaGVyIGNsb3NlbHkgYXQgbXkgY2VsbCwKICAgIFRpbGwgSSBjb252ZW5pZW50bHkgY291bGQgc2VuZCB0byBSb21lbzoKICAgIEJ1dCB3aGVuIEkgY2FtZSwgc29tZSBtaW51dGUgZXJlIHRoZSB0aW1lCiAgICBPZiBoZXIgYXdha2luZywgaGVyZSB1bnRpbWVseSBsYXkKICAgIFRoZSBub2JsZSBQYXJpcyBhbmQgdHJ1ZSBSb21lbyBkZWFkLgogICAgU2hlIHdha2VzOyBhbmQgSSBlbnRyZWF0ZWQgaGVyIGNvbWUgZm9ydGgsCiAgICBBbmQgYmVhciB0aGlzIHdvcmsgb2YgaGVhdmVuIHdpdGggcGF0aWVuY2U6CiAgICBCdXQgdGhlbiBhIG5vaXNlIGRpZCBzY2FyZSBtZSBmcm9tIHRoZSB0b21iOwogICAgQW5kIHNoZSwgdG9vIGRlc3BlcmF0ZSwgd291bGQgbm90IGdvIHdpdGggbWUsCiAgICBCdXQsIGFzIGl0IHNlZW1zLCBkaWQgdmlvbGVuY2Ugb24gaGVyc2VsZi4KICAgIEFsbCB0aGlzIEkga25vdzsgYW5kIHRvIHRoZSBtYXJyaWFnZQogICAgSGVyIG51cnNlIGlzIHByaXZ5OiBhbmQsIGlmIGF1Z2h0IGluIHRoaXMKICAgIE1pc2NhcnJpZWQgYnkgbXkgZmF1bHQsIGxldCBteSBvbGQgbGlmZQogICAgQmUgc2FjcmlmaWNlZCwgc29tZSBob3VyIGJlZm9yZSBoaXMgdGltZSwKICAgIFVudG8gdGhlIHJpZ291ciBvZiBzZXZlcmVzdCBsYXcuCgpQUklOQ0UKCiAgICBXZSBzdGlsbCBoYXZlIGtub3duIHRoZWUgZm9yIGEgaG9seSBtYW4uCiAgICBXaGVyZSdzIFJvbWVvJ3MgbWFuPyB3aGF0IGNhbiBoZSBzYXkgaW4gdGhpcz8KCkJBTFRIQVNBUgoKICAgIEkgYnJvdWdodCBteSBtYXN0ZXIgbmV3cyBvZiBKdWxpZXQncyBkZWF0aDsKICAgIEFuZCB0aGVuIGluIHBvc3QgaGUgY2FtZSBmcm9tIE1hbnR1YQogICAgVG8gdGhpcyBzYW1lIHBsYWNlLCB0byB0aGlzIHNhbWUgbW9udW1lbnQuCiAgICBUaGlzIGxldHRlciBoZSBlYXJseSBiaWQgbWUgZ2l2ZSBoaXMgZmF0aGVyLAogICAgQW5kIHRocmVhdGVuZWQgbWUgd2l0aCBkZWF0aCwgZ29pbmcgaW4gdGhlIHZhdWx0LAogICAgSSBkZXBhcnRlZCBub3QgYW5kIGxlZnQgaGltIHRoZXJlLgoKUFJJTkNFCgogICAgR2l2ZSBtZSB0aGUgbGV0dGVyOyBJIHdpbGwgbG9vayBvbiBpdC4KICAgIFdoZXJlIGlzIHRoZSBjb3VudHkncyBwYWdlLCB0aGF0IHJhaXNlZCB0aGUgd2F0Y2gCiAgICBTaXJyYWgsIHdoYXQgbWFkZSB5b3VyIG1hc3RlciBpbiB0aGlzIHBsYWNlPwoKUEFHRQoKICAgIEhlIGNhbWUgd2l0aCBmbG93ZXJzIHRvIHN0cmV3IGhpcyBsYWR5J3MgZ3JhdmU7CiAgICBBbmQgYmlkIG1lIHN0YW5kIGFsb29mLCBhbmQgc28gSSBkaWQ6CiAgICBBbm9uIGNvbWVzIG9uZSB3aXRoIGxpZ2h0IHRvIG9wZSB0aGUgdG9tYjsKICAgIEFuZCBieSBhbmQgYnkgbXkgbWFzdGVyIGRyZXcgb24gaGltOwogICAgQW5kIHRoZW4gSSByYW4gYXdheSB0byBjYWxsIHRoZSB3YXRjaC4KClBSSU5DRQoKICAgIFRoaXMgbGV0dGVyIGRvdGggbWFrZSBnb29kIHRoZSBmcmlhcidzIHdvcmRzLAogICAgVGhlaXIgY291cnNlIG9mIGxvdmUsIHRoZSB0aWRpbmdzIG9mIGhlciBkZWF0aDoKICAgIEFuZCBoZXJlIGhlIHdyaXRlcyB0aGF0IGhlIGRpZCBidXkgYSBwb2lzb24KICAgIE9mIGEgcG9vciAncG90aGVjYXJ5LCBhbmQgdGhlcmV3aXRoYWwKICAgIENhbWUgdG8gdGhpcyB2YXVsdCB0byBkaWUsIGFuZCBsaWUgd2l0aCBKdWxpZXQuCiAgICBXaGVyZSBiZSB0aGVzZSBlbmVtaWVzPyBDYXB1bGV0ISBNb250YWd1ZSEKICAgIFNlZSwgd2hhdCBhIHNjb3VyZ2UgaXMgbGFpZCB1cG9uIHlvdXIgaGF0ZSwKICAgIFRoYXQgaGVhdmVuIGZpbmRzIG1lYW5zIHRvIGtpbGwgeW91ciBqb3lzIHdpdGggbG92ZS4KICAgIEFuZCBJIGZvciB3aW5raW5nIGF0IHlvdXIgZGlzY29yZHMgdG9vCiAgICBIYXZlIGxvc3QgYSBicmFjZSBvZiBraW5zbWVuOiBhbGwgYXJlIHB1bmlzaCdkLgoKQ0FQVUxFVAoKICAgIE8gYnJvdGhlciBNb250YWd1ZSwgZ2l2ZSBtZSB0aHkgaGFuZDoKICAgIFRoaXMgaXMgbXkgZGF1Z2h0ZXIncyBqb2ludHVyZSwgZm9yIG5vIG1vcmUKICAgIENhbiBJIGRlbWFuZC4KCk1PTlRBR1VFCgogICAgQnV0IEkgY2FuIGdpdmUgdGhlZSBtb3JlOgogICAgRm9yIEkgd2lsbCByYWlzZSBoZXIgc3RhdHVlIGluIHB1cmUgZ29sZDsKICAgIFRoYXQgd2hpbGUgVmVyb25hIGJ5IHRoYXQgbmFtZSBpcyBrbm93biwKICAgIFRoZXJlIHNoYWxsIG5vIGZpZ3VyZSBhdCBzdWNoIHJhdGUgYmUgc2V0CiAgICBBcyB0aGF0IG9mIHRydWUgYW5kIGZhaXRoZnVsIEp1bGlldC4KCkNBUFVMRVQKCiAgICBBcyByaWNoIHNoYWxsIFJvbWVvJ3MgYnkgaGlzIGxhZHkncyBsaWU7CiAgICBQb29yIHNhY3JpZmljZXMgb2Ygb3VyIGVubWl0eSEKClBSSU5DRQoKICAgIEEgZ2xvb21pbmcgcGVhY2UgdGhpcyBtb3JuaW5nIHdpdGggaXQgYnJpbmdzOwogICAgVGhlIHN1biwgZm9yIHNvcnJvdywgd2lsbCBub3Qgc2hvdyBoaXMgaGVhZDoKICAgIEdvIGhlbmNlLCB0byBoYXZlIG1vcmUgdGFsayBvZiB0aGVzZSBzYWQgdGhpbmdzOwogICAgU29tZSBzaGFsbCBiZSBwYXJkb24nZCwgYW5kIHNvbWUgcHVuaXNoZWQ6CiAgICBGb3IgbmV2ZXIgd2FzIGEgc3Rvcnkgb2YgbW9yZSB3b2UKICAgIFRoYW4gdGhpcyBvZiBKdWxpZXQgYW5kIGhlciBSb21lby4KCiAgICBFeGV1bnQK

Chuck Cartledge
Chuck Cartledge
Chuck Cartledge

httpantonio-ferraroeupnword-clouds-in-r-packages-wordcloud2-and-tmrm(list=ls())library(wordcloud2)library(NLP)library(tm)library(RCurl) Necessary steps 1 Use imagesgooglecom to find an outline of the shape to fill (tmpusapng) 2 Use gimp to fill the outline with black 3 Use a command like wordcloud2(TDMasDF size = 20 figPath=tmpusapng backgroundColor = white fontFamily=Loma) to populate shape 4 Result is a web page with javascript embedded to create image and allow mouse overs Clean corpuscleanCorpus lt- function(corpus) corpustmp lt- tm_map(corpus removePunctuation) corpustmp lt- tm_map(corpustmpstripWhitespace) corpustmp lt- tm_map(corpustmptolower) corpustmp lt- tm_map(corpustmp PlainTextDocument) corpustmp lt- tm_map(corpustmpremoveWords stopwords(english)) return(corpustmp) Build TDMgenerateTDM lt- function(path) sdir lt-path scor lt-Corpus(DirSource(directory = sdir encoding= UTF-8)) scorcl lt- cleanCorpus(scor) stdm lt- TermDocumentMatrix(scorcl) stdminitData lt- function(path) if (direxists(path) == FALSE) If the directory does not exist create and populate with dummy data dummyDataFile lt- romeoAndJulietbase64 fileName lt- sprintf(sdummyDatatxt path) print(sprintf(Creating and populating the file s with dummy data fileName)) dircreate(path recursive = TRUE) write(base64( paste( readLines(dummyDataFile) collapse=) encode=FALSE) file=fileName) main lt- function() options(stringsAsFactors = FALSE) The working directory pathName lt- Text initData(pathName) Get the Term Document Matrix TDM lt- generateTDM(pathName) Do I need a matrix or a DF We will see TDMasMatrix lt- asmatrix(TDM) TDMasDFlt-dataframe(TDMasMatrix) TDMasDF$words lt-rownames(TDMasDF) Column headers colnames(TDMasDF) lt- c(freq word) TDMasDFlt-TDMasDF[ c(word freq)] TDMasDF lt- TDMasDF[order(TDMasDF$freqdecreasing=TRUE)] The results a lt- wordcloud2(TDMasDF size = 03 shape=star backgroundColor = black fontFamily=Loma) print(a) a lt- letterCloud(TDMasDF word=USA size = 03 fontFamily=Loma backgroundColor = black) print(a) a lt- wordcloud2(TDMasDF size = 13 figPath=heartpng backgroundColor = white fontFamily=Loma color=red) print(a) TDMasDF$freq lt- log(TDMasDF$freq) a lt- wordcloud2(TDMasDF size = 12 figPath=usapng backgroundColor = white shuffle=FALSE minRotation = 0 maxRotation = 2pi) print(a) print(The program has ended)main()

Chuck Cartledge
Page 6: Creating Shaped Wordclouds Using R - clc-ent.comThe wordcloud2 function behaves slightly di erently than most of the other R plot func-tions that I’ve used. The result from both

Figure 4 A filled word cloud figure

5

Figure 5 A filled USA word cloud figure

The wordcloud2 function behaves slightly differently than most of the other R plot func-tions that Irsquove used The result from both wordcloud2 and letterCloud is not displayablewithin R These functions actually create an HTML page in a temporary directory with em-bedded JavaScript that performs the placement of the words within the shape and providesa level of interaction after the page is displayed R ldquounderstandsrdquo that the product fromthese functions is an HTML widget and starts up the default browser to show the page Thepage and its sub-directories are removed when R ends

The fact that the page uses JavaScript introduces some interesting aspects Buried in theJavaScript used by the page to place the words in the cloud are a plethora of Mathrandom()calls The JavaScript specification says that the Mathrandom() function has to return avalue greater than or equal to 0 and less than 1 which is reasonable for a random functionThe specification also says that the implementation of the random function is up to theJavaScript application and does not specify how the numbers are to be generated Meaningthat the same HTML page being viewed by two different browsers may generate two differentsequences of random numbers Most random number generators have the capability of settinga seed value so that a repeatable sequence can be generated JavaScript does not supportthe idea of a random number seed The HTML page and collection of directories can bemoved to a server where they are available for use and support

All of this means that each loading and viewing of the page will generate a different

1Available fromhttpsgithubcomLchiffonwordcloud2

6

image and there is no practical way to ldquoget backrdquo to an image that was goodIn the Files section (see Section A on page 9) is an R script and support files to work

with The R script was used to create various images (see Figure 6 on the following page)

3 Conclusion

The wordcloud2 library enables you to create word clouds of arbitrary shape inside an HTMLusing JavaScript to position and orient each word Each HTML page and its associatedlibrary files are placed in individual directories that are removed when the creating R processterminates Pages and files can be moved or copied for safe keeping if desired Because thepages use the Mathrandom() JavaScript function each time the page is loaded words willbe positioned differently in the cloud If the desired shape has an internal hole then it ispossible that some words may not be placed in the cloud

wordcloud2 allows you to create word clouds to support your data visualization needs

7

(a) A heart

(b) The letters ldquoUSArdquo

(c) A star

(d) The USA

Figure 6 A collection of sample word clouds These images were created with the attachedR script

8

A Misc files

The files used to create all these figures are attached to this report They are

1 romeoAndJulietbase64 ndash default text used to demonstrate the software

2 heartpng ndash a heart shape with a hole

3 usapng ndash an outline of the continental United States

4 wordCloudR ndash an R script to demonstrate making word clouds

9

ClJvbWVvIGFuZCBKdWxpZXQKU2hha2VzcGVhcmUgaG9tZXBhZ2UgfCBSb21lbyBhbmQgSnVsaWV0IHwgRW50aXJlIHBsYXkKQUNUIEkKUFJPTE9HVUUKCiAgICBUd28gaG91c2Vob2xkcywgYm90aCBhbGlrZSBpbiBkaWduaXR5LAogICAgSW4gZmFpciBWZXJvbmEsIHdoZXJlIHdlIGxheSBvdXIgc2NlbmUsCiAgICBGcm9tIGFuY2llbnQgZ3J1ZGdlIGJyZWFrIHRvIG5ldyBtdXRpbnksCiAgICBXaGVyZSBjaXZpbCBibG9vZCBtYWtlcyBjaXZpbCBoYW5kcyB1bmNsZWFuLgogICAgRnJvbSBmb3J0aCB0aGUgZmF0YWwgbG9pbnMgb2YgdGhlc2UgdHdvIGZvZXMKICAgIEEgcGFpciBvZiBzdGFyLWNyb3NzJ2QgbG92ZXJzIHRha2UgdGhlaXIgbGlmZTsKICAgIFdob3NlIG1pc2FkdmVudHVyZWQgcGl0ZW91cyBvdmVydGhyb3dzCiAgICBEbyB3aXRoIHRoZWlyIGRlYXRoIGJ1cnkgdGhlaXIgcGFyZW50cycgc3RyaWZlLgogICAgVGhlIGZlYXJmdWwgcGFzc2FnZSBvZiB0aGVpciBkZWF0aC1tYXJrJ2QgbG92ZSwKICAgIEFuZCB0aGUgY29udGludWFuY2Ugb2YgdGhlaXIgcGFyZW50cycgcmFnZSwKICAgIFdoaWNoLCBidXQgdGhlaXIgY2hpbGRyZW4ncyBlbmQsIG5vdWdodCBjb3VsZCByZW1vdmUsCiAgICBJcyBub3cgdGhlIHR3byBob3VycycgdHJhZmZpYyBvZiBvdXIgc3RhZ2U7CiAgICBUaGUgd2hpY2ggaWYgeW91IHdpdGggcGF0aWVudCBlYXJzIGF0dGVuZCwKICAgIFdoYXQgaGVyZSBzaGFsbCBtaXNzLCBvdXIgdG9pbCBzaGFsbCBzdHJpdmUgdG8gbWVuZC4KClNDRU5FIEkuIFZlcm9uYS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgU0FNUFNPTiBhbmQgR1JFR09SWSwgb2YgdGhlIGhvdXNlIG9mIENhcHVsZXQsIGFybWVkIHdpdGggc3dvcmRzIGFuZCBidWNrbGVycyAKClNBTVBTT04KCiAgICBHcmVnb3J5LCBvJyBteSB3b3JkLCB3ZSdsbCBub3QgY2FycnkgY29hbHMuCgpHUkVHT1JZCgogICAgTm8sIGZvciB0aGVuIHdlIHNob3VsZCBiZSBjb2xsaWVycy4KClNBTVBTT04KCiAgICBJIG1lYW4sIGFuIHdlIGJlIGluIGNob2xlciwgd2UnbGwgZHJhdy4KCkdSRUdPUlkKCiAgICBBeSwgd2hpbGUgeW91IGxpdmUsIGRyYXcgeW91ciBuZWNrIG91dCBvJyB0aGUgY29sbGFyLgoKU0FNUFNPTgoKICAgIEkgc3RyaWtlIHF1aWNrbHksIGJlaW5nIG1vdmVkLgoKR1JFR09SWQoKICAgIEJ1dCB0aG91IGFydCBub3QgcXVpY2tseSBtb3ZlZCB0byBzdHJpa2UuCgpTQU1QU09OCgogICAgQSBkb2cgb2YgdGhlIGhvdXNlIG9mIE1vbnRhZ3VlIG1vdmVzIG1lLgoKR1JFR09SWQoKICAgIFRvIG1vdmUgaXMgdG8gc3RpcjsgYW5kIHRvIGJlIHZhbGlhbnQgaXMgdG8gc3RhbmQ6CiAgICB0aGVyZWZvcmUsIGlmIHRob3UgYXJ0IG1vdmVkLCB0aG91IHJ1bm4nc3QgYXdheS4KClNBTVBTT04KCiAgICBBIGRvZyBvZiB0aGF0IGhvdXNlIHNoYWxsIG1vdmUgbWUgdG8gc3RhbmQ6IEkgd2lsbAogICAgdGFrZSB0aGUgd2FsbCBvZiBhbnkgbWFuIG9yIG1haWQgb2YgTW9udGFndWUncy4KCkdSRUdPUlkKCiAgICBUaGF0IHNob3dzIHRoZWUgYSB3ZWFrIHNsYXZlOyBmb3IgdGhlIHdlYWtlc3QgZ29lcwogICAgdG8gdGhlIHdhbGwuCgpTQU1QU09OCgogICAgVHJ1ZTsgYW5kIHRoZXJlZm9yZSB3b21lbiwgYmVpbmcgdGhlIHdlYWtlciB2ZXNzZWxzLAogICAgYXJlIGV2ZXIgdGhydXN0IHRvIHRoZSB3YWxsOiB0aGVyZWZvcmUgSSB3aWxsIHB1c2gKICAgIE1vbnRhZ3VlJ3MgbWVuIGZyb20gdGhlIHdhbGwsIGFuZCB0aHJ1c3QgaGlzIG1haWRzCiAgICB0byB0aGUgd2FsbC4KCkdSRUdPUlkKCiAgICBUaGUgcXVhcnJlbCBpcyBiZXR3ZWVuIG91ciBtYXN0ZXJzIGFuZCB1cyB0aGVpciBtZW4uCgpTQU1QU09OCgogICAgJ1RpcyBhbGwgb25lLCBJIHdpbGwgc2hvdyBteXNlbGYgYSB0eXJhbnQ6IHdoZW4gSQogICAgaGF2ZSBmb3VnaHQgd2l0aCB0aGUgbWVuLCBJIHdpbGwgYmUgY3J1ZWwgd2l0aCB0aGUKICAgIG1haWRzLCBhbmQgY3V0IG9mZiB0aGVpciBoZWFkcy4KCkdSRUdPUlkKCiAgICBUaGUgaGVhZHMgb2YgdGhlIG1haWRzPwoKU0FNUFNPTgoKICAgIEF5LCB0aGUgaGVhZHMgb2YgdGhlIG1haWRzLCBvciB0aGVpciBtYWlkZW5oZWFkczsKICAgIHRha2UgaXQgaW4gd2hhdCBzZW5zZSB0aG91IHdpbHQuCgpHUkVHT1JZCgogICAgVGhleSBtdXN0IHRha2UgaXQgaW4gc2Vuc2UgdGhhdCBmZWVsIGl0LgoKU0FNUFNPTgoKICAgIE1lIHRoZXkgc2hhbGwgZmVlbCB3aGlsZSBJIGFtIGFibGUgdG8gc3RhbmQ6IGFuZAogICAgJ3RpcyBrbm93biBJIGFtIGEgcHJldHR5IHBpZWNlIG9mIGZsZXNoLgoKR1JFR09SWQoKICAgICdUaXMgd2VsbCB0aG91IGFydCBub3QgZmlzaDsgaWYgdGhvdSBoYWRzdCwgdGhvdQogICAgaGFkc3QgYmVlbiBwb29yIEpvaG4uIERyYXcgdGh5IHRvb2whIGhlcmUgY29tZXMKICAgIHR3byBvZiB0aGUgaG91c2Ugb2YgdGhlIE1vbnRhZ3Vlcy4KClNBTVBTT04KCiAgICBNeSBuYWtlZCB3ZWFwb24gaXMgb3V0OiBxdWFycmVsLCBJIHdpbGwgYmFjayB0aGVlLgoKR1JFR09SWQoKICAgIEhvdyEgdHVybiB0aHkgYmFjayBhbmQgcnVuPwoKU0FNUFNPTgoKICAgIEZlYXIgbWUgbm90LgoKR1JFR09SWQoKICAgIE5vLCBtYXJyeTsgSSBmZWFyIHRoZWUhCgpTQU1QU09OCgogICAgTGV0IHVzIHRha2UgdGhlIGxhdyBvZiBvdXIgc2lkZXM7IGxldCB0aGVtIGJlZ2luLgoKR1JFR09SWQoKICAgIEkgd2lsbCBmcm93biBhcyBJIHBhc3MgYnksIGFuZCBsZXQgdGhlbSB0YWtlIGl0IGFzCiAgICB0aGV5IGxpc3QuCgpTQU1QU09OCgogICAgTmF5LCBhcyB0aGV5IGRhcmUuIEkgd2lsbCBiaXRlIG15IHRodW1iIGF0IHRoZW07CiAgICB3aGljaCBpcyBhIGRpc2dyYWNlIHRvIHRoZW0sIGlmIHRoZXkgYmVhciBpdC4KCiAgICBFbnRlciBBQlJBSEFNIGFuZCBCQUxUSEFTQVIKCkFCUkFIQU0KCiAgICBEbyB5b3UgYml0ZSB5b3VyIHRodW1iIGF0IHVzLCBzaXICgpTQU1QU09OCgogICAgSSBkbyBiaXRlIG15IHRodW1iLCBzaXIuCgpBQlJBSEFNCgogICAgRG8geW91IGJpdGUgeW91ciB0aHVtYiBhdCB1cywgc2lyPwoKU0FNUFNPTgoKICAgIFtBc2lkZSB0byBHUkVHT1JZXSBJcyB0aGUgbGF3IG9mIG91ciBzaWRlLCBpZiBJIHNheQogICAgYXkCgpHUkVHT1JZCgogICAgTm8uCgpTQU1QU09OCgogICAgTm8sIHNpciwgSSBkbyBub3QgYml0ZSBteSB0aHVtYiBhdCB5b3UsIHNpciwgYnV0IEkKICAgIGJpdGUgbXkgdGh1bWIsIHNpci4KCkdSRUdPUlkKCiAgICBEbyB5b3UgcXVhcnJlbCwgc2lyPwoKQUJSQUhBTQoKICAgIFF1YXJyZWwgc2lyISBubywgc2lyLgoKU0FNUFNPTgoKICAgIElmIHlvdSBkbywgc2lyLCBJIGFtIGZvciB5b3U6IEkgc2VydmUgYXMgZ29vZCBhIG1hbiBhcyB5b3UuCgpBQlJBSEFNCgogICAgTm8gYmV0dGVyLgoKU0FNUFNPTgoKICAgIFdlbGwsIHNpci4KCkdSRUdPUlkKCiAgICBTYXkgJ2JldHRlcjonIGhlcmUgY29tZXMgb25lIG9mIG15IG1hc3RlcidzIGtpbnNtZW4uCgpTQU1QU09OCgogICAgWWVzLCBiZXR0ZXIsIHNpci4KCkFCUkFIQU0KCiAgICBZb3UgbGllLgoKU0FNUFNPTgoKICAgIERyYXcsIGlmIHlvdSBiZSBtZW4uIEdyZWdvcnksIHJlbWVtYmVyIHRoeSBzd2FzaGluZyBibG93LgoKICAgIFRoZXkgZmlnaHQKCiAgICBFbnRlciBCRU5WT0xJTwoKQkVOVk9MSU8KCiAgICBQYXJ0LCBmb29scyEKICAgIFB1dCB1cCB5b3VyIHN3b3JkczsgeW91IGtub3cgbm90IHdoYXQgeW91IGRvLgoKICAgIEJlYXRzIGRvd24gdGhlaXIgc3dvcmRzCgogICAgRW50ZXIgVFlCQUxUCgpUWUJBTFQKCiAgICBXaGF0LCBhcnQgdGhvdSBkcmF3biBhbW9uZyB0aGVzZSBoZWFydGxlc3MgaGluZHMCiAgICBUdXJuIHRoZWUsIEJlbnZvbGlvLCBsb29rIHVwb24gdGh5IGRlYXRoLgoKQkVOVk9MSU8KCiAgICBJIGRvIGJ1dCBrZWVwIHRoZSBwZWFjZTogcHV0IHVwIHRoeSBzd29yZCwKICAgIE9yIG1hbmFnZSBpdCB0byBwYXJ0IHRoZXNlIG1lbiB3aXRoIG1lLgoKVFlCQUxUCgogICAgV2hhdCwgZHJhd24sIGFuZCB0YWxrIG9mIHBlYWNlISBJIGhhdGUgdGhlIHdvcmQsCiAgICBBcyBJIGhhdGUgaGVsbCwgYWxsIE1vbnRhZ3VlcywgYW5kIHRoZWU6CiAgICBIYXZlIGF0IHRoZWUsIGNvd2FyZCEKCiAgICBUaGV5IGZpZ2h0CgogICAgRW50ZXIsIHNldmVyYWwgb2YgYm90aCBob3VzZXMsIHdobyBqb2luIHRoZSBmcmF5OyB0aGVuIGVudGVyIENpdGl6ZW5zLCB3aXRoIGNsdWJzCgpGaXJzdCBDaXRpemVuCgogICAgQ2x1YnMsIGJpbGxzLCBhbmQgcGFydGlzYW5zISBzdHJpa2UhIGJlYXQgdGhlbSBkb3duIQogICAgRG93biB3aXRoIHRoZSBDYXB1bGV0cyEgZG93biB3aXRoIHRoZSBNb250YWd1ZXMhCgogICAgRW50ZXIgQ0FQVUxFVCBpbiBoaXMgZ293biwgYW5kIExBRFkgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgdGhpcz8gR2l2ZSBtZSBteSBsb25nIHN3b3JkLCBobyEKCkxBRFkgQ0FQVUxFVAoKICAgIEEgY3J1dGNoLCBhIGNydXRjaCEgd2h5IGNhbGwgeW91IGZvciBhIHN3b3JkPwoKQ0FQVUxFVAoKICAgIE15IHN3b3JkLCBJIHNheSEgT2xkIE1vbnRhZ3VlIGlzIGNvbWUsCiAgICBBbmQgZmxvdXJpc2hlcyBoaXMgYmxhZGUgaW4gc3BpdGUgb2YgbWUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIExBRFkgTU9OVEFHVUUKCk1PTlRBR1VFCgogICAgVGhvdSB2aWxsYWluIENhcHVsZXQsLS1Ib2xkIG1lIG5vdCwgbGV0IG1lIGdvLgoKTEFEWSBNT05UQUdVRQoKICAgIFRob3Ugc2hhbHQgbm90IHN0aXIgYSBmb290IHRvIHNlZWsgYSBmb2UuCgogICAgRW50ZXIgUFJJTkNFLCB3aXRoIEF0dGVuZGFudHMKClBSSU5DRQoKICAgIFJlYmVsbGlvdXMgc3ViamVjdHMsIGVuZW1pZXMgdG8gcGVhY2UsCiAgICBQcm9mYW5lcnMgb2YgdGhpcyBuZWlnaGJvdXItc3RhaW5lZCBzdGVlbCwtLQogICAgV2lsbCB0aGV5IG5vdCBoZWFyPyBXaGF0LCBobyEgeW91IG1lbiwgeW91IGJlYXN0cywKICAgIFRoYXQgcXVlbmNoIHRoZSBmaXJlIG9mIHlvdXIgcGVybmljaW91cyByYWdlCiAgICBXaXRoIHB1cnBsZSBmb3VudGFpbnMgaXNzdWluZyBmcm9tIHlvdXIgdmVpbnMsCiAgICBPbiBwYWluIG9mIHRvcnR1cmUsIGZyb20gdGhvc2UgYmxvb2R5IGhhbmRzCiAgICBUaHJvdyB5b3VyIG1pc3RlbXBlcidkIHdlYXBvbnMgdG8gdGhlIGdyb3VuZCwKICAgIEFuZCBoZWFyIHRoZSBzZW50ZW5jZSBvZiB5b3VyIG1vdmVkIHByaW5jZS4KICAgIFRocmVlIGNpdmlsIGJyYXdscywgYnJlZCBvZiBhbiBhaXJ5IHdvcmQsCiAgICBCeSB0aGVlLCBvbGQgQ2FwdWxldCwgYW5kIE1vbnRhZ3VlLAogICAgSGF2ZSB0aHJpY2UgZGlzdHVyYidkIHRoZSBxdWlldCBvZiBvdXIgc3RyZWV0cywKICAgIEFuZCBtYWRlIFZlcm9uYSdzIGFuY2llbnQgY2l0aXplbnMKICAgIENhc3QgYnkgdGhlaXIgZ3JhdmUgYmVzZWVtaW5nIG9ybmFtZW50cywKICAgIFRvIHdpZWxkIG9sZCBwYXJ0aXNhbnMsIGluIGhhbmRzIGFzIG9sZCwKICAgIENhbmtlcidkIHdpdGggcGVhY2UsIHRvIHBhcnQgeW91ciBjYW5rZXInZCBoYXRlOgogICAgSWYgZXZlciB5b3UgZGlzdHVyYiBvdXIgc3RyZWV0cyBhZ2FpbiwKICAgIFlvdXIgbGl2ZXMgc2hhbGwgcGF5IHRoZSBmb3JmZWl0IG9mIHRoZSBwZWFjZS4KICAgIEZvciB0aGlzIHRpbWUsIGFsbCB0aGUgcmVzdCBkZXBhcnQgYXdheToKICAgIFlvdSBDYXB1bGV0OyBzaGFsbCBnbyBhbG9uZyB3aXRoIG1lOgogICAgQW5kLCBNb250YWd1ZSwgY29tZSB5b3UgdGhpcyBhZnRlcm5vb24sCiAgICBUbyBrbm93IG91ciBmdXJ0aGVyIHBsZWFzdXJlIGluIHRoaXMgY2FzZSwKICAgIFRvIG9sZCBGcmVlLXRvd24sIG91ciBjb21tb24ganVkZ21lbnQtcGxhY2UuCiAgICBPbmNlIG1vcmUsIG9uIHBhaW4gb2YgZGVhdGgsIGFsbCBtZW4gZGVwYXJ0LgoKICAgIEV4ZXVudCBhbGwgYnV0IE1PTlRBR1VFLCBMQURZIE1PTlRBR1VFLCBhbmQgQkVOVk9MSU8KCk1PTlRBR1VFCgogICAgV2hvIHNldCB0aGlzIGFuY2llbnQgcXVhcnJlbCBuZXcgYWJyb2FjaD8KICAgIFNwZWFrLCBuZXBoZXcsIHdlcmUgeW91IGJ5IHdoZW4gaXQgYmVnYW4CgpCRU5WT0xJTwoKICAgIEhlcmUgd2VyZSB0aGUgc2VydmFudHMgb2YgeW91ciBhZHZlcnNhcnksCiAgICBBbmQgeW91cnMsIGNsb3NlIGZpZ2h0aW5nIGVyZSBJIGRpZCBhcHByb2FjaDoKICAgIEkgZHJldyB0byBwYXJ0IHRoZW06IGluIHRoZSBpbnN0YW50IGNhbWUKICAgIFRoZSBmaWVyeSBUeWJhbHQsIHdpdGggaGlzIHN3b3JkIHByZXBhcmVkLAogICAgV2hpY2gsIGFzIGhlIGJyZWF0aGVkIGRlZmlhbmNlIHRvIG15IGVhcnMsCiAgICBIZSBzd3VuZyBhYm91dCBoaXMgaGVhZCBhbmQgY3V0IHRoZSB3aW5kcywKICAgIFdobyBub3RoaW5nIGh1cnQgd2l0aGFsIGhpc3MnZCBoaW0gaW4gc2Nvcm46CiAgICBXaGlsZSB3ZSB3ZXJlIGludGVyY2hhbmdpbmcgdGhydXN0cyBhbmQgYmxvd3MsCiAgICBDYW1lIG1vcmUgYW5kIG1vcmUgYW5kIGZvdWdodCBvbiBwYXJ0IGFuZCBwYXJ0LAogICAgVGlsbCB0aGUgcHJpbmNlIGNhbWUsIHdobyBwYXJ0ZWQgZWl0aGVyIHBhcnQuCgpMQURZIE1PTlRBR1VFCgogICAgTywgd2hlcmUgaXMgUm9tZW8IHNhdyB5b3UgaGltIHRvLWRheT8KICAgIFJpZ2h0IGdsYWQgSSBhbSBoZSB3YXMgbm90IGF0IHRoaXMgZnJheS4KCkJFTlZPTElPCgogICAgTWFkYW0sIGFuIGhvdXIgYmVmb3JlIHRoZSB3b3JzaGlwcCdkIHN1bgogICAgUGVlcidkIGZvcnRoIHRoZSBnb2xkZW4gd2luZG93IG9mIHRoZSBlYXN0LAogICAgQSB0cm91YmxlZCBtaW5kIGRyYXZlIG1lIHRvIHdhbGsgYWJyb2FkOwogICAgV2hlcmUsIHVuZGVybmVhdGggdGhlIGdyb3ZlIG9mIHN5Y2Ftb3JlCiAgICBUaGF0IHdlc3R3YXJkIHJvb3RldGggZnJvbSB0aGUgY2l0eSdzIHNpZGUsCiAgICBTbyBlYXJseSB3YWxraW5nIGRpZCBJIHNlZSB5b3VyIHNvbjoKICAgIFRvd2FyZHMgaGltIEkgbWFkZSwgYnV0IGhlIHdhcyB3YXJlIG9mIG1lCiAgICBBbmQgc3RvbGUgaW50byB0aGUgY292ZXJ0IG9mIHRoZSB3b29kOgogICAgSSwgbWVhc3VyaW5nIGhpcyBhZmZlY3Rpb25zIGJ5IG15IG93biwKICAgIFRoYXQgbW9zdCBhcmUgYnVzaWVkIHdoZW4gdGhleSdyZSBtb3N0IGFsb25lLAogICAgUHVyc3VlZCBteSBodW1vdXIgbm90IHB1cnN1aW5nIGhpcywKICAgIEFuZCBnbGFkbHkgc2h1bm4nZCB3aG8gZ2xhZGx5IGZsZWQgZnJvbSBtZS4KCk1PTlRBR1VFCgogICAgTWFueSBhIG1vcm5pbmcgaGF0aCBoZSB0aGVyZSBiZWVuIHNlZW4sCiAgICBXaXRoIHRlYXJzIGF1Z21lbnRpbmcgdGhlIGZyZXNoIG1vcm5pbmcgZGV3LgogICAgQWRkaW5nIHRvIGNsb3VkcyBtb3JlIGNsb3VkcyB3aXRoIGhpcyBkZWVwIHNpZ2hzOwogICAgQnV0IGFsbCBzbyBzb29uIGFzIHRoZSBhbGwtY2hlZXJpbmcgc3VuCiAgICBTaG91bGQgaW4gdGhlIGZ1cnRoZXN0IGVhc3QgYmVnaW4gdG8gZHJhdwogICAgVGhlIHNoYWR5IGN1cnRhaW5zIGZyb20gQXVyb3JhJ3MgYmVkLAogICAgQXdheSBmcm9tIHRoZSBsaWdodCBzdGVhbHMgaG9tZSBteSBoZWF2eSBzb24sCiAgICBBbmQgcHJpdmF0ZSBpbiBoaXMgY2hhbWJlciBwZW5zIGhpbXNlbGYsCiAgICBTaHV0cyB1cCBoaXMgd2luZG93cywgbG9ja3MgZmFyIGRheWxpZ2h0IG91dAogICAgQW5kIG1ha2VzIGhpbXNlbGYgYW4gYXJ0aWZpY2lhbCBuaWdodDoKICAgIEJsYWNrIGFuZCBwb3J0ZW50b3VzIG11c3QgdGhpcyBodW1vdXIgcHJvdmUsCiAgICBVbmxlc3MgZ29vZCBjb3Vuc2VsIG1heSB0aGUgY2F1c2UgcmVtb3ZlLgoKQkVOVk9MSU8KCiAgICBNeSBub2JsZSB1bmNsZSwgZG8geW91IGtub3cgdGhlIGNhdXNlPwoKTU9OVEFHVUUKCiAgICBJIG5laXRoZXIga25vdyBpdCBub3IgY2FuIGxlYXJuIG9mIGhpbS4KCkJFTlZPTElPCgogICAgSGF2ZSB5b3UgaW1wb3J0dW5lZCBoaW0gYnkgYW55IG1lYW5zPwoKTU9OVEFHVUUKCiAgICBCb3RoIGJ5IG15c2VsZiBhbmQgbWFueSBvdGhlciBmcmllbmRzOgogICAgQnV0IGhlLCBoaXMgb3duIGFmZmVjdGlvbnMnIGNvdW5zZWxsb3IsCiAgICBJcyB0byBoaW1zZWxmLS1JIHdpb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UVPCgogICAgR29vZCBoZWFydCwgYXQgd2hhdD8KCkJFTlZPTElPCgogICAgQXQgdGh5IGdvb2QgaGVhcnQncyBvcHByZXNzaW9uLgoKUk9NRU8KCiAgICBXaHksIHN1Y2ggaXMgbG92ZSdzIHRyYW5zZ3Jlc3Npb24uCiAgICBHcmllZnMgb2YgbWluZSBvd24gbGllIGhlYXZ5IGluIG15IGJyZWFzdCwKICAgIFdoaWNoIHRob3Ugd2lsdCBwcm9wYWdhdGUsIHRvIGhhdmUgaXQgcHJlc3QKICAgIFdpdGggbW9yZSBvZiB0aGluZTogdGhpcyBsb3ZlIHRoYXQgdGhvdSBoYXN0IHNob3duCiAgICBEb3RoIGFkZCBtb3JlIGdyaWVmIHRvIHRvbyBtdWNoIG9mIG1pbmUgb3duLgogICAgTG92ZSBpcyBhIHNtb2tlIHJhaXNlZCB3aXRoIHRoZSBmdW1lIG9mIHNpZ2hzOwogICAgQmVpbmcgcHVyZ2VkLCBhIGZpcmUgc3BhcmtsaW5nIGluIGxvdmVycycgZXllczsKICAgIEJlaW5nIHZleCdkIGEgc2VhIG5vdXJpc2gnZCB3aXRoIGxvdmVycycgdGVhcnM6CiAgICBXaGF0IGlzIGl0IGVsc2UIGEgbWFkbmVzcyBtb3N0IGRpc2NyZWV0LAogICAgQSBjaG9raW5nIGdhbGwgYW5kIGEgcHJlc2VydmluZyBzd2VldC4KICAgIEZhcmV3ZWxsLCBteSBjb3ouCgpCRU5WT0xJTwoKICAgIFNvZnQhIEkgd2lsbCBnbyBhbG9uZzsKICAgIEFuIGlmIHlvdSBsZWF2ZSBtZSBzbywgeW91IGRvIG1lIHdyb25nLgoKUk9NRU8KCiAgICBUdXQsIEkgaGF2ZSBsb3N0IG15c2VsZjsgSSBhbSBub3QgaGVyZTsKICAgIFRoaXMgaXMgbm90IFJvbWVvLCBoZSdzIHNvbWUgb3RoZXIgd2hlcmUuCgpCRU5WT0xJTwoKICAgIFRlbGwgbWUgaW4gc2FkbmVzcywgd2hvIGlzIHRoYXQgeW91IGxvdmUuCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIEkgZ3JvYW4gYW5kIHRlbGwgdGhlZT8KCkJFTlZPTElPCgogICAgR3JvYW4hIHdoeSwgbm8uCiAgICBCdXQgc2FkbHkgdGVsbCBtZSB3aG8uCgpST01FTwoKICAgIEJpZCBhIHNpY2sgbWFuIGluIHNhZG5lc3MgbWFrZSBoaXMgd2lsbDoKICAgIEFoLCB3b3JkIGlsbCB1cmdlZCB0byBvbmUgdGhhdCBpcyBzbyBpbGwhCiAgICBJbiBzYWRuZXNzLCBjb3VzaW4sIEkgZG8gbG92ZSBhIHdvbWFuLgoKQkVOVk9MSU8KCiAgICBJIGFpbSdkIHNvIG5lYXIsIHdoZW4gSSBzdXBwb3NlZCB5b3UgbG92ZWQuCgpST01FTwoKICAgIEEgcmlnaHQgZ29vZCBtYXJrLW1hbiEgQW5kIHNoZSdzIGZhaXIgSSBsb3ZlLgoKQkVOVk9MSU8KCiAgICBBIHJpZ2h0IGZhaXIgbWFyaywgZmFpciBjb3osIGlzIHNvb25lc3QgaGl0LgoKUk9NRU8KCiAgICBXZWxsLCBpbiB0aGF0IGhpdCB5b3UgbWlzczogc2hlJ2xsIG5vdCBiZSBoaXQKICAgIFdpdGggQ3VwaWQncyBhcnJvdzsgc2hlIGhhdGggRGlhbidzIHdpdDsKICAgIEFuZCwgaW4gc3Ryb25nIHByb29mIG9mIGNoYXN0aXR5IHdlbGwgYXJtJ2QsCiAgICBGcm9tIGxvdmUncyB3ZWFrIGNoaWxkaXNoIGJvdyBzaGUgbGl2ZXMgdW5oYXJtJ2QuCiAgICBTaGUgd2lsbCBub3Qgc3RheSB0aGUgc2llZ2Ugb2YgbG92aW5nIHRlcm1zLAogICAgTm9yIGJpZGUgdGhlIGVuY291bnRlciBvZiBhc3NhaWxpbmcgZXllcywKICAgIE5vciBvcGUgaGVyIGxhcCB0byBzYWludC1zZWR1Y2luZyBnb2xkOgogICAgTywgc2hlIGlzIHJpY2ggaW4gYmVhdXR5LCBvbmx5IHBvb3IsCiAgICBUaGF0IHdoZW4gc2hlIGRpZXMgd2l0aCBiZWF1dHkgZGllcyBoZXIgc3RvcmUuCgpCRU5WT0xJTwoKICAgIFRoZW4gc2hlIGhhdGggc3dvcm4gdGhhdCBzaGUgd2lsbCBzdGlsbCBsaXZlIGNoYXN0ZT8KClJPTUVPCgogICAgU2hlIGhhdGgsIGFuZCBpbiB0aGF0IHNwYXJpbmcgbWFrZXMgaHVnZSB3YXN0ZSwKICAgIEZvciBiZWF1dHkgc3RhcnZlZCB3aXRoIGhlciBzZXZlcml0eQogICAgQ3V0cyBiZWF1dHkgb2ZmIGZyb20gYWxsIHBvc3Rlcml0eS4KICAgIFNoZSBpcyB0b28gZmFpciwgdG9vIHdpc2UsIHdpc2VseSB0b28gZmFpciwKICAgIFRvIG1lcml0IGJsaXNzIGJ5IG1ha2luZyBtZSBkZXNwYWlyOgogICAgU2hlIGhhdGggZm9yc3dvcm4gdG8gbG92ZSwgYW5kIGluIHRoYXQgdm93CiAgICBEbyBJIGxpdmUgZGVhZCB0aGF0IGxpdmUgdG8gdGVsbCBpdCBub3cuCgpCRU5WT0xJTwoKICAgIEJlIHJ1bGVkIGJ5IG1lLCBmb3JnZXQgdG8gdGhpbmsgb2YgaGVyLgoKUk9NRU8KCiAgICBPLCB0ZWFjaCBtZSBob3cgSSBzaG91bGQgZm9yZ2V0IHRvIHRoaW5rLgoKQkVOVk9MSU8KCiAgICBCeSBnaXZpbmcgbGliZXJ0eSB1bnRvIHRoaW5lIGV5ZXM7CiAgICBFeGFtaW5lIG90aGVyIGJlYXV0aWVzLgoKUk9NRU8KCiAgICAnVGlzIHRoZSB3YXkKICAgIFRvIGNhbGwgaGVycyBleHF1aXNpdGUsIGluIHF1ZXN0aW9uIG1vcmU6CiAgICBUaGVzZSBoYXBweSBtYXNrcyB0aGF0IGtpc3MgZmFpciBsYWRpZXMnIGJyb3dzCiAgICBCZWluZyBibGFjayBwdXQgdXMgaW4gbWluZCB0aGV5IGhpZGUgdGhlIGZhaXI7CiAgICBIZSB0aGF0IGlzIHN0cnVja2VuIGJsaW5kIGNhbm5vdCBmb3JnZXQKICAgIFRoZSBwcmVjaW91cyB0cmVhc3VyZSBvZiBoaXMgZXllc2lnaHQgbG9zdDoKICAgIFNob3cgbWUgYSBtaXN0cmVzcyB0aGF0IGlzIHBhc3NpbmcgZmFpciwKICAgIFdoYXQgZG90aCBoZXIgYmVhdXR5IHNlcnZlLCBidXQgYXMgYSBub3RlCiAgICBXaGVyZSBJIG1heSByZWFkIHdobyBwYXNzJ2QgdGhhdCBwYXNzaW5nIGZhaXICiAgICBGYXJld2VsbDogdGhvdSBjYW5zdCBub3QgdGVhY2ggbWUgdG8gZm9yZ2V0LgoKQkVOVk9MSU8KCiAgICBJJ2xsIHBheSB0aGF0IGRvY3RyaW5lLCBvciBlbHNlIGRpZSBpbiBkZWJ0LgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEEgc3RyZWV0LgoKICAgIEVudGVyIENBUFVMRVQsIFBBUklTLCBhbmQgU2VydmFudCAKCkNBUFVMRVQKCiAgICBCdXQgTW9udGFndWUgaXMgYm91bmQgYXMgd2VsbCBhcyBJLAogICAgSW4gcGVuYWx0eSBhbGlrZTsgYW5kICd0aXMgbm90IGhhcmQsIEkgdGhpbmssCiAgICBGb3IgbWVuIHNvIG9sZCBhcyB3ZSB0byBrZWVwIHRoZSBwZWFjZS4KClBBUklTCgogICAgT2YgaG9ub3VyYWJsZSByZWNrb25pbmcgYXJlIHlvdSBib3RoOwogICAgQW5kIHBpdHkgJ3RpcyB5b3UgbGl2ZWQgYXQgb2RkcyBzbyBsb25nLgogICAgQnV0IG5vdywgbXkgbG9yZCwgd2hhdCBzYXkgeW91IHRvIG15IHN1aXQCgpDQVBVTEVUCgogICAgQnV0IHNheWluZyBvJ2VyIHdoYXQgSSBoYXZlIHNhaWQgYmVmb3JlOgogICAgTXkgY2hpbGQgaXMgeWV0IGEgc3RyYW5nZXIgaW4gdGhlIHdvcmxkOwogICAgU2hlIGhhdGggbm90IHNlZW4gdGhlIGNoYW5nZSBvZiBmb3VydGVlbiB5ZWFycywKICAgIExldCB0d28gbW9yZSBzdW1tZXJzIHdpdGhlciBpbiB0aGVpciBwcmlkZSwKICAgIEVyZSB3ZSBtYXkgdGhpbmsgaGVyIHJpcGUgdG8gYmUgYSBicmlkZS4KClBBUklTCgogICAgWW91bmdlciB0aGFuIHNoZSBhcmUgaGFwcHkgbW90aGVycyBtYWRlLgoKQ0FQVUxFVAoKICAgIEFuZCB0b28gc29vbiBtYXJyJ2QgYXJlIHRob3NlIHNvIGVhcmx5IG1hZGUuCiAgICBUaGUgZWFydGggaGF0aCBzd2FsbG93J2QgYWxsIG15IGhvcGVzIGJ1dCBzaGUsCiAgICBTaGUgaXMgdGhlIGhvcGVmdWwgbGFkeSBvZiBteSBlYXJ0aDoKICAgIEJ1dCB3b28gaGVyLCBnZW50bGUgUGFyaXMsIGdldCBoZXIgaGVhcnQsCiAgICBNeSB3aWxsIHRvIGhlciBjb25zZW50IGlzIGJ1dCBhIHBhcnQ7CiAgICBBbiBzaGUgYWdyZWUsIHdpdGhpbiBoZXIgc2NvcGUgb2YgY2hvaWNlCiAgICBMaWVzIG15IGNvbnNlbnQgYW5kIGZhaXIgYWNjb3JkaW5nIHZvaWNlLgogICAgVGhpcyBuaWdodCBJIGhvbGQgYW4gb2xkIGFjY3VzdG9tJ2QgZmVhc3QsCiAgICBXaGVyZXRvIEkgaGF2ZSBpbnZpdGVkIG1hbnkgYSBndWVzdCwKICAgIFN1Y2ggYXMgSSBsb3ZlOyBhbmQgeW91LCBhbW9uZyB0aGUgc3RvcmUsCiAgICBPbmUgbW9yZSwgbW9zdCB3ZWxjb21lLCBtYWtlcyBteSBudW1iZXIgbW9yZS4KICAgIEF0IG15IHBvb3IgaG91c2UgbG9vayB0byBiZWhvbGQgdGhpcyBuaWdodAogICAgRWFydGgtdHJlYWRpbmcgc3RhcnMgdGhhdCBtYWtlIGRhcmsgaGVhdmVuIGxpZ2h0OgogICAgU3VjaCBjb21mb3J0IGFzIGRvIGx1c3R5IHlvdW5nIG1lbiBmZWVsCiAgICBXaGVuIHdlbGwtYXBwYXJlbGwnZCBBcHJpbCBvbiB0aGUgaGVlbAogICAgT2YgbGltcGluZyB3aW50ZXIgdHJlYWRzLCBldmVuIHN1Y2ggZGVsaWdodAogICAgQW1vbmcgZnJlc2ggZmVtYWxlIGJ1ZHMgc2hhbGwgeW91IHRoaXMgbmlnaHQKICAgIEluaGVyaXQgYXQgbXkgaG91c2U7IGhlYXIgYWxsLCBhbGwgc2VlLAogICAgQW5kIGxpa2UgaGVyIG1vc3Qgd2hvc2UgbWVyaXQgbW9zdCBzaGFsbCBiZToKICAgIFdoaWNoIG9uIG1vcmUgdmlldywgb2YgbWFueSBtaW5lIGJlaW5nIG9uZQogICAgTWF5IHN0YW5kIGluIG51bWJlciwgdGhvdWdoIGluIHJlY2tvbmluZyBub25lLAogICAgQ29tZSwgZ28gd2l0aCBtZS4KCiAgICBUbyBTZXJ2YW50LCBnaXZpbmcgYSBwYXBlcgogICAgR28sIHNpcnJhaCwgdHJ1ZGdlIGFib3V0CiAgICBUaHJvdWdoIGZhaXIgVmVyb25hOyBmaW5kIHRob3NlIHBlcnNvbnMgb3V0CiAgICBXaG9zZSBuYW1lcyBhcmUgd3JpdHRlbiB0aGVyZSwgYW5kIHRvIHRoZW0gc2F5LAogICAgTXkgaG91c2UgYW5kIHdlbGNvbWUgb24gdGhlaXIgcGxlYXN1cmUgc3RheS4KCiAgICBFeGV1bnQgQ0FQVUxFVCBhbmQgUEFSSVMKClNlcnZhbnQKCiAgICBGaW5kIHRoZW0gb3V0IHdob3NlIG5hbWVzIGFyZSB3cml0dGVuIGhlcmUhIEl0IGlzCiAgICB3cml0dGVuLCB0aGF0IHRoZSBzaG9lbWFrZXIgc2hvdWxkIG1lZGRsZSB3aXRoIGhpcwogICAgeWFyZCwgYW5kIHRoZSB0YWlsb3Igd2l0aCBoaXMgbGFzdCwgdGhlIGZpc2hlciB3aXRoCiAgICBoaXMgcGVuY2lsLCBhbmQgdGhlIHBhaW50ZXIgd2l0aCBoaXMgbmV0czsgYnV0IEkgYW0KICAgIHNlbnQgdG8gZmluZCB0aG9zZSBwZXJzb25zIHdob3NlIG5hbWVzIGFyZSBoZXJlCiAgICB3cml0LCBhbmQgY2FuIG5ldmVyIGZpbmQgd2hhdCBuYW1lcyB0aGUgd3JpdGluZwogICAgcGVyc29uIGhhdGggaGVyZSB3cml0LiBJIG11c3QgdG8gdGhlIGxlYXJuZWQuLS1JbiBnb29kIHRpbWUuCgogICAgRW50ZXIgQkVOVk9MSU8gYW5kIFJPTUVPCgpCRU5WT0xJTwoKICAgIFR1dCwgbWFuLCBvbmUgZmlyZSBidXJucyBvdXQgYW5vdGhlcidzIGJ1cm5pbmcsCiAgICBPbmUgcGFpbiBpcyBsZXNzZW4nZCBieSBhbm90aGVyJ3MgYW5ndWlzaDsKICAgIFR1cm4gZ2lkZHksIGFuZCBiZSBob2xwIGJ5IGJhY2t3YXJkIHR1cm5pbmc7CiAgICBPbmUgZGVzcGVyYXRlIGdyaWVmIGN1cmVzIHdpdGggYW5vdGhlcidzIGxhbmd1aXNoOgogICAgVGFrZSB0aG91IHNvbWUgbmV3IGluZmVjdGlvbiB0byB0aHkgZXllLAogICAgQW5kIHRoZSByYW5rIHBvaXNvbiBvZiB0aGUgb2xkIHdpbGwgZGllLgoKUk9NRU8KCiAgICBZb3VyIHBsYWludGFpbi1sZWFmIGlzIGV4Y2VsbGVudCBmb3IgdGhhdC4KCkJFTlZPTElPCgogICAgRm9yIHdoYXQsIEkgcHJheSB0aGVlPwoKUk9NRU8KCiAgICBGb3IgeW91ciBicm9rZW4gc2hpbi4KCkJFTlZPTElPCgogICAgV2h5LCBSb21lbywgYXJ0IHRob3UgbWFkPwoKUk9NRU8KCiAgICBOb3QgbWFkLCBidXQgYm91bmQgbW9yZSB0aGFuIGEgbWFkLW1hbiBpczsKICAgIFNodXQgdXAgaW4gcHJpc29uLCBrZXB0IHdpdGhvdXQgbXkgZm9vZCwKICAgIFdoaXBwJ2QgYW5kIHRvcm1lbnRlZCBhbmQtLUdvZC1kZW4sIGdvb2QgZmVsbG93LgoKU2VydmFudAoKICAgIEdvZCBnaScgZ29kLWRlbi4gSSBwcmF5LCBzaXIsIGNhbiB5b3UgcmVhZD8KClJPTUVPCgogICAgQXksIG1pbmUgb3duIGZvcnR1bmUgaW4gbXkgbWlzZXJ5LgoKU2VydmFudAoKICAgIFBlcmhhcHMgeW91IGhhdmUgbGVhcm5lZCBpdCB3aXRob3V0IGJvb2s6IGJ1dCwgSQogICAgcHJheSwgY2FuIHlvdSByZWFkIGFueSB0aGluZyB5b3Ugc2VlPwoKUk9NRU8KCiAgICBBeSwgaWYgSSBrbm93IHRoZSBsZXR0ZXJzIGFuZCB0aGUgbGFuZ3VhZ2UuCgpTZXJ2YW50CgogICAgWWUgc2F5IGhvbmVzdGx5OiByZXN0IHlvdSBtZXJyeSEKClJPTUVPCgogICAgU3RheSwgZmVsbG93OyBJIGNhbiByZWFkLgoKICAgIFJlYWRzCiAgICAnU2lnbmlvciBNYXJ0aW5vIGFuZCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOwogICAgQ291bnR5IEFuc2VsbWUgYW5kIGhpcyBiZWF1dGVvdXMgc2lzdGVyczsgdGhlIGxhZHkKICAgIHdpZG93IG9mIFZpdHJhdmlvOyBTaWduaW9yIFBsYWNlbnRpbyBhbmQgaGlzIGxvdmVseQogICAgbmllY2VzOyBNZXJjdXRpbyBhbmQgaGlzIGJyb3RoZXIgVmFsZW50aW5lOyBtaW5lCiAgICB1bmNsZSBDYXB1bGV0LCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOyBteSBmYWlyIG5pZWNlCiAgICBSb3NhbGluZTsgTGl2aWE7IFNpZ25pb3IgVmFsZW50aW8gYW5kIGhpcyBjb3VzaW4KICAgIFR5YmFsdCwgTHVjaW8gYW5kIHRoZSBsaXZlbHkgSGVsZW5hLicgQSBmYWlyCiAgICBhc3NlbWJseTogd2hpdGhlciBzaG91bGQgdGhleSBjb21lPwoKU2VydmFudAoKICAgIFVwLgoKUk9NRU8KCiAgICBXaGl0aGVyPwoKU2VydmFudAoKICAgIFRvIHN1cHBlcjsgdG8gb3VyIGhvdXNlLgoKUk9NRU8KCiAgICBXaG9zZSBob3VzZT8KClNlcnZhbnQKCiAgICBNeSBtYXN0ZXIncy4KClJPTUVPCgogICAgSW5kZWVkLCBJIHNob3VsZCBoYXZlIGFzaydkIHlvdSB0aGF0IGJlZm9yZS4KClNlcnZhbnQKCiAgICBOb3cgSSdsbCB0ZWxsIHlvdSB3aXRob3V0IGFza2luZzogbXkgbWFzdGVyIGlzIHRoZQogICAgZ3JlYXQgcmljaCBDYXB1bGV0OyBhbmQgaWYgeW91IGJlIG5vdCBvZiB0aGUgaG91c2UKICAgIG9mIE1vbnRhZ3VlcywgSSBwcmF5LCBjb21lIGFuZCBjcnVzaCBhIGN1cCBvZiB3aW5lLgogICAgUmVzdCB5b3UgbWVycnkhCgogICAgRXhpdAoKQkVOVk9MSU8KCiAgICBBdCB0aGlzIHNhbWUgYW5jaWVudCBmZWFzdCBvZiBDYXB1bGV0J3MKICAgIFN1cHMgdGhlIGZhaXIgUm9zYWxpbmUgd2hvbSB0aG91IHNvIGxvdmVzdCwKICAgIFdpdGggYWxsIHRoZSBhZG1pcmVkIGJlYXV0aWVzIG9mIFZlcm9uYToKICAgIEdvIHRoaXRoZXI7IGFuZCwgd2l0aCB1bmF0dGFpbnRlZCBleWUsCiAgICBDb21wYXJlIGhlciBmYWNlIHdpdGggc29tZSB0aGF0IEkgc2hhbGwgc2hvdywKICAgIEFuZCBJIHdpbGwgbWFrZSB0aGVlIHRoaW5rIHRoeSBzd2FuIGEgY3Jvdy4KClJPTUVPCgogICAgV2hlbiB0aGUgZGV2b3V0IHJlbGlnaW9uIG9mIG1pbmUgZXllCiAgICBNYWludGFpbnMgc3VjaCBmYWxzZWhvb2QsIHRoZW4gdHVybiB0ZWFycyB0byBmaXJlczsKICAgIEFuZCB0aGVzZSwgd2hvIG9mdGVuIGRyb3duJ2QgY291bGQgbmV2ZXIgZGllLAogICAgVHJhbnNwYXJlbnQgaGVyZXRpY3MsIGJlIGJ1cm50IGZvciBsaWFycyEKICAgIE9uZSBmYWlyZXIgdGhhbiBteSBsb3ZlISB0aGUgYWxsLXNlZWluZyBzdW4KICAgIE5lJ2VyIHNhdyBoZXIgbWF0Y2ggc2luY2UgZmlyc3QgdGhlIHdvcmxkIGJlZ3VuLgoKQkVOVk9MSU8KCiAgICBUdXQsIHlvdSBzYXcgaGVyIGZhaXIsIG5vbmUgZWxzZSBiZWluZyBieSwKICAgIEhlcnNlbGYgcG9pc2VkIHdpdGggaGVyc2VsZiBpbiBlaXRoZXIgZXllOgogICAgQnV0IGluIHRoYXQgY3J5c3RhbCBzY2FsZXMgbGV0IHRoZXJlIGJlIHdlaWdoJ2QKICAgIFlvdXIgbGFkeSdzIGxvdmUgYWdhaW5zdCBzb21lIG90aGVyIG1haWQKICAgIFRoYXQgSSB3aWxsIHNob3cgeW91IHNoaW5pbmcgYXQgdGhpcyBmZWFzdCwKICAgIEFuZCBzaGUgc2hhbGwgc2NhbnQgc2hvdyB3ZWxsIHRoYXQgbm93IHNob3dzIGJlc3QuCgpST01FTwoKICAgIEknbGwgZ28gYWxvbmcsIG5vIHN1Y2ggc2lnaHQgdG8gYmUgc2hvd24sCiAgICBCdXQgdG8gcmVqb2ljZSBpbiBzcGxlbmRvciBvZiBtaW5lIG93bi4KCiAgICBFeGV1bnQKClNDRU5FIElJSS4gQSByb29tIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgTnVyc2UsIHdoZXJlJ3MgbXkgZGF1Z2h0ZXIIGNhbGwgaGVyIGZvcnRoIHRvIG1lLgoKTnVyc2UKCiAgICBOb3csIGJ5IG15IG1haWRlbmhlYWQsIGF0IHR3ZWx2ZSB5ZWFyIG9sZCwKICAgIEkgYmFkZSBoZXIgY29tZS4gV2hhdCwgbGFtYiEgd2hhdCwgbGFkeWJpcmQhCiAgICBHb2QgZm9yYmlkISBXaGVyZSdzIHRoaXMgZ2lybD8gV2hhdCwgSnVsaWV0IQoKICAgIEVudGVyIEpVTElFVAoKSlVMSUVUCgogICAgSG93IG5vdyEgd2hvIGNhbGxzPwoKTnVyc2UKCiAgICBZb3VyIG1vdGhlci4KCkpVTElFVAoKICAgIE1hZGFtLCBJIGFtIGhlcmUuCiAgICBXaGF0IGlzIHlvdXIgd2lsbD8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoaXMgaXMgdGhlIG1hdHRlcjotLU51cnNlLCBnaXZlIGxlYXZlIGF3aGlsZSwKICAgIFdlIG11c3QgdGFsayBpbiBzZWNyZXQ6LS1udXJzZSwgY29tZSBiYWNrIGFnYWluOwogICAgSSBoYXZlIHJlbWVtYmVyJ2QgbWUsIHRob3UncyBoZWFyIG91ciBjb3Vuc2VsLgogICAgVGhvdSBrbm93J3N0IG15IGRhdWdodGVyJ3Mgb2YgYSBwcmV0dHkgYWdlLgoKTnVyc2UKCiAgICBGYWl0aCwgSSBjYW4gdGVsbCBoZXIgYWdlIHVudG8gYW4gaG91ci4KCkxBRFkgQ0FQVUxFVAoKICAgIFNoZSdzIG5vdCBmb3VydGVlbi4KCk51cnNlCgogICAgSSdsbCBsYXkgZm91cnRlZW4gb2YgbXkgdGVldGgsLS0KICAgIEFuZCB5ZXQsIHRvIG15IHRlZXRoIGJlIGl0IHNwb2tlbiwgSSBoYXZlIGJ1dCBmb3VyLS0KICAgIFNoZSBpcyBub3QgZm91cnRlZW4uIEhvdyBsb25nIGlzIGl0IG5vdwogICAgVG8gTGFtbWFzLXRpZGUCgpMQURZIENBUFVMRVQKCiAgICBBIGZvcnRuaWdodCBhbmQgb2RkIGRheXMuCgpOdXJzZQoKICAgIEV2ZW4gb3Igb2RkLCBvZiBhbGwgZGF5cyBpbiB0aGUgeWVhciwKICAgIENvbWUgTGFtbWFzLWV2ZSBhdCBuaWdodCBzaGFsbCBzaGUgYmUgZm91cnRlZW4uCiAgICBTdXNhbiBhbmQgc2hlLS1Hb2QgcmVzdCBhbGwgQ2hyaXN0aWFuIHNvdWxzIS0tCiAgICBXZXJlIG9mIGFuIGFnZTogd2VsbCwgU3VzYW4gaXMgd2l0aCBHb2Q7CiAgICBTaGUgd2FzIHRvbyBnb29kIGZvciBtZTogYnV0LCBhcyBJIHNhaWQsCiAgICBPbiBMYW1tYXMtZXZlIGF0IG5pZ2h0IHNoYWxsIHNoZSBiZSBmb3VydGVlbjsKICAgIFRoYXQgc2hhbGwgc2hlLCBtYXJyeTsgSSByZW1lbWJlciBpdCB3ZWxsLgogICAgJ1RpcyBzaW5jZSB0aGUgZWFydGhxdWFrZSBub3cgZWxldmVuIHllYXJzOwogICAgQW5kIHNoZSB3YXMgd2VhbidkLC0tSSBuZXZlciBzaGFsbCBmb3JnZXQgaXQsLS0KICAgIE9mIGFsbCB0aGUgZGF5cyBvZiB0aGUgeWVhciwgdXBvbiB0aGF0IGRheToKICAgIEZvciBJIGhhZCB0aGVuIGxhaWQgd29ybXdvb2QgdG8gbXkgZHVnLAogICAgU2l0dGluZyBpbiB0aGUgc3VuIHVuZGVyIHRoZSBkb3ZlLWhvdXNlIHdhbGw7CiAgICBNeSBsb3JkIGFuZCB5b3Ugd2VyZSB0aGVuIGF0IE1hbnR1YTotLQogICAgTmF5LCBJIGRvIGJlYXIgYSBicmFpbjotLWJ1dCwgYXMgSSBzYWlkLAogICAgV2hlbiBpdCBkaWQgdGFzdGUgdGhlIHdvcm13b29kIG9uIHRoZSBuaXBwbGUKICAgIE9mIG15IGR1ZyBhbmQgZmVsdCBpdCBiaXR0ZXIsIHByZXR0eSBmb29sLAogICAgVG8gc2VlIGl0IHRldGNoeSBhbmQgZmFsbCBvdXQgd2l0aCB0aGUgZHVnIQogICAgU2hha2UgcXVvdGggdGhlIGRvdmUtaG91c2U6ICd0d2FzIG5vIG5lZWQsIEkgdHJvdywKICAgIFRvIGJpZCBtZSB0cnVkZ2U6CiAgICBBbmQgc2luY2UgdGhhdCB0aW1lIGl0IGlzIGVsZXZlbiB5ZWFyczsKICAgIEZvciB0aGVuIHNoZSBjb3VsZCBzdGFuZCBhbG9uZTsgbmF5LCBieSB0aGUgcm9vZCwKICAgIFNoZSBjb3VsZCBoYXZlIHJ1biBhbmQgd2FkZGxlZCBhbGwgYWJvdXQ7CiAgICBGb3IgZXZlbiB0aGUgZGF5IGJlZm9yZSwgc2hlIGJyb2tlIGhlciBicm93OgogICAgQW5kIHRoZW4gbXkgaHVzYmFuZC0tR29kIGJlIHdpdGggaGlzIHNvdWwhCiAgICBBJyB3YXMgYSBtZXJyeSBtYW4tLXRvb2sgdXAgdGhlIGNoaWxkOgogICAgJ1llYSwnIHF1b3RoIGhlLCAnZG9zdCB0aG91IGZhbGwgdXBvbiB0aHkgZmFjZT8KICAgIFRob3Ugd2lsdCBmYWxsIGJhY2t3YXJkIHdoZW4gdGhvdSBoYXN0IG1vcmUgd2l0OwogICAgV2lsdCB0aG91IG5vdCwgSnVsZT8nIGFuZCwgYnkgbXkgaG9saWRhbWUsCiAgICBUaGUgcHJldHR5IHdyZXRjaCBsZWZ0IGNyeWluZyBhbmQgc2FpZCAnQXkuJwogICAgVG8gc2VlLCBub3csIGhvdyBhIGplc3Qgc2hhbGwgY29tZSBhYm91dCEKICAgIEkgd2FycmFudCwgYW4gSSBzaG91bGQgbGl2ZSBhIHRob3VzYW5kIHllYXJzLAogICAgSSBuZXZlciBzaG91bGQgZm9yZ2V0IGl0OiAnV2lsdCB0aG91IG5vdCwgSnVsZT8nIHF1b3RoIGhlOwogICAgQW5kLCBwcmV0dHkgZm9vbCwgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKTEFEWSBDQVBVTEVUCgogICAgRW5vdWdoIG9mIHRoaXM7IEkgcHJheSB0aGVlLCBob2xkIHRoeSBwZWFjZS4KCk51cnNlCgogICAgWWVzLCBtYWRhbTogeWV0IEkgY2Fubm90IGNob29zZSBidXQgbGF1Z2gsCiAgICBUbyB0aGluayBpdCBzaG91bGQgbGVhdmUgY3J5aW5nIGFuZCBzYXkgJ0F5LicKICAgIEFuZCB5ZXQsIEkgd2FycmFudCwgaXQgaGFkIHVwb24gaXRzIGJyb3cKICAgIEEgYnVtcCBhcyBiaWcgYXMgYSB5b3VuZyBjb2NrZXJlbCdzIHN0b25lOwogICAgQSBwYXJsb3VzIGtub2NrOyBhbmQgaXQgY3JpZWQgYml0dGVybHk6CiAgICAnWWVhLCcgcXVvdGggbXkgaHVzYmFuZCwnZmFsbCdzdCB1cG9uIHRoeSBmYWNlPwogICAgVGhvdSB3aWx0IGZhbGwgYmFja3dhcmQgd2hlbiB0aG91IGNvbWVzdCB0byBhZ2U7CiAgICBXaWx0IHRob3Ugbm90LCBKdWxlPycgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKSlVMSUVUCgogICAgQW5kIHN0aW50IHRob3UgdG9vLCBJIHByYXkgdGhlZSwgbnVyc2UsIHNheSBJLgoKTnVyc2UKCiAgICBQZWFjZSwgSSBoYXZlIGRvbmUuIEdvZCBtYXJrIHRoZWUgdG8gaGlzIGdyYWNlIQogICAgVGhvdSB3YXN0IHRoZSBwcmV0dGllc3QgYmFiZSB0aGF0IGUnZXIgSSBudXJzZWQ6CiAgICBBbiBJIG1pZ2h0IGxpdmUgdG8gc2VlIHRoZWUgbWFycmllZCBvbmNlLAogICAgSSBoYXZlIG15IHdpc2guCgpMQURZIENBUFVMRVQKCiAgICBNYXJyeSwgdGhhdCAnbWFycnknIGlzIHRoZSB2ZXJ5IHRoZW1lCiAgICBJIGNhbWUgdG8gdGFsayBvZi4gVGVsbCBtZSwgZGF1Z2h0ZXIgSnVsaWV0LAogICAgSG93IHN0YW5kcyB5b3VyIGRpc3Bvc2l0aW9uIHRvIGJlIG1hcnJpZWQCgpKVUxJRVQKCiAgICBJdCBpcyBhbiBob25vdXIgdGhhdCBJIGRyZWFtIG5vdCBvZi4KCk51cnNlCgogICAgQW4gaG9ub3VyISB3ZXJlIG5vdCBJIHRoaW5lIG9ubHkgbnVyc2UsCiAgICBJIHdvdWxkIHNheSB0aG91IGhhZHN0IHN1Y2snZCB3aXNkb20gZnJvbSB0aHkgdGVhdC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHRoaW5rIG9mIG1hcnJpYWdlIG5vdzsgeW91bmdlciB0aGFuIHlvdSwKICAgIEhlcmUgaW4gVmVyb25hLCBsYWRpZXMgb2YgZXN0ZWVtLAogICAgQXJlIG1hZGUgYWxyZWFkeSBtb3RoZXJzOiBieSBteSBjb3VudCwKICAgIEkgd2FzIHlvdXIgbW90aGVyIG11Y2ggdXBvbiB0aGVzZSB5ZWFycwogICAgVGhhdCB5b3UgYXJlIG5vdyBhIG1haWQuIFRodXMgdGhlbiBpbiBicmllZjoKICAgIFRoZSB2YWxpYW50IFBhcmlzIHNlZWtzIHlvdSBmb3IgaGlzIGxvdmUuCgpOdXJzZQoKICAgIEEgbWFuLCB5b3VuZyBsYWR5ISBsYWR5LCBzdWNoIGEgbWFuCiAgICBBcyBhbGwgdGhlIHdvcmxkLS13aHksIGhlJ3MgYSBtYW4gb2Ygd2F4LgoKTEFEWSBDQVBVTEVUCgogICAgVmVyb25hJ3Mgc3VtbWVyIGhhdGggbm90IHN1Y2ggYSBmbG93ZXIuCgpOdXJzZQoKICAgIE5heSwgaGUncyBhIGZsb3dlcjsgaW4gZmFpdGgsIGEgdmVyeSBmbG93ZXIuCgpMQURZIENBUFVMRVQKCiAgICBXaGF0IHNheSB5b3UIGNhbiB5b3UgbG92ZSB0aGUgZ2VudGxlbWFuPwogICAgVGhpcyBuaWdodCB5b3Ugc2hhbGwgYmVob2xkIGhpbSBhdCBvdXIgZmVhc3Q7CiAgICBSZWFkIG8nZXIgdGhlIHZvbHVtZSBvZiB5b3VuZyBQYXJpcycgZmFjZSwKICAgIEFuZCBmaW5kIGRlbGlnaHQgd3JpdCB0aGVyZSB3aXRoIGJlYXV0eSdzIHBlbjsKICAgIEV4YW1pbmUgZXZlcnkgbWFycmllZCBsaW5lYW1lbnQsCiAgICBBbmQgc2VlIGhvdyBvbmUgYW5vdGhlciBsZW5kcyBjb250ZW50CiAgICBBbmQgd2hhdCBvYnNjdXJlZCBpbiB0aGlzIGZhaXIgdm9sdW1lIGxpZXMKICAgIEZpbmQgd3JpdHRlbiBpbiB0aGUgbWFyZ2VudCBvZiBoaXMgZXllcy4KICAgIFRoaXMgcHJlY2lvdXMgYm9vayBvZiBsb3ZlLCB0aGlzIHVuYm91bmQgbG92ZXIsCiAgICBUbyBiZWF1dGlmeSBoaW0sIG9ubHkgbGFja3MgYSBjb3ZlcjoKICAgIFRoZSBmaXNoIGxpdmVzIGluIHRoZSBzZWEsIGFuZCAndGlzIG11Y2ggcHJpZGUKICAgIEZvciBmYWlyIHdpdGhvdXQgdGhlIGZhaXIgd2l0aGluIHRvIGhpZGU6CiAgICBUaGF0IGJvb2sgaW4gbWFueSdzIGV5ZXMgZG90aCBzaGFyZSB0aGUgZ2xvcnksCiAgICBUaGF0IGluIGdvbGQgY2xhc3BzIGxvY2tzIGluIHRoZSBnb2xkZW4gc3Rvcnk7CiAgICBTbyBzaGFsbCB5b3Ugc2hhcmUgYWxsIHRoYXQgaGUgZG90aCBwb3NzZXNzLAogICAgQnkgaGF2aW5nIGhpbSwgbWFraW5nIHlvdXJzZWxmIG5vIGxlc3MuCgpOdXJzZQoKICAgIE5vIGxlc3MhIG5heSwgYmlnZ2VyOyB3b21lbiBncm93IGJ5IG1lbi4KCkxBRFkgQ0FQVUxFVAoKICAgIFNwZWFrIGJyaWVmbHksIGNhbiB5b3UgbGlrZSBvZiBQYXJpcycgbG92ZT8KCkpVTElFVAoKICAgIEknbGwgbG9vayB0byBsaWtlLCBpZiBsb29raW5nIGxpa2luZyBtb3ZlOgogICAgQnV0IG5vIG1vcmUgZGVlcCB3aWxsIEkgZW5kYXJ0IG1pbmUgZXllCiAgICBUaGFuIHlvdXIgY29uc2VudCBnaXZlcyBzdHJlbmd0aCB0byBtYWtlIGl0IGZseS4KCiAgICBFbnRlciBhIFNlcnZhbnQKClNlcnZhbnQKCiAgICBNYWRhbSwgdGhlIGd1ZXN0cyBhcmUgY29tZSwgc3VwcGVyIHNlcnZlZCB1cCwgeW91CiAgICBjYWxsZWQsIG15IHlvdW5nIGxhZHkgYXNrZWQgZm9yLCB0aGUgbnVyc2UgY3Vyc2VkIGluCiAgICB0aGUgcGFudHJ5LCBhbmQgZXZlcnkgdGhpbmcgaW4gZXh0cmVtaXR5LiBJIG11c3QKICAgIGhlbmNlIHRvIHdhaXQ7IEkgYmVzZWVjaCB5b3UsIGZvbGxvdyBzdHJhaWdodC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlIGZvbGxvdyB0aGVlLgoKICAgIEV4aXQgU2VydmFudAogICAgSnVsaWV0LCB0aGUgY291bnR5IHN0YXlzLgoKTnVyc2UKCiAgICBHbywgZ2lybCwgc2VlayBoYXBweSBuaWdodHMgdG8gaGFwcHkgZGF5cy4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBST01FTywgTUVSQ1VUSU8sIEJFTlZPTElPLCB3aXRoIGZpdmUgb3Igc2l4IE1hc2tlcnMsIFRvcmNoLWJlYXJlcnMsIGFuZCBvdGhlcnMgCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIHRoaXMgc3BlZWNoIGJlIHNwb2tlIGZvciBvdXIgZXhjdXNlPwogICAgT3Igc2hhbGwgd2Ugb24gd2l0aG91dCBhIGFwb2xvZ3kCgpCRU5WT0xJTwoKICAgIFRoZSBkYXRlIGlzIG91dCBvZiBzdWNoIHByb2xpeGl0eToKICAgIFdlJ2xsIGhhdmUgbm8gQ3VwaWQgaG9vZHdpbmsnZCB3aXRoIGEgc2NhcmYsCiAgICBCZWFyaW5nIGEgVGFydGFyJ3MgcGFpbnRlZCBib3cgb2YgbGF0aCwKICAgIFNjYXJpbmcgdGhlIGxhZGllcyBsaWtlIGEgY3Jvdy1rZWVwZXI7CiAgICBOb3Igbm8gd2l0aG91dC1ib29rIHByb2xvZ3VlLCBmYWludGx5IHNwb2tlCiAgICBBZnRlciB0aGUgcHJvbXB0ZXIsIGZvciBvdXIgZW50cmFuY2U6CiAgICBCdXQgbGV0IHRoZW0gbWVhc3VyZSB1cyBieSB3aGF0IHRoZXkgd2lsbDsKICAgIFdlJ2xsIG1lYXN1cmUgdGhlbSBhIG1lYXN1cmUsIGFuZCBiZSBnb25lLgoKUk9NRU8KCiAgICBHaXZlIG1lIGEgdG9yY2g6IEkgYW0gbm90IGZvciB0aGlzIGFtYmxpbmc7CiAgICBCZWluZyBidXQgaGVhdnksIEkgd2lsbCBiZWFyIHRoZSBsaWdodC4KCk1FUkNVVElPCgogICAgTmF5LCBnZW50bGUgUm9tZW8sIHdlIG11c3QgaGF2ZSB5b3UgZGFuY2UuCgpST01FTwoKICAgIE5vdCBJLCBiZWxpZXZlIG1lOiB5b3UgaGF2ZSBkYW5jaW5nIHNob2VzCiAgICBXaXRoIG5pbWJsZSBzb2xlczogSSBoYXZlIGEgc291bCBvZiBsZWFkCiAgICBTbyBzdGFrZXMgbWUgdG8gdGhlIGdyb3VuZCBJIGNhbm5vdCBtb3ZlLgoKTUVSQ1VUSU8KCiAgICBZb3UgYXJlIGEgbG92ZXI7IGJvcnJvdyBDdXBpZCdzIHdpbmdzLAogICAgQW5kIHNvYXIgd2l0aCB0aGVtIGFib3ZlIGEgY29tbW9uIGJvdW5kLgoKUk9NRU8KCiAgICBJIGFtIHRvbyBzb3JlIGVucGllcmNlZCB3aXRoIGhpcyBzaGFmdAogICAgVG8gc29hciB3aXRoIGhpcyBsaWdodCBmZWF0aGVycywgYW5kIHNvIGJvdW5kLAogICAgSSBjYW5ub3QgYm91bmQgYSBwaXRjaCBhYm92ZSBkdWxsIHdvZToKICAgIFVuZGVyIGxvdmUncyBoZWF2eSBidXJkZW4gZG8gSSBzaW5rLgoKTUVSQ1VUSU8KCiAgICBBbmQsIHRvIHNpbmsgaW4gaXQsIHNob3VsZCB5b3UgYnVyZGVuIGxvdmU7CiAgICBUb28gZ3JlYXQgb3BwcmVzc2lvbiBmb3IgYSB0ZW5kZXIgdGhpbmcuCgpST01FTwoKICAgIElzIGxvdmUgYSB0ZW5kZXIgdGhpbmcIGl0IGlzIHRvbyByb3VnaCwKICAgIFRvbyBydWRlLCB0b28gYm9pc3Rlcm91cywgYW5kIGl0IHByaWNrcyBsaWtlIHRob3JuLgoKTUVSQ1VUSU8KCiAgICBJZiBsb3ZlIGJlIHJvdWdoIHdpdGggeW91LCBiZSByb3VnaCB3aXRoIGxvdmU7CiAgICBQcmljayBsb3ZlIGZvciBwcmlja2luZywgYW5kIHlvdSBiZWF0IGxvdmUgZG93bi4KICAgIEdpdmUgbWUgYSBjYXNlIHRvIHB1dCBteSB2aXNhZ2UgaW46CiAgICBBIHZpc29yIGZvciBhIHZpc29yISB3aGF0IGNhcmUgSQogICAgV2hhdCBjdXJpb3VzIGV5ZSBkb3RoIHF1b3RlIGRlZm9ybWl0aWVzPwogICAgSGVyZSBhcmUgdGhlIGJlZXRsZSBicm93cyBzaGFsbCBibHVzaCBmb3IgbWUuCgpCRU5WT0xJTwoKICAgIENvbWUsIGtub2NrIGFuZCBlbnRlcjsgYW5kIG5vIHNvb25lciBpbiwKICAgIEJ1dCBldmVyeSBtYW4gYmV0YWtlIGhpbSB0byBoaXMgbGVncy4KClJPTUVPCgogICAgQSB0b3JjaCBmb3IgbWU6IGxldCB3YW50b25zIGxpZ2h0IG9mIGhlYXJ0CiAgICBUaWNrbGUgdGhlIHNlbnNlbGVzcyBydXNoZXMgd2l0aCB0aGVpciBoZWVscywKICAgIEZvciBJIGFtIHByb3ZlcmInZCB3aXRoIGEgZ3JhbmRzaXJlIHBocmFzZTsKICAgIEknbGwgYmUgYSBjYW5kbGUtaG9sZGVyLCBhbmQgbG9vayBvbi4KICAgIFRoZSBnYW1lIHdhcyBuZSdlciBzbyBmYWlyLCBhbmQgSSBhbSBkb25lLgoKTUVSQ1VUSU8KCiAgICBUdXQsIGR1bidzIHRoZSBtb3VzZSwgdGhlIGNvbnN0YWJsZSdzIG93biB3b3JkOgogICAgSWYgdGhvdSBhcnQgZHVuLCB3ZSdsbCBkcmF3IHRoZWUgZnJvbSB0aGUgbWlyZQogICAgT2YgdGhpcyBzaXItcmV2ZXJlbmNlIGxvdmUsIHdoZXJlaW4gdGhvdSBzdGljaydzdAogICAgVXAgdG8gdGhlIGVhcnMuIENvbWUsIHdlIGJ1cm4gZGF5bGlnaHQsIGhvIQoKUk9NRU8KCiAgICBOYXksIHRoYXQncyBub3Qgc28uCgpNRVJDVVRJTwoKICAgIEkgbWVhbiwgc2lyLCBpbiBkZWxheQogICAgV2Ugd2FzdGUgb3VyIGxpZ2h0cyBpbiB2YWluLCBsaWtlIGxhbXBzIGJ5IGRheS4KICAgIFRha2Ugb3VyIGdvb2QgbWVhbmluZywgZm9yIG91ciBqdWRnbWVudCBzaXRzCiAgICBGaXZlIHRpbWVzIGluIHRoYXQgZXJlIG9uY2UgaW4gb3VyIGZpdmUgd2l0cy4KClJPTUVPCgogICAgQW5kIHdlIG1lYW4gd2VsbCBpbiBnb2luZyB0byB0aGlzIG1hc2s7CiAgICBCdXQgJ3RpcyBubyB3aXQgdG8gZ28uCgpNRVJDVVRJTwoKICAgIFdoeSwgbWF5IG9uZSBhc2sCgpST01FTwoKICAgIEkgZHJlYW0nZCBhIGRyZWFtIHRvLW5pZ2h0LgoKTUVSQ1VUSU8KCiAgICBBbmQgc28gZGlkIEkuCgpST01FTwoKICAgIFdlbGwsIHdoYXQgd2FzIHlvdXJzPwoKTUVSQ1VUSU8KCiAgICBUaGF0IGRyZWFtZXJzIG9mdGVuIGxpZS4KClJPTUVPCgogICAgSW4gYmVkIGFzbGVlcCwgd2hpbGUgdGhleSBkbyBkcmVhbSB0aGluZ3MgdHJ1ZS4KCk1FUkNVVElPCgogICAgTywgdGhlbiwgSSBzZWUgUXVlZW4gTWFiIGhhdGggYmVlbiB3aXRoIHlvdS4KICAgIFNoZSBpcyB0aGUgZmFpcmllcycgbWlkd2lmZSwgYW5kIHNoZSBjb21lcwogICAgSW4gc2hhcGUgbm8gYmlnZ2VyIHRoYW4gYW4gYWdhdGUtc3RvbmUKICAgIE9uIHRoZSBmb3JlLWZpbmdlciBvZiBhbiBhbGRlcm1hbiwKICAgIERyYXduIHdpdGggYSB0ZWFtIG9mIGxpdHRsZSBhdG9taWVzCiAgICBBdGh3YXJ0IG1lbidzIG5vc2VzIGFzIHRoZXkgbGllIGFzbGVlcDsKICAgIEhlciB3YWdvbi1zcG9rZXMgbWFkZSBvZiBsb25nIHNwaWRlcnMnIGxlZ3MsCiAgICBUaGUgY292ZXIgb2YgdGhlIHdpbmdzIG9mIGdyYXNzaG9wcGVycywKICAgIFRoZSB0cmFjZXMgb2YgdGhlIHNtYWxsZXN0IHNwaWRlcidzIHdlYiwKICAgIFRoZSBjb2xsYXJzIG9mIHRoZSBtb29uc2hpbmUncyB3YXRlcnkgYmVhbXMsCiAgICBIZXIgd2hpcCBvZiBjcmlja2V0J3MgYm9uZSwgdGhlIGxhc2ggb2YgZmlsbSwKICAgIEhlciB3YWdvbmVyIGEgc21hbGwgZ3JleS1jb2F0ZWQgZ25hdCwKICAgIE5vdCBzbyBiaWcgYXMgYSByb3VuZCBsaXR0bGUgd29ybQogICAgUHJpY2snZCBmcm9tIHRoZSBsYXp5IGZpbmdlciBvZiBhIG1haWQ7CiAgICBIZXIgY2hhcmlvdCBpcyBhbiBlbXB0eSBoYXplbC1udXQKICAgIE1hZGUgYnkgdGhlIGpvaW5lciBzcXVpcnJlbCBvciBvbGQgZ3J1YiwKICAgIFRpbWUgb3V0IG8nIG1pbmQgdGhlIGZhaXJpZXMnIGNvYWNobWFrZXJzLgogICAgQW5kIGluIHRoaXMgc3RhdGUgc2hlIGdhbGxvcHMgbmlnaHQgYnkgbmlnaHQKICAgIFRocm91Z2ggbG92ZXJzJyBicmFpbnMsIGFuZCB0aGVuIHRoZXkgZHJlYW0gb2YgbG92ZTsKICAgIE8nZXIgY291cnRpZXJzJyBrbmVlcywgdGhhdCBkcmVhbSBvbiBjb3VydCdzaWVzIHN0cmFpZ2h0LAogICAgTydlciBsYXd5ZXJzJyBmaW5nZXJzLCB3aG8gc3RyYWlnaHQgZHJlYW0gb24gZmVlcywKICAgIE8nZXIgbGFkaWVzICcgbGlwcywgd2hvIHN0cmFpZ2h0IG9uIGtpc3NlcyBkcmVhbSwKICAgIFdoaWNoIG9mdCB0aGUgYW5ncnkgTWFiIHdpdGggYmxpc3RlcnMgcGxhZ3VlcywKICAgIEJlY2F1c2UgdGhlaXIgYnJlYXRocyB3aXRoIHN3ZWV0bWVhdHMgdGFpbnRlZCBhcmU6CiAgICBTb21ldGltZSBzaGUgZ2FsbG9wcyBvJ2VyIGEgY291cnRpZXIncyBub3NlLAogICAgQW5kIHRoZW4gZHJlYW1zIGhlIG9mIHNtZWxsaW5nIG91dCBhIHN1aXQ7CiAgICBBbmQgc29tZXRpbWUgY29tZXMgc2hlIHdpdGggYSB0aXRoZS1waWcncyB0YWlsCiAgICBUaWNrbGluZyBhIHBhcnNvbidzIG5vc2UgYXMgYScgbGllcyBhc2xlZXAsCiAgICBUaGVuIGRyZWFtcywgaGUgb2YgYW5vdGhlciBiZW5lZmljZToKICAgIFNvbWV0aW1lIHNoZSBkcml2ZXRoIG8nZXIgYSBzb2xkaWVyJ3MgbmVjaywKICAgIEFuZCB0aGVuIGRyZWFtcyBoZSBvZiBjdXR0aW5nIGZvcmVpZ24gdGhyb2F0cywKICAgIE9mIGJyZWFjaGVzLCBhbWJ1c2NhZG9lcywgU3BhbmlzaCBibGFkZXMsCiAgICBPZiBoZWFsdGhzIGZpdmUtZmF0aG9tIGRlZXA7IGFuZCB0aGVuIGFub24KICAgIERydW1zIGluIGhpcyBlYXIsIGF0IHdoaWNoIGhlIHN0YXJ0cyBhbmQgd2FrZXMsCiAgICBBbmQgYmVpbmcgdGh1cyBmcmlnaHRlZCBzd2VhcnMgYSBwcmF5ZXIgb3IgdHdvCiAgICBBbmQgc2xlZXBzIGFnYWluLiBUaGlzIGlzIHRoYXQgdmVyeSBNYWIKICAgIFRoYXQgcGxhdHMgdGhlIG1hbmVzIG9mIGhvcnNlcyBpbiB0aGUgbmlnaHQsCiAgICBBbmQgYmFrZXMgdGhlIGVsZmxvY2tzIGluIGZvdWwgc2x1dHRpc2ggaGFpcnMsCiAgICBXaGljaCBvbmNlIHVudGFuZ2xlZCwgbXVjaCBtaXNmb3J0dW5lIGJvZGVzOgogICAgVGhpcyBpcyB0aGUgaGFnLCB3aGVuIG1haWRzIGxpZSBvbiB0aGVpciBiYWNrcywKICAgIFRoYXQgcHJlc3NlcyB0aGVtIGFuZCBsZWFybnMgdGhlbSBmaXJzdCB0byBiZWFyLAogICAgTWFraW5nIHRoZW0gd29tZW4gb2YgZ29vZCBjYXJyaWFnZToKICAgIFRoaXMgaXMgc2hlLS0KClJPTUVPCgogICAgUGVhY2UsIHBlYWNlLCBNZXJjdXRpbywgcGVhY2UhCiAgICBUaG91IHRhbGsnc3Qgb2Ygbm90aGluZy4KCk1FUkNVVElPCgogICAgVHJ1ZSwgSSB0YWxrIG9mIGRyZWFtcywKICAgIFdoaWNoIGFyZSB0aGUgY2hpbGRyZW4gb2YgYW4gaWRsZSBicmFpbiwKICAgIEJlZ290IG9mIG5vdGhpbmcgYnV0IHZhaW4gZmFudGFzeSwKICAgIFdoaWNoIGlzIGFzIHRoaW4gb2Ygc3Vic3RhbmNlIGFzIHRoZSBhaXIKICAgIEFuZCBtb3JlIGluY29uc3RhbnQgdGhhbiB0aGUgd2luZCwgd2hvIHdvb2VzCiAgICBFdmVuIG5vdyB0aGUgZnJvemVuIGJvc29tIG9mIHRoZSBub3J0aCwKICAgIEFuZCwgYmVpbmcgYW5nZXInZCwgcHVmZnMgYXdheSBmcm9tIHRoZW5jZSwKICAgIFR1cm5pbmcgaGlzIGZhY2UgdG8gdGhlIGRldy1kcm9wcGluZyBzb3V0aC4KCkJFTlZPTElPCgogICAgVGhpcyB3aW5kLCB5b3UgdGFsayBvZiwgYmxvd3MgdXMgZnJvbSBvdXJzZWx2ZXM7CiAgICBTdXBwZXIgaXMgZG9uZSwgYW5kIHdlIHNoYWxsIGNvbWUgdG9vIGxhdGUuCgpST01FTwoKICAgIEkgZmVhciwgdG9vIGVhcmx5OiBmb3IgbXkgbWluZCBtaXNnaXZlcwogICAgU29tZSBjb25zZXF1ZW5jZSB5ZXQgaGFuZ2luZyBpbiB0aGUgc3RhcnMKICAgIFNoYWxsIGJpdHRlcmx5IGJlZ2luIGhpcyBmZWFyZnVsIGRhdGUKICAgIFdpdGggdGhpcyBuaWdodCdzIHJldmVscyBhbmQgZXhwaXJlIHRoZSB0ZXJtCiAgICBPZiBhIGRlc3Bpc2VkIGxpZmUgY2xvc2VkIGluIG15IGJyZWFzdAogICAgQnkgc29tZSB2aWxlIGZvcmZlaXQgb2YgdW50aW1lbHkgZGVhdGguCiAgICBCdXQgSGUsIHRoYXQgaGF0aCB0aGUgc3RlZXJhZ2Ugb2YgbXkgY291cnNlLAogICAgRGlyZWN0IG15IHNhaWwhIE9uLCBsdXN0eSBnZW50bGVtZW4uCgpCRU5WT0xJTwoKICAgIFN0cmlrZSwgZHJ1bS4KCiAgICBFeGV1bnQKClNDRU5FIFYuIEEgaGFsbCBpbiBDYXB1bGV0J3MgaG91c2UuCgogICAgTXVzaWNpYW5zIHdhaXRpbmcuIEVudGVyIFNlcnZpbmdtZW4gd2l0aCBuYXBraW5zIAoKRmlyc3QgU2VydmFudAoKICAgIFdoZXJlJ3MgUG90cGFuLCB0aGF0IGhlIGhlbHBzIG5vdCB0byB0YWtlIGF3YXkIEhlCiAgICBzaGlmdCBhIHRyZW5jaGVyPyBoZSBzY3JhcGUgYSB0cmVuY2hlciEKClNlY29uZCBTZXJ2YW50CgogICAgV2hlbiBnb29kIG1hbm5lcnMgc2hhbGwgbGllIGFsbCBpbiBvbmUgb3IgdHdvIG1lbidzCiAgICBoYW5kcyBhbmQgdGhleSB1bndhc2hlZCB0b28sICd0aXMgYSBmb3VsIHRoaW5nLgoKRmlyc3QgU2VydmFudAoKICAgIEF3YXkgd2l0aCB0aGUgam9pbnQtc3Rvb2xzLCByZW1vdmUgdGhlCiAgICBjb3VydC1jdXBib2FyZCwgbG9vayB0byB0aGUgcGxhdGUuIEdvb2QgdGhvdSwgc2F2ZQogICAgbWUgYSBwaWVjZSBvZiBtYXJjaHBhbmU7IGFuZCwgYXMgdGhvdSBsb3Zlc3QgbWUsIGxldAogICAgdGhlIHBvcnRlciBsZXQgaW4gU3VzYW4gR3JpbmRzdG9uZSBhbmQgTmVsbC4KICAgIEFudG9ueSwgYW5kIFBvdHBhbiEKClNlY29uZCBTZXJ2YW50CgogICAgQXksIGJveSwgcmVhZHkuCgpGaXJzdCBTZXJ2YW50CgogICAgWW91IGFyZSBsb29rZWQgZm9yIGFuZCBjYWxsZWQgZm9yLCBhc2tlZCBmb3IgYW5kCiAgICBzb3VnaHQgZm9yLCBpbiB0aGUgZ3JlYXQgY2hhbWJlci4KClNlY29uZCBTZXJ2YW50CgogICAgV2UgY2Fubm90IGJlIGhlcmUgYW5kIHRoZXJlIHRvby4gQ2hlZXJseSwgYm95czsgYmUKICAgIGJyaXNrIGF3aGlsZSwgYW5kIHRoZSBsb25nZXIgbGl2ZXIgdGFrZSBhbGwuCgogICAgRW50ZXIgQ0FQVUxFVCwgd2l0aCBKVUxJRVQgYW5kIG90aGVycyBvZiBoaXMgaG91c2UsIG1lZXRpbmcgdGhlIEd1ZXN0cyBhbmQgTWFza2VycwoKQ0FQVUxFVAoKICAgIFdlbGNvbWUsIGdlbnRsZW1lbiEgbGFkaWVzIHRoYXQgaGF2ZSB0aGVpciB0b2VzCiAgICBVbnBsYWd1ZWQgd2l0aCBjb3JucyB3aWxsIGhhdmUgYSBib3V0IHdpdGggeW91LgogICAgQWggaGEsIG15IG1pc3RyZXNzZXMhIHdoaWNoIG9mIHlvdSBhbGwKICAgIFdpbGwgbm93IGRlbnkgdG8gZGFuY2UIHNoZSB0aGF0IG1ha2VzIGRhaW50eSwKICAgIFNoZSwgSSdsbCBzd2VhciwgaGF0aCBjb3JuczsgYW0gSSBjb21lIG5lYXIgeWUgbm93PwogICAgV2VsY29tZSwgZ2VudGxlbWVuISBJIGhhdmUgc2VlbiB0aGUgZGF5CiAgICBUaGF0IEkgaGF2ZSB3b3JuIGEgdmlzb3IgYW5kIGNvdWxkIHRlbGwKICAgIEEgd2hpc3BlcmluZyB0YWxlIGluIGEgZmFpciBsYWR5J3MgZWFyLAogICAgU3VjaCBhcyB3b3VsZCBwbGVhc2U6ICd0aXMgZ29uZSwgJ3RpcyBnb25lLCAndGlzIGdvbmU6CiAgICBZb3UgYXJlIHdlbGNvbWUsIGdlbnRsZW1lbiEgY29tZSwgbXVzaWNpYW5zLCBwbGF5LgogICAgQSBoYWxsLCBhIGhhbGwhIGdpdmUgcm9vbSEgYW5kIGZvb3QgaXQsIGdpcmxzLgoKICAgIE11c2ljIHBsYXlzLCBhbmQgdGhleSBkYW5jZQogICAgTW9yZSBsaWdodCwgeW91IGtuYXZlczsgYW5kIHR1cm4gdGhlIHRhYmxlcyB1cCwKICAgIEFuZCBxdWVuY2ggdGhlIGZpcmUsIHRoZSByb29tIGlzIGdyb3duIHRvbyBob3QuCiAgICBBaCwgc2lycmFoLCB0aGlzIHVubG9vaydkLWZvciBzcG9ydCBjb21lcyB3ZWxsLgogICAgTmF5LCBzaXQsIG5heSwgc2l0LCBnb29kIGNvdXNpbiBDYXB1bGV0OwogICAgRm9yIHlvdSBhbmQgSSBhcmUgcGFzdCBvdXIgZGFuY2luZyBkYXlzOgogICAgSG93IGxvbmcgaXMndCBub3cgc2luY2UgbGFzdCB5b3Vyc2VsZiBhbmQgSQogICAgV2VyZSBpbiBhIG1hc2sCgpTZWNvbmQgQ2FwdWxldAoKICAgIEJ5J3IgbGFkeSwgdGhpcnR5IHllYXJzLgoKQ0FQVUxFVAoKICAgIFdoYXQsIG1hbiEgJ3RpcyBub3Qgc28gbXVjaCwgJ3RpcyBub3Qgc28gbXVjaDoKICAgICdUaXMgc2luY2UgdGhlIG51cHRpYWxzIG9mIEx1Y2VudGlvLAogICAgQ29tZSBwZW50ZWNvc3QgYXMgcXVpY2tseSBhcyBpdCB3aWxsLAogICAgU29tZSBmaXZlIGFuZCB0d2VudHkgeWVhcnM7IGFuZCB0aGVuIHdlIG1hc2snZC4KClNlY29uZCBDYXB1bGV0CgogICAgJ1RpcyBtb3JlLCAndGlzIG1vcmUsIGhpcyBzb24gaXMgZWxkZXIsIHNpcjsKICAgIEhpcyBzb24gaXMgdGhpcnR5LgoKQ0FQVUxFVAoKICAgIFdpbGwgeW91IHRlbGwgbWUgdGhhdD8KICAgIEhpcyBzb24gd2FzIGJ1dCBhIHdhcmQgdHdvIHllYXJzIGFnby4KClJPTUVPCgogICAgW1RvIGEgU2VydmluZ21hbl0gV2hhdCBsYWR5IGlzIHRoYXQsIHdoaWNoIGRvdGgKICAgIGVucmljaCB0aGUgaGFuZAogICAgT2YgeW9uZGVyIGtuaWdodD8KClNlcnZhbnQKCiAgICBJIGtub3cgbm90LCBzaXIuCgpST01FTwoKICAgIE8sIHNoZSBkb3RoIHRlYWNoIHRoZSB0b3JjaGVzIHRvIGJ1cm4gYnJpZ2h0IQogICAgSXQgc2VlbXMgc2hlIGhhbmdzIHVwb24gdGhlIGNoZWVrIG9mIG5pZ2h0CiAgICBMaWtlIGEgcmljaCBqZXdlbCBpbiBhbiBFdGhpb3BlJ3MgZWFyOwogICAgQmVhdXR5IHRvbyByaWNoIGZvciB1c2UsIGZvciBlYXJ0aCB0b28gZGVhciEKICAgIFNvIHNob3dzIGEgc25vd3kgZG92ZSB0cm9vcGluZyB3aXRoIGNyb3dzLAogICAgQXMgeW9uZGVyIGxhZHkgbydlciBoZXIgZmVsbG93cyBzaG93cy4KICAgIFRoZSBtZWFzdXJlIGRvbmUsIEknbGwgd2F0Y2ggaGVyIHBsYWNlIG9mIHN0YW5kLAogICAgQW5kLCB0b3VjaGluZyBoZXJzLCBtYWtlIGJsZXNzZWQgbXkgcnVkZSBoYW5kLgogICAgRGlkIG15IGhlYXJ0IGxvdmUgdGlsbCBub3cIGZvcnN3ZWFyIGl0LCBzaWdodCEKICAgIEZvciBJIG5lJ2VyIHNhdyB0cnVlIGJlYXV0eSB0aWxsIHRoaXMgbmlnaHQuCgpUWUJBTFQKCiAgICBUaGlzLCBieSBoaXMgdm9pY2UsIHNob3VsZCBiZSBhIE1vbnRhZ3VlLgogICAgRmV0Y2ggbWUgbXkgcmFwaWVyLCBib3kuIFdoYXQgZGFyZXMgdGhlIHNsYXZlCiAgICBDb21lIGhpdGhlciwgY292ZXInZCB3aXRoIGFuIGFudGljIGZhY2UsCiAgICBUbyBmbGVlciBhbmQgc2Nvcm4gYXQgb3VyIHNvbGVtbml0eT8KICAgIE5vdywgYnkgdGhlIHN0b2NrIGFuZCBob25vdXIgb2YgbXkga2luLAogICAgVG8gc3RyaWtlIGhpbSBkZWFkLCBJIGhvbGQgaXQgbm90IGEgc2luLgoKQ0FQVUxFVAoKICAgIFdoeSwgaG93IG5vdywga2luc21hbiEgd2hlcmVmb3JlIHN0b3JtIHlvdSBzbz8KClRZQkFMVAoKICAgIFVuY2xlLCB0aGlzIGlzIGEgTW9udGFndWUsIG91ciBmb2UsCiAgICBBIHZpbGxhaW4gdGhhdCBpcyBoaXRoZXIgY29tZSBpbiBzcGl0ZSwKICAgIFRvIHNjb3JuIGF0IG91ciBzb2xlbW5pdHkgdGhpcyBuaWdodC4KCkNBUFVMRVQKCiAgICBZb3VuZyBSb21lbyBpcyBpdD8KClRZQkFMVAoKICAgICdUaXMgaGUsIHRoYXQgdmlsbGFpbiBSb21lby4KCkNBUFVMRVQKCiAgICBDb250ZW50IHRoZWUsIGdlbnRsZSBjb3osIGxldCBoaW0gYWxvbmU7CiAgICBIZSBiZWFycyBoaW0gbGlrZSBhIHBvcnRseSBnZW50bGVtYW47CiAgICBBbmQsIHRvIHNheSB0cnV0aCwgVmVyb25hIGJyYWdzIG9mIGhpbQogICAgVG8gYmUgYSB2aXJ0dW91cyBhbmQgd2VsbC1nb3Zlcm4nZCB5b3V0aDoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd2VhbHRoIG9mIGFsbCB0aGUgdG93bgogICAgSGVyZSBpbiBteSBob3VzZSBkbyBoaW0gZGlzcGFyYWdlbWVudDoKICAgIFRoZXJlZm9yZSBiZSBwYXRpZW50LCB0YWtlIG5vIG5vdGUgb2YgaGltOgogICAgSXQgaXMgbXkgd2lsbCwgdGhlIHdoaWNoIGlmIHRob3UgcmVzcGVjdCwKICAgIFNob3cgYSBmYWlyIHByZXNlbmNlIGFuZCBwdXQgb2ZmIHRoZXNlIGZyb3ducywKICAgIEFuZCBpbGwtYmVzZWVtaW5nIHNlbWJsYW5jZSBmb3IgYSBmZWFzdC4KClRZQkFMVAoKICAgIEl0IGZpdHMsIHdoZW4gc3VjaCBhIHZpbGxhaW4gaXMgYSBndWVzdDoKICAgIEknbGwgbm90IGVuZHVyZSBoaW0uCgpDQVBVTEVUCgogICAgSGUgc2hhbGwgYmUgZW5kdXJlZDoKICAgIFdoYXQsIGdvb2RtYW4gYm95ISBJIHNheSwgaGUgc2hhbGw6IGdvIHRvOwogICAgQW0gSSB0aGUgbWFzdGVyIGhlcmUsIG9yIHlvdT8gZ28gdG8uCiAgICBZb3UnbGwgbm90IGVuZHVyZSBoaW0hIEdvZCBzaGFsbCBtZW5kIG15IHNvdWwhCiAgICBZb3UnbGwgbWFrZSBhIG11dGlueSBhbW9uZyBteSBndWVzdHMhCiAgICBZb3Ugd2lsbCBzZXQgY29jay1hLWhvb3AhIHlvdSdsbCBiZSB0aGUgbWFuIQoKVFlCQUxUCgogICAgV2h5LCB1bmNsZSwgJ3RpcyBhIHNoYW1lLgoKQ0FQVUxFVAoKICAgIEdvIHRvLCBnbyB0bzsKICAgIFlvdSBhcmUgYSBzYXVjeSBib3k6IGlzJ3Qgc28sIGluZGVlZD8KICAgIFRoaXMgdHJpY2sgbWF5IGNoYW5jZSB0byBzY2F0aGUgeW91LCBJIGtub3cgd2hhdDoKICAgIFlvdSBtdXN0IGNvbnRyYXJ5IG1lISBtYXJyeSwgJ3RpcyB0aW1lLgogICAgV2VsbCBzYWlkLCBteSBoZWFydHMhIFlvdSBhcmUgYSBwcmluY294OyBnbzoKICAgIEJlIHF1aWV0LCBvci0tTW9yZSBsaWdodCwgbW9yZSBsaWdodCEgRm9yIHNoYW1lIQogICAgSSdsbCBtYWtlIHlvdSBxdWlldC4gV2hhdCwgY2hlZXJseSwgbXkgaGVhcnRzIQoKVFlCQUxUCgogICAgUGF0aWVuY2UgcGVyZm9yY2Ugd2l0aCB3aWxmdWwgY2hvbGVyIG1lZXRpbmcKICAgIE1ha2VzIG15IGZsZXNoIHRyZW1ibGUgaW4gdGhlaXIgZGlmZmVyZW50IGdyZWV0aW5nLgogICAgSSB3aWxsIHdpdGhkcmF3OiBidXQgdGhpcyBpbnRydXNpb24gc2hhbGwKICAgIE5vdyBzZWVtaW5nIHN3ZWV0IGNvbnZlcnQgdG8gYml0dGVyIGdhbGwuCgogICAgRXhpdAoKUk9NRU8KCiAgICBbVG8gSlVMSUVUXSBJZiBJIHByb2ZhbmUgd2l0aCBteSB1bndvcnRoaWVzdCBoYW5kCiAgICBUaGlzIGhvbHkgc2hyaW5lLCB0aGUgZ2VudGxlIGZpbmUgaXMgdGhpczoKICAgIE15IGxpcHMsIHR3byBibHVzaGluZyBwaWxncmltcywgcmVhZHkgc3RhbmQKICAgIFRvIHNtb290aCB0aGF0IHJvdWdoIHRvdWNoIHdpdGggYSB0ZW5kZXIga2lzcy4KCkpVTElFVAoKICAgIEdvb2QgcGlsZ3JpbSwgeW91IGRvIHdyb25nIHlvdXIgaGFuZCB0b28gbXVjaCwKICAgIFdoaWNoIG1hbm5lcmx5IGRldm90aW9uIHNob3dzIGluIHRoaXM7CiAgICBGb3Igc2FpbnRzIGhhdmUgaGFuZHMgdGhhdCBwaWxncmltcycgaGFuZHMgZG8gdG91Y2gsCiAgICBBbmQgcGF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lIGJlIG1hcnJpZWQuCiAgICBNeSBncmF2ZSBpcyBsaWtlIHRvIGJlIG15IHdlZGRpbmcgYmVkLgoKTnVyc2UKCiAgICBIaXMgbmFtZSBpcyBSb21lbywgYW5kIGEgTW9udGFndWU7CiAgICBUaGUgb25seSBzb24gb2YgeW91ciBncmVhdCBlbmVteS4KCkpVTElFVAoKICAgIE15IG9ubHkgbG92ZSBzcHJ1bmcgZnJvbSBteSBvbmx5IGhhdGUhCiAgICBUb28gZWFybHkgc2VlbiB1bmtub3duLCBhbmQga25vd24gdG9vIGxhdGUhCiAgICBQcm9kaWdpb3VzIGJpcnRoIG9mIGxvdmUgaXQgaXMgdG8gbWUsCiAgICBUaGF0IEkgbXVzdCBsb3ZlIGEgbG9hdGhlZCBlbmVteS4KCk51cnNlCgogICAgV2hhdCdzIHRoaXMIHdoYXQncyB0aGlzPwoKSlVMSUVUCgogICAgQSByaHltZSBJIGxlYXJuJ2QgZXZlbiBub3cKICAgIE9mIG9uZSBJIGRhbmNlZCB3aXRoYWwuCgogICAgT25lIGNhbGxzIHdpdGhpbiAnSnVsaWV0LicKCk51cnNlCgogICAgQW5vbiwgYW5vbiEKICAgIENvbWUsIGxldCdzIGF3YXk7IHRoZSBzdHJhbmdlcnMgYWxsIGFyZSBnb25lLgoKICAgIEV4ZXVudAoKQUNUIElJClBST0xPR1VFCgogICAgRW50ZXIgQ2hvcnVzIAoKQ2hvcnVzCgogICAgTm93IG9sZCBkZXNpcmUgZG90aCBpbiBoaXMgZGVhdGgtYmVkIGxpZSwKICAgIEFuZCB5b3VuZyBhZmZlY3Rpb24gZ2FwZXMgdG8gYmUgaGlzIGhlaXI7CiAgICBUaGF0IGZhaXIgZm9yIHdoaWNoIGxvdmUgZ3JvYW4nZCBmb3IgYW5kIHdvdWxkIGRpZSwKICAgIFdpdGggdGVuZGVyIEp1bGlldCBtYXRjaCdkLCBpcyBub3cgbm90IGZhaXIuCiAgICBOb3cgUm9tZW8gaXMgYmVsb3ZlZCBhbmQgbG92ZXMgYWdhaW4sCiAgICBBbGlrZSBiZXR3aXRjaGVkIGJ5IHRoZSBjaGFybSBvZiBsb29rcywKICAgIEJ1dCB0byBoaXMgZm9lIHN1cHBvc2VkIGhlIG11c3QgY29tcGxhaW4sCiAgICBBbmQgc2hlIHN0ZWFsIGxvdmUncyBzd2VldCBiYWl0IGZyb20gZmVhcmZ1bCBob29rczoKICAgIEJlaW5nIGhlbGQgYSBmb2UsIGhlIG1heSBub3QgaGF2ZSBhY2Nlc3MKICAgIFRvIGJyZWF0aGUgc3VjaCB2b3dzIGFzIGxvdmVycyB1c2UgdG8gc3dlYXI7CiAgICBBbmQgc2hlIGFzIG11Y2ggaW4gbG92ZSwgaGVyIG1lYW5zIG11Y2ggbGVzcwogICAgVG8gbWVldCBoZXIgbmV3LWJlbG92ZWQgYW55IHdoZXJlOgogICAgQnV0IHBhc3Npb24gbGVuZHMgdGhlbSBwb3dlciwgdGltZSBtZWFucywgdG8gbWVldAogICAgVGVtcGVyaW5nIGV4dHJlbWl0aWVzIHdpdGggZXh0cmVtZSBzd2VldC4KCiAgICBFeGl0CgpTQ0VORSBJLiBBIGxhbmUgYnkgdGhlIHdhbGwgb2YgQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gCgpST01FTwoKICAgIENhbiBJIGdvIGZvcndhcmQgd2hlbiBteSBoZWFydCBpcyBoZXJlPwogICAgVHVybiBiYWNrLCBkdWxsIGVhcnRoLCBhbmQgZmluZCB0aHkgY2VudHJlIG91dC4KCiAgICBIZSBjbGltYnMgdGhlIHdhbGwsIGFuZCBsZWFwcyBkb3duIHdpdGhpbiBpdAoKICAgIEVudGVyIEJFTlZPTElPIGFuZCBNRVJDVVRJTwoKQkVOVk9MSU8KCiAgICBSb21lbyEgbXkgY291c2luIFJvbWVvIQoKTUVSQ1VUSU8KCiAgICBIZSBpcyB3aXNlOwogICAgQW5kLCBvbiBteSBsaWUsIGhhdGggc3RvbCduIGhpbSBob21lIHRvIGJlZC4KCkJFTlZPTElPCgogICAgSGUgcmFuIHRoaXMgd2F5LCBhbmQgbGVhcCdkIHRoaXMgb3JjaGFyZCB3YWxsOgogICAgQ2FsbCwgZ29vZCBNZXJjdXRpby4KCk1FUkNVVElPCgogICAgTmF5LCBJJ2xsIGNvbmp1cmUgdG9vLgogICAgUm9tZW8hIGh1bW91cnMhIG1hZG1hbiEgcGFzc2lvbiEgbG92ZXIhCiAgICBBcHBlYXIgdGhvdSBpbiB0aGUgbGlrZW5lc3Mgb2YgYSBzaWdoOgogICAgU3BlYWsgYnV0IG9uZSByaHltZSwgYW5kIEkgYW0gc2F0aXNmaWVkOwogICAgQ3J5IGJ1dCAnQXkgbWUhJyBwcm9ub3VuY2UgYnV0ICdsb3ZlJyBhbmQgJ2RvdmU7JwogICAgU3BlYWsgdG8gbXkgZ29zc2lwIFZlbnVzIG9uZSBmYWlyIHdvcmQsCiAgICBPbmUgbmljay1uYW1lIGZvciBoZXIgcHVyYmxpbmQgc29uIGFuZCBoZWlyLAogICAgWW91bmcgQWRhbSBDdXBpZCwgaGUgdGhhdCBzaG90IHNvIHRyaW0sCiAgICBXaGVuIEtpbmcgQ29waGV0dWEgbG92ZWQgdGhlIGJlZ2dhci1tYWlkIQogICAgSGUgaGVhcmV0aCBub3QsIGhlIHN0aXJyZXRoIG5vdCwgaGUgbW92ZXRoIG5vdDsKICAgIFRoZSBhcGUgaXMgZGVhZCwgYW5kIEkgbXVzdCBjb25qdXJlIGhpbS4KICAgIEkgY29uanVyZSB0aGVlIGJ5IFJvc2FsaW5lJ3MgYnJpZ2h0IGV5ZXMsCiAgICBCeSBoZXIgaGlnaCBmb3JlaGVhZCBhbmQgaGVyIHNjYXJsZXQgbGlwLAogICAgQnkgaGVyIGZpbmUgZm9vdCwgc3RyYWlnaHQgbGVnIGFuZCBxdWl2ZXJpbmcgdGhpZ2gKICAgIEFuZCB0aGUgZGVtZXNuZXMgdGhhdCB0aGVyZSBhZGphY2VudCBsaWUsCiAgICBUaGF0IGluIHRoeSBsaWtlbmVzcyB0aG91IGFwcGVhciB0byB1cyEKCkJFTlZPTElPCgogICAgQW5kIGlmIGhlIGhlYXIgdGhlZSwgdGhvdSB3aWx0IGFuZ2VyIGhpbS4KCk1FUkNVVElPCgogICAgVGhpcyBjYW5ub3QgYW5nZXIgaGltOiAndHdvdWxkIGFuZ2VyIGhpbQogICAgVG8gcmFpc2UgYSBzcGlyaXQgaW4gaGlzIG1pc3RyZXNzJyBjaXJjbGUKICAgIE9mIHNvbWUgc3RyYW5nZSBuYXR1cmUsIGxldHRpbmcgaXQgdGhlcmUgc3RhbmQKICAgIFRpbGwgc2hlIGhhZCBsYWlkIGl0IGFuZCBjb25qdXJlZCBpdCBkb3duOwogICAgVGhhdCB3ZXJlIHNvbWUgc3BpdGU6IG15IGludm9jYXRpb24KICAgIElzIGZhaXIgYW5kIGhvbmVzdCwgYW5kIGluIGhpcyBtaXN0cmVzIHMnIG5hbWUKICAgIEkgY29uanVyZSBvbmx5IGJ1dCB0byByYWlzZSB1cCBoaW0uCgpCRU5WT0xJTwoKICAgIENvbWUsIGhlIGhhdGggaGlkIGhpbXNlbGYgYW1vbmcgdGhlc2UgdHJlZXMsCiAgICBUbyBiZSBjb25zb3J0ZWQgd2l0aCB0aGUgaHVtb3JvdXMgbmlnaHQ6CiAgICBCbGluZCBpcyBoaXMgbG92ZSBhbmQgYmVzdCBiZWZpdHMgdGhlIGRhcmsuCgpNRVJDVVRJTwoKICAgIElmIGxvdmUgYmUgYmxpbmQsIGxvdmUgY2Fubm90IGhpdCB0aGUgbWFyay4KICAgIE5vdyB3aWxsIGhlIHNpdCB1bmRlciBhIG1lZGxhciB0cmVlLAogICAgQW5kIHdpc2ggaGlzIG1pc3RyZXNzIHdlcmUgdGhhdCBraW5kIG9mIGZydWl0CiAgICBBcyBtYWlkcyBjYWxsIG1lZGxhcnMsIHdoZW4gdGhleSBsYXVnaCBhbG9uZS4KICAgIFJvbWVvLCB0aGF0IHNoZSB3ZXJlLCBPLCB0aGF0IHNoZSB3ZXJlCiAgICBBbiBvcGVuIGV0IGNhZXRlcmEsIHRob3UgYSBwb3BlcmluIHBlYXIhCiAgICBSb21lbywgZ29vZCBuaWdodDogSSdsbCB0byBteSB0cnVja2xlLWJlZDsKICAgIFRoaXMgZmllbGQtYmVkIGlzIHRvbyBjb2xkIGZvciBtZSB0byBzbGVlcDoKICAgIENvbWUsIHNoYWxsIHdlIGdvPwoKQkVOVk9MSU8KCiAgICBHbywgdGhlbjsgZm9yICd0aXMgaW4gdmFpbgogICAgVG8gc2VlayBoaW0gaGVyZSB0aGF0IG1lYW5zIG5vdCB0byBiZSBmb3VuZC4KCiAgICBFeGV1bnQKClNDRU5FIElJLiBDYXB1bGV0J3Mgb3JjaGFyZC4KCiAgICBFbnRlciBST01FTyAKClJPTUVPCgogICAgSGUgamVzdHMgYXQgc2NhcnMgdGhhdCBuZXZlciBmZWx0IGEgd291bmQuCgogICAgSlVMSUVUIGFwcGVhcnMgYWJvdmUgYXQgYSB3aW5kb3cKICAgIEJ1dCwgc29mdCEgd2hhdCBsaWdodCB0aHJvdWdoIHlvbmRlciB3aW5kb3cgYnJlYWtzPwogICAgSXQgaXMgdGhlIGVhc3QsIGFuZCBKdWxpZXQgaXMgdGhlIHN1bi4KICAgIEFyaXNlLCBmYWlyIHN1biwgYW5kIGtpbGwgdGhlIGVudmlvdXMgbW9vbiwKICAgIFdobyBpcyBhbHJlYWR5IHNpY2sgYW5kIHBhbGUgd2l0aCBncmllZiwKICAgIFRoYXQgdGhvdSBoZXIgbWFpZCBhcnQgZmFyIG1vcmUgZmFpciB0aGFuIHNoZToKICAgIEJlIG5vdCBoZXIgbWFpZCwgc2luY2Ugc2hlIGlzIGVudmlvdXM7CiAgICBIZXIgdmVzdGFsIGxpdmVyeSBpcyBidXQgc2ljayBhbmQgZ3JlZW4KICAgIEFuZCBub25lIGJ1dCBmb29scyBkbyB3ZWFyIGl0OyBjYXN0IGl0IG9mZi4KICAgIEl0IGlzIG15IGxhZHksIE8sIGl0IGlzIG15IGxvdmUhCiAgICBPLCB0aGF0IHNoZSBrbmV3IHNoZSB3ZXJlIQogICAgU2hlIHNwZWFrcyB5ZXQgc2hlIHNheXMgbm90aGluZzogd2hhdCBvZiB0aGF0PwogICAgSGVyIGV5ZSBkaXNjb3Vyc2VzOyBJIHdpbGwgYW5zd2VyIGl0LgogICAgSSBhbSB0b28gYm9sZCwgJ3RpcyBub3QgdG8gbWUgc2hlIHNwZWFrczoKICAgIFR3byBvZiB0aGUgZmFpcmVzdCBzdGFycyBpbiBhbGwgdGhlIGhlYXZlbiwKICAgIEhhdmluZyBzb21lIGJ1c2luZXNzLCBkbyBlbnRyZWF0IGhlciBleWVzCiAgICBUbyB0d2lua2xlIGluIHRoZWlyIHNwaGVyZXMgdGlsbCB0aGV5IHJldHVybi4KICAgIFdoYXQgaWYgaGVyIGV5ZXMgd2VyZSB0aGVyZSwgdGhleSBpbiBoZXIgaGVhZD8KICAgIFRoZSBicmlnaHRuZXNzIG9mIGhlciBjaGVlayB3b3VsZCBzaGFtZSB0aG9zZSBzdGFycywKICAgIEFzIGRheWxpZ2h0IGRvdGggYSBsYW1wOyBoZXIgZXllcyBpbiBoZWF2ZW4KICAgIFdvdWxkIHRocm91Z2ggdGhlIGFpcnkgcmVnaW9uIHN0cmVhbSBzbyBicmlnaHQKICAgIFRoYXQgYmlyZHMgd291bGQgc2luZyBhbmQgdGhpbmsgaXQgd2VyZSBub3QgbmlnaHQuCiAgICBTZWUsIGhvdyBzaGUgbGVhbnMgaGVyIGNoZWVrIHVwb24gaGVyIGhhbmQhCiAgICBPLCB0aGF0IEkgd2VyZSBhIGdsb3ZlIHVwb24gdGhhdCBoYW5kLAogICAgVGhhdCBJIG1pZ2h0IHRvdWNoIHRoYXQgY2hlZWshCgpKVUxJRVQKCiAgICBBeSBtZSEKClJPTUVPCgogICAgU2hlIHNwZWFrczoKICAgIE8sIHNwZWFrIGFnYWluLCBicmlnaHQgYW5nZWwhIGZvciB0aG91IGFydAogICAgQXMgZ2xvcmlvdXMgdG8gdGhpcyBuaWdodCwgYmVpbmcgbydlciBteSBoZWFkCiAgICBBcyBpcyBhIHdpbmdlZCBtZXNzZW5nZXIgb2YgaGVhdmVuCiAgICBVbnRvIHRoZSB3aGl0ZS11cHR1cm5lZCB3b25kZXJpbmcgZXllcwogICAgT2YgbW9ydGFscyB0aGF0IGZhbGwgYmFjayB0byBnYXplIG9uIGhpbQogICAgV2hlbiBoZSBiZXN0cmlkZXMgdGhlIGxhenktcGFjaW5nIGNsb3VkcwogICAgQW5kIHNhaWxzIHVwb24gdGhlIGJvc29tIG9mIHRoZSBhaXIuCgpKVUxJRVQKCiAgICBPIFJvbWVvLCBSb21lbyEgd2hlcmVmb3JlIGFydCB0aG91IFJvbWVvPwogICAgRGVueSB0aHkgZmF0aGVyIGFuZCByZWZ1c2UgdGh5IG5hbWU7CiAgICBPciwgaWYgdGhvdSB3aWx0IG5vdCwgYmUgYnV0IHN3b3JuIG15IGxvdmUsCiAgICBBbmQgSSdsbCBubyBsb25nZXIgYmUgYSBDYXB1bGV0LgoKUk9NRU8KCiAgICBbQXNpZGVdIFNoYWxsIEkgaGVhciBtb3JlLCBvciBzaGFsbCBJIHNwZWFrIGF0IHRoaXMCgpKVUxJRVQKCiAgICAnVGlzIGJ1dCB0aHkgbmFtZSB0aGF0IGlzIG15IGVuZW15OwogICAgVGhvdSBhcnQgdGh5c2VsZiwgdGhvdWdoIG5vdCBhIE1vbnRhZ3VlLgogICAgV2hhdCdzIE1vbnRhZ3VlPyBpdCBpcyBub3IgaGFuZCwgbm9yIGZvb3QsCiAgICBOb3IgYXJtLCBub3IgZmFjZSwgbm9yIGFueSBvdGhlciBwYXJ0CiAgICBCZWxvbmdpbmcgdG8gYSBtYW4uIE8sIGJlIHNvbWUgb3RoZXIgbmFtZSEKICAgIFdoYXQncyBpbiBhIG5hbWUIHRoYXQgd2hpY2ggd2UgY2FsbCBhIHJvc2UKICAgIEJ5IGFueSBvdGhlciBuYW1lIHdvdWxkIHNtZWxsIGFzIHN3ZWV0OwogICAgU28gUm9tZW8gd291bGQsIHdlcmUgaGUgbm90IFJvbWVvIGNhbGwnZCwKICAgIFJldGFpbiB0aGF0IGRlYXIgcGVyZmVjdGlvbiB3aGljaCBoZSBvd2VzCiAgICBXaXRob3V0IHRoYXQgdGl0bGUuIFJvbWVvLCBkb2ZmIHRoeSBuYW1lLAogICAgQW5kIGZvciB0aGF0IG5hbWUgd2hpY2ggaXMgbm8gcGFydCBvZiB0aGVlCiAgICBUYWtlIGFsbCBteXNlbGYuCgpST01FTwoKICAgIEkgdGFrZSB0aGVlIGF0IHRoeSB3b3JkOgogICAgQ2FsbCBtZSBidXQgbG92ZSwgYW5kIEknbGwgYmUgbmV3IGJhcHRpemVkOwogICAgSGVuY2Vmb3J0aCBJIG5ldmVyIHdpbGwgYmUgUm9tZW8uCgpKVUxJRVQKCiAgICBXaGF0IG1hbiBhcnQgdGhvdSB0aGF0IHRodXMgYmVzY3JlZW4nZCBpbiBuaWdodAogICAgU28gc3R1bWJsZXN0IG9uIG15IGNvdW5zZWwCgpST01FTwoKICAgIEJ5IGEgbmFtZQogICAgSSBrbm93IG5vdCBob3cgdG8gdGVsbCB0aGVlIHdobyBJIGFtOgogICAgTXkgbmFtZSwgZGVhciBzYWludCwgaXMgaGF0ZWZ1bCB0byBteXNlbGYsCiAgICBCZWNhdXNlIGl0IGlzIGFuIGVuZW15IHRvIHRoZWU7CiAgICBIYWQgSSBpdCB3cml0dGVuLCBJIHdvdWxkIHRlYXIgdGhlIHdvcmQuCgpKVUxJRVQKCiAgICBNeSBlYXJzIGhhdmUgbm90IHlldCBkcnVuayBhIGh1bmRyZWQgd29yZHMKICAgIE9mIHRoYXQgdG9uZ3VlJ3MgdXR0ZXJhbmNlLCB5ZXQgSSBrbm93IHRoZSBzb3VuZDoKICAgIEFydCB0aG91IG5vdCBSb21lbyBhbmQgYSBNb250YWd1ZT8KClJPTUVPCgogICAgTmVpdGhlciwgZmFpciBzYWludCwgaWYgZWl0aGVyIHRoZWUgZGlzbGlrZS4KCkpVTElFVAoKICAgIEhvdyBjYW1lc3QgdGhvdSBoaXRoZXIsIHRlbGwgbWUsIGFuZCB3aGVyZWZvcmUCiAgICBUaGUgb3JjaGFyZCB3YWxscyBhcmUgaGlnaCBhbmQgaGFyZCB0byBjbGltYiwKICAgIEFuZCB0aGUgcGxhY2UgZGVhdGgsIGNvbnNpZGVyaW5nIHdobyB0aG91IGFydCwKICAgIElmIGFueSBvZiBteSBraW5zbWVuIGZpbmQgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBXaXRoIGxvdmUncyBsaWdodCB3aW5ncyBkaWQgSSBvJ2VyLXBlcmNoIHRoZXNlIHdhbGxzOwogICAgRm9yIHN0b255IGxpbWl0cyBjYW5ub3QgaG9sZCBsb3ZlIG91dCwKICAgIEFuZCB3aGF0IGxvdmUgY2FuIGRvIHRoYXQgZGFyZXMgbG92ZSBhdHRlbXB0OwogICAgVGhlcmVmb3JlIHRoeSBraW5zbWVuIGFyZSBubyBsZXQgdG8gbWUuCgpKVUxJRVQKCiAgICBJZiB0aGV5IGRvIHNlZSB0aGVlLCB0aGV5IHdpbGwgbXVyZGVyIHRoZWUuCgpST01FTwoKICAgIEFsYWNrLCB0aGVyZSBsaWVzIG1vcmUgcGVyaWwgaW4gdGhpbmUgZXllCiAgICBUaGFuIHR3ZW50eSBvZiB0aGVpciBzd29yZHM6IGxvb2sgdGhvdSBidXQgc3dlZXQsCiAgICBBbmQgSSBhbSBwcm9vZiBhZ2FpbnN0IHRoZWlyIGVubWl0eS4KCkpVTElFVAoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd29ybGQgdGhleSBzYXcgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBJIGhhdmUgbmlnaHQncyBjbG9hayB0byBoaWRlIG1lIGZyb20gdGhlaXIgc2lnaHQ7CiAgICBBbmQgYnV0IHRob3UgbG92ZSBtZSwgbGV0IHRoZW0gZmluZCBtZSBoZXJlOgogICAgTXkgbGlmZSB3ZXJlIGJldHRlciBlbmRlZCBieSB0aGVpciBoYXRlLAogICAgVGhhbiBkZWF0aCBwcm9yb2d1ZWQsIHdhbnRpbmcgb2YgdGh5IGxvdmUuCgpKVUxJRVQKCiAgICBCeSB3aG9zZSBkaXJlY3Rpb24gZm91bmQnc3QgdGhvdSBvdXQgdGhpcyBwbGFjZT8KClJPTUVPCgogICAgQnkgbG92ZSwgd2hvIGZpcnN0IGRpZCBwcm9tcHQgbWUgdG8gaW5xdWlyZTsKICAgIEhlIGxlbnQgbWUgY291bnNlbCBhbmQgSSBsZW50IGhpbSBleWVzLgogICAgSSBhbSBubyBwaWxvdDsgeWV0LCB3ZXJ0IHRob3UgYXMgZmFyCiAgICBBcyB0aGF0IHZhc3Qgc2hvcmUgd2FzaCdkIHdpdGggdGhlIGZhcnRoZXN0IHNlYSwKICAgIEkgd291bGQgYWR2ZW50dXJlIGZvciBzdWNoIG1lcmNoYW5kaXNlLgoKSlVMSUVUCgogICAgVGhvdSBrbm93J3N0IHRoZSBtYXNrIG9mIG5pZ2h0IGlzIG9uIG15IGZhY2UsCiAgICBFbHNlIHdvdWxkIGEgbWFpZGVuIGJsdXNoIGJlcGFpbnQgbXkgY2hlZWsKICAgIEZvciB0aGF0IHdoaWNoIHRob3UgaGFzdCBoZWFyZCBtZSBzcGVhayB0by1uaWdodAogICAgRmFpbiB3b3VsZCBJIGR3ZWxsIG9uIGZvcm0sIGZhaW4sIGZhaW4gZGVueQogICAgV2hhdCBJIGhhdmUgc3Bva2U6IGJ1dCBmYXJld2VsbCBjb21wbGltZW50IQogICAgRG9zdCB0aG91IGxvdmUgbWUIEkga25vdyB0aG91IHdpbHQgc2F5ICdBeSwnCiAgICBBbmQgSSB3aWxsIHRha2UgdGh5IHdvcmQ6IHlldCBpZiB0aG91IHN3ZWFyJ3N0LAogICAgVGhvdSBtYXlzdCBwcm92ZSBmYWxzZTsgYXQgbG92ZXJzJyBwZXJqdXJpZXMKICAgIFRoZW4gc2F5LCBKb3ZlIGxhdWdocy4gTyBnZW50bGUgUm9tZW8sCiAgICBJZiB0aG91IGRvc3QgbG92ZSwgcHJvbm91bmNlIGl0IGZhaXRoZnVsbHk6CiAgICBPciBpZiB0aG91IHRoaW5rJ3N0IEkgYW0gdG9vIHF1aWNrbHkgd29uLAogICAgSSdsbCBmcm93biBhbmQgYmUgcGVydmVyc2UgYW4gc2F5IHRoZWUgbmF5LAogICAgU28gdGhvdSB3aWx0IHdvbzsgYnV0IGVsc2UsIG5vdCBmb3IgdGhlIHdvcmxkLgogICAgSW4gdHJ1dGgsIGZhaXIgTW9udGFndWUsIEkgYW0gdG9vIGZvbmQsCiAgICBBbmQgdGhlcmVmb3JlIHRob3UgbWF5c3QgdGhpbmsgbXkgJ2hhdmlvciBsaWdodDoKICAgIEJ1dCB0cnVzdCBtZSwgZ2VudGxlbWFuLCBJJ2xsIHByb3ZlIG1vcmUgdHJ1ZQogICAgVGhhbiB0aG9zZSB0aGF0IGhhdmUgbW9yZSBjdW5uaW5nIHRvIGJlIHN0cmFuZ2UuCiAgICBJIHNob3VsZCBoYXZlIGJlZW4gbW9yZSBzdHJhbmdlLCBJIG11c3QgY29uZmVzcywKICAgIEJ1dCB0aGF0IHRob3Ugb3ZlcmhlYXJkJ3N0LCBlcmUgSSB3YXMgd2FyZSwKICAgIE15IHRydWUgbG92ZSdzIHBhc3Npb246IHRoZXJlZm9yZSBwYXJkb24gbWUsCiAgICBBbmQgbm90IGltcHV0ZSB0aGlzIHlpZWxkaW5nIHRvIGxpZ2h0IGxvdmUsCiAgICBXaGljaCB0aGUgZGFyayBuaWdodCBoYXRoIHNvIGRpc2NvdmVyZWQuCgpST01FTwoKICAgIExhZHksIGJ5IHlvbmRlciBibGVzc2VkIG1vb24gSSBzd2VhcgogICAgVGhhdCB0aXBzIHdpdGggc2lsdmVyIGFsbCB0aGVzZSBmcnVpdC10cmVlIHRvcHMtLQoKSlVMSUVUCgogICAgTywgc3dlYXIgbm90IGJ5IHRoZSBtb29uLCB0aGUgaW5jb25zdGFudCBtb29uLAogICAgVGhhdCBtb250aGx5IGNoYW5nZXMgaW4gaGVyIGNpcmNsZWQgb3JiLAogICAgTGVzdCB0aGF0IHRoeSBsb3ZlIHByb3ZlIGxpa2V3aXNlIHZhcmlhYmxlLgoKUk9NRU8KCiAgICBXaGF0IHNoYWxsIEkgc3dlYXIgYnkCgpKVUxJRVQKCiAgICBEbyBub3Qgc3dlYXIgYXQgYWxsOwogICAgT3IsIGlmIHRob3Ugd2lsdCwgc3dlYXIgYnkgdGh5IGdyYWNpb3VzIHNlbGYsCiAgICBXaGljaCBpcyB0aGUgZ29kIG9mIG15IGlkb2xhdHJ5LAogICAgQW5kIEknbGwgYmVsaWV2ZSB0aGVlLgoKUk9NRU8KCiAgICBJZiBteSBoZWFydCdzIGRlYXIgbG92ZS0tCgpKVUxJRVQKCiAgICBXZWxsLCBkbyBub3Qgc3dlYXI6IGFsdGhvdWdoIEkgam95IGluIHRoZWUsCiAgICBJIGhhdmUgbm8gam95IG9mIHRoaXMgY29udHJhY3QgdG8tbmlnaHQ6CiAgICBJdCBpcyB0b28gcmFzaCwgdG9vIHVuYWR2aXNlZCwgdG9vIHN1ZGRlbjsKICAgIFRvbyBsaWtlIHRoZSBsaWdodG5pbmcsIHdoaWNoIGRvdGggY2Vhc2UgdG8gYmUKICAgIEVyZSBvbmUgY2FuIHNheSAnSXQgbGlnaHRlbnMuJyBTd2VldCwgZ29vZCBuaWdodCEKICAgIFRoaXMgYnVkIG9mIGxvdmUsIGJ5IHN1bW1lcidzIHJpcGVuaW5nIGJyZWF0aCwKICAgIE1heSBwcm92ZSBhIGJlYXV0ZW91cyBmbG93ZXIgd2hlbiBuZXh0IHdlIG1lZXQuCiAgICBHb29kIG5pZ2h0LCBnb29kIG5pZ2h0ISBhcyBzd2VldCByZXBvc2UgYW5kIHJlc3QKICAgIENvbWUgdG8gdGh5IGhlYXJ0IGFzIHRoYXQgd2l0aGluIG15IGJyZWFzdCEKClJPTUVPCgogICAgTywgd2lsdCB0aG91IGxlYXZlIG1lIHNvIHVuc2F0aXNmaWVkPwoKSlVMSUVUCgogICAgV2hhdCBzYXRpc2ZhY3Rpb24gY2Fuc3QgdGhvdSBoYXZlIHRvLW5pZ2h0PwoKUk9NRU8KCiAgICBUaGUgZXhjaGFuZ2Ugb2YgdGh5IGxvdmUncyBmYWl0aGZ1bCB2b3cgZm9yIG1pbmUuCgpKVUxJRVQKCiAgICBJIGdhdmUgdGhlZSBtaW5lIGJlZm9yZSB0aG91IGRpZHN0IHJlcXVlc3QgaXQ6CiAgICBBbmQgeWV0IEkgd291bGQgaXQgd2VyZSB0byBnaXZlIGFnYWluLgoKUk9NRU8KCiAgICBXb3VsZHN0IHRob3Ugd2l0aGRyYXcgaXQIGZvciB3aGF0IHB1cnBvc2UsIGxvdmUCgpKVUxJRVQKCiAgICBCdXQgdG8gYmUgZnJhbmssIGFuZCBnaXZlIGl0IHRoZWUgYWdhaW4uCiAgICBBbmQgeWV0IEkgd2lzaCBidXQgZm9yIHRoZSB0aGluZyBJIGhhdmU6CiAgICBNeSBib3VudHkgaXMgYXMgYm91bmRsZXNzIGFzIHRoZSBzZWEsCiAgICBNeSBsb3ZlIGFzIGRlZXA7IHRoZSBtb3JlIEkgZ2l2ZSB0byB0aGVlLAogICAgVGhlIG1vcmUgSSBoYXZlLCBmb3IgYm90aCBhcmUgaW5maW5pdGUuCgogICAgTnVyc2UgY2FsbHMgd2l0aGluCiAgICBJIGhlYXIgc29tZSBub2lzZSB3aXRoaW47IGRlYXIgbG92ZSwgYWRpZXUhCiAgICBBbm9uLCBnb29kIG51cnNlISBTd2VldCBNb250YWd1ZSwgYmUgdHJ1ZS4KICAgIFN0YXkgYnV0IGEgbGl0dGxlLCBJIHdpbGwgY29tZSBhZ2Fpbi4KCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBPIGJsZXNzZWQsIGJsZXNzZWQgbmlnaHQhIEkgYW0gYWZlYXJkLgogICAgQmVpbmcgaW4gbmlnaHQsIGFsbCB0aGlzIGlzIGJ1dCBhIGRyZWFtLAogICAgVG9vIGZsYXR0ZXJpbmctc3dlZXQgdG8gYmUgc3Vic3RhbnRpYWwuCgogICAgUmUtZW50ZXIgSlVMSUVULCBhYm92ZQoKSlVMSUVUCgogICAgVGhyZWUgd29yZHMsIGRlYXIgUm9tZW8sIGFuZCBnb29kIG5pZ2h0IGluZGVlZC4KICAgIElmIHRoYXQgdGh5IGJlbnQgb2YgbG92ZSBiZSBob25vdXJhYmxlLAogICAgVGh5IHB1cnBvc2UgbWFycmlhZ2UsIHNlbmQgbWUgd29yZCB0by1tb3Jyb3csCiAgICBCeSBvbmUgdGhhdCBJJ2xsIHByb2N1cmUgdG8gY29tZSB0byB0aGVlLAogICAgV2hlcmUgYW5kIHdoYXQgdGltZSB0aG91IHdpbHQgcGVyZm9ybSB0aGUgcml0ZTsKICAgIEFuZCBhbGwgbXkgZm9ydHVuZXMgYXQgdGh5IGZvb3QgSSdsbCBsYXkKICAgIEFuZCBmb2xsb3cgdGhlZSBteSBsb3JkIHRocm91Z2hvdXQgdGhlIHdvcmxkLgoKTnVyc2UKCiAgICBbV2l0aGluXSBNYWRhbSEKCkpVTElFVAoKICAgIEkgY29tZSwgYW5vbi4tLUJ1dCBpZiB0aG91IG1lYW4nc3Qgbm90IHdlbGwsCiAgICBJIGRvIGJlc2VlY2ggdGhlZS0tCgpOdXJzZQoKICAgIFtXaXRoaW5dIE1hZGFtIQoKSlVMSUVUCgogICAgQnkgYW5kIGJ5LCBJIGNvbWU6LS0KICAgIFRvIGNlYXNlIHRoeSBzdWl0LCBhbmQgbGVhdmUgbWUgdG8gbXkgZ3JpZWY6CiAgICBUby1tb3Jyb3cgd2lsbCBJIHNlbmQuCgpST01FTwoKICAgIFNvIHRocml2ZSBteSBzb3VsLS0KCkpVTElFVAoKICAgIEEgdGhvdXNhbmQgdGltZXMgZ29vZCBuaWdodCEKCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBBIHRob3VzYW5kIHRpbWVzIHRoZSB3b3JzZSwgdG8gd2FudCB0aHkgbGlnaHQuCiAgICBMb3ZlIGdvZXMgdG93YXJkIGxvdmUsIGFzIHNjaG9vbGJveXMgZnJvbQogICAgdGhlaXIgYm9va3MsCiAgICBCdXQgbG92ZSBmcm9tIGxvdmUsIHRvd2FyZCBzY2hvb2wgd2l0aCBoZWF2eSBsb29rcy4KCiAgICBSZXRpcmluZwoKICAgIFJlLWVudGVyIEpVTElFVCwgYWJvdmUKCkpVTElFVAoKICAgIEhpc3QhIFJvbWVvLCBoaXN0ISBPLCBmb3IgYSBmYWxjb25lcidzIHZvaWNlLAogICAgVG8gbHVyZSB0aGlzIHRhc3NlbC1nZW50bGUgYmFjayBhZ2FpbiEKICAgIEJvbmRhZ2UgaXMgaG9hcnNlLCBhbmQgbWF5IG5vdCBzcGVhayBhbG91ZDsKICAgIEVsc2Ugd291bGQgSSB0ZWFyIHRoZSBjYXZlIHdoZXJlIEVjaG8gbGllcywKICAgIEFuZCBtYWtlIGhlciBhaXJ5IHRvbmd1ZSBtb3JlIGhvYXJzZSB0aGFuIG1pbmUsCiAgICBXaXRoIHJlcGV0aXRpb24gb2YgbXkgUm9tZW8ncyBuYW1lLgoKUk9NRU8KCiAgICBJdCBpcyBteSBzb3VsIHRoYXQgY2FsbHMgdXBvbiBteSBuYW1lOgogICAgSG93IHNpbHZlci1zd2VldCBzb3VuZCBsb3ZlcnMnIHRvbmd1ZXMgYnkgbmlnaHQsCiAgICBMaWtlIHNvZnRlc3QgbXVzaWMgdG8gYXR0ZW5kaW5nIGVhcnMhCgpKVUxJRVQKCiAgICBSb21lbyEKClJPTUVPCgogICAgTXkgZGVhcj8KCkpVTElFVAoKICAgIEF0IHdoYXQgbydjbG9jayB0by1tb3Jyb3cKICAgIFNoYWxsIEkgc2VuZCB0byB0aGVlPwoKUk9NRU8KCiAgICBBdCB0aGUgaG91ciBvZiBuaW5lLgoKSlVMSUVUCgogICAgSSB3aWxsIG5vdCBmYWlsOiAndGlzIHR3ZW50eSB5ZWFycyB0aWxsIHRoZW4uCiAgICBJIGhhdmUgZm9yZ290IHdoeSBJIGRpZCBjYWxsIHRoZWUgYmFjay4KClJPTUVPCgogICAgTGV0IG1lIHN0YW5kIGhlcmUgdGlsbCB0aG91IHJlbWVtYmVyIGl0LgoKSlVMSUVUCgogICAgSSBzaGFsbCBmb3JnZXQsIHRvIGhhdmUgdGhlZSBzdGlsbCBzdGFuZCB0aGVyZSwKICAgIFJlbWVtYmVyaW5nIGhvdyBJIGxvdmUgdGh5IGNvbXBhbnkuCgpST01FTwoKICAgIEFuZCBJJ2xsIHN0aWxsIHN0YXksIHRvIGhhdmUgdGhlZSBzdGlsbCBmb3JnZXQsCiAgICBGb3JnZXR0aW5nIGFueSBvdGhlciBob21lIGJ1dCB0aGlzLgoKSlVMSUVUCgogICAgJ1RpcyBhbG1vc3QgbW9ybmluZzsgSSB3b3VsZCBoYXZlIHRoZWUgZ29uZToKICAgIEFuZCB5ZXQgbm8gZnVydGhlciB0aGFuIGEgd2FudG9uJ3MgYmlyZDsKICAgIFdobyBsZXRzIGl0IGhvcCBhIGxpdHRsZSBmcm9tIGhlciBoYW5kLAogICAgTGlrZSBhIHBvb3IgcHJpc29uZXIgaW4gaGlzIHR3aXN0ZWQgZ3l2ZXMsCiAgICBBbmQgd2l0aCBhIHNpbGsgdGhyZWFkIHBsdWNrcyBpdCBiYWNrIGFnYWluLAogICAgU28gbG92aW5nLWplYWxvdXMgb2YgaGlzIGxpYmVydHkuCgpST01FTwoKICAgIEkgd291bGQgSSB3ZXJlIHRoeSBiaXJkLgoKSlVMSUVUCgogICAgU3dlZXQsIHNvIHdvdWxkIEk6CiAgICBZZXQgSSBzaG91bGQga2lsbCB0aGVlIHdpdGggbXVjaCBjaGVyaXNoaW5nLgogICAgR29vZCBuaWdodCwgZ29vZCBuaWdodCEgcGFydGluZyBpcyBzdWNoCiAgICBzd2VldCBzb3Jyb3csCiAgICBUaGF0IEkgc2hhbGwgc2F5IGdvb2QgbmlnaHQgdGlsbCBpdCBiZSBtb3Jyb3cuCgogICAgRXhpdCBhYm92ZQoKUk9NRU8KCiAgICBTbGVlcCBkd2VsbCB1cG9uIHRoaW5lIGV5ZXMsIHBlYWNlIGluIHRoeSBicmVhc3QhCiAgICBXb3VsZCBJIHdlcmUgc2xlZXAgYW5kIHBlYWNlLCBzbyBzd2VldCB0byByZXN0IQogICAgSGVuY2Ugd2lsbCBJIHRvIG15IGdob3N0bHkgZmF0aGVyJ3MgY2VsbCwKICAgIEhpcyBoZWxwIHRvIGNyYXZlLCBhbmQgbXkgZGVhciBoYXAgdG8gdGVsbC4KCiAgICBFeGl0CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSwgd2l0aCBhIGJhc2tldCAKCkZSSUFSIExBVVJFTkNFCgogICAgVGhlIGdyZXktZXllZCBtb3JuIHNtaWxlcyBvbiB0aGUgZnJvd25pbmcgbmlnaHQsCiAgICBDaGVxdWVyaW5nIHRoZSBlYXN0ZXJuIGNsb3VkcyB3aXRoIHN0cmVha3Mgb2YgbGlnaHQsCiAgICBBbmQgZmxlY2tlZCBkYXJrbmVzcyBsaWtlIGEgZHJ1bmthcmQgcmVlbHMKICAgIEZyb20gZm9ydGggZGF5J3MgcGF0aCBhbmQgVGl0YW4ncyBmaWVyeSB3aGVlbHM6CiAgICBOb3csIGVyZSB0aGUgc3VuIGFkdmFuY2UgaGlzIGJ1cm5pbmcgZXllLAogICAgVGhlIGRheSB0byBjaGVlciBhbmQgbmlnaHQncyBkYW5rIGRldyB0byBkcnksCiAgICBJIG11c3QgdXAtZmlsbCB0aGlzIG9zaWVyIGNhZ2Ugb2Ygb3VycwogICAgV2l0aCBiYWxlZnVsIHdlZWRzIGFuZCBwcmVjaW91cy1qdWljZWQgZmxvd2Vycy4KICAgIFRoZSBlYXJ0aCB0aGF0J3MgbmF0dXJlJ3MgbW90aGVyIGlzIGhlciB0b21iOwogICAgV2hhdCBpcyBoZXIgYnVyeWluZyBncmF2ZSB0aGF0IGlzIGhlciB3b21iLAogICAgQW5kIGZyb20gaGVyIHdvbWIgY2hpbGRyZW4gb2YgZGl2ZXJzIGtpbmQKICAgIFdlIHN1Y2tpbmcgb24gaGVyIG5hdHVyYWwgYm9zb20gZmluZCwKICAgIE1hbnkgZm9yIG1hbnkgdmlydHVlcyBleGNlbGxlbnQsCiAgICBOb25lIGJ1dCBmb3Igc29tZSBhbmQgeWV0IGFsbCBkaWZmZXJlbnQuCiAgICBPLCBtaWNrbGUgaXMgdGhlIHBvd2VyZnVsIGdyYWNlIHRoYXQgbGllcwogICAgSW4gaGVyYnMsIHBsYW50cywgc3RvbmVzLCBhbmQgdGhlaXIgdHJ1ZSBxdWFsaXRpZXM6CiAgICBGb3Igbm91Z2h0IHNvIHZpbGUgdGhhdCBvbiB0aGUgZWFydGggZG90aCBsaXZlCiAgICBCdXQgdG8gdGhlIGVhcnRoIHNvbWUgc3BlY2lhbCBnb29kIGRvdGggZ2l2ZSwKICAgIE5vciBhdWdodCBzbyBnb29kIGJ1dCBzdHJhaW4nZCBmcm9tIHRoYXQgZmFpciB1c2UKICAgIFJldm9sdHMgZnJvbSB0cnVlIGJpcnRoLCBzdHVtYmxpbmcgb24gYWJ1c2U6CiAgICBWaXJ0dWUgaXRzZWxmIHR1cm5zIHZpY2UsIGJlaW5nIG1pc2FwcGxpZWQ7CiAgICBBbmQgdmljZSBzb21ldGltZXMgYnkgYWN0aW9uIGRpZ25pZmllZC4KICAgIFdpdGhpbiB0aGUgaW5mYW50IHJpbmQgb2YgdGhpcyBzbWFsbCBmbG93ZXIKICAgIFBvaXNvbiBoYXRoIHJlc2lkZW5jZSBhbmQgbWVkaWNpbmUgcG93ZXI6CiAgICBGb3IgdGhpcywgYmVpbmcgc21lbHQsIHdpdGggdGhhdCBwYXJ0IGNoZWVycyBlYWNoIHBhcnQ7CiAgICBCZWluZyB0YXN0ZWQsIHNsYXlzIGFsbCBzZW5zZXMgd2l0aCB0aGUgaGVhcnQuCiAgICBUd28gc3VjaCBvcHBvc2VkIGtpbmdzIGVuY2FtcCB0aGVtIHN0aWxsCiAgICBJbiBtYW4gYXMgd2VsbCBhcyBoZXJicywgZ3JhY2UgYW5kIHJ1ZGUgd2lsbDsKICAgIEFuZCB3aGVyZSB0aGUgd29yc2VyIGlzIHByZWRvbWluYW50LAogICAgRnVsbCBzb29uIHRoZSBjYW5rZXIgZGVhdGggZWF0cyB1cCB0aGF0IHBsYW50LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEdvb2QgbW9ycm93LCBmYXRoZXIuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlbmVkaWNpdGUhCiAgICBXaGF0IGVhcmx5IHRvbmd1ZSBzbyBzd2VldCBzYWx1dGV0aCBtZT8KICAgIFlvdW5nIHNvbiwgaXQgYXJndWVzIGEgZGlzdGVtcGVyJ2QgaGVhZAogICAgU28gc29vbiB0byBiaWQgZ29vZCBtb3Jyb3cgdG8gdGh5IGJlZDoKICAgIENhcmUga2VlcHMgaGlzIHdhdGNoIGluIGV2ZXJ5IG9sZCBtYW4ncyBleWUsCiAgICBBbmQgd2hlcmUgY2FyZSBsb2RnZXMsIHNsZWVwIHdpbGwgbmV2ZXIgbGllOwogICAgQnV0IHdoZXJlIHVuYnJ1aXNlZCB5b3V0aCB3aXRoIHVuc3R1ZmYnZCBicmFpbgogICAgRG90aCBjb3VjaCBoaXMgbGltYnMsIHRoZXJlIGdvbGRlbiBzbGVlcCBkb3RoIHJlaWduOgogICAgVGhlcmVmb3JlIHRoeSBlYXJsaW5lc3MgZG90aCBtZSBhc3N1cmUKICAgIFRob3UgYXJ0IHVwLXJvdXNlZCBieSBzb21lIGRpc3RlbXBlcmF0dXJlOwogICAgT3IgaWYgbm90IHNvLCB0aGVuIGhlcmUgSSBoaXQgaXQgcmlnaHQsCiAgICBPdXIgUm9tZW8gaGF0aCBub3QgYmVlbiBpbiBiZWQgdG8tbmlnaHQuCgpST01FTwoKICAgIFRoYXQgbGFzdCBpcyB0cnVlOyB0aGUgc3dlZXRlciByZXN0IHdhcyBtaW5lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHb2QgcGFyZG9uIHNpbiEgd2FzdCB0aG91IHdpdGggUm9zYWxpbmUCgpST01FTwoKICAgIFdpdGggUm9zYWxpbmUsIG15IGdob3N0bHkgZmF0aGVyPyBubzsKICAgIEkgaGF2ZSBmb3Jnb3QgdGhhdCBuYW1lLCBhbmQgdGhhdCBuYW1lJ3Mgd29lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGF0J3MgbXkgZ29vZCBzb246IGJ1dCB3aGVyZSBoYXN0IHRob3UgYmVlbiwgdGhlbj8KClJPTUVPCgogICAgSSdsbCB0ZWxsIHRoZWUsIGVyZSB0aG91IGFzayBpdCBtZSBhZ2Fpbi4KICAgIEkgaGF2ZSBiZWVuIGZlYXN0aW5nIHdpdGggbWluZSBlbmVteSwKICAgIFdoZXJlIG9uIGEgc3VkZGVuIG9uZSBoYXRoIHdvdW5kZWQgbWUsCiAgICBUaGF0J3MgYnkgbWUgd291bmRlZDogYm90aCBvdXIgcmVtZWRpZXMKICAgIFdpdGhpbiB0aHkgaGVscCBhbmQgaG9seSBwaHlzaWMgbGllczoKICAgIEkgYmVhciBubyBoYXRyZWQsIGJsZXNzZWQgbWFuLCBmb3IsIGxvLAogICAgTXkgaW50ZXJjZXNzaW9uIGxpa2V3aXNlIHN0ZWFkcyBteSBmb2UuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlIHBsYWluLCBnb29kIHNvbiwgYW5kIGhvbWVseSBpbiB0aHkgZHJpZnQ7CiAgICBSaWRkbGluZyBjb25mZXNzaW9uIGZpbmRzIGJ1dCByaWRkbGluZyBzaHJpZnQuCgpST01FTwoKICAgIFRoZW4gcGxhaW5seSBrbm93IG15IGhlYXJ0J3MgZGVhciBsb3ZlIGlzIHNldAogICAgT24gdGhlIGZhaXIgZGF1Z2h0ZXIgb2YgcmljaCBDYXB1bGV0OgogICAgQXMgbWluZSBvbiBoZXJzLCBzbyBoZXJzIGlzIHNldCBvbiBtaW5lOwogICAgQW5kIGFsbCBjb21iaW5lZCwgc2F2ZSB3aGF0IHRob3UgbXVzdCBjb21iaW5lCiAgICBCeSBob2x5IG1hcnJpYWdlOiB3aGVuIGFuZCB3aGVyZSBhbmQgaG93CiAgICBXZSBtZXQsIHdlIHdvbydkIGFuZCBtYWRlIGV4Y2hhbmdlIG9mIHZvdywKICAgIEknbGwgdGVsbCB0aGVlIGFzIHdlIHBhc3M7IGJ1dCB0aGlzIEkgcHJheSwKICAgIFRoYXQgdGhvdSBjb25zZW50IHRvIG1hcnJ5IHVzIHRvLWRheS4KCkZSSUFSIExBVVJFTkNFCgogICAgSG9seSBTYWludCBGcmFuY2lzLCB3aGF0IGEgY2hhbmdlIGlzIGhlcmUhCiAgICBJcyBSb3NhbGluZSwgd2hvbSB0aG91IGRpZHN0IGxvdmUgc28gZGVhciwKICAgIFNvIHNvb24gZm9yc2FrZW4IHlvdW5nIG1lbidzIGxvdmUgdGhlbiBsaWVzCiAgICBOb3QgdHJ1bHkgaW4gdGhlaXIgaGVhcnRzLCBidXQgaW4gdGhlaXIgZXllcy4KICAgIEplc3UgTWFyaWEsIHdoYXQgYSBkZWFsIG9mIGJyaW5lCiAgICBIYXRoIHdhc2gnZCB0aHkgc2FsbG93IGNoZWVrcyBmb3IgUm9zYWxpbmUhCiAgICBIb3cgbXVjaCBzYWx0IHdhdGVyIHRocm93biBhd2F5IGluIHdhc3RlLAogICAgVG8gc2Vhc29uIGxvdmUsIHRoYXQgb2YgaXQgZG90aCBub3QgdGFzdGUhCiAgICBUaGUgc3VuIG5vdCB5ZXQgdGh5IHNpZ2hzIGZyb20gaGVhdmVuIGNsZWFycywKICAgIFRoeSBvbGQgZ3JvYW5zIHJpbmcgeWV0IGluIG15IGFuY2llbnQgZWFyczsKICAgIExvLCBoZXJlIHVwb24gdGh5IGNoZWVrIHRoZSBzdGFpbiBkb3RoIHNpdAogICAgT2YgYW4gb2xkIHRlYXIgdGhhdCBpcyBub3Qgd2FzaCdkIG9mZiB5ZXQ6CiAgICBJZiBlJ2VyIHRob3Ugd2FzdCB0aHlzZWxmIGFuZCB0aGVzZSB3b2VzIHRoaW5lLAogICAgVGhvdSBhbmQgdGhlc2Ugd29lcyB3ZXJlIGFsbCBmb3IgUm9zYWxpbmU6CiAgICBBbmQgYXJ0IHRob3UgY2hhbmdlZD8gcHJvbm91bmNlIHRoaXMgc2VudGVuY2UgdGhlbiwKICAgIFdvbWVuIG1heSBmYWxsLCB3aGVuIHRoZXJlJ3Mgbm8gc3RyZW5ndGggaW4gbWVuLgoKUk9NRU8KCiAgICBUaG91IGNoaWQnc3QgbWUgb2Z0IGZvciBsb3ZpbmcgUm9zYWxpbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIEZvciBkb3RpbmcsIG5vdCBmb3IgbG92aW5nLCBwdXBpbCBtaW5lLgoKUk9NRU8KCiAgICBBbmQgYmFkJ3N0IG1lIGJ1cnkgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTm90IGluIGEgZ3JhdmUsCiAgICBUbyBsYXkgb25lIGluLCBhbm90aGVyIG91dCB0byBoYXZlLgoKUk9NRU8KCiAgICBJIHByYXkgdGhlZSwgY2hpZGUgbm90OyBzaGUgd2hvbSBJIGxvdmUgbm93CiAgICBEb3RoIGdyYWNlIGZvciBncmFjZSBhbmQgbG92ZSBmb3IgbG92ZSBhbGxvdzsKICAgIFRoZSBvdGhlciBkaWQgbm90IHNvLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBPLCBzaGUga25ldyB3ZWxsCiAgICBUaHkgbG92ZSBkaWQgcmVhZCBieSByb3RlIGFuZCBjb3VsZCBub3Qgc3BlbGwuCiAgICBCdXQgY29tZSwgeW91bmcgd2F2ZXJlciwgY29tZSwgZ28gd2l0aCBtZSwKICAgIEluIG9uZSByZXNwZWN0IEknbGwgdGh5IGFzc2lzdGFudCBiZTsKICAgIEZvciB0aGlzIGFsbGlhbmNlIG1heSBzbyBoYXBweSBwcm92ZSwKICAgIFRvIHR1cm4geW91ciBob3VzZWhvbGRzJyByYW5jb3VyIHRvIHB1cmUgbG92ZS4KClJPTUVPCgogICAgTywgbGV0IHVzIGhlbmNlOyBJIHN0YW5kIG9uIHN1ZGRlbiBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2lzZWx5IGFuZCBzbG93OyB0aGV5IHN0dW1ibGUgdGhhdCBydW4gZmFzdC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBCRU5WT0xJTyBhbmQgTUVSQ1VUSU8gCgpNRVJDVVRJTwoKICAgIFdoZXJlIHRoZSBkZXZpbCBzaG91bGQgdGhpcyBSb21lbyBiZT8KICAgIENhbWUgaGUgbm90IGhvbWUgdG8tbmlnaHQCgpCRU5WT0xJTwoKICAgIE5vdCB0byBoaXMgZmF0aGVyJ3M7IEkgc3Bva2Ugd2l0aCBoaXMgbWFuLgoKTUVSQ1VUSU8KCiAgICBBaCwgdGhhdCBzYW1lIHBhbGUgaGFyZC1oZWFydGVkIHdlbmNoLCB0aGF0IFJvc2FsaW5lLgogICAgVG9ybWVudHMgaGltIHNvLCB0aGF0IGhlIHdpbGwgc3VyZSBydW4gbWFkLgoKQkVOVk9MSU8KCiAgICBUeWJhbHQsIHRoZSBraW5zbWFuIG9mIG9sZCBDYXB1bGV0LAogICAgSGF0aCBzZW50IGEgbGV0dGVyIHRvIGhpcyBmYXRoZXIncyBob3VzZS4KCk1FUkNVVElPCgogICAgQSBjaGFsbGVuZ2UsIG9uIG15IGxpZmUuCgpCRU5WT0xJTwoKICAgIFJvbWVvIHdpbGwgYW5zd2VyIGl0LgoKTUVSQ1VUSU8KCiAgICBBbnkgbWFuIHRoYXQgY2FuIHdyaXRlIG1heSBhbnN3ZXIgYSBsZXR0ZXIuCgpCRU5WT0xJTwoKICAgIE5heSwgaGUgd2lsbCBhbnN3ZXIgdGhlIGxldHRlcidzIG1hc3RlciwgaG93IGhlCiAgICBkYXJlcywgYmVpbmcgZGFyZWQuCgpNRVJDVVRJTwoKICAgIEFsYXMgcG9vciBSb21lbyEgaGUgaXMgYWxyZWFkeSBkZWFkOyBzdGFiYmVkIHdpdGggYQogICAgd2hpdGUgd2VuY2gncyBibGFjayBleWU7IHNob3QgdGhyb3VnaCB0aGUgZWFyIHdpdGggYQogICAgbG92ZS1zb25nOyB0aGUgdmVyeSBwaW4gb2YgaGlzIGhlYXJ0IGNsZWZ0IHdpdGggdGhlCiAgICBibGluZCBib3ctYm95J3MgYnV0dC1zaGFmdDogYW5kIGlzIGhlIGEgbWFuIHRvCiAgICBlbmNvdW50ZXIgVHliYWx0PwoKQkVOVk9MSU8KCiAgICBXaHksIHdoYXQgaXMgVHliYWx0PwoKTUVSQ1VUSU8KCiAgICBNb3JlIHRoYW4gcHJpbmNlIG9mIGNhdHMsIEkgY2FuIHRlbGwgeW91LiBPLCBoZSBpcwogICAgdGhlIGNvdXJhZ2VvdXMgY2FwdGFpbiBvZiBjb21wbGltZW50cy4gSGUgZmlnaHRzIGFzCiAgICB5b3Ugc2luZyBwcmljay1zb25nLCBrZWVwcyB0aW1lLCBkaXN0YW5jZSwgYW5kCiAgICBwcm9wb3J0aW9uOyByZXN0cyBtZSBoaXMgbWluaW0gcmVzdCwgb25lLCB0d28sIGFuZAogICAgdGhlIHRoaXJkIGluIHlvdXIgYm9zb206IHRoZSB2ZXJ5IGJ1dGNoZXIgb2YgYSBzaWxrCiAgICBidXR0b24sIGEgZHVlbGxpc3QsIGEgZHVlbGxpc3Q7IGEgZ2VudGxlbWFuIG9mIHRoZQogICAgdmVyeSBmaXJzdCBob3VzZSwgb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2F1c2U6CiAgICBhaCwgdGhlIGltbW9ydGFsIHBhc3NhZG8hIHRoZSBwdW50byByZXZlcnNvISB0aGUKICAgIGhhaSEKCkJFTlZPTElPCgogICAgVGhlIHdoYXQCgpNRVJDVVRJTwoKICAgIFRoZSBwb3ggb2Ygc3VjaCBhbnRpYywgbGlzcGluZywgYWZmZWN0aW5nCiAgICBmYW50YXN0aWNvZXM7IHRoZXNlIG5ldyB0dW5lcnMgb2YgYWNjZW50cyEgJ0J5IEplc3UsCiAgICBhIHZlcnkgZ29vZCBibGFkZSEgYSB2ZXJ5IHRhbGwgbWFuISBhIHZlcnkgZ29vZAogICAgd2hvcmUhJyBXaHksIGlzIG5vdCB0aGlzIGEgbGFtZW50YWJsZSB0aGluZywKICAgIGdyYW5kc2lyZSwgdGhhdCB3ZSBzaG91bGQgYmUgdGh1cyBhZmZsaWN0ZWQgd2l0aAogICAgdGhlc2Ugc3RyYW5nZSBmbGllcywgdGhlc2UgZmFzaGlvbi1tb25nZXJzLCB0aGVzZQogICAgcGVyZG9uYS1taSdzLCB3aG8gc3RhbmQgc28gbXVjaCBvbiB0aGUgbmV3IGZvcm0sCiAgICB0aGF0IHRoZXkgY2Fubm90IGF0IGVhc2Ugb24gdGhlIG9sZCBiZW5jaD8gTywgdGhlaXIKICAgIGJvbmVzLCB0aGVpciBib25lcyEKCiAgICBFbnRlciBST01FTwoKQkVOVk9MSU8KCiAgICBIZXJlIGNvbWVzIFJvbWVvLCBoZXJlIGNvbWVzIFJvbWVvLgoKTUVSQ1VUSU8KCiAgICBXaXRob3V0IGhpcyByb2UsIGxpa2UgYSBkcmllZCBoZXJyaW5nOiBmbGVzaCwgZmxlc2gsCiAgICBob3cgYXJ0IHRob3UgZmlzaGlmaWVkISBOb3cgaXMgaGUgZm9yIHRoZSBudW1iZXJzCiAgICB0aGF0IFBldHJhcmNoIGZsb3dlZCBpbjogTGF1cmEgdG8gaGlzIGxhZHkgd2FzIGJ1dCBhCiAgICBraXRjaGVuLXdlbmNoOyBtYXJyeSwgc2hlIGhhZCBhIGJldHRlciBsb3ZlIHRvCiAgICBiZS1yaHltZSBoZXI7IERpZG8gYSBkb3dkeTsgQ2xlb3BhdHJhIGEgZ2lwc3k7CiAgICBIZWxlbiBhbmQgSGVybyBoaWxkaW5ncyBhbmQgaGFybG90czsgVGhpc2JlIGEgZ3JleQogICAgZXllIG9yIHNvLCBidXQgbm90IHRvIHRoZSBwdXJwb3NlLiBTaWduaW9yCiAgICBSb21lbywgYm9uIGpvdXIhIHRoZXJlJ3MgYSBGcmVuY2ggc2FsdXRhdGlvbgogICAgdG8geW91ciBGcmVuY2ggc2xvcC4gWW91IGdhdmUgdXMgdGhlIGNvdW50ZXJmZWl0CiAgICBmYWlybHkgbGFzdCBuaWdodC4KClJPTUVPCgogICAgR29vZCBtb3Jyb3cgdG8geW91IGJvdGguIFdoYXQgY291bnRlcmZlaXQgZGlkIEkgZ2l2ZSB5b3UCgpNRVJDVVRJTwoKICAgIFRoZSBzaGlwLCBzaXIsIHRoZSBzbGlwOyBjYW4geW91IG5vdCBjb25jZWl2ZT8KClJPTUVPCgogICAgUGFyZG9uLCBnb29kIE1lcmN1dGlvLCBteSBidXNpbmVzcyB3YXMgZ3JlYXQ7IGFuZCBpbgogICAgc3VjaCBhIGNhc2UgYXMgbWluZSBhIG1hbiBtYXkgc3RyYWluIGNvdXJ0ZXN5LgoKTUVSQ1VUSU8KCiAgICBUaGF0J3MgYXMgbXVjaCBhcyB0byBzYXksIHN1Y2ggYSBjYXNlIGFzIHlvdXJzCiAgICBjb25zdHJhaW5zIGEgbWFuIHRvIGJvdyBpbiB0aGUgaGFtcy4KClJPTUVPCgogICAgTWVhbmluZywgdG8gY291cnQnc3kuCgpNRVJDVVRJTwoKICAgIFRob3UgaGFzdCBtb3N0IGtpbmRseSBoaXQgaXQuCgpST01FTwoKICAgIEEgbW9zdCBjb3VydGVvdXMgZXhwb3NpdGlvbi4KCk1FUkNVVElPCgogICAgTmF5LCBJIGFtIHRoZSB2ZXJ5IHBpbmsgb2YgY291cnRlc3kuCgpST01FTwoKICAgIFBpbmsgZm9yIGZsb3dlci4KCk1FUkNVVElPCgogICAgUmlnaHQuCgpST01FTwoKICAgIFdoeSwgdGhlbiBpcyBteSBwdW1wIHdlbGwgZmxvd2VyZWQuCgpNRVJDVVRJTwoKICAgIFdlbGwgc2FpZDogZm9sbG93IG1lIHRoaXMgamVzdCBub3cgdGlsbCB0aG91IGhhc3QKICAgIHdvcm4gb3V0IHRoeSBwdW1wLCB0aGF0IHdoZW4gdGhlIHNpbmdsZSBzb2xlIG9mIGl0CiAgICBpcyB3b3JuLCB0aGUgamVzdCBtYXkgcmVtYWluIGFmdGVyIHRoZSB3ZWFyaW5nIHNvbGUgc2luZ3VsYXIuCgpST01FTwoKICAgIE8gc2luZ2xlLXNvbGVkIGplc3QsIHNvbGVseSBzaW5ndWxhciBmb3IgdGhlCiAgICBzaW5nbGVuZXNzLgoKTUVSQ1VUSU8KCiAgICBDb21lIGJldHdlZW4gdXMsIGdvb2QgQmVudm9saW87IG15IHdpdHMgZmFpbnQuCgpST01FTwoKICAgIFN3aXRjaCBhbmQgc3B1cnMsIHN3aXRjaCBhbmQgc3B1cnM7IG9yIEknbGwgY3J5IGEgbWF0Y2guCgpNRVJDVVRJTwoKICAgIE5heSwgaWYgdGh5IHdpdHMgcnVuIHRoZSB3aWxkLWdvb3NlIGNoYXNlLCBJIGhhdmUKICAgIGRvbmUsIGZvciB0aG91IGhhc3QgbW9yZSBvZiB0aGUgd2lsZC1nb29zZSBpbiBvbmUgb2YKICAgIHRoeSB3aXRzIHRoYW4sIEkgYW0gc3VyZSwgSSBoYXZlIGluIG15IHdob2xlIGZpdmU6CiAgICB3YXMgSSB3aXRoIHlvdSB0aGVyZSBmb3IgdGhlIGdvb3NlPwoKUk9NRU8KCiAgICBUaG91IHdhc3QgbmV2ZXIgd2l0aCBtZSBmb3IgYW55IHRoaW5nIHdoZW4gdGhvdSB3YXN0CiAgICBub3QgdGhlcmUgZm9yIHRoZSBnb29zZS4KCk1FUkNVVElPCgogICAgSSB3aWxsIGJpdGUgdGhlZSBieSB0aGUgZWFyIGZvciB0aGF0IGplc3QuCgpST01FTwoKICAgIE5heSwgZ29vZCBnb29zZSwgYml0ZSBub3QuCgpNRVJDVVRJTwoKICAgIFRoeSB3aXQgaXMgYSB2ZXJ5IGJpdHRlciBzd2VldGluZzsgaXQgaXMgYSBtb3N0CiAgICBzaGFycCBzYXVjZS4KClJPTUVPCgogICAgQW5kIGlzIGl0IG5vdCB3ZWxsIHNlcnZlZCBpbiB0byBhIHN3ZWV0IGdvb3NlPwoKTUVSQ1VUSU8KCiAgICBPIGhlcmUncyBhIHdpdCBvZiBjaGV2ZXJpbCwgdGhhdCBzdHJldGNoZXMgZnJvbSBhbgogICAgaW5jaCBuYXJyb3cgdG8gYW4gZWxsIGJyb2FkIQoKUk9NRU8KCiAgICBJIHN0cmV0Y2ggaXQgb3V0IGZvciB0aGF0IHdvcmQgJ2Jyb2FkOycgd2hpY2ggYWRkZWQKICAgIHRvIHRoZSBnb29zZSwgcHJvdmVzIHRoZWUgZmFyIGFuZCB3aWRlIGEgYnJvYWQgZ29vc2UuCgpNRVJDVVRJTwoKICAgIFdoeSwgaXMgbm90IHRoaXMgYmV0dGVyIG5vdyB0aGFuIGdyb2FuaW5nIGZvciBsb3ZlPwogICAgbm93IGFydCB0aG91IHNvY2lhYmxlLCBub3cgYXJ0IHRob3UgUm9tZW87IG5vdyBhcnQKICAgIHRob3Ugd2hhdCB0aG91IGFydCwgYnkgYXJ0IGFzIHdlbGwgYXMgYnkgbmF0dXJlOgogICAgZm9yIHRoaXMgZHJpdmVsbGluZyBsb3ZlIGlzIGxpa2UgYSBncmVhdCBuYXR1cmFsLAogICAgdGhhdCBydW5zIGxvbGxpbmcgdXAgYW5kIGRvd24gdG8gaGlkZSBoaXMgYmF1YmxlIGluIGEgaG9sZS4KCkJFTlZPTElPCgogICAgU3RvcCB0aGVyZSwgc3RvcCB0aGVyZS4KCk1FUkNVVElPCgogICAgVGhvdSBkZXNpcmVzdCBtZSB0byBzdG9wIGluIG15IHRhbGUgYWdhaW5zdCB0aGUgaGFpci4KCkJFTlZPTElPCgogICAgVGhvdSB3b3VsZHN0IGVsc2UgaGF2ZSBtYWRlIHRoeSB0YWxlIGxhcmdlLgoKTUVSQ1VUSU8KCiAgICBPLCB0aG91IGFydCBkZWNlaXZlZDsgSSB3b3VsZCBoYXZlIG1hZGUgaXQgc2hvcnQ6CiAgICBmb3IgSSB3YXMgY29tZSB0byB0aGUgd2hvbGUgZGVwdGggb2YgbXkgdGFsZTsgYW5kCiAgICBtZWFudCwgaW5kZWVkLCB0byBvY2N1cHkgdGhlIGFyZ3VtZW50IG5vIGxvbmdlci4KClJPTUVPCgogICAgSGVyZSdzIGdvb2RseSBnZWFyIQoKICAgIEVudGVyIE51cnNlIGFuZCBQRVRFUgoKTUVSQ1VUSU8KCiAgICBBIHNhaWwsIGEgc2FpbCEKCkJFTlZPTElPCgogICAgVHdvLCB0d287IGEgc2hpcnQgYW5kIGEgc21vY2suCgpOdXJzZQoKICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBNeSBmYW4sIFBldGVyLgoKTUVSQ1VUSU8KCiAgICBHb29kIFBldGVyLCB0byBoaWRlIGhlciBmYWNlOyBmb3IgaGVyIGZhbidzIHRoZQogICAgZmFpcmVyIGZhY2UuCgpOdXJzZQoKICAgIEdvZCB5ZSBnb29kIG1vcnJvdywgZ2VudGxlbWVuLgoKTUVSQ1VUSU8KCiAgICBHb2QgeWUgZ29vZCBkZW4sIGZhaXIgZ2VudGxld29tYW4uCgpOdXJzZQoKICAgIElzIGl0IGdvb2QgZGVuPwoKTUVSQ1VUSU8KCiAgICAnVGlzIG5vIGxlc3MsIEkgdGVsbCB5b3UsIGZvciB0aGUgYmF3ZHkgaGFuZCBvZiB0aGUKICAgIGRpYWwgaXMgbm93IHVwb24gdGhlIHByaWNrIG9mIG5vb24uCgpOdXJzZQoKICAgIE91dCB1cG9uIHlvdSEgd2hhdCBhIG1hbiBhcmUgeW91IQoKUk9NRU8KCiAgICBPbmUsIGdlbnRsZXdvbWFuLCB0aGF0IEdvZCBoYXRoIG1hZGUgZm9yIGhpbXNlbGYgdG8KICAgIG1hci4KCk51cnNlCgogICAgQnkgbXkgdHJvdGgsIGl0IGlzIHdlbGwgc2FpZDsgJ2ZvciBoaW1zZWxmIHRvIG1hciwnCiAgICBxdW90aCBhJz8gR2VudGxlbWVuLCBjYW4gYW55IG9mIHlvdSB0ZWxsIG1lIHdoZXJlIEkKICAgIG1heSBmaW5kIHRoZSB5b3VuZyBSb21lbz8KClJPTUVPCgogICAgSSBjYW4gdGVsbCB5b3U7IGJ1dCB5b3VuZyBSb21lbyB3aWxsIGJlIG9sZGVyIHdoZW4KICAgIHlvdSBoYXZlIGZvdW5kIGhpbSB0aGFuIGhlIHdhcyB3aGVuIHlvdSBzb3VnaHQgaGltOgogICAgSSBhbSB0aGUgeW91bmdlc3Qgb2YgdGhhdCBuYW1lLCBmb3IgZmF1bHQgb2YgYSB3b3JzZS4KCk51cnNlCgogICAgWW91IHNheSB3ZWxsLgoKTUVSQ1VUSU8KCiAgICBZZWEsIGlzIHRoZSB3b3JzdCB3ZWxsPyB2ZXJ5IHdlbGwgdG9vaywgaScgZmFpdGg7CiAgICB3aXNlbHksIHdpc2VseS4KCk51cnNlCgogICAgaWYgeW91IGJlIGhlLCBzaXIsIEkgZGVzaXJlIHNvbWUgY29uZmlkZW5jZSB3aXRoCiAgICB5b3UuCgpCRU5WT0xJTwoKICAgIFNoZSB3aWxsIGluZGl0ZSBoaW0gdG8gc29tZSBzdXBwZXIuCgpNRVJDVVRJTwoKICAgIEEgYmF3ZCwgYSBiYXdkLCBhIGJhd2QhIHNvIGhvIQoKUk9NRU8KCiAgICBXaGF0IGhhc3QgdGhvdSBmb3VuZD8KCk1FUkNVVElPCgogICAgTm8gaGFyZSwgc2lyOyB1bmxlc3MgYSBoYXJlLCBzaXIsIGluIGEgbGVudGVuIHBpZSwKICAgIHRoYXQgaXMgc29tZXRoaW5nIHN0YWxlIGFuZCBob2FyIGVyZSBpdCBiZSBzcGVudC4KCiAgICBTaW5ncwogICAgQW4gb2xkIGhhcmUgaG9hciwKICAgIEFuZCBhbiBvbGQgaGFyZSBob2FyLAogICAgSXMgdmVyeSBnb29kIG1lYXQgaW4gbGVudAogICAgQnV0IGEgaGFyZSB0aGF0IGlzIGhvYXIKICAgIElzIHRvbyBtdWNoIGZvciBhIHNjb3JlLAogICAgV2hlbiBpdCBob2FycyBlcmUgaXQgYmUgc3BlbnQuCiAgICBSb21lbywgd2lsbCB5b3UgY29tZSB0byB5b3VyIGZhdGhlcidzPyB3ZSdsbAogICAgdG8gZGlubmVyLCB0aGl0aGVyLgoKUk9NRU8KCiAgICBJIHdpbGwgZm9sbG93IHlvdS4KCk1FUkNVVElPCgogICAgRmFyZXdlbGwsIGFuY2llbnQgbGFkeTsgZmFyZXdlbGwsCgogICAgU2luZ2luZwogICAgJ2xhZHksIGxhZHksIGxhZHkuJwoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KCk51cnNlCgogICAgTWFycnksIGZhcmV3ZWxsISBJIHByYXkgeW91LCBzaXIsIHdoYXQgc2F1Y3kKICAgIG1lcmNoYW50IHdhcyB0aGlzLCB0aGF0IHdhcyBzbyBmdWxsIG9mIGhpcyByb3BlcnkCgpST01FTwoKICAgIEEgZ2VudGxlbWFuLCBudXJzZSwgdGhhdCBsb3ZlcyB0byBoZWFyIGhpbXNlbGYgdGFsaywKICAgIGFuZCB3aWxsIHNwZWFrIG1vcmUgaW4gYSBtaW51dGUgdGhhbiBoZSB3aWxsIHN0YW5kCiAgICB0byBpbiBhIG1vbnRoLgoKTnVyc2UKCiAgICBBbiBhJyBzcGVhayBhbnkgdGhpbmcgYWdhaW5zdCBtZSwgSSdsbCB0YWtlIGhpbQogICAgZG93biwgYW4gYScgd2VyZSBsdXN0aWVyIHRoYW4gaGUgaXMsIGFuZCB0d2VudHkgc3VjaAogICAgSmFja3M7IGFuZCBpZiBJIGNhbm5vdCwgSSdsbCBmaW5kIHRob3NlIHRoYXQgc2hhbGwuCiAgICBTY3Vydnkga25hdmUhIEkgYW0gbm9uZSBvZiBoaXMgZmxpcnQtZ2lsbHM7IEkgYW0KICAgIG5vbmUgb2YgaGlzIHNrYWlucy1tYXRlcy4gQW5kIHRob3UgbXVzdCBzdGFuZCBieQogICAgdG9vLCBhbmQgc3VmZmVyIGV2ZXJ5IGtuYXZlIHRvIHVzZSBtZSBhdCBoaXMgcGxlYXN1cmUCgpQRVRFUgoKICAgIEkgc2F3IG5vIG1hbiB1c2UgeW91IGEgcGxlYXN1cmU7IGlmIEkgaGFkLCBteSB3ZWFwb24KICAgIHNob3VsZCBxdWlja2x5IGhhdmUgYmVlbiBvdXQsIEkgd2FycmFudCB5b3U6IEkgZGFyZQogICAgZHJhdyBhcyBzb29uIGFzIGFub3RoZXIgbWFuLCBpZiBJIHNlZSBvY2Nhc2lvbiBpbiBhCiAgICBnb29kIHF1YXJyZWwsIGFuZCB0aGUgbGF3IG9uIG15IHNpZGUuCgpOdXJzZQoKICAgIE5vdywgYWZvcmUgR29kLCBJIGFtIHNvIHZleGVkLCB0aGF0IGV2ZXJ5IHBhcnQgYWJvdXQKICAgIG1lIHF1aXZlcnMuIFNjdXJ2eSBrbmF2ZSEgUHJheSB5b3UsIHNpciwgYSB3b3JkOgogICAgYW5kIGFzIEkgdG9sZCB5b3UsIG15IHlvdW5nIGxhZHkgYmFkZSBtZSBpbnF1aXJlIHlvdQogICAgb3V0OyB3aGF0IHNoZSBiYWRlIG1lIHNheSwgSSB3aWxsIGtlZXAgdG8gbXlzZWxmOgogICAgYnV0IGZpcnN0IGxldCBtZSB0ZWxsIHllLCBpZiB5ZSBzaG91bGQgbGVhZCBoZXIgaW50bwogICAgYSBmb29sJ3MgcGFyYWRpc2UsIGFzIHRoZXkgc2F5LCBpdCB3ZXJlIGEgdmVyeSBncm9zcwogICAga2luZCBvZiBiZWhhdmlvciwgYXMgdGhleSBzYXk6IGZvciB0aGUgZ2VudGxld29tYW4KICAgIGlzIHlvdW5nOyBhbmQsIHRoZXJlZm9yZSwgaWYgeW91IHNob3VsZCBkZWFsIGRvdWJsZQogICAgd2l0aCBoZXIsIHRydWx5IGl0IHdlcmUgYW4gaWxsIHRoaW5nIHRvIGJlIG9mZmVyZWQKICAgIHRvIGFueSBnZW50bGV3b21hbiwgYW5kIHZlcnkgd2VhayBkZWFsaW5nLgoKUk9NRU8KCiAgICBOdXJzZSwgY29tbWVuZCBtZSB0byB0aHkgbGFkeSBhbmQgbWlzdHJlc3MuIEkKICAgIHByb3Rlc3QgdW50byB0aGVlLS0KCk51cnNlCgogICAgR29vZCBoZWFydCwgYW5kLCBpJyBmYWl0aCwgSSB3aWxsIHRlbGwgaGVyIGFzIG11Y2g6CiAgICBMb3JkLCBMb3JkLCBzaGUgd2lsbCBiZSBhIGpveWZ1bCB3b21hbi4KClJPTUVPCgogICAgV2hhdCB3aWx0IHRob3UgdGVsbCBoZXIsIG51cnNlPyB0aG91IGRvc3Qgbm90IG1hcmsgbWUuCgpOdXJzZQoKICAgIEkgd2lsbCB0ZWxsIGhlciwgc2lyLCB0aGF0IHlvdSBkbyBwcm90ZXN0OyB3aGljaCwgYXMKICAgIEkgdGFrZSBpdCwgaXMgYSBnZW50bGVtYW5saWtlIG9mZmVyLgoKUk9NRU8KCiAgICBCaWQgaGVyIGRldmlzZQogICAgU29tZSBtZWFucyB0byBjb21lIHRvIHNocmlmdCB0aGlzIGFmdGVybm9vbjsKICAgIEFuZCB0aGVyZSBzaGUgc2hhbGwgYXQgRnJpYXIgTGF1cmVuY2UnIGNlbGwKICAgIEJlIHNocml2ZWQgYW5kIG1hcnJpZWQuIEhlcmUgaXMgZm9yIHRoeSBwYWlucy4KCk51cnNlCgogICAgTm8gdHJ1bHkgc2lyOyBub3QgYSBwZW5ueS4KClJPTUVPCgogICAgR28gdG87IEkgc2F5IHlvdSBzaGFsbC4KCk51cnNlCgogICAgVGhpcyBhZnRlcm5vb24sIHNpcj8gd2VsbCwgc2hlIHNoYWxsIGJlIHRoZXJlLgoKUk9NRU8KCiAgICBBbmQgc3RheSwgZ29vZCBudXJzZSwgYmVoaW5kIHRoZSBhYmJleSB3YWxsOgogICAgV2l0aGluIHRoaXMgaG91ciBteSBtYW4gc2hhbGwgYmUgd2l0aCB0aGVlCiAgICBBbmQgYnJpbmcgdGhlZSBjb3JkcyBtYWRlIGxpa2UgYSB0YWNrbGVkIHN0YWlyOwogICAgV2hpY2ggdG8gdGhlIGhpZ2ggdG9wLWdhbGxhbnQgb2YgbXkgam95CiAgICBNdXN0IGJlIG15IGNvbnZveSBpbiB0aGUgc2VjcmV0IG5pZ2h0LgogICAgRmFyZXdlbGw7IGJlIHRydXN0eSwgYW5kIEknbGwgcXVpdCB0aHkgcGFpbnM6CiAgICBGYXJld2VsbDsgY29tbWVuZCBtZSB0byB0aHkgbWlzdHJlc3MuCgpOdXJzZQoKICAgIE5vdyBHb2QgaW4gaGVhdmVuIGJsZXNzIHRoZWUhIEhhcmsgeW91LCBzaXIuCgpST01FTwoKICAgIFdoYXQgc2F5J3N0IHRob3UsIG15IGRlYXIgbnVyc2UCgpOdXJzZQoKICAgIElzIHlvdXIgbWFuIHNlY3JldD8gRGlkIHlvdSBuZSdlciBoZWFyIHNheSwKICAgIFR3byBtYXkga2VlcCBjb3Vuc2VsLCBwdXR0aW5nIG9uZSBhd2F5PwoKUk9NRU8KCiAgICBJIHdhcnJhbnQgdGhlZSwgbXkgbWFuJ3MgYXMgdHJ1ZSBhcyBzdGVlbC4KCk5VUlNFCgogICAgV2VsbCwgc2lyOyBteSBtaXN0cmVzcyBpcyB0aGUgc3dlZXRlc3QgbGFkeS0tTG9yZCwKICAgIExvcmQhIHdoZW4gJ3R3YXMgYSBsaXR0bGUgcHJhdGluZyB0aGluZzotLU8sIHRoZXJlCiAgICBpcyBhIG5vYmxlbWFuIGluIHRvd24sIG9uZSBQYXJpcywgdGhhdCB3b3VsZCBmYWluCiAgICBsYXkga25pZmUgYWJvYXJkOyBidXQgc2hlLCBnb29kIHNvdWwsIGhhZCBhcyBsaWVmCiAgICBzZWUgYSB0b2FkLCBhIHZlcnkgdG9hZCwgYXMgc2VlIGhpbS4gSSBhbmdlciBoZXIKICAgIHNvbWV0aW1lcyBhbmQgdGVsbCBoZXIgdGhhdCBQYXJpcyBpcyB0aGUgcHJvcGVyZXIKICAgIG1hbjsgYnV0LCBJJ2xsIHdhcnJhbnQgeW91LCB3aGVuIEkgc2F5IHNvLCBzaGUgbG9va3MKICAgIGFzIHBhbGUgYXMgYW55IGNsb3V0IGluIHRoZSB2ZXJzYWwgd29ybGQuIERvdGggbm90CiAgICByb3NlbWFyeSBhbmQgUm9tZW8gYmVnaW4gYm90aCB3aXRoIGEgbGV0dGVyPwoKUk9NRU8KCiAgICBBeSwgbnVyc2U7IHdoYXQgb2YgdGhhdD8gYm90aCB3aXRoIGFuIFIuCgpOdXJzZQoKICAgIEFoLiBtb2NrZXIhIHRoYXQncyB0aGUgZG9nJ3MgbmFtZTsgUiBpcyBmb3IKICAgIHRoZS0tTm87IEkga25vdyBpdCBiZWdpbnMgd2l0aCBzb21lIG90aGVyCiAgICBsZXR0ZXI6LS1hbmQgc2hlIGhhdGggdGhlIHByZXR0aWVzdCBzZW50ZW50aW91cyBvZgogICAgaXQsIG9mIHlvdSBhbmQgcm9zZW1hcnksIHRoYXQgaXQgd291bGQgZG8geW91IGdvb2QKICAgIHRvIGhlYXIgaXQuCgpST01FTwoKICAgIENvbW1lbmQgbWUgdG8gdGh5IGxhZHkuCgpOdXJzZQoKICAgIEF5LCBhIHRob3VzYW5kIHRpbWVzLgoKICAgIEV4aXQgUm9tZW8KICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBQZXRlciwgdGFrZSBteSBmYW4sIGFuZCBnbyBiZWZvcmUgYW5kIGFwYWNlLgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgSlVMSUVUIAoKSlVMSUVUCgogICAgVGhlIGNsb2NrIHN0cnVjayBuaW5lIHdoZW4gSSBkaWQgc2VuZCB0aGUgbnVyc2U7CiAgICBJbiBoYWxmIGFuIGhvdXIgc2hlIHByb21pc2VkIHRvIHJldHVybi4KICAgIFBlcmNoYW5jZSBzaGUgY2Fubm90IG1lZXQgaGltOiB0aGF0J3Mgbm90IHNvLgogICAgTywgc2hlIGlzIGxhbWUhIGxvdmUncyBoZXJhbGRzIHNob3VsZCBiZSB0aG91Z2h0cywKICAgIFdoaWNoIHRlbiB0aW1lcyBmYXN0ZXIgZ2xpZGUgdGhhbiB0aGUgc3VuJ3MgYmVhbXMsCiAgICBEcml2aW5nIGJhY2sgc2hhZG93cyBvdmVyIGxvdXJpbmcgaGlsbHM6CiAgICBUaGVyZWZvcmUgZG8gbmltYmxlLXBpbmlvbidkIGRvdmVzIGRyYXcgbG92ZSwKICAgIEFuZCB0aGVyZWZvcmUgaGF0aCB0aGUgd2luZC1zd2lmdCBDdXBpZCB3aW5ncy4KICAgIE5vdyBpcyB0aGUgc3VuIHVwb24gdGhlIGhpZ2htb3N0IGhpbGwKICAgIE9mIHRoaXMgZGF5J3Mgam91cm5leSwgYW5kIGZyb20gbmluZSB0aWxsIHR3ZWx2ZQogICAgSXMgdGhyZWUgbG9uZyBob3VycywgeWV0IHNoZSBpcyBub3QgY29tZS4KICAgIEhhZCBzaGUgYWZmZWN0aW9ucyBhbmQgd2FybSB5b3V0aGZ1bCBibG9vZCwKICAgIFNoZSB3b3VsZCBiZSBhcyBzd2lmdCBpbiBtb3Rpb24gYXMgYSBiYWxsOwogICAgTXkgd29yZHMgd291bGQgYmFuZHkgaGVyIHRvIG15IHN3ZWV0IGxvdmUsCiAgICBBbmQgaGlzIHRvIG1lOgogICAgQnV0IG9sZCBmb2xrcywgbWFueSBmZWlnbiBhcyB0aGV5IHdlcmUgZGVhZDsKICAgIFVud2llbGR5LCBzbG93LCBoZWF2eSBhbmQgcGFsZSBhcyBsZWFkLgogICAgTyBHb2QsIHNoZSBjb21lcyEKCiAgICBFbnRlciBOdXJzZSBhbmQgUEVURVIKICAgIE8gaG9uZXkgbnVyc2UsIHdoYXQgbmV3cz8KICAgIEhhc3QgdGhvdSBtZXQgd2l0aCBoaW0IFNlbmQgdGh5IG1hbiBhd2F5LgoKTnVyc2UKCiAgICBQZXRlciwgc3RheSBhdCB0aGUgZ2F0ZS4KCiAgICBFeGl0IFBFVEVSCgpKVUxJRVQKCiAgICBOb3csIGdvb2Qgc3dlZXQgbnVyc2UsLS1PIExvcmQsIHdoeSBsb29rJ3N0IHRob3Ugc2FkPwogICAgVGhvdWdoIG5ld3MgYmUgc2FkLCB5ZXQgdGVsbCB0aGVtIG1lcnJpbHk7CiAgICBJZiBnb29kLCB0aG91IHNoYW1lc3QgdGhlIG11c2ljIG9mIHN3ZWV0IG5ld3MKICAgIEJ5IHBsYXlpbmcgaXQgdG8gbWUgd2l0aCBzbyBzb3VyIGEgZmFjZS4KCk51cnNlCgogICAgSSBhbSBhLXdlYXJ5LCBnaXZlIG1lIGxlYXZlIGF3aGlsZToKICAgIEZpZSwgaG93IG15IGJvbmVzIGFjaGUhIHdoYXQgYSBqYXVudCBoYXZlIEkgaGFkIQoKSlVMSUVUCgogICAgSSB3b3VsZCB0aG91IGhhZHN0IG15IGJvbmVzLCBhbmQgSSB0aHkgbmV3czoKICAgIE5heSwgY29tZSwgSSBwcmF5IHRoZWUsIHNwZWFrOyBnb29kLCBnb29kIG51cnNlLCBzcGVhay4KCk51cnNlCgogICAgSmVzdSwgd2hhdCBoYXN0ZT8gY2FuIHlvdSBub3Qgc3RheSBhd2hpbGUCiAgICBEbyB5b3Ugbm90IHNlZSB0aGF0IEkgYW0gb3V0IG9mIGJyZWF0aD8KCkpVTElFVAoKICAgIEhvdyBhcnQgdGhvdSBvdXQgb2YgYnJlYXRoLCB3aGVuIHRob3UgaGFzdCBicmVhdGgKICAgIFRvIHNheSB0byBtZSB0aGF0IHRob3UgYXJ0IG91dCBvZiBicmVhdGgCiAgICBUaGUgZXhjdXNlIHRoYXQgdGhvdSBkb3N0IG1ha2UgaW4gdGhpcyBkZWxheQogICAgSXMgbG9uZ2VyIHRoYW4gdGhlIHRhbGUgdGhvdSBkb3N0IGV4Y3VzZS4KICAgIElzIHRoeSBuZXdzIGdvb2QsIG9yIGJhZD8gYW5zd2VyIHRvIHRoYXQ7CiAgICBTYXkgZWl0aGVyLCBhbmQgSSdsbCBzdGF5IHRoZSBjaXJjdW1zdGFuY2U6CiAgICBMZXQgbWUgYmUgc2F0aXNmaWVkLCBpcyd0IGdvb2Qgb3IgYmFkPwoKTnVyc2UKCiAgICBXZWxsLCB5b3UgaGF2ZSBtYWRlIGEgc2ltcGxlIGNob2ljZTsgeW91IGtub3cgbm90CiAgICBob3cgdG8gY2hvb3NlIGEgbWFuOiBSb21lbyEgbm8sIG5vdCBoZTsgdGhvdWdoIGhpcwogICAgZmFjZSBiZSBiZXR0ZXIgdGhhbiBhbnkgbWFuJ3MsIHlldCBoaXMgbGVnIGV4Y2VscwogICAgYWxsIG1lbidzOyBhbmQgZm9yIGEgaGFuZCwgYW5kIGEgZm9vdCwgYW5kIGEgYm9keSwKICAgIHRob3VnaCB0aGV5IGJlIG5vdCB0byBiZSB0YWxrZWQgb24sIHlldCB0aGV5IGFyZQogICAgcGFzdCBjb21wYXJlOiBoZSBpcyBub3QgdGhlIGZsb3dlciBvZiBjb3VydGVzeSwKICAgIGJ1dCwgSSdsbCB3YXJyYW50IGhpbSwgYXMgZ2VudGxlIGFzIGEgbGFtYi4gR28gdGh5CiAgICB3YXlzLCB3ZW5jaDsgc2VydmUgR29kLiBXaGF0LCBoYXZlIHlvdSBkaW5lZCBhdCBob21lPwoKSlVMSUVUCgogICAgTm8sIG5vOiBidXQgYWxsIHRoaXMgZGlkIEkga25vdyBiZWZvcmUuCiAgICBXaGF0IHNheXMgaGUgb2Ygb3VyIG1hcnJpYWdlPyB3aGF0IG9mIHRoYXQCgpOdXJzZQoKICAgIExvcmQsIGhvdyBteSBoZWFkIGFjaGVzISB3aGF0IGEgaGVhZCBoYXZlIEkhCiAgICBJdCBiZWF0cyBhcyBpdCB3b3VsZCBmYWxsIGluIHR3ZW50eSBwaWVjZXMuCiAgICBNeSBiYWNrIG8nIHQnIG90aGVyIHNpZGUsLS1PLCBteSBiYWNrLCBteSBiYWNrIQogICAgQmVzaHJldyB5b3VyIGhlYXJ0IGZvciBzZW5kaW5nIG1lIGFib3V0LAogICAgVG8gY2F0Y2ggbXkgZGVhdGggd2l0aCBqYXVudGluZyB1cCBhbmQgZG93biEKCkpVTElFVAoKICAgIEknIGZhaXRoLCBJIGFtIHNvcnJ5IHRoYXQgdGhvdSBhcnQgbm90IHdlbGwuCiAgICBTd2VldCwgc3dlZXQsIHN3ZWV0IG51cnNlLCB0ZWxsIG1lLCB3aGF0IHNheXMgbXkgbG92ZT8KCk51cnNlCgogICAgWW91ciBsb3ZlIHNheXMsIGxpa2UgYW4gaG9uZXN0IGdlbnRsZW1hbiwgYW5kIGEKICAgIGNvdXJ0ZW91cywgYW5kIGEga2luZCwgYW5kIGEgaGFuZHNvbWUsIGFuZCwgSQogICAgd2FycmFudCwgYSB2aXJ0dW91cywtLVdoZXJlIGlzIHlvdXIgbW90aGVyPwoKSlVMSUVUCgogICAgV2hlcmUgaXMgbXkgbW90aGVyISB3aHksIHNoZSBpcyB3aXRoaW47CiAgICBXaGVyZSBzaG91bGQgc2hlIGJlPyBIb3cgb2RkbHkgdGhvdSByZXBsaWVzdCEKICAgICdZb3VyIGxvdmUgc2F5cywgbGlrZSBhbiBob25lc3QgZ2VudGxlbWFuLAogICAgV2hlcmUgaXMgeW91ciBtb3RoZXIJwoKTnVyc2UKCiAgICBPIEdvZCdzIGxhZHkgZGVhciEKICAgIEFyZSB5b3Ugc28gaG90PyBtYXJyeSwgY29tZSB1cCwgSSB0cm93OwogICAgSXMgdGhpcyB0aGUgcG91bHRpY2UgZm9yIG15IGFjaGluZyBib25lcz8KICAgIEhlbmNlZm9yd2FyZCBkbyB5b3VyIG1lc3NhZ2VzIHlvdXJzZWxmLgoKSlVMSUVUCgogICAgSGVyZSdzIHN1Y2ggYSBjb2lsISBjb21lLCB3aGF0IHNheXMgUm9tZW8CgpOdXJzZQoKICAgIEhhdmUgeW91IGdvdCBsZWF2ZSB0byBnbyB0byBzaHJpZnQgdG8tZGF5PwoKSlVMSUVUCgogICAgSSBoYXZlLgoKTnVyc2UKCiAgICBUaGVuIGhpZSB5b3UgaGVuY2UgdG8gRnJpYXIgTGF1cmVuY2UnIGNlbGw7CiAgICBUaGVyZSBzdGF5cyBhIGh1c2JhbmQgdG8gbWFrZSB5b3UgYSB3aWZlOgogICAgTm93IGNvbWVzIHRoZSB3YW50b24gYmxvb2QgdXAgaW4geW91ciBjaGVla3MsCiAgICBUaGV5J2xsIGJlIGluIHNjYXJsZXQgc3RyYWlnaHQgYXQgYW55IG5ld3MuCiAgICBIaWUgeW91IHRvIGNodXJjaDsgSSBtdXN0IGFub3RoZXIgd2F5LAogICAgVG8gZmV0Y2ggYSBsYWRkZXIsIGJ5IHRoZSB3aGljaCB5b3VyIGxvdmUKICAgIE11c3QgY2xpbWIgYSBiaXJkJ3MgbmVzdCBzb29uIHdoZW4gaXQgaXMgZGFyazoKICAgIEkgYW0gdGhlIGRydWRnZSBhbmQgdG9pbCBpbiB5b3VyIGRlbGlnaHQsCiAgICBCdXQgeW91IHNoYWxsIGJlYXIgdGhlIGJ1cmRlbiBzb29uIGF0IG5pZ2h0LgogICAgR287IEknbGwgdG8gZGlubmVyOiBoaWUgeW91IHRvIHRoZSBjZWxsLgoKSlVMSUVUCgogICAgSGllIHRvIGhpZ2ggZm9ydHVuZSEgSG9uZXN0IG51cnNlLCBmYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIFZJLiBGcmlhciBMYXVyZW5jZSdzIGNlbGwuCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UgYW5kIFJPTUVPIAoKRlJJQVIgTEFVUkVOQ0UKCiAgICBTbyBzbWlsZSB0aGUgaGVhdmVucyB1cG9uIHRoaXMgaG9seSBhY3QsCiAgICBUaGF0IGFmdGVyIGhvdXJzIHdpdGggc29ycm93IGNoaWRlIHVzIG5vdCEKClJPTUVPCgogICAgQW1lbiwgYW1lbiEgYnV0IGNvbWUgd2hhdCBzb3Jyb3cgY2FuLAogICAgSXQgY2Fubm90IGNvdW50ZXJ2YWlsIHRoZSBleGNoYW5nZSBvZiBqb3kKICAgIFRoYXQgb25lIHNob3J0IG1pbnV0ZSBnaXZlcyBtZSBpbiBoZXIgc2lnaHQ6CiAgICBEbyB0aG91IGJ1dCBjbG9zZSBvdXIgaGFuZHMgd2l0aCBob2x5IHdvcmRzLAogICAgVGhlbiBsb3ZlLWRldm91cmluZyBkZWF0aCBkbyB3aGF0IGhlIGRhcmU7CiAgICBJdCBpcyBlbm91Z2ggSSBtYXkgYnV0IGNhbGwgaGVyIG1pbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFRoZXNlIHZpb2xlbnQgZGVsaWdodHMgaGF2ZSB2aW9sZW50IGVuZHMKICAgIEFuZCBpbiB0aGVpciB0cml1bXBoIGRpZSwgbGlrZSBmaXJlIGFuZCBwb3dkZXIsCiAgICBXaGljaCBhcyB0aGV5IGtpc3MgY29uc3VtZTogdGhlIHN3ZWV0ZXN0IGhvbmV5CiAgICBJcyBsb2F0aHNvbWUgaW4gaGlzIG93biBkZWxpY2lvdXNuZXNzCiAgICBBbmQgaW4gdGhlIHRhc3RlIGNvbmZvdW5kcyB0aGUgYXBwZXRpdGU6CiAgICBUaGVyZWZvcmUgbG92ZSBtb2RlcmF0ZWx5OyBsb25nIGxvdmUgZG90aCBzbzsKICAgIFRvbyBzd2lmdCBhcnJpdmVzIGFzIHRhcmR5IGFzIHRvbyBzbG93LgoKICAgIEVudGVyIEpVTElFVAogICAgSGVyZSBjb21lcyB0aGUgbGFkeTogTywgc28gbGlnaHQgYSBmb290CiAgICBXaWxsIG5lJ2VyIHdlYXIgb3V0IHRoZSBldmVybGFzdGluZyBmbGludDoKICAgIEEgbG92ZXIgbWF5IGJlc3RyaWRlIHRoZSBnb3NzYW1lcgogICAgVGhhdCBpZGxlcyBpbiB0aGUgd2FudG9uIHN1bW1lciBhaXIsCiAgICBBbmQgeWV0IG5vdCBmYWxsOyBzbyBsaWdodCBpcyB2YW5pdHkuCgpKVUxJRVQKCiAgICBHb29kIGV2ZW4gdG8gbXkgZ2hvc3RseSBjb25mZXNzb3IuCgpGUklBUiBMQVVSRU5DRQoKICAgIFJvbWVvIHNoYWxsIHRoYW5rIHRoZWUsIGRhdWdodGVyLCBmb3IgdXMgYm90aC4KCkpVTElFVAoKICAgIEFzIG11Y2ggdG8gaGltLCBlbHNlIGlzIGhpcyB0aGFua3MgdG9vIG11Y2guCgpST01FTwoKICAgIEFoLCBKdWxpZXQsIGlmIHRoZSBtZWFzdXJlIG9mIHRoeSBqb3kKICAgIEJlIGhlYXAnZCBsaWtlIG1pbmUgYW5kIHRoYXQgdGh5IHNraWxsIGJlIG1vcmUKICAgIFRvIGJsYXpvbiBpdCwgdGhlbiBzd2VldGVuIHdpdGggdGh5IGJyZWF0aAogICAgVGhpcyBuZWlnaGJvdXIgYWlyLCBhbmQgbGV0IHJpY2ggbXVzaWMncyB0b25ndWUKICAgIFVuZm9sZCB0aGUgaW1hZ2luZWQgaGFwcGluZXNzIHRoYXQgYm90aAogICAgUmVjZWl2ZSBpbiBlaXRoZXIgYnkgdGhpcyBkZWFyIGVuY291bnRlci4KCkpVTElFVAoKICAgIENvbmNlaXQsIG1vcmUgcmljaCBpbiBtYXR0ZXIgdGhhbiBpbiB3b3JkcywKICAgIEJyYWdzIG9mIGhpcyBzdWJzdGFuY2UsIG5vdCBvZiBvcm5hbWVudDoKICAgIFRoZXkgYXJlIGJ1dCBiZWdnYXJzIHRoYXQgY2FuIGNvdW50IHRoZWlyIHdvcnRoOwogICAgQnV0IG15IHRydWUgbG92ZSBpcyBncm93biB0byBzdWNoIGV4Y2VzcwogICAgSSBjYW5ub3Qgc3VtIHVwIHN1bSBvZiBoYWxmIG15IHdlYWx0aC4KCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgY29tZSB3aXRoIG1lLCBhbmQgd2Ugd2lsbCBtYWtlIHNob3J0IHdvcms7CiAgICBGb3IsIGJ5IHlvdXIgbGVhdmVzLCB5b3Ugc2hhbGwgbm90IHN0YXkgYWxvbmUKICAgIFRpbGwgaG9seSBjaHVyY2ggaW5jb3Jwb3JhdGUgdHdvIGluIG9uZS4KCiAgICBFeGV1bnQKCkFDVCBJSUkKU0NFTkUgSS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgTUVSQ1VUSU8sIEJFTlZPTElPLCBQYWdlLCBhbmQgU2VydmFudHMgCgpCRU5WT0xJTwoKICAgIEkgcHJheSB0aGVlLCBnb29kIE1lcmN1dGlvLCBsZXQncyByZXRpcmU6CiAgICBUaGUgZGF5IGlzIGhvdCwgdGhlIENhcHVsZXRzIGFicm9hZCwKICAgIEFuZCwgaWYgd2UgbWVldCwgd2Ugc2hhbGwgbm90IHNjYXBlIGEgYnJhd2w7CiAgICBGb3Igbm93LCB0aGVzZSBob3QgZGF5cywgaXMgdGhlIG1hZCBibG9vZCBzdGlycmluZy4KCk1FUkNVVElPCgogICAgVGhvdSBhcnQgbGlrZSBvbmUgb2YgdGhvc2UgZmVsbG93cyB0aGF0IHdoZW4gaGUKICAgIGVudGVycyB0aGUgY29uZmluZXMgb2YgYSB0YXZlcm4gY2xhcHMgbWUgaGlzIHN3b3JkCiAgICB1cG9uIHRoZSB0YWJsZSBhbmQgc2F5cyAnR29kIHNlbmQgbWUgbm8gbmVlZCBvZgogICAgdGhlZSEnIGFuZCBieSB0aGUgb3BlcmF0aW9uIG9mIHRoZSBzZWNvbmQgY3VwIGRyYXdzCiAgICBpdCBvbiB0aGUgZHJhd2VyLCB3aGVuIGluZGVlZCB0aGVyZSBpcyBubyBuZWVkLgoKQkVOVk9MSU8KCiAgICBBbSBJIGxpa2Ugc3VjaCBhIGZlbGxvdz8KCk1FUkNVVElPCgogICAgQ29tZSwgY29tZSwgdGhvdSBhcnQgYXMgaG90IGEgSmFjayBpbiB0aHkgbW9vZCBhcwogICAgYW55IGluIEl0YWx5LCBhbmQgYXMgc29vbiBtb3ZlZCB0byBiZSBtb29keSwgYW5kIGFzCiAgICBzb29uIG1vb2R5IHRvIGJlIG1vdmVkLgoKQkVOVk9MSU8KCiAgICBBbmQgd2hhdCB0bz8KCk1FUkNVVElPCgogICAgTmF5LCBhbiB0aGVyZSB3ZXJlIHR3byBzdWNoLCB3ZSBzaG91bGQgaGF2ZSBub25lCiAgICBzaG9ydGx5LCBmb3Igb25lIHdvdWxkIGtpbGwgdGhlIG90aGVyLiBUaG91ISB3aHksCiAgICB0aG91IHdpbHQgcXVhcnJlbCB3aXRoIGEgbWFuIHRoYXQgaGF0aCBhIGhhaXIgbW9yZSwKICAgIG9yIGEgaGFpciBsZXNzLCBpbiBoaXMgYmVhcmQsIHRoYW4gdGhvdSBoYXN0OiB0aG91CiAgICB3aWx0IHF1YXJyZWwgd2l0aCBhIG1hbiBmb3IgY3JhY2tpbmcgbnV0cywgaGF2aW5nIG5vCiAgICBvdGhlciByZWFzb24gYnV0IGJlY2F1c2UgdGhvdSBoYXN0IGhhemVsIGV5ZXM6IHdoYXQKICAgIGV5ZSBidXQgc3VjaCBhbiBleWUgd291bGQgc3B5IG91dCBzdWNoIGEgcXVhcnJlbD8KICAgIFRoeSBoZWFkIGlzIGFzIGZ1biBvZiBxdWFycmVscyBhcyBhbiBlZ2cgaXMgZnVsbCBvZgogICAgbWVhdCwgYW5kIHlldCB0aHkgaGVhZCBoYXRoIGJlZW4gYmVhdGVuIGFzIGFkZGxlIGFzCiAgICBhbiBlZ2cgZm9yIHF1YXJyZWxsaW5nOiB0aG91IGhhc3QgcXVhcnJlbGxlZCB3aXRoIGEKICAgIG1hbiBmb3IgY291Z2hpbmcgaW4gdGhlIHN0cmVldCwgYmVjYXVzZSBoZSBoYXRoCiAgICB3YWtlbmVkIHRoeSBkb2cgdGhhdCBoYXRoIGxhaW4gYXNsZWVwIGluIHRoZSBzdW46CiAgICBkaWRzdCB0aG91IG5vdCBmYWxsIG91dCB3aXRoIGEgdGFpbG9yIGZvciB3ZWFyaW5nCiAgICBoaXMgbmV3IGRvdWJsZXQgYmVmb3JlIEVhc3Rlcj8gd2l0aCBhbm90aGVyLCBmb3IKICAgIHR5aW5nIGhpcyBuZXcgc2hvZXMgd2l0aCBvbGQgcmliYW5kPyBhbmQgeWV0IHRob3UKICAgIHdpbHQgdHV0b3IgbWUgZnJvbSBxdWFycmVsbGluZyEKCkJFTlZPTElPCgogICAgQW4gSSB3ZXJlIHNvIGFwdCB0byBxdWFycmVsIGFzIHRob3UgYXJ0LCBhbnkgbWFuCiAgICBzaG91bGQgYnV5IHRoZSBmZWUtc2ltcGxlIG9mIG15IGxpZmUgZm9yIGFuIGhvdXIgYW5kIGEgcXVhcnRlci4KCk1FUkNVVElPCgogICAgVGhlIGZlZS1zaW1wbGUhIE8gc2ltcGxlIQoKQkVOVk9MSU8KCiAgICBCeSBteSBoZWFkLCBoZXJlIGNvbWUgdGhlIENhcHVsZXRzLgoKTUVSQ1VUSU8KCiAgICBCeSBteSBoZWVsLCBJIGNhcmUgbm90LgoKICAgIEVudGVyIFRZQkFMVCBhbmQgb3RoZXJzCgpUWUJBTFQKCiAgICBGb2xsb3cgbWUgY2xvc2UsIGZvciBJIHdpbGwgc3BlYWsgdG8gdGhlbS4KICAgIEdlbnRsZW1lbiwgZ29vZCBkZW46IGEgd29yZCB3aXRoIG9uZSBvZiB5b3UuCgpNRVJDVVRJTwoKICAgIEFuZCBidXQgb25lIHdvcmQgd2l0aCBvbmUgb2YgdXMIGNvdXBsZSBpdCB3aXRoCiAgICBzb21ldGhpbmc7IG1ha2UgaXQgYSB3b3JkIGFuZCBhIGJsb3cuCgpUWUJBTFQKCiAgICBZb3Ugc2hhbGwgZmluZCBtZSBhcHQgZW5vdWdoIHRvIHRoYXQsIHNpciwgYW4geW91CiAgICB3aWxsIGdpdmUgbWUgb2NjYXNpb24uCgpNRVJDVVRJTwoKICAgIENvdWxkIHlvdSBub3QgdGFrZSBzb21lIG9jY2FzaW9uIHdpdGhvdXQgZ2l2aW5nPwoKVFlCQUxUCgogICAgTWVyY3V0aW8sIHRob3UgY29uc29ydCdzdCB3aXRoIFJvbWVvLC0tCgpNRVJDVVRJTwoKICAgIENvbnNvcnQhIHdoYXQsIGRvc3QgdGhvdSBtYWtlIHVzIG1pbnN0cmVscz8gYW4KICAgIHRob3UgbWFrZSBtaW5zdHJlbHMgb2YgdXMsIGxvb2sgdG8gaGVhciBub3RoaW5nIGJ1dAogICAgZGlzY29yZHM6IGhlcmUncyBteSBmaWRkbGVzdGljazsgaGVyZSdzIHRoYXQgc2hhbGwKICAgIG1ha2UgeW91IGRhbmNlLiAnWm91bmRzLCBjb25zb3J0IQoKQkVOVk9MSU8KCiAgICBXZSB0YWxrIGhlcmUgaW4gdGhlIHB1YmxpYyBoYXVudCBvZiBtZW46CiAgICBFaXRoZXIgd2l0aGRyYXcgdW50byBzb21lIHByaXZhdGUgcGxhY2UsCiAgICBBbmQgcmVhc29uIGNvbGRseSBvZiB5b3VyIGdyaWV2YW5jZXMsCiAgICBPciBlbHNlIGRlcGFydDsgaGVyZSBhbGwgZXllcyBnYXplIG9uIHVzLgoKTUVSQ1VUSU8KCiAgICBNZW4ncyBleWVzIHdlcmUgbWFkZSB0byBsb29rLCBhbmQgbGV0IHRoZW0gZ2F6ZTsKICAgIEkgd2lsbCBub3QgYnVkZ2UgZm9yIG5vIG1hbidzIHBsZWFzdXJlLCBJLgoKICAgIEVudGVyIFJPTUVPCgpUWUJBTFQKCiAgICBXZWxsLCBwZWFjZSBiZSB3aXRoIHlvdSwgc2lyOiBoZXJlIGNvbWVzIG15IG1hbi4KCk1FUkNVVElPCgogICAgQnV0IEknbGwgYmUgaGFuZ2VkLCBzaXIsIGlmIGhlIHdlYXIgeW91ciBsaXZlcnk6CiAgICBNYXJyeSwgZ28gYmVmb3JlIHRvIGZpZWxkLCBoZSdsbCBiZSB5b3VyIGZvbGxvd2VyOwogICAgWW91ciB3b3JzaGlwIGluIHRoYXQgc2Vuc2UgbWF5IGNhbGwgaGltICdtYW4uJwoKVFlCQUxUCgogICAgUm9tZW8sIHRoZSBoYXRlIEkgYmVhciB0aGVlIGNhbiBhZmZvcmQKICAgIE5vIGJldHRlciB0ZXJtIHRoYW4gdGhpcywtLXRob3UgYXJ0IGEgdmlsbGFpbi4KClJPTUVPCgogICAgVHliYWx0LCB0aGUgcmVhc29uIHRoYXQgSSBoYXZlIHRvIGxvdmUgdGhlZQogICAgRG90aCBtdWNoIGV4Y3VzZSB0aGUgYXBwZXJ0YWluaW5nIHJhZ2UKICAgIFRvIHN1Y2ggYSBncmVldGluZzogdmlsbGFpbiBhbSBJIG5vbmU7CiAgICBUaGVyZWZvcmUgZmFyZXdlbGw7IEkgc2VlIHRob3Uga25vdydzdCBtZSBub3QuCgpUWUJBTFQKCiAgICBCb3ksIHRoaXMgc2hhbGwgbm90IGV4Y3VzZSB0aGUgaW5qdXJpZXMKICAgIFRoYXQgdGhvdSBoYXN0IGRvbmUgbWU7IHRoZXJlZm9yZSB0dXJuIGFuZCBkcmF3LgoKUk9NRU8KCiAgICBJIGRvIHByb3Rlc3QsIEkgbmV2ZXIgaW5qdXJlZCB0aGVlLAogICAgQnV0IGxvdmUgdGhlZSBiZXR0ZXIgdGhhbiB0aG91IGNhbnN0IGRldmlzZSwKICAgIFRpbGwgdGhvdSBzaGFsdCBrbm93IHRoZSByZWFzb24gb2YgbXkgbG92ZToKICAgIEFuZCBzbywgZ29vZCBDYXB1bGV0LC0td2hpY2ggbmFtZSBJIHRlbmRlcgogICAgQXMgZGVhcmx5IGFzIG15IG93biwtLWJlIHNhdGlzZmllZC4KCk1FUkNVVElPCgogICAgTyBjYWxtLCBkaXNob25vdXJhYmxlLCB2aWxlIHN1Ym1pc3Npb24hCiAgICBBbGxhIHN0b2NjYXRhIGNhcnJpZXMgaXQgYXdheS4KCiAgICBEcmF3cwogICAgVHliYWx0LCB5b3UgcmF0LWNhdGNoZXIsIHdpbGwgeW91IHdhbGsCgpUWUJBTFQKCiAgICBXaGF0IHdvdWxkc3QgdGhvdSBoYXZlIHdpdGggbWUCgpNRVJDVVRJTwoKICAgIEdvb2Qga2luZyBvZiBjYXRzLCBub3RoaW5nIGJ1dCBvbmUgb2YgeW91ciBuaW5lCiAgICBsaXZlczsgdGhhdCBJIG1lYW4gdG8gbWFrZSBib2xkIHdpdGhhbCwgYW5kIGFzIHlvdQogICAgc2hhbGwgdXNlIG1lIGhlcmVhZnRlciwgZHJ5YmVhdCB0aGUgcmVzdCBvZiB0aGUKICAgIGVpZ2h0LiBXaWxsIHlvdSBwbHVjayB5b3VyIHN3b3JkIG91dCBvZiBoaXMgcGl0Y2hlcgogICAgYnkgdGhlIGVhcnMIG1ha2UgaGFzdGUsIGxlc3QgbWluZSBiZSBhYm91dCB5b3VyCiAgICBlYXJzIGVyZSBpdCBiZSBvdXQuCgpUWUJBTFQKCiAgICBJIGFtIGZvciB5b3UuCgogICAgRHJhd2luZwoKUk9NRU8KCiAgICBHZW50bGUgTWVyY3V0aW8sIHB1dCB0aHkgcmFwaWVyIHVwLgoKTUVSQ1VUSU8KCiAgICBDb21lLCBzaXIsIHlvdXIgcGFzc2Fkby4KCiAgICBUaGV5IGZpZ2h0CgpST01FTwoKICAgIERyYXcsIEJlbnZvbGlvOyBiZWF0IGRvd24gdGhlaXIgd2VhcG9ucy4KICAgIEdlbnRsZW1lbiwgZm9yIHNoYW1lLCBmb3JiZWFyIHRoaXMgb3V0cmFnZSEKICAgIFR5YmFsdCwgTWVyY3V0aW8sIHRoZSBwcmluY2UgZXhwcmVzc2x5IGhhdGgKICAgIEZvcmJpZGRlbiBiYW5keWluZyBpbiBWZXJvbmEgc3RyZWV0czoKICAgIEhvbGQsIFR5YmFsdCEgZ29vZCBNZXJjdXRpbyEKCiAgICBUWUJBTFQgdW5kZXIgUk9NRU8ncyBhcm0gc3RhYnMgTUVSQ1VUSU8sIGFuZCBmbGllcyB3aXRoIGhpcyBmb2xsb3dlcnMKCk1FUkNVVElPCgogICAgSSBhbSBodXJ0LgogICAgQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEgSSBhbSBzcGVkLgogICAgSXMgaGUgZ29uZSwgYW5kIGhhdGggbm90aGluZz8KCkJFTlZPTElPCgogICAgV2hhdCwgYXJ0IHRob3UgaHVydD8KCk1FUkNVVElPCgogICAgQXksIGF5LCBhIHNjcmF0Y2gsIGEgc2NyYXRjaDsgbWFycnksICd0aXMgZW5vdWdoLgogICAgV2hlcmUgaXMgbXkgcGFnZT8gR28sIHZpbGxhaW4sIGZldGNoIGEgc3VyZ2Vvbi4KCiAgICBFeGl0IFBhZ2UKClJPTUVPCgogICAgQ291cmFnZSwgbWFuOyB0aGUgaHVydCBjYW5ub3QgYmUgbXVjaC4KCk1FUkNVVElPCgogICAgTm8sICd0aXMgbm90IHNvIGRlZXAgYXMgYSB3ZWxsLCBub3Igc28gd2lkZSBhcyBhCiAgICBjaHVyY2gtZG9vcjsgYnV0ICd0aXMgZW5vdWdoLCd0d2lsbCBzZXJ2ZTogYXNrIGZvcgogICAgbWUgdG8tbW9ycm93LCBhbmQgeW91IHNoYWxsIGZpbmQgbWUgYSBncmF2ZSBtYW4uIEkKICAgIGFtIHBlcHBlcmVkLCBJIHdhcnJhbnQsIGZvciB0aGlzIHdvcmxkLiBBIHBsYWd1ZSBvJwogICAgYm90aCB5b3VyIGhvdXNlcyEgJ1pvdW5kcywgYSBkb2csIGEgcmF0LCBhIG1vdXNlLCBhCiAgICBjYXQsIHRvIHNjcmF0Y2ggYSBtYW4gdG8gZGVhdGghIGEgYnJhZ2dhcnQsIGEKICAgIHJvZ3VlLCBhIHZpbGxhaW4sIHRoYXQgZmlnaHRzIGJ5IHRoZSBib29rIG9mCiAgICBhcml0aG1ldGljISBXaHkgdGhlIGRldmlsIGNhbWUgeW91IGJldHdlZW4gdXMIEkKICAgIHdhcyBodXJ0IHVuZGVyIHlvdXIgYXJtLgoKUk9NRU8KCiAgICBJIHRob3VnaHQgYWxsIGZvciB0aGUgYmVzdC4KCk1FUkNVVElPCgogICAgSGVscCBtZSBpbnRvIHNvbWUgaG91c2UsIEJlbnZvbGlvLAogICAgT3IgSSBzaGFsbCBmYWludC4gQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEKICAgIFRoZXkgaGF2ZSBtYWRlIHdvcm1zJyBtZWF0IG9mIG1lOiBJIGhhdmUgaXQsCiAgICBBbmQgc291bmRseSB0b286IHlvdXIgaG91c2VzIQoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KClJPTUVPCgogICAgVGhpcyBnZW50bGVtYW4sIHRoZSBwcmluY2UncyBuZWFyIGFsbHksCiAgICBNeSB2ZXJ5IGZyaWVuZCwgaGF0aCBnb3QgaGlzIG1vcnRhbCBodXJ0CiAgICBJbiBteSBiZWhhbGY7IG15IHJlcHV0YXRpb24gc3RhaW4nZAogICAgV2l0aCBUeWJhbHQncyBzbGFuZGVyLC0tVHliYWx0LCB0aGF0IGFuIGhvdXIKICAgIEhhdGggYmVlbiBteSBraW5zbWFuISBPIHN3ZWV0IEp1bGlldCwKICAgIFRoeSBiZWF1dHkgaGF0aCBtYWRlIG1lIGVmZmVtaW5hdGUKICAgIEFuZCBpbiBteSB0ZW1wZXIgc29mdGVuJ2QgdmFsb3VyJ3Mgc3RlZWwhCgogICAgUmUtZW50ZXIgQkVOVk9MSU8KCkJFTlZPTElPCgogICAgTyBSb21lbywgUm9tZW8sIGJyYXZlIE1lcmN1dGlvJ3MgZGVhZCEKICAgIFRoYXQgZ2FsbGFudCBzcGlyaXQgaGF0aCBhc3BpcmVkIHRoZSBjbG91ZHMsCiAgICBXaGljaCB0b28gdW50aW1lbHkgaGVyZSBkaWQgc2Nvcm4gdGhlIGVhcnRoLgoKUk9NRU8KCiAgICBUaGlzIGRheSdzIGJsYWNrIGZhdGUgb24gbW9yZSBkYXlzIGRvdGggZGVwZW5kOwogICAgVGhpcyBidXQgYmVnaW5zIHRoZSB3b2UsIG90aGVycyBtdXN0IGVuZC4KCkJFTlZPTElPCgogICAgSGVyZSBjb21lcyB0aGUgZnVyaW91cyBUeWJhbHQgYmFjayBhZ2Fpbi4KClJPTUVPCgogICAgQWxpdmUsIGluIHRyaXVtcGghIGFuZCBNZXJjdXRpbyBzbGFpbiEKICAgIEF3YXkgdG8gaGVhdmVuLCByZXNwZWN0aXZlIGxlbml0eSwKICAgIEFuZCBmaXJlLWV5ZWQgZnVyeSBiZSBteSBjb25kdWN0IG5vdyEKCiAgICBSZS1lbnRlciBUWUJBTFQKICAgIE5vdywgVHliYWx0LCB0YWtlIHRoZSB2aWxsYWluIGJhY2sgYWdhaW4sCiAgICBUaGF0IGxhdGUgdGhvdSBnYXZlc3QgbWU7IGZvciBNZXJjdXRpbydzIHNvdWwKICAgIElzIGJ1dCBhIGxpdHRsZSB3YXkgYWJvdmUgb3VyIGhlYWRzLAogICAgU3RheWluZyBmb3IgdGhpbmUgdG8ga2VlcCBoaW0gY29tcGFueToKICAgIEVpdGhlciB0aG91LCBvciBJLCBvciBib3RoLCBtdXN0IGdvIHdpdGggaGltLgoKVFlCQUxUCgogICAgVGhvdSwgd3JldGNoZWQgYm95LCB0aGF0IGRpZHN0IGNvbnNvcnQgaGltIGhlcmUsCiAgICBTaGFsdCB3aXRoIGhpbSBoZW5jZS4KClJPTUVPCgogICAgVGhpcyBzaGFsbCBkZXRlcm1pbmUgdGhhdC4KCiAgICBUaGV5IGZpZ2h0OyBUWUJBTFQgZmFsbHMKCkJFTlZPTElPCgogICAgUm9tZW8sIGF3YXksIGJlIGdvbmUhCiAgICBUaGUgY2l0aXplbnMgYXJlIHVwLCBhbmQgVHliYWx0IHNsYWluLgogICAgU3RhbmQgbm90IGFtYXplZDogdGhlIHByaW5jZSB3aWxsIGRvb20gdGhlZSBkZWF0aCwKICAgIElmIHRob3UgYXJ0IHRha2VuOiBoZW5jZSwgYmUgZ29uZSwgYXdheSEKClJPTUVPCgogICAgTywgSSBhbSBmb3J0dW5lJ3MgZm9vbCEKCkJFTlZPTElPCgogICAgV2h5IGRvc3QgdGhvdSBzdGF5PwoKICAgIEV4aXQgUk9NRU8KCiAgICBFbnRlciBDaXRpemVucywgJiBjCgpGaXJzdCBDaXRpemVuCgogICAgV2hpY2ggd2F5IHJhbiBoZSB0aGF0IGtpbGwnZCBNZXJjdXRpbz8KICAgIFR5YmFsdCwgdGhhdCBtdXJkZXJlciwgd2hpY2ggd2F5IHJhbiBoZT8KCkJFTlZPTElPCgogICAgVGhlcmUgbGllcyB0aGF0IFR5YmFsdC4KCkZpcnN0IENpdGl6ZW4KCiAgICBVcCwgc2lyLCBnbyB3aXRoIG1lOwogICAgSSBjaGFyZ2UgdGhlZSBpbiB0aGUgcHJpbmNlcyBuYW1lLCBvYmV5LgoKICAgIEVudGVyIFByaW5jZSwgYXR0ZW5kZWQ7IE1PTlRBR1VFLCBDQVBVTEVULCB0aGVpciBXaXZlcywgYW5kIG90aGVycwoKUFJJTkNFCgogICAgV2hlcmUgYXJlIHRoZSB2aWxlIGJlZ2lubmVycyBvZiB0aGlzIGZyYXkCgpCRU5WT0xJTwoKICAgIE8gbm9ibGUgcHJpbmNlLCBJIGNhbiBkaXNjb3ZlciBhbGwKICAgIFRoZSB1bmx1Y2t5IG1hbmFnZSBvZiB0aGlzIGZhdGFsIGJyYXdsOgogICAgVGhlcmUgbGllcyB0aGUgbWFuLCBzbGFpbiBieSB5b3VuZyBSb21lbywKICAgIFRoYXQgc2xldyB0aHkga2luc21hbiwgYnJhdmUgTWVyY3V0aW8uCgpMQURZIENBUFVMRVQKCiAgICBUeWJhbHQsIG15IGNvdXNpbiEgTyBteSBicm90aGVyJ3MgY2hpbGQhCiAgICBPIHByaW5jZSEgTyBjb3VzaW4hIGh1c2JhbmQhIE8sIHRoZSBibG9vZCBpcyBzcGlsdAogICAgTyBteSBkZWFyIGtpbnNtYW4hIFByaW5jZSwgYXMgdGhvdSBhcnQgdHJ1ZSwKICAgIEZvciBibG9vZCBvZiBvdXJzLCBzaGVkIGJsb29kIG9mIE1vbnRhZ3VlLgogICAgTyBjb3VzaW4sIGNvdXNpbiEKClBSSU5DRQoKICAgIEJlbnZvbGlvLCB3aG8gYmVnYW4gdGhpcyBibG9vZHkgZnJheT8KCkJFTlZPTElPCgogICAgVHliYWx0LCBoZXJlIHNsYWluLCB3aG9tIFJvbWVvJ3MgaGFuZCBkaWQgc2xheTsKICAgIFJvbWVvIHRoYXQgc3Bva2UgaGltIGZhaXIsIGJhZGUgaGltIGJldGhpbmsKICAgIEhvdyBuaWNlIHRoZSBxdWFycmVsIHdhcywgYW5kIHVyZ2VkIHdpdGhhbAogICAgWW91ciBoaWdoIGRpc3BsZWFzdXJlOiBhbGwgdGhpcyB1dHRlcmVkCiAgICBXaXRoIGdlbnRsZSBicmVhdGgsIGNhbG0gbG9vaywga25lZXMgaHVtYmx5IGJvdydkLAogICAgQ291bGQgbm90IHRha2UgdHJ1Y2Ugd2l0aCB0aGUgdW5ydWx5IHNwbGVlbgogICAgT2YgVHliYWx0IGRlYWYgdG8gcGVhY2UsIGJ1dCB0aGF0IGhlIHRpbHRzCiAgICBXaXRoIHBpZXJjaW5nIHN0ZWVsIGF0IGJvbGQgTWVyY3V0aW8ncyBicmVhc3QsCiAgICBXaG8gYWxsIGFzIGhvdCwgdHVybnMgZGVhZGx5IHBvaW50IHRvIHBvaW50LAogICAgQW5kLCB3aXRoIGEgbWFydGlhbCBzY29ybiwgd2l0aCBvbmUgaGFuZCBiZWF0cwogICAgQ29sZCBkZWF0aCBhc2lkZSwgYW5kIHdpdGggdGhlIG90aGVyIHNlbmRzCiAgICBJdCBiYWNrIHRvIFR5YmFsdCwgd2hvc2UgZGV4dGVyaXR5LAogICAgUmV0b3J0cyBpdDogUm9tZW8gaGUgY3JpZXMgYWxvdWQsCiAgICAnSG9sZCwgZnJpZW5kcyEgZnJpZW5kcywgcGFydCEnIGFuZCwgc3dpZnRlciB0aGFuCiAgICBoaXMgdG9uZ3VlLAogICAgSGlzIGFnaWxlIGFybSBiZWF0cyBkb3duIHRoZWlyIGZhdGFsIHBvaW50cywKICAgIEFuZCAndHdpeHQgdGhlbSBydXNoZXM7IHVuZGVybmVhdGggd2hvc2UgYXJtCiAgICBBbiBlbnZpb3VzIHRocnVzdCBmcm9tIFR5YmFsdCBoaXQgdGhlIGxpZmUKICAgIE9mIHN0b3V0IE1lcmN1dGlvLCBhbmQgdGhlbiBUeWJhbHQgZmxlZDsKICAgIEJ1dCBieSBhbmQgYnkgY29tZXMgYmFjayB0byBSb21lbywKICAgIFdobyBoYWQgYnV0IG5ld2x5IGVudGVydGFpbidkIHJldmVuZ2UsCiAgICBBbmQgdG8gJ3QgdGhleSBnbyBsaWtlIGxpZ2h0bmluZywgZm9yLCBlcmUgSQogICAgQ291bGQgZHJhdyB0byBwYXJ0IHRoZW0sIHdhcyBzdG91dCBUeWJhbHQgc2xhaW4uCiAgICBBbmQsIGFzIGhlIGZlbGwsIGRpZCBSb21lbyB0dXJuIGFuZCBmbHkuCiAgICBUaGlzIGlzIHRoZSB0cnV0aCwgb3IgbGV0IEJlbnZvbGlvIGRpZS4KCkxBRFkgQ0FQVUxFVAoKICAgIEhlIGlzIGEga2luc21hbiB0byB0aGUgTW9udGFndWU7CiAgICBBZmZlY3Rpb24gbWFrZXMgaGltIGZhbHNlOyBoZSBzcGVha3Mgbm90IHRydWU6CiAgICBTb21lIHR3ZW50eSBvZiB0aGVtIGZvdWdodCBpbiB0aGlzIGJsYWNrIHN0cmlmZSwKICAgIEFuZCBhbGwgdGhvc2UgdHdlbnR5IGNvdWxkIGJ1dCBraWxsIG9uZSBsaWZlLgogICAgSSBiZWcgZm9yIGp1c3RpY2UsIHdoaWNoIHRob3UsIHByaW5jZSwgbXVzdCBnaXZlOwogICAgUm9tZW8gc2xldyBUeWJhbHQsIFJvbWVvIG11c3Qgbm90IGxpdmUuCgpQUklOQ0UKCiAgICBSb21lbyBzbGV3IGhpbSwgaGUgc2xldyBNZXJjdXRpbzsKICAgIFdobyBub3cgdGhlIHByaWNlIG9mIGhpcyBkZWFyIGJsb29kIGRvdGggb3dlPwoKTU9OVEFHVUUKCiAgICBOb3QgUm9tZW8sIHByaW5jZSwgaGUgd2FzIE1lcmN1dGlvJ3MgZnJpZW5kOwogICAgSGlzIGZhdWx0IGNvbmNsdWRlcyBidXQgd2hhdCB0aGUgbGF3IHNob3VsZCBlbmQsCiAgICBUaGUgbGlmZSBvZiBUeWJhbHQuCgpQUklOQ0UKCiAgICBBbmQgZm9yIHRoYXQgb2ZmZW5jZQogICAgSW1tZWRpYXRlbHkgd2UgZG8gZXhpbGUgaGltIGhlbmNlOgogICAgSSBoYXZlIGFuIGludGVyZXN0IGluIHlvdXIgaGF0ZSdzIHByb2NlZWRpbmcsCiAgICBNeSBibG9vZCBmb3IgeW91ciBydWRlIGJyYXdscyBkb3RoIGxpZSBhLWJsZWVkaW5nOwogICAgQnV0IEknbGwgYW1lcmNlIHlvdSB3aXRoIHNvIHN0cm9uZyBhIGZpbmUKICAgIFRoYXQgeW91IHNoYWxsIGFsbCByZXBlbnQgdGhlIGxvc3Mgb2YgbWluZToKICAgIEkgd2lsbCBiZSBkZWFmIHRvIHBsZWFkaW5nIGFuZCBleGN1c2VzOwogICAgTm9yIHRlYXJzIG5vciBwcmF5ZXJzIHNoYWxsIHB1cmNoYXNlIG91dCBhYnVzZXM6CiAgICBUaGVyZWZvcmUgdXNlIG5vbmU6IGxldCBSb21lbyBoZW5jZSBpbiBoYXN0ZSwKICAgIEVsc2UsIHdoZW4gaGUncyBmb3VuZCwgdGhhdCBob3VyIGlzIGhpcyBsYXN0LgogICAgQmVhciBoZW5jZSB0aGlzIGJvZHkgYW5kIGF0dGVuZCBvdXIgd2lsbDoKICAgIE1lcmN5IGJ1dCBtdXJkZXJzLCBwYXJkb25pbmcgdGhvc2UgdGhhdCBraWxsLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIENhcHVsZXQncyBvcmNoYXJkLgoKICAgIEVudGVyIEpVTElFVCAKCkpVTElFVAoKICAgIEdhbGxvcCBhcGFjZSwgeW91IGZpZXJ5LWZvb3RlZCBzdGVlZHMsCiAgICBUb3dhcmRzIFBob2VidXMnIGxvZGdpbmc6IHN1Y2ggYSB3YWdvbmVyCiAgICBBcyBQaGFldGhvbiB3b3VsZCB3aGlwIHlvdSB0byB0aGUgd2VzdCwKICAgIEFuZCBicmluZyBpbiBjbG91ZHkgbmlnaHQgaW1tZWRpYXRlbHkuCiAgICBTcHJlYWQgdGh5IGNsb3NlIGN1cnRhaW4sIGxvdmUtcGVyZm9ybWluZyBuaWdodCwKICAgIFRoYXQgcnVuYXdheSdzIGV5ZXMgbWF5IHdpbmsgYW5kIFJvbWVvCiAgICBMZWFwIHRvIHRoZXNlIGFybXMsIHVudGFsaydkIG9mIGFuZCB1bnNlZW4uCiAgICBMb3ZlcnMgY2FuIHNlZSB0byBkbyB0aGVpciBhbW9yb3VzIHJpdGVzCiAgICBCeSB0aGVpciBvd24gYmVhdXRpZXM7IG9yLCBpZiBsb3ZlIGJlIGJsaW5kLAogICAgSXQgYmVzdCBhZ3JlZXMgd2l0aCBuaWdodC4gQ29tZSwgY2l2aWwgbmlnaHQsCiAgICBUaG91IHNvYmVyLXN1aXRlZCBtYXRyb24sIGFsbCBpbiBibGFjaywKICAgIEFuZCBsZWFybiBtZSBob3cgdG8gbG9zZSBhIHdpbm5pbmcgbWF0Y2gsCiAgICBQbGF5J2QgZm9yIGEgcGFpciBvZiBzdGFpbmxlc3MgbWFpZGVuaG9vZHM6CiAgICBIb29kIG15IHVubWFubidkIGJsb29kLCBiYXRpbmcgaW4gbXkgY2hlZWtzLAogICAgV2l0aCB0aHkgYmxhY2sgbWFudGxlOyB0aWxsIHN0cmFuZ2UgbG92ZSwgZ3Jvd24gYm9sZCwKICAgIFRoaW5rIHRydWUgbG92ZSBhY3RlZCBzaW1wbGUgbW9kZXN0eS4KICAgIENvbWUsIG5pZ2h0OyBjb21lLCBSb21lbzsgY29tZSwgdGhvdSBkYXkgaW4gbmlnaHQ7CiAgICBGb3IgdGhvdSB3aWx0IGxpZSB1cG9uIHRoZSB3aW5ncyBvZiBuaWdodAogICAgV2hpdGVyIHRoYW4gbmV3IHNub3cgb24gYSByYXZlbidzIGJhY2suCiAgICBDb21lLCBnZW50bGUgbmlnaHQsIGNvbWUsIGxvdmluZywgYmxhY2stYnJvdydkIG5pZ2h0LAogICAgR2l2ZSBtZSBteSBSb21lbzsgYW5kLCB3aGVuIGhlIHNoYWxsIGRpZSwKICAgIFRha2UgaGltIGFuZCBjdXQgaGltIG91dCBpbiBsaXR0bGUgc3RhcnMsCiAgICBBbmQgaGUgd2lsbCBtYWtlIHRoZSBmYWNlIG9mIGhlYXZlbiBzbyBmaW5lCiAgICBUaGF0IGFsbCB0aGUgd29ybGQgd2lsbCBiZSBpbiBsb3ZlIHdpdGggbmlnaHQKICAgIEFuZCBwYXkgbm8gd29yc2hpcCB0byB0aGUgZ2FyaXNoIHN1bi4KICAgIE8sIEkgaGF2ZSBib3VnaHQgdGhlIG1hbnNpb24gb2YgYSBsb3ZlLAogICAgQnV0IG5vdCBwb3NzZXNzJ2QgaXQsIGFuZCwgdGhvdWdoIEkgYW0gc29sZCwKICAgIE5vdCB5ZXQgZW5qb3knZDogc28gdGVkaW91cyBpcyB0aGlzIGRheQogICAgQXMgaXMgdGhlIG5pZ2h0IGJlZm9yZSBzb21lIGZlc3RpdmFsCiAgICBUbyBhbiBpbXBhdGllbnQgY2hpbGQgdGhhdCBoYXRoIG5ldyByb2JlcwogICAgQW5kIG1heSBub3Qgd2VhciB0aGVtLiBPLCBoZXJlIGNvbWVzIG15IG51cnNlLAogICAgQW5kIHNoZSBicmluZ3MgbmV3czsgYW5kIGV2ZXJ5IHRvbmd1ZSB0aGF0IHNwZWFrcwogICAgQnV0IFJvbWVvJ3MgbmFtZSBzcGVha3MgaGVhdmVubHkgZWxvcXVlbmNlLgoKICAgIEVudGVyIE51cnNlLCB3aXRoIGNvcmRzCiAgICBOb3csIG51cnNlLCB3aGF0IG5ld3MIFdoYXQgaGFzdCB0aG91IHRoZXJlPyB0aGUgY29yZHMKICAgIFRoYXQgUm9tZW8gYmlkIHRoZWUgZmV0Y2gCgpOdXJzZQoKICAgIEF5LCBheSwgdGhlIGNvcmRzLgoKICAgIFRocm93cyB0aGVtIGRvd24KCkpVTElFVAoKICAgIEF5IG1lISB3aGF0IG5ld3MIHdoeSBkb3N0IHRob3Ugd3JpbmcgdGh5IGhhbmRzPwoKTnVyc2UKCiAgICBBaCwgd2VsbC1hLWRheSEgaGUncyBkZWFkLCBoZSdzIGRlYWQsIGhlJ3MgZGVhZCEKICAgIFdlIGFyZSB1bmRvbmUsIGxhZHksIHdlIGFyZSB1bmRvbmUhCiAgICBBbGFjayB0aGUgZGF5ISBoZSdzIGdvbmUsIGhlJ3Mga2lsbCdkLCBoZSdzIGRlYWQhCgpKVUxJRVQKCiAgICBDYW4gaGVhdmVuIGJlIHNvIGVudmlvdXMCgpOdXJzZQoKICAgIFJvbWVvIGNhbiwKICAgIFRob3VnaCBoZWF2ZW4gY2Fubm90OiBPIFJvbWVvLCBSb21lbyEKICAgIFdobyBldmVyIHdvdWxkIGhhdmUgdGhvdWdodCBpdD8gUm9tZW8hCgpKVUxJRVQKCiAgICBXaGF0IGRldmlsIGFydCB0aG91LCB0aGF0IGRvc3QgdG9ybWVudCBtZSB0aHVzPwogICAgVGhpcyB0b3J0dXJlIHNob3VsZCBiZSByb2FyJ2QgaW4gZGlzbWFsIGhlbGwuCiAgICBIYXRoIFJvbWVvIHNsYWluIGhpbXNlbGYIHNheSB0aG91IGJ1dCAnSSwnCiAgICBBbmQgdGhhdCBiYXJlIHZvd2VsICdJJyBzaGFsbCBwb2lzb24gbW9yZQogICAgVGhhbiB0aGUgZGVhdGgtZGFydGluZyBleWUgb2YgY29ja2F0cmljZToKICAgIEkgYW0gbm90IEksIGlmIHRoZXJlIGJlIHN1Y2ggYW4gSTsKICAgIE9yIHRob3NlIGV5ZXMgc2h1dCwgdGhhdCBtYWtlIHRoZWUgYW5zd2VyICdJLicKICAgIElmIGhlIGJlIHNsYWluLCBzYXkgJ0knOyBvciBpZiBub3QsIG5vOgogICAgQnJpZWYgc291bmRzIGRldGVybWluZSBvZiBteSB3ZWFsIG9yIHdvZS4KCk51cnNlCgogICAgSSBzYXcgdGhlIHdvdW5kLCBJIHNhdyBpdCB3aXRoIG1pbmUgZXllcywtLQogICAgR29kIHNhdmUgdGhlIG1hcmshLS1oZXJlIG9uIGhpcyBtYW5seSBicmVhc3Q6CiAgICBBIHBpdGVvdXMgY29yc2UsIGEgYmxvb2R5IHBpdGVvdXMgY29yc2U7CiAgICBQYWxlLCBwYWxlIGFzIGFzaGVzLCBhbGwgYmVkYXViJ2QgaW4gYmxvb2QsCiAgICBBbGwgaW4gZ29yZS1ibG9vZDsgSSBzd291bmRlZCBhdCB0aGUgc2lnaHQuCgpKVUxJRVQKCiAgICBPLCBicmVhaywgbXkgaGVhcnQhIHBvb3IgYmFua3J1cHQsIGJyZWFrIGF0IG9uY2UhCiAgICBUbyBwcmlzb24sIGV5ZXMsIG5lJ2VyIGxvb2sgb24gbGliZXJ0eSEKICAgIFZpbGUgZWFydGgsIHRvIGVhcnRoIHJlc2lnbjsgZW5kIG1vdGlvbiBoZXJlOwogICAgQW5kIHRob3UgYW5kIFJvbWVvIHByZXNzIG9uZSBoZWF2eSBiaWVyIQoKTnVyc2UKCiAgICBPIFR5YmFsdCwgVHliYWx0LCB0aGUgYmVzdCBmcmllbmQgSSBoYWQhCiAgICBPIGNvdXJ0ZW91cyBUeWJhbHQhIGhvbmVzdCBnZW50bGVtYW4hCiAgICBUaGF0IGV2ZXIgSSBzaG91bGQgbGl2ZSB0byBzZWUgdGhlZSBkZWFkIQoKSlVMSUVUCgogICAgV2hhdCBzdG9ybSBpcyB0aGlzIHRoYXQgYmxvd3Mgc28gY29udHJhcnkCiAgICBJcyBSb21lbyBzbGF1Z2h0ZXInZCwgYW5kIGlzIFR5YmFsdCBkZWFkPwogICAgTXkgZGVhci1sb3ZlZCBjb3VzaW4sIGFuZCBteSBkZWFyZXIgbG9yZD8KICAgIFRoZW4sIGRyZWFkZnVsIHRydW1wZXQsIHNvdW5kIHRoZSBnZW5lcmFsIGRvb20hCiAgICBGb3Igd2hvIGlzIGxpdmluZywgaWYgdGhvc2UgdHdvIGFyZSBnb25lPwoKTnVyc2UKCiAgICBUeWJhbHQgaXMgZ29uZSwgYW5kIFJvbWVvIGJhbmlzaGVkOwogICAgUm9tZW8gdGhhdCBraWxsJ2QgaGltLCBoZSBpcyBiYW5pc2hlZC4KCkpVTElFVAoKICAgIE8gR29kISBkaWQgUm9tZW8ncyBoYW5kIHNoZWQgVHliYWx0J3MgYmxvb2QCgpOdXJzZQoKICAgIEl0IGRpZCwgaXQgZGlkOyBhbGFzIHRoZSBkYXksIGl0IGRpZCEKCkpVTElFVAoKICAgIE8gc2VycGVudCBoZWFydCwgaGlkIHdpdGggYSBmbG93ZXJpbmcgZmFjZSEKICAgIERpZCBldmVyIGRyYWdvbiBrZWVwIHNvIGZhaXIgYSBjYXZlPwogICAgQmVhdXRpZnVsIHR5cmFudCEgZmllbmQgYW5nZWxpY2FsIQogICAgRG92ZS1mZWF0aGVyJ2QgcmF2ZW4hIHdvbHZpc2gtcmF2ZW5pbmcgbGFtYiEKICAgIERlc3Bpc2VkIHN1YnN0YW5jZSBvZiBkaXZpbmVzdCBzaG93IQogICAgSnVzdCBvcHBvc2l0ZSB0byB3aGF0IHRob3UganVzdGx5IHNlZW0nc3QsCiAgICBBIGRhbW5lZCBzYWludCwgYW4gaG9ub3VyYWJsZSB2aWxsYWluIQogICAgTyBuYXR1cmUsIHdoYXQgaGFkc3QgdGhvdSB0byBkbyBpbiBoZWxsLAogICAgV2hlbiB0aG91IGRpZHN0IGJvd2VyIHRoZSBzcGlyaXQgb2YgYSBmaWVuZAogICAgSW4gbW9yYWwgcGFyYWRpc2Ugb2Ygc3VjaCBzd2VldCBmbGVzaD8KICAgIFdhcyBldmVyIGJvb2sgY29udGFpbmluZyBzdWNoIHZpbGUgbWF0dGVyCiAgICBTbyBmYWlybHkgYm91bmQIE8gdGhhdCBkZWNlaXQgc2hvdWxkIGR3ZWxsCiAgICBJbiBzdWNoIGEgZ29yZ2VvdXMgcGFsYWNlIQoKTnVyc2UKCiAgICBUaGVyZSdzIG5vIHRydXN0LAogICAgTm8gZmFpdGgsIG5vIGhvbmVzdHkgaW4gbWVuOyBhbGwgcGVyanVyZWQsCiAgICBBbGwgZm9yc3dvcm4sIGFsbCBuYXVnaHQsIGFsbCBkaXNzZW1ibGVycy4KICAgIEFoLCB3aGVyZSdzIG15IG1hbj8gZ2l2ZSBtZSBzb21lIGFxdWEgdml0YWU6CiAgICBUaGVzZSBncmllZnMsIHRoZXNlIHdvZXMsIHRoZXNlIHNvcnJvd3MgbWFrZSBtZSBvbGQuCiAgICBTaGFtZSBjb21lIHRvIFJvbWVvIQoKSlVMSUVUCgogICAgQmxpc3RlcidkIGJlIHRoeSB0b25ndWUKICAgIEZvciBzdWNoIGEgd2lzaCEgaGUgd2FzIG5vdCBib3JuIHRvIHNoYW1lOgogICAgVXBvbiBoaXMgYnJvdyBzaGFtZSBpcyBhc2hhbWVkIHRvIHNpdDsKICAgIEZvciAndGlzIGEgdGhyb25lIHdoZXJlIGhvbm91ciBtYXkgYmUgY3Jvd24nZAogICAgU29sZSBtb25hcmNoIG9mIHRoZSB1bml2ZXJzYWwgZWFydGguCiAgICBPLCB3aGF0IGEgYmVhc3Qgd2FzIEkgdG8gY2hpZGUgYXQgaGltIQoKTnVyc2UKCiAgICBXaWxsIHlvdSBzcGVhayB3ZWxsIG9mIGhpbSB0aGF0IGtpbGwnZCB5b3VyIGNvdXNpbj8KCkpVTElFVAoKICAgIFNoYWxsIEkgc3BlYWsgaWxsIG9mIGhpbSB0aGF0IGlzIG15IGh1c2JhbmQCiAgICBBaCwgcG9vciBteSBsb3JkLCB3aGF0IHRvbmd1ZSBzaGFsbCBzbW9vdGggdGh5IG5hbWUsCiAgICBXaGVuIEksIHRoeSB0aHJlZS1ob3VycyB3aWZlLCBoYXZlIG1hbmdsZWQgaXQCiAgICBCdXQsIHdoZXJlZm9yZSwgdmlsbGFpbiwgZGlkc3QgdGhvdSBraWxsIG15IGNvdXNpbj8KICAgIFRoYXQgdmlsbGFpbiBjb3VzaW4gd291bGQgaGF2ZSBraWxsJ2QgbXkgaHVzYmFuZDoKICAgIEJhY2ssIGZvb2xpc2ggdGVhcnMsIGJhY2sgdG8geW91ciBuYXRpdmUgc3ByaW5nOwogICAgWW91ciB0cmlidXRhcnkgZHJvcHMgYmVsb25nIHRvIHdvZSwKICAgIFdoaWNoIHlvdSwgbWlzdGFraW5nLCBvZmZlciB1cCB0byBqb3kuCiAgICBNeSBodXNiYW5kIGxpdmVzLCB0aGF0IFR5YmFsdCB3b3VsZCBoYXZlIHNsYWluOwogICAgQW5kIFR5YmFsdCdzIGRlYWQsIHRoYXQgd291bGQgaGF2ZSBzbGFpbiBteSBodXNiYW5kOgogICAgQWxsIHRoaXMgaXMgY29tZm9ydDsgd2hlcmVmb3JlIHdlZXAgSSB0aGVuPwogICAgU29tZSB3b3JkIHRoZXJlIHdhcywgd29yc2VyIHRoYW4gVHliYWx0J3MgZGVhdGgsCiAgICBUaGF0IG11cmRlcidkIG1lOiBJIHdvdWxkIGZvcmdldCBpdCBmYWluOwogICAgQnV0LCBPLCBpdCBwcmVzc2VzIHRvIG15IG1lbW9yeSwKICAgIExpa2UgZGFtbmVkIGd1aWx0eSBkZWVkcyB0byBzaW5uZXJzJyBtaW5kczoKICAgICdUeWJhbHQgaXMgZGVhZCwgYW5kIFJvbWVvLS1iYW5pc2hlZDsnCiAgICBUaGF0ICdiYW5pc2hlZCwnIHRoYXQgb25lIHdvcmQgJ2JhbmlzaGVkLCcKICAgIEhhdGggc2xhaW4gdGVuIHRob3VzYW5kIFR5YmFsdHMuIFR5YmFsdCdzIGRlYXRoCiAgICBXYXMgd29lIGVub3VnaCwgaWYgaXQgaGFkIGVuZGVkIHRoZXJlOgogICAgT3IsIGlmIHNvdXIgd29lIGRlbGlnaHRzIGluIGZlbGxvd3NoaXAKICAgIEFuZCBuZWVkbHkgd2lsbCBiZSByYW5rJ2Qgd2l0aCBvdGhlciBncmllZnMsCiAgICBXaHkgZm9sbG93J2Qgbm90LCB3aGVuIHNoZSBzYWlkICdUeWJhbHQncyBkZWFkLCcKICAgIFRoeSBmYXRoZXIsIG9yIHRoeSBtb3RoZXIsIG5heSwgb3IgYm90aCwKICAgIFdoaWNoIG1vZGVybiBsYW1lbnRhdGlvbnMgbWlnaHQgaGF2ZSBtb3ZlZD8KICAgIEJ1dCB3aXRoIGEgcmVhci13YXJkIGZvbGxvd2luZyBUeWJhbHQncyBkZWF0aCwKICAgICdSb21lbyBpcyBiYW5pc2hlZCwnIHRvIHNwZWFrIHRoYXQgd29yZCwKICAgIElzIGZhdGhlciwgbW90aGVyLCBUeWJhbHQsIFJvbWVvLCBKdWxpZXQsCiAgICBBbGwgc2xhaW4sIGFsbCBkZWFkLiAnUm9tZW8gaXMgYmFuaXNoZWQhJwogICAgVGhlcmUgaXMgbm8gZW5kLCBubyBsaW1pdCwgbWVhc3VyZSwgYm91bmQsCiAgICBJbiB0aGF0IHdvcmQncyBkZWF0aDsgbm8gd29yZHMgY2FuIHRoYXQgd29lIHNvdW5kLgogICAgV2hlcmUgaXMgbXkgZmF0aGVyLCBhbmQgbXkgbW90aGVyLCBudXJzZT8KCk51cnNlCgogICAgV2VlcGluZyBhbmQgd2FpbGluZyBvdmVyIFR5YmFsdCdzIGNvcnNlOgogICAgV2lsbCB5b3UgZ28gdG8gdGhlbT8gSSB3aWxsIGJyaW5nIHlvdSB0aGl0aGVyLgoKSlVMSUVUCgogICAgV2FzaCB0aGV5IGhpcyB3b3VuZHMgd2l0aCB0ZWFyczogbWluZSBzaGFsbCBiZSBzcGVudCwKICAgIFdoZW4gdGhlaXJzIGFyZSBkcnksIGZvciBSb21lbydzIGJhbmlzaG1lbnQuCiAgICBUYWtlIHVwIHRob3NlIGNvcmRzOiBwb29yIHJvcGVzLCB5b3UgYXJlIGJlZ3VpbGVkLAogICAgQm90aCB5b3UgYW5kIEk7IGZvciBSb21lbyBpcyBleGlsZWQ6CiAgICBIZSBtYWRlIHlvdSBmb3IgYSBoaWdod2F5IHRvIG15IGJlZDsKICAgIEJ1dCBJLCBhIG1haWQsIGRpZSBtYWlkZW4td2lkb3dlZC4KICAgIENvbWUsIGNvcmRzLCBjb21lLCBudXJzZTsgSSdsbCB0byBteSB3ZWRkaW5nLWJlZDsKICAgIEFuZCBkZWF0aCwgbm90IFJvbWVvLCB0YWtlIG15IG1haWRlbmhlYWQhCgpOdXJzZQoKICAgIEhpZSB0byB5b3VyIGNoYW1iZXI6IEknbGwgZmluZCBSb21lbwogICAgVG8gY29tZm9ydCB5b3U6IEkgd290IHdlbGwgd2hlcmUgaGUgaXMuCiAgICBIYXJrIHllLCB5b3VyIFJvbWVvIHdpbGwgYmUgaGVyZSBhdCBuaWdodDoKICAgIEknbGwgdG8gaGltOyBoZSBpcyBoaWQgYXQgTGF1cmVuY2UnIGNlbGwuCgpKVUxJRVQKCiAgICBPLCBmaW5kIGhpbSEgZ2l2ZSB0aGlzIHJpbmcgdG8gbXkgdHJ1ZSBrbmlnaHQsCiAgICBBbmQgYmlkIGhpbSBjb21lIHRvIHRha2UgaGlzIGxhc3QgZmFyZXdlbGwuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSAKCkZSSUFSIExBVVJFTkNFCgogICAgUm9tZW8sIGNvbWUgZm9ydGg7IGNvbWUgZm9ydGgsIHRob3UgZmVhcmZ1bCBtYW46CiAgICBBZmZsaWN0aW9uIGlzIGVuYW1vdXInZCBvZiB0aHkgcGFydHMsCiAgICBBbmQgdGhvdSBhcnQgd2VkZGVkIHRvIGNhbGFtaXR5LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEZhdGhlciwgd2hhdCBuZXdzPyB3aGF0IGlzIHRoZSBwcmluY2UncyBkb29tPwogICAgV2hhdCBzb3Jyb3cgY3JhdmVzIGFjcXVhaW50YW5jZSBhdCBteSBoYW5kLAogICAgVGhhdCBJIHlldCBrbm93IG5vdD8KCkZSSUFSIExBVVJFTkNFCgogICAgVG9vIGZhbWlsaWFyCiAgICBJcyBteSBkZWFyIHNvbiB3aXRoIHN1Y2ggc291ciBjb21wYW55OgogICAgSSBicmluZyB0aGVlIHRpZGluZ3Mgb2YgdGhlIHByaW5jZSdzIGRvb20uCgpST01FTwoKICAgIFdoYXQgbGVzcyB0aGFuIGRvb21zLWRheSBpcyB0aGUgcHJpbmNlJ3MgZG9vbT8KCkZSSUFSIExBVVJFTkNFCgogICAgQSBnZW50bGVyIGp1ZGdtZW50IHZhbmlzaCdkIGZyb20gaGlzIGxpcHMsCiAgICBOb3QgYm9keSdzIGRlYXRoLCBidXQgYm9keSdzIGJhbmlzaG1lbnQuCgpST01FTwoKICAgIEhhLCBiYW5pc2htZW50ISBiZSBtZXJjaWZ1bCwgc2F5ICdkZWF0aDsnCiAgICBGb3IgZXhpbGUgaGF0aCBtb3JlIHRlcnJvciBpbiBoaXMgbG9vaywKICAgIE11Y2ggbW9yZSB0aGFuIGRlYXRoOiBkbyBub3Qgc2F5ICdiYW5pc2htZW50LicKCkZSSUFSIExBVVJFTkNFCgogICAgSGVuY2UgZnJvbSBWZXJvbmEgYXJ0IHRob3UgYmFuaXNoZWQ6CiAgICBCZSBwYXRpZW50LCBmb3IgdGhlIHdvcmxkIGlzIGJyb2FkIGFuZCB3aWRlLgoKUk9NRU8KCiAgICBUaGVyZSBpcyBubyB3b3JsZCB3aXRob3V0IFZlcm9uYSB3YWxscywKICAgIEJ1dCBwdXJnYXRvcnksIHRvcnR1cmUsIGhlbGwgaXRzZWxmLgogICAgSGVuY2UtYmFuaXNoZWQgaXMgYmFuaXNoJ2QgZnJvbSB0aGUgd29ybGQsCiAgICBBbmQgd29ybGQncyBleGlsZSBpcyBkZWF0aDogdGhlbiBiYW5pc2hlZCwKICAgIElzIGRlYXRoIG1pcy10ZXJtJ2Q6IGNhbGxpbmcgZGVhdGggYmFuaXNobWVudCwKICAgIFRob3UgY3V0dCdzdCBteSBoZWFkIG9mZiB3aXRoIGEgZ29sZGVuIGF4ZSwKICAgIEFuZCBzbWlsZXN0IHVwb24gdGhlIHN0cm9rZSB0aGF0IG11cmRlcnMgbWUuCgpGUklBUiBMQVVSRU5DRQoKICAgIE8gZGVhZGx5IHNpbiEgTyBydWRlIHVudGhhbmtmdWxuZXNzIQogICAgVGh5IGZhdWx0IG91ciBsYXcgY2FsbHMgZGVhdGg7IGJ1dCB0aGUga2luZCBwcmluY2UsCiAgICBUYWtpbmcgdGh5IHBhcnQsIGhhdGggcnVzaCdkIGFzaWRlIHRoZSBsYXcsCiAgICBBbmQgdHVybidkIHRoYXQgYmxhY2sgd29yZCBkZWF0aCB0byBiYW5pc2htZW50OgogICAgVGhpcyBpcyBkZWFyIG1lcmN5LCBhbmQgdGhvdSBzZWVzdCBpdCBub3QuCgpST01FTwoKICAgICdUaXMgdG9ydHVyZSwgYW5kIG5vdCBtZXJjeTogaGVhdmVuIGlzIGhlcmUsCiAgICBXaGVyZSBKdWxpZXQgbGl2ZXM7IGFuZCBldmVyeSBjYXQgYW5kIGRvZwogICAgQW5kIGxpdHRsZSBtb3VzZSwgZXZlcnkgdW53b3J0aHkgdGhpbmcsCiAgICBMaXZlIGhlcmUgaW4gaGVhdmVuIGFuZCBtYXkgbG9vayBvbiBoZXI7CiAgICBCdXQgUm9tZW8gbWF5IG5vdDogbW9yZSB2YWxpZGl0eSwKICAgIE1vcmUgaG9ub3VyYWJsZSBzdGF0ZSwgbW9yZSBjb3VydHNoaXAgbGl2ZXMKICAgIEluIGNhcnJpb24tZmxpZXMgdGhhbiBSb21lbzogdGhleSBteSBzZWl6ZQogICAgT24gdGhlIHdoaXRlIHdvbmRlciBvZiBkZWFyIEp1bGlldCdzIGhhbmQKICAgIEFuZCBzdGVhbCBpbW1vcnRhbCBibGVzc2luZyBmcm9tIGhlciBsaXBzLAogICAgV2hvIGV2ZW4gaW4gcHVyZSBhbmQgdmVzdGFsIG1vZGVzdHksCiAgICBTdGlsbCBibHVzaCwgYXMgdGhpbmtpbmcgdGhlaXIgb3duIGtpc3NlcyBzaW47CiAgICBCdXQgUm9tZW8gbWF5IG5vdDsgaGUgaXMgYmFuaXNoZWQ6CiAgICBGbGllcyBtYXkgZG8gdGhpcywgYnV0IEkgZnJvbSB0aGlzIG11c3QgZmx5OgogICAgVGhleSBhcmUgZnJlZSBtZW4sIGJ1dCBJIGFtIGJhbmlzaGVkLgogICAgQW5kIHNheSdzdCB0aG91IHlldCB0aGF0IGV4aWxlIGlzIG5vdCBkZWF0aD8KICAgIEhhZHN0IHRob3Ugbm8gcG9pc29uIG1peCdkLCBubyBzaGFycC1ncm91bmQga25pZmUsCiAgICBObyBzdWRkZW4gbWVhbiBvZiBkZWF0aCwgdGhvdWdoIG5lJ2VyIHNvIG1lYW4sCiAgICBCdXQgJ2JhbmlzaGVkJyB0byBraWxsIG1lPy0tJ2JhbmlzaGVkJz8KICAgIE8gZnJpYXIsIHRoZSBkYW1uZWQgdXNlIHRoYXQgd29yZCBpbiBoZWxsOwogICAgSG93bGluZ3MgYXR0ZW5kIGl0OiBob3cgaGFzdCB0aG91IHRoZSBoZWFydCwKICAgIEJlaW5nIGEgZGl2aW5lLCBhIGdob3N0bHkgY29uZmVzc29yLAogICAgQSBzaW4tYWJzb2x2ZXIsIGFuZCBteSBmcmllbmQgcHJvZmVzcydkLAogICAgVG8gbWFuZ2xlIG1lIHdpdGggdGhhdCB3b3JkICdiYW5pc2hlZCcCgpGUklBUiBMQVVSRU5DRQoKICAgIFRob3UgZm9uZCBtYWQgbWFuLCBoZWFyIG1lIGJ1dCBzcGVhayBhIHdvcmQuCgpST01FTwoKICAgIE8sIHRob3Ugd2lsdCBzcGVhayBhZ2FpbiBvZiBiYW5pc2htZW50LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJJ2xsIGdpdmUgdGhlZSBhcm1vdXIgdG8ga2VlcCBvZmYgdGhhdCB3b3JkOgogICAgQWR2ZXJzaXR5J3Mgc3dlZXQgbWlsaywgcGhpbG9zb3BoeSwKICAgIFRvIGNvbWZvcnQgdGhlZSwgdGhvdWdoIHRob3UgYXJ0IGJhbmlzaGVkLgoKUk9NRU8KCiAgICBZZXQgJ2JhbmlzaGVkJz8gSGFuZyB1cCBwaGlsb3NvcGh5IQogICAgVW5sZXNzIHBoaWxvc29waHkgY2FuIG1ha2UgYSBKdWxpZXQsCiAgICBEaXNwbGFudCBhIHRvd24sIHJldmVyc2UgYSBwcmluY2UncyBkb29tLAogICAgSXQgaGVscHMgbm90LCBpdCBwcmV2YWlscyBub3Q6IHRhbGsgbm8gbW9yZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTywgdGhlbiBJIHNlZSB0aGF0IG1hZG1lbiBoYXZlIG5vIGVhcnMuCgpST01FTwoKICAgIEhvdyBzaG91bGQgdGhleSwgd2hlbiB0aGF0IHdpc2UgbWVuIGhhdmUgbm8gZXllcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTGV0IG1lIGRpc3B1dGUgd2l0aCB0aGVlIG9mIHRoeSBlc3RhdGUuCgpST01FTwoKICAgIFRob3UgY2Fuc3Qgbm90IHNwZWFrIG9mIHRoYXQgdGhvdSBkb3N0IG5vdCBmZWVsOgogICAgV2VydCB0aG91IGFzIHlvdW5nIGFzIEksIEp1bGlldCB0aHkgbG92ZSwKICAgIEFuIGhvdXIgYnV0IG1hcnJpZWQsIFR5YmFsdCBtdXJkZXJlZCwKICAgIERvdGluZyBsaWtlIG1lIGFuZCBsaWtlIG1lIGJhbmlzaGVkLAogICAgVGhlbiBtaWdodHN0IHRob3Ugc3BlYWssIHRoZW4gbWlnaHRzdCB0aG91IHRlYXIgdGh5IGhhaXIsCiAgICBBbmQgZmFsbCB1cG9uIHRoZSBncm91bmQsIGFzIEkgZG8gbm93LAogICAgVGFraW5nIHRoZSBtZWFzdXJlIG9mIGFuIHVubWFkZSBncmF2ZS4KCiAgICBLbm9ja2luZyB3aXRoaW4KCkZSSUFSIExBVVJFTkNFCgogICAgQXJpc2U7IG9uZSBrbm9ja3M7IGdvb2QgUm9tZW8sIGhpZGUgdGh5c2VsZi4KClJPTUVPCgogICAgTm90IEk7IHVubGVzcyB0aGUgYnJlYXRoIG9mIGhlYXJ0c2ljayBncm9hbnMsCiAgICBNaXN0LWxpa2UsIGluZm9sZCBtZSBmcm9tIHRoZSBzZWFyY2ggb2YgZXllcy4KCiAgICBLbm9ja2luZwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIYXJrLCBob3cgdGhleSBrbm9jayEgV2hvJ3MgdGhlcmUIFJvbWVvLCBhcmlzZTsKICAgIFRob3Ugd2lsdCBiZSB0YWtlbi4gU3RheSBhd2hpbGUhIFN0YW5kIHVwOwoKICAgIEtub2NraW5nCiAgICBSdW4gdG8gbXkgc3R1ZHkuIEJ5IGFuZCBieSEgR29kJ3Mgd2lsbCwKICAgIFdoYXQgc2ltcGxlbmVzcyBpcyB0aGlzISBJIGNvbWUsIEkgY29tZSEKCiAgICBLbm9ja2luZwogICAgV2hvIGtub2NrcyBzbyBoYXJkPyB3aGVuY2UgY29tZSB5b3UIHdoYXQncyB5b3VyIHdpbGwCgpOdXJzZQoKICAgIFtXaXRoaW5dIExldCBtZSBjb21lIGluLCBhbmQgeW91IHNoYWxsIGtub3cKICAgIG15IGVycmFuZDsKICAgIEkgY29tZSBmcm9tIExhZHkgSnVsaWV0LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXZWxjb21lLCB0aGVuLgoKICAgIEVudGVyIE51cnNlCgpOdXJzZQoKICAgIE8gaG9seSBmcmlhciwgTywgdGVsbCBtZSwgaG9seSBmcmlhciwKICAgIFdoZXJlIGlzIG15IGxhZHkncyBsb3JkLCB3aGVyZSdzIFJvbWVvPwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGVyZSBvbiB0aGUgZ3JvdW5kLCB3aXRoIGhpcyBvd24gdGVhcnMgbWFkZSBkcnVuay4KCk51cnNlCgogICAgTywgaGUgaXMgZXZlbiBpbiBteSBtaXN0cmVzcycgY2FzZSwKICAgIEp1c3QgaW4gaGVyIGNhc2UhIE8gd29mdWwgc3ltcGF0aHkhCiAgICBQaXRlb3VzIHByZWRpY2FtZW50ISBFdmVuIHNvIGxpZXMgc2hlLAogICAgQmx1YmJlcmluZyBhbmQgd2VlcGluZywgd2VlcGluZyBhbmQgYmx1YmJlcmluZy4KICAgIFN0YW5kIHVwLCBzdGFuZCB1cDsgc3RhbmQsIGFuZCB5b3UgYmUgYSBtYW46CiAgICBGb3IgSnVsaWV0J3Mgc2FrZSwgZm9yIGhlciBzYWtlLCByaXNlIGFuZCBzdGFuZDsKICAgIFdoeSBzaG91bGQgeW91IGZhbGwgaW50byBzbyBkZWVwIGFuIE8CgpST01FTwoKICAgIE51cnNlIQoKTnVyc2UKCiAgICBBaCBzaXIhIGFoIHNpciEgV2VsbCwgZGVhdGgncyB0aGUgZW5kIG9mIGFsbC4KClJPTUVPCgogICAgU3Bha2VzdCB0aG91IG9mIEp1bGlldD8gaG93IGlzIGl0IHdpdGggaGVyPwogICAgRG90aCBzaGUgbm90IHRoaW5rIG1lIGFuIG9sZCBtdXJkZXJlciwKICAgIE5vdyBJIGhhdmUgc3RhaW4nZCB0aGUgY2hpbGRob29kIG9mIG91ciBqb3kKICAgIFdpdGggYmxvb2QgcmVtb3ZlZCBidXQgbGl0dGxlIGZyb20gaGVyIG93bj8KICAgIFdoZXJlIGlzIHNoZT8gYW5kIGhvdyBkb3RoIHNoZT8gYW5kIHdoYXQgc2F5cwogICAgTXkgY29uY2VhbCdkIGxhZHkgdG8gb3VyIGNhbmNlbGwnZCBsb3ZlPwoKTnVyc2UKCiAgICBPLCBzaGUgc2F5cyBub3RoaW5nLCBzaXIsIGJ1dCB3ZWVwcyBhbmQgd2VlcHM7CiAgICBBbmQgbm93IGZhbGxzIG9uIGhlciBiZWQ7IGFuZCB0aGVuIHN0YXJ0cyB1cCwKICAgIEFuZCBUeWJhbHQgY2FsbHM7IGFuZCB0aGVuIG9uIFJvbWVvIGNyaWVzLAogICAgQW5kIHRoZW4gZG93biBmYWxscyBhZ2Fpbi4KClJPTUVPCgogICAgQXMgaWYgdGhhdCBuYW1lLAogICAgU2hvdCBmcm9tIHRoZSBkZWFkbHkgbGV2ZWwgb2YgYSBndW4sCiAgICBEaWQgbXVyZGVyIGhlcjsgYXMgdGhhdCBuYW1lJ3MgY3Vyc2VkIGhhbmQKICAgIE11cmRlcidkIGhlciBraW5zbWFuLiBPLCB0ZWxsIG1lLCBmcmlhciwgdGVsbCBtZSwKICAgIEluIHdoYXQgdmlsZSBwYXJ0IG9mIHRoaXMgYW5hdG9teQogICAgRG90aCBteSBuYW1lIGxvZGdlPyB0ZWxsIG1lLCB0aGF0IEkgbWF5IHNhY2sKICAgIFRoZSBoYXRlZnVsIG1hbnNpb24uCgogICAgRHJhd2luZyBoaXMgc3dvcmQKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZCB0aHkgZGVzcGVyYXRlIGhhbmQ6CiAgICBBcnQgdGhvdSBhIG1hbj8gdGh5IGZvcm0gY3JpZXMgb3V0IHRob3UgYXJ0OgogICAgVGh5IHRlYXJzIGFyZSB3b21hbmlzaDsgdGh5IHdpbGQgYWN0cyBkZW5vdGUKICAgIFRoZSB1bnJlYXNvbmFibGUgZnVyeSBvZiBhIGJlYXN0OgogICAgVW5zZWVtbHkgd29tYW4gaW4gYSBzZWVtaW5nIG1hbiEKICAgIE9yIGlsbC1iZXNlZW1pbmcgYmVhc3QgaW4gc2VlbWluZyBib3RoIQogICAgVGhvdSBoYXN0IGFtYXplZCBtZTogYnkgbXkgaG9seSBvcmRlciwKICAgIEkgdGhvdWdodCB0aHkgZGlzcG9zaXRpb24gYmV0dGVyIHRlbXBlcidkLgogICAgSGFzdCB0aG91IHNsYWluIFR5YmFsdD8gd2lsdCB0aG91IHNsYXkgdGh5c2VsZj8KICAgIEFuZCBzdGF5IHRoeSBsYWR5IHRvbyB0aGF0IGxpdmVzIGluIHRoZWUsCiAgICBCeSBkb2luZyBkYW1uZWQgaGF0ZSB1cG9uIHRoeXNlbGYCiAgICBXaHkgcmFpbCdzdCB0aG91IG9uIHRoeSBiaXJ0aCwgdGhlIGhlYXZlbiwgYW5kIGVhcnRoPwogICAgU2luY2UgYmlydGgsIGFuZCBoZWF2ZW4sIGFuZCBlYXJ0aCwgYWxsIHRocmVlIGRvIG1lZXQKICAgIEluIHRoZWUgYXQgb25jZTsgd2hpY2ggdGhvdSBhdCBvbmNlIHdvdWxkc3QgbG9zZS4KICAgIEZpZSwgZmllLCB0aG91IHNoYW1lc3QgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDsKICAgIFdoaWNoLCBsaWtlIGEgdXN1cmVyLCBhYm91bmQnc3QgaW4gYWxsLAogICAgQW5kIHVzZXN0IG5vbmUgaW4gdGhhdCB0cnVlIHVzZSBpbmRlZWQKICAgIFdoaWNoIHNob3VsZCBiZWRlY2sgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDoKICAgIFRoeSBub2JsZSBzaGFwZSBpcyBidXQgYSBmb3JtIG9mIHdheCwKICAgIERpZ3Jlc3NpbmcgZnJvbSB0aGUgdmFsb3VyIG9mIGEgbWFuOwogICAgVGh5IGRlYXIgbG92ZSBzd29ybiBidXQgaG9sbG93IHBlcmp1cnksCiAgICBLaWxsaW5nIHRoYXQgbG92ZSB3aGljaCB0aG91IGhhc3Qgdm93J2QgdG8gY2hlcmlzaDsKICAgIFRoeSB3aXQsIHRoYXQgb3JuYW1lbnQgdG8gc2hhcGUgYW5kIGxvdmUsCiAgICBNaXNzaGFwZW4gaW4gdGhlIGNvbmR1Y3Qgb2YgdGhlbSBib3RoLAogICAgTGlrZSBwb3dkZXIgaW4gYSBza2l0bGVzcyBzb2xkaWVyJ3MgZmxhc2ssCiAgICBJcyBzZXQgYWZpcmUgYnkgdGhpbmUgb3duIGlnbm9yYW5jZSwKICAgIEFuZCB0aG91IGRpc21lbWJlcidkIHdpdGggdGhpbmUgb3duIGRlZmVuY2UuCiAgICBXaGF0LCByb3VzZSB0aGVlLCBtYW4hIHRoeSBKdWxpZXQgaXMgYWxpdmUsCiAgICBGb3Igd2hvc2UgZGVhciBzYWtlIHRob3Ugd2FzdCBidXQgbGF0ZWx5IGRlYWQ7CiAgICBUaGVyZSBhcnQgdGhvdSBoYXBweTogVHliYWx0IHdvdWxkIGtpbGwgdGhlZSwKICAgIEJ1dCB0aG91IHNsZXcnc3QgVHliYWx0OyB0aGVyZSBhcmUgdGhvdSBoYXBweSB0b286CiAgICBUaGUgbGF3IHRoYXQgdGhyZWF0ZW4nZCBkZWF0aCBiZWNvbWVzIHRoeSBmcmllbmQKICAgIEFuZCB0dXJucyBpdCB0byBleGlsZTsgdGhlcmUgYXJ0IHRob3UgaGFwcHk6CiAgICBBIHBhY2sgb2YgYmxlc3NpbmdzIGxpZ2h0cyB1cCB1cG9uIHRoeSBiYWNrOwogICAgSGFwcGluZXNzIGNvdXJ0cyB0aGVlIGluIGhlciBiZXN0IGFycmF5OwogICAgQnV0LCBsaWtlIGEgbWlzYmVoYXZlZCBhbmQgc3VsbGVuIHdlbmNoLAogICAgVGhvdSBwb3V0J3N0IHVwb24gdGh5IGZvcnR1bmUgYW5kIHRoeSBsb3ZlOgogICAgVGFrZSBoZWVkLCB0YWtlIGhlZWQsIGZvciBzdWNoIGRpZSBtaXNlcmFibGUuCiAgICBHbywgZ2V0IHRoZWUgdG8gdGh5IGxvdmUsIGFzIHdhcyBkZWNyZWVkLAogICAgQXNjZW5kIGhlciBjaGFtYmVyLCBoZW5jZSBhbmQgY29tZm9ydCBoZXI6CiAgICBCdXQgbG9vayB0aG91IHN0YXkgbm90IHRpbGwgdGhlIHdhdGNoIGJlIHNldCwKICAgIEZvciB0aGVuIHRob3UgY2Fuc3Qgbm90IHBhc3MgdG8gTWFudHVhOwogICAgV2hlcmUgdGhvdSBzaGFsdCBsaXZlLCB0aWxsIHdlIGNhbiBmaW5kIGEgdGltZQogICAgVG8gYmxhemUgeW91ciBtYXJyaWFnZSwgcmVjb25jaWxlIHlvdXIgZnJpZW5kcywKICAgIEJlZyBwYXJkb24gb2YgdGhlIHByaW5jZSwgYW5kIGNhbGwgdGhlZSBiYWNrCiAgICBXaXRoIHR3ZW50eSBodW5kcmVkIHRob3VzYW5kIHRpbWVzIG1vcmUgam95CiAgICBUaGFuIHRob3Ugd2VudCdzdCBmb3J0aCBpbiBsYW1lbnRhdGlvbi4KICAgIEdvIGJlZm9yZSwgbnVyc2U6IGNvbW1lbmQgbWUgdG8gdGh5IGxhZHk7CiAgICBBbmQgYmlkIGhlciBoYXN0ZW4gYWxsIHRoZSBob3VzZSB0byBiZWQsCiAgICBXaGljaCBoZWF2eSBzb3Jyb3cgbWFrZXMgdGhlbSBhcHQgdW50bzoKICAgIFJvbWVvIGlzIGNvbWluZy4KCk51cnNlCgogICAgTyBMb3JkLCBJIGNvdWxkIGhhdmUgc3RheSdkIGhlcmUgYWxsIHRoZSBuaWdodAogICAgVG8gaGVhciBnb29kIGNvdW5zZWw6IE8sIHdoYXQgbGVhcm5pbmcgaXMhCiAgICBNeSBsb3JkLCBJJ2xsIHRlbGwgbXkgbGFkeSB5b3Ugd2lsbCBjb21lLgoKUk9NRU8KCiAgICBEbyBzbywgYW5kIGJpZCBteSBzd2VldCBwcmVwYXJlIHRvIGNoaWRlLgoKTnVyc2UKCiAgICBIZXJlLCBzaXIsIGEgcmluZyBzaGUgYmlkIG1lIGdpdmUgeW91LCBzaXI6CiAgICBIaWUgeW91LCBtYWtlIGhhc3RlLCBmb3IgaXQgZ3Jvd3MgdmVyeSBsYXRlLgoKICAgIEV4aXQKClJPTUVPCgogICAgSG93IHdlbGwgbXkgY29tZm9ydCBpcyByZXZpdmVkIGJ5IHRoaXMhCgpGUklBUiBMQVVSRU5DRQoKICAgIEdvIGhlbmNlOyBnb29kIG5pZ2h0OyBhbmQgaGVyZSBzdGFuZHMgYWxsIHlvdXIgc3RhdGU6CiAgICBFaXRoZXIgYmUgZ29uZSBiZWZvcmUgdGhlIHdhdGNoIGJlIHNldCwKICAgIE9yIGJ5IHRoZSBicmVhayBvZiBkYXkgZGlzZ3Vpc2VkIGZyb20gaGVuY2U6CiAgICBTb2pvdXJuIGluIE1hbnR1YTsgSSdsbCBmaW5kIG91dCB5b3VyIG1hbiwKICAgIEFuZCBoZSBzaGFsbCBzaWduaWZ5IGZyb20gdGltZSB0byB0aW1lCiAgICBFdmVyeSBnb29kIGhhcCB0byB5b3UgdGhhdCBjaGFuY2VzIGhlcmU6CiAgICBHaXZlIG1lIHRoeSBoYW5kOyAndGlzIGxhdGU6IGZhcmV3ZWxsOyBnb29kIG5pZ2h0LgoKUk9NRU8KCiAgICBCdXQgdGhhdCBhIGpveSBwYXN0IGpveSBjYWxscyBvdXQgb24gbWUsCiAgICBJdCB3ZXJlIGEgZ3JpZWYsIHNvIGJyaWVmIHRvIHBhcnQgd2l0aCB0aGVlOiBGYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHJvb20gaW4gQ2FwdWxldCdzIGhvdXNlLgoKICAgIEVudGVyIENBUFVMRVQsIExBRFkgQ0FQVUxFVCwgYW5kIFBBUklTIAoKQ0FQVUxFVAoKICAgIFRoaW5ncyBoYXZlIGZhbGwnbiBvdXQsIHNpciwgc28gdW5sdWNraWx5LAogICAgVGhhdCB3ZSBoYXZlIGhhZCBubyB0aW1lIHRvIG1vdmUgb3VyIGRhdWdodGVyOgogICAgTG9vayB5b3UsIHNoZSBsb3ZlZCBoZXIga2luc21hbiBUeWJhbHQgZGVhcmx5LAogICAgQW5kIHNvIGRpZCBJOi0tV2VsbCwgd2Ugd2VyZSBib3JuIHRvIGRpZS4KICAgICdUaXMgdmVyeSBsYXRlLCBzaGUnbGwgbm90IGNvbWUgZG93biB0by1uaWdodDoKICAgIEkgcHJvbWlzZSB5b3UsIGJ1dCBmb3IgeW91ciBjb21wYW55LAogICAgSSB3b3VsZCBoYXZlIGJlZW4gYS1iZWQgYW4gaG91ciBhZ28uCgpQQVJJUwoKICAgIFRoZXNlIHRpbWVzIG9mIHdvZSBhZmZvcmQgbm8gdGltZSB0byB3b28uCiAgICBNYWRhbSwgZ29vZCBuaWdodDogY29tbWVuZCBtZSB0byB5b3VyIGRhdWdodGVyLgoKTEFEWSBDQVBVTEVUCgogICAgSSB3aWxsLCBhbmQga25vdyBoZXIgbWluZCBlYXJseSB0by1tb3Jyb3c7CiAgICBUby1uaWdodCBzaGUgaXMgbWV3J2QgdXAgdG8gaGVyIGhlYXZpbmVzcy4KCkNBUFVMRVQKCiAgICBTaXIgUGFyaXMsIEkgd2lsbCBtYWtlIGEgZGVzcGVyYXRlIHRlbmRlcgogICAgT2YgbXkgY2hpbGQncyBsb3ZlOiBJIHRoaW5rIHNoZSB3aWxsIGJlIHJ1bGVkCiAgICBJbiBhbGwgcmVzcGVjdHMgYnkgbWU7IG5heSwgbW9yZSwgSSBkb3VidCBpdCBub3QuCiAgICBXaWZlLCBnbyB5b3UgdG8gaGVyIGVyZSB5b3UgZ28gdG8gYmVkOwogICAgQWNxdWFpbnQgaGVyIGhlcmUgb2YgbXkgc29uIFBhcmlzJyBsb3ZlOwogICAgQW5kIGJpZCBoZXIsIG1hcmsgeW91IG1lLCBvbiBXZWRuZXNkYXkgbmV4dC0tCiAgICBCdXQsIHNvZnQhIHdoYXQgZGF5IGlzIHRoaXMCgpQQVJJUwoKICAgIE1vbmRheSwgbXkgbG9yZCwKCkNBUFVMRVQKCiAgICBNb25kYXkhIGhhLCBoYSEgV2VsbCwgV2VkbmVzZGF5IGlzIHRvbyBzb29uLAogICAgTycgVGh1cnNkYXkgbGV0IGl0IGJlOiBvJyBUaHVyc2RheSwgdGVsbCBoZXIsCiAgICBTaGUgc2hhbGwgYmUgbWFycmllZCB0byB0aGlzIG5vYmxlIGVhcmwuCiAgICBXaWxsIHlvdSBiZSByZWFkeT8gZG8geW91IGxpa2UgdGhpcyBoYXN0ZT8KICAgIFdlJ2xsIGtlZXAgbm8gZ3JlYXQgYWRvLC0tYSBmcmllbmQgb3IgdHdvOwogICAgRm9yLCBoYXJrIHlvdSwgVHliYWx0IGJlaW5nIHNsYWluIHNvIGxhdGUsCiAgICBJdCBtYXkgYmUgdGhvdWdodCB3ZSBoZWxkIGhpbSBjYXJlbGVzc2x5LAogICAgQmVpbmcgb3VyIGtpbnNtYW4sIGlmIHdlIHJldmVsIG11Y2g6CiAgICBUaGVyZWZvcmUgd2UnbGwgaGF2ZSBzb21lIGhhbGYgYSBkb3plbiBmcmllbmRzLAogICAgQW5kIHRoZXJlIGFuIGVuZC4gQnV0IHdoYXQgc2F5IHlvdSB0byBUaHVyc2RheT8KClBBUklTCgogICAgTXkgbG9yZCwgSSB3b3VsZCB0aGF0IFRodXJzZGF5IHdlcmUgdG8tbW9ycm93LgoKQ0FQVUxFVAoKICAgIFdlbGwgZ2V0IHlvdSBnb25lOiBvJyBUaHVyc2RheSBiZSBpdCwgdGhlbi4KICAgIEdvIHlvdSB0byBKdWxpZXQgZXJlIHlvdSBnbyB0byBiZWQsCiAgICBQcmVwYXJlIGhlciwgd2lmZSwgYWdhaW5zdCB0aGlzIHdlZGRpbmctZGF5LgogICAgRmFyZXdlbGwsIG15IGxvcmQuIExpZ2h0IHRvIG15IGNoYW1iZXIsIGhvIQogICAgQWZvcmUgbWUhIGl0IGlzIHNvIHZlcnkgdmVyeSBsYXRlLAogICAgVGhhdCB3ZSBtYXkgY2FsbCBpdCBlYXJseSBieSBhbmQgYnkuCiAgICBHb29kIG5pZ2h0LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gYW5kIEpVTElFVCBhYm92ZSwgYXQgdGhlIHdpbmRvdyAKCkpVTElFVAoKICAgIFdpbHQgdGhvdSBiZSBnb25lPyBpdCBpcyBub3QgeWV0IG5lYXIgZGF5OgogICAgSXQgd2FzIHRoZSBuaWdodGluZ2FsZSwgYW5kIG5vdCB0aGUgbGFyaywKICAgIFRoYXQgcGllcmNlZCB0aGUgZmVhcmZ1bCBob2xsb3cgb2YgdGhpbmUgZWFyOwogICAgTmlnaHRseSBzaGUgc2luZ3Mgb24geW9uIHBvbWVncmFuYXRlLXRyZWU6CiAgICBCZWxpZXZlIG1lLCBsb3ZlLCBpdCB3YXMgdGhlIG5pZ2h0aW5nYWxlLgoKUk9NRU8KCiAgICBJdCB3YXMgdGhlIGxhcmssIHRoZSBoZXJhbGQgb2YgdGhlIG1vcm4sCiAgICBObyBuaWdodGluZ2FsZTogbG9vaywgbG92ZSwgd2hhdCBlbnZpb3VzIHN0cmVha3MKICAgIERvIGxhY2UgdGhlIHNldmVyaW5nIGNsb3VkcyBpbiB5b25kZXIgZWFzdDoKICAgIE5pZ2h0J3MgY2FuZGxlcyBhcmUgYnVybnQgb3V0LCBhbmQgam9jdW5kIGRheQogICAgU3RhbmRzIHRpcHRvZSBvbiB0aGUgbWlzdHkgbW91bnRhaW4gdG9wcy4KICAgIEkgbXVzdCBiZSBnb25lIGFuZCBsaXZlLCBvciBzdGF5IGFuZCBkaWUuCgpKVUxJRVQKCiAgICBZb24gbGlnaHQgaXMgbm90IGRheS1saWdodCwgSSBrbm93IGl0LCBJOgogICAgSXQgaXMgc29tZSBtZXRlb3IgdGhhdCB0aGUgc3VuIGV4aGFsZXMsCiAgICBUbyBiZSB0byB0aGVlIHRoaXMgbmlnaHQgYSB0b3JjaC1iZWFyZXIsCiAgICBBbmQgbGlnaHQgdGhlZSBvbiB0aHkgd2F5IHRvIE1hbnR1YToKICAgIFRoZXJlZm9yZSBzdGF5IHlldDsgdGhvdSBuZWVkJ3N0IG5vdCB0byBiZSBnb25lLgoKUk9NRU8KCiAgICBMZXQgbWUgYmUgdGEnZW4sIGxldCBtZSBiZSBwdXQgdG8gZGVhdGg7CiAgICBJIGFtIGNvbnRlbnQsIHNvIHRob3Ugd2lsdCBoYXZlIGl0IHNvLgogICAgSSdsbCBzYXkgeW9uIGdyZXkgaXMgbm90IHRoZSBtb3JuaW5nJ3MgZXllLAogICAgJ1RpcyBidXQgdGhlIHBhbGUgcmVmbGV4IG9mIEN5bnRoaWEncyBicm93OwogICAgTm9yIHRoYXQgaXMgbm90IHRoZSBsYXJrLCB3aG9zZSBub3RlcyBkbyBiZWF0CiAgICBUaGUgdmF1bHR5IGhlYXZlbiBzbyBoaWdoIGFib3ZlIG91ciBoZWFkczoKICAgIEkgaGF2ZSBtb3JlIGNhcmUgdG8gc3RheSB0aGFuIHdpbGwgdG8gZ286CiAgICBDb21lLCBkZWF0aCwgYW5kIHdlbGNvbWUhIEp1bGlldCB3aWxscyBpdCBzby4KICAgIEhvdyBpcyd0LCBteSBzb3VsPyBsZXQncyB0YWxrOyBpdCBpcyBub3QgZGF5LgoKSlVMSUVUCgogICAgSXQgaXMsIGl0IGlzOiBoaWUgaGVuY2UsIGJlIGdvbmUsIGF3YXkhCiAgICBJdCBpcyB0aGUgbGFyayB0aGF0IHNpbmdzIHNvIG91dCBvZiB0dW5lLAogICAgU3RyYWluaW5nIGhhcnNoIGRpc2NvcmRzIGFuZCB1bnBsZWFzaW5nIHNoYXJwcy4KICAgIFNvbWUgc2F5IHRoZSBsYXJrIG1ha2VzIHN3ZWV0IGRpdmlzaW9uOwogICAgVGhpcyBkb3RoIG5vdCBzbywgZm9yIHNoZSBkaXZpZGV0aCB1czoKICAgIFNvbWUgc2F5IHRoZSBsYXJrIGFuZCBsb2F0aGVkIHRvYWQgY2hhbmdlIGV5ZXMsCiAgICBPLCBub3cgSSB3b3VsZCB0aGV5IGhhZCBjaGFuZ2VkIHZvaWNlcyB0b28hCiAgICBTaW5jZSBhcm0gZnJvbSBhcm0gdGhhdCB2b2ljZSBkb3RoIHVzIGFmZnJheSwKICAgIEh1bnRpbmcgdGhlZSBoZW5jZSB3aXRoIGh1bnQnc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cmUgd2VlcGluZyBmb3IgeW91ciBjb3VzaW4ncyBkZWF0aD8KICAgIFdoYXQsIHdpbHQgdGhvdSB3YXNoIGhpbSBmcm9tIGhpcyBncmF2ZSB3aXRoIHRlYXJzPwogICAgQW4gaWYgdGhvdSBjb3VsZHN0LCB0aG91IGNvdWxkc3Qgbm90IG1ha2UgaGltIGxpdmU7CiAgICBUaGVyZWZvcmUsIGhhdmUgZG9uZTogc29tZSBncmllZiBzaG93cyBtdWNoIG9mIGxvdmU7CiAgICBCdXQgbXVjaCBvZiBncmllZiBzaG93cyBzdGlsbCBzb21lIHdhbnQgb2Ygd2l0LgoKSlVMSUVUCgogICAgWWV0IGxldCBtZSB3ZWVwIGZvciBzdWNoIGEgZmVlbGluZyBsb3NzLgoKTEFEWSBDQVBVTEVUCgogICAgU28gc2hhbGwgeW91IGZlZWwgdGhlIGxvc3MsIGJ1dCBub3QgdGhlIGZyaWVuZAogICAgV2hpY2ggeW91IHdlZXAgZm9yLgoKSlVMSUVUCgogICAgRmVlbGluZyBzbyB0aGUgbG9zcywKICAgIENhbm5vdCBjaG9vc2UgYnV0IGV2ZXIgd2VlcCB0aGUgZnJpZW5kLgoKTEFEWSBDQVBVTEVUCgogICAgV2VsbCwgZ2lybCwgdGhvdSB3ZWVwJ3N0IG5vdCBzbyBtdWNoIGZvciBoaXMgZGVhdGgsCiAgICBBcyB0aGF0IHRoZSB2aWxsYWluIGxpdmVzIHdoaWNoIHNsYXVnaHRlcidkIGhpbS4KCkpVTElFVAoKICAgIFdoYXQgdmlsbGFpbiBtYWRhbT8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoYXQgc2FtZSB2aWxsYWluLCBSb21lby4KCkpVTElFVAoKICAgIFtBc2lkZV0gVmlsbGFpbiBhbmQgaGUgYmUgbWFueSBtaWxlcyBhc3VuZGVyLi0tCiAgICBHb2QgUGFyZG9uIGhpbSEgSSBkbywgd2l0aCBhbGwgbXkgaGVhcnQ7CiAgICBBbmQgeWV0IG5vIG1hbiBsaWtlIGhlIGRvdGggZ3JpZXZlIG15IGhlYXJ0LgoKTEFEWSBDQVBVTEVUCgogICAgVGhhdCBpcywgYmVjYXVzZSB0aGUgdHJhaXRvciBtdXJkZXJlciBsaXZlcy4KCkpVTElFVAoKICAgIEF5LCBtYWRhbSwgZnJvbSB0aGUgcmVhY2ggb2YgdGhlc2UgbXkgaGFuZHM6CiAgICBXb3VsZCBub25lIGJ1dCBJIG1pZ2h0IHZlbmdlIG15IGNvdXNpbidzIGRlYXRoIQoKTEFEWSBDQVBVTEVUCgogICAgV2Ugd2lsbCBoYXZlIHZlbmdlYW5jZSBmb3IgaXQsIGZlYXIgdGhvdSBub3Q6CiAgICBUaGVuIHdlZXAgbm8gbW9yZS4gSSdsbCBzZW5kIHRvIG9uZSBpbiBNYW50dWEsCiAgICBXaGVyZSB0aGF0IHNhbWUgYmFuaXNoJ2QgcnVuYWdhdGUgZG90aCBsaXZlLAogICAgU2hhbGwgZ2l2ZSBoaW0gc3VjaCBhbiB1bmFjY3VzdG9tJ2QgZHJhbSwKICAgIFRoYXQgaGUgc2hhbGwgc29vbiBrZWVwIFR5YmFsdCBjb21wYW55OgogICAgQW5kIHRoZW4sIEkgaG9wZSwgdGhvdSB3aWx0IGJlIHNhdGlzZmllZC4KCkpVTElFVAoKICAgIEluZGVlZCwgSSBuZXZlciBzaGFsbCBiZSBzYXRpc2ZpZWQKICAgIFdpdGggUm9tZW8sIHRpbGwgSSBiZWhvbGQgaGltLS1kZWFkLS0KICAgIElzIG15IHBvb3IgaGVhcnQgZm9yIGEga2luc21hbiB2ZXgnZC4KICAgIE1hZGFtLCBpZiB5b3UgY291bGQgZmluZCBvdXQgYnV0IGEgbWFuCiAgICBUbyBiZWFyIGEgcG9pc29uLCBJIHdvdWxkIHRlbXBlciBpdDsKICAgIFRoYXQgUm9tZW8gc2hvdWxkLCB1cG9uIHJlY2VpcHQgdGhlcmVvZiwKICAgIFNvb24gc2xlZXAgaW4gcXVpZXQuIE8sIGhvdyBteSBoZWFydCBhYmhvcnMKICAgIFRvIGhlYXIgaGltIG5hbWVkLCBhbmQgY2Fubm90IGNvbWUgdG8gaGltLgogICAgVG8gd3JlYWsgdGhlIGxvdmUgSSBib3JlIG15IGNvdXNpbgogICAgVXBvbiBoaXMgYm9keSB0aGF0IHNsYXVnaHRlcidkIGhpbSEKCkxBRFkgQ0FQVUxFVAoKICAgIEZpbmQgdGhvdSB0aGUgbWVhbnMsIGFuZCBJJ2xsIGZpbmQgc3VjaCBhIG1hbi4KICAgIEJ1dCBub3cgSSdsbCB0ZWxsIHRoZWUgam95ZnVsIHRpZGluZ3MsIGdpcmwuCgpKVUxJRVQKCiAgICBBbmQgam95IGNvbWVzIHdlbGwgaW4gc3VjaCBhIG5lZWR5IHRpbWU6CiAgICBXaGF0IGFyZSB0aGV5LCBJIGJlc2VlY2ggeW91ciBsYWR5c2hpcD8KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHdlbGwsIHRob3UgaGFzdCBhIGNhcmVmdWwgZmF0aGVyLCBjaGlsZDsKICAgIE9uZSB3aG8sIHRvIHB1dCB0aGVlIGZyb20gdGh5IGhlYXZpbmVzcywKICAgIEhhdGggc29ydGVkIG91dCBhIHN1ZGRlbiBkYXkgb2Ygam95LAogICAgVGhhdCB0aG91IGV4cGVjdCdzdCBub3Qgbm9yIEkgbG9vaydkIG5vdCBmb3IuCgpKVUxJRVQKCiAgICBNYWRhbSwgaW4gaGFwcHkgdGltZSwgd2hhdCBkYXkgaXMgdGhhdD8KCkxBRFkgQ0FQVUxFVAoKICAgIE1hcnJ5LCBteSBjaGlsZCwgZWFybHkgbmV4dCBUaHVyc2RheSBtb3JuLAogICAgVGhlIGdhbGxhbnQsIHlvdW5nIGFuZCBub2JsZSBnZW50bGVtYW4sCiAgICBUaGUgQ291bnR5IFBhcmlzLCBhdCBTYWludCBQZXRlcidzIENodXJjaCwKICAgIFNoYWxsIGhhcHBpbHkgbWFrZSB0aGVlIHRoZXJlIGEgam95ZnVsIGJyaWRlLgoKSlVMSUVUCgogICAgTm93LCBieSBTYWludCBQZXRlcidzIENodXJjaCBhbmQgUGV0ZXIgdG9vLAogICAgSGUgc2hhbGwgbm90IG1ha2UgbWUgdGhlcmUgYSBqb3lmdWwgYnJpZGUuCiAgICBJIHdvbmRlciBhdCB0aGlzIGhhc3RlOyB0aGF0IEkgbXVzdCB3ZWQKICAgIEVyZSBoZSwgdGhhdCBzaG91bGQgYmUgaHVzYmFuZCwgY29tZXMgdG8gd29vLgogICAgSSBwcmF5IHlvdSwgdGVsbCBteSBsb3JkIGFuZCBmYXRoZXIsIG1hZGFtLAogICAgSSB3aWxsIG5vdCBtYXJyeSB5ZXQ7IGFuZCwgd2hlbiBJIGRvLCBJIHN3ZWFyLAogICAgSXQgc2hhbGwgYmUgUm9tZW8sIHdob20geW91IGtub3cgSSBoYXRlLAogICAgUmF0aGVyIHRoYW4gUGFyaXMuIFRoZXNlIGFyZSBuZXdzIGluZGVlZCEKCkxBRFkgQ0FQVUxFVAoKICAgIEhlcmUgY29tZXMgeW91ciBmYXRoZXI7IHRlbGwgaGltIHNvIHlvdXJzZWxmLAogICAgQW5kIHNlZSBob3cgaGUgd2lsbCB0YWtlIGl0IGF0IHlvdXIgaGFuZHMuCgogICAgRW50ZXIgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBXaGVuIHRoZSBzdW4gc2V0cywgdGhlIGFpciBkb3RoIGRyaXp6bGUgZGV3OwogICAgQnV0IGZvciB0aGUgc3Vuc2V0IG9mIG15IGJyb3RoZXIncyBzb24KICAgIEl0IHJhaW5zIGRvd25yaWdodC4KICAgIEhvdyBub3chIGEgY29uZHVpdCwgZ2lybD8gd2hhdCwgc3RpbGwgaW4gdGVhcnMCiAgICBFdmVybW9yZSBzaG93ZXJpbmcIEluIG9uZSBsaXR0bGUgYm9keQogICAgVGhvdSBjb3VudGVyZmVpdCdzdCBhIGJhcmssIGEgc2VhLCBhIHdpbmQ7CiAgICBGb3Igc3RpbGwgdGh5IGV5ZXMsIHdoaWNoIEkgbWF5IGNhbGwgdGhlIHNlYSwKICAgIERvIGViYiBhbmQgZmxvdyB3aXRoIHRlYXJzOyB0aGUgYmFyayB0aHkgYm9keSBpcywKICAgIFNhaWxpbmcgaW4gdGhpcyBzYWx0IGZsb29kOyB0aGUgd2luZHMsIHRoeSBzaWdoczsKICAgIFdobywgcmFnaW5nIHdpdGggdGh5IHRlYXJzLCBhbmQgdGhleSB3aXRoIHRoZW0sCiAgICBXaXRob3V0IGEgc3VkZGVuIGNhbG0sIHdpbGwgb3ZlcnNldAogICAgVGh5IHRlbXBlc3QtdG9zc2VkIGJvZHkuIEhvdyBub3csIHdpZmUhCiAgICBIYXZlIHlvdSBkZWxpdmVyJ2QgdG8gaGVyIG91ciBkZWNyZWUCgpMQURZIENBUFVMRVQKCiAgICBBeSwgc2lyOyBidXQgc2hlIHdpbGwgbm9uZSwgc2hlIGdpdmVzIHlvdSB0aGFua3MuCiAgICBJIHdvdWxkIHRoZSBmb29sIHdlcmUgbWFycmllZCB0byBoZXIgZ3JhdmUhCgpDQVBVTEVUCgogICAgU29mdCEgdGFrZSBtZSB3aXRoIHlvdSwgdGFrZSBtZSB3aXRoIHlvdSwgd2lmZS4KICAgIEhvdyEgd2lsbCBzaGUgbm9uZT8gZG90aCBzaGUgbm90IGdpdmUgdXMgdGhhbmtzPwogICAgSXMgc2hlIG5vdCBwcm91ZD8gZG90aCBzaGUgbm90IGNvdW50IGhlciBibGVzdCwKICAgIFVud29ydGh5IGFzIHNoZSBpcywgdGhhdCB3ZSBoYXZlIHdyb3VnaHQKICAgIFNvIHdvcnRoeSBhIGdlbnRsZW1hbiB0byBiZSBoZXIgYnJpZGVncm9vbT8KCkpVTElFVAoKICAgIE5vdCBwcm91ZCwgeW91IGhhdmU7IGJ1dCB0aGFua2Z1bCwgdGhhdCB5b3UgaGF2ZToKICAgIFByb3VkIGNhbiBJIG5ldmVyIGJlIG9mIHdoYXQgSSBoYXRlOwogICAgQnV0IHRoYW5rZnVsIGV2ZW4gZm9yIGhhdGUsIHRoYXQgaXMgbWVhbnQgbG92ZS4KCkNBUFVMRVQKCiAgICBIb3cgbm93LCBob3cgbm93LCBjaG9wLWxvZ2ljISBXaGF0IGlzIHRoaXMCiAgICAnUHJvdWQsJyBhbmQgJ0kgdGhhbmsgeW91LCcgYW5kICdJIHRoYW5rIHlvdSBub3Q7JwogICAgQW5kIHlldCAnbm90IHByb3VkLCcgbWlzdHJlc3MgbWluaW9uLCB5b3UsCiAgICBUaGFuayBtZSBubyB0aGFua2luZ3MsIG5vciwgcHJvdWQgbWUgbm8gcHJvdWRzLAogICAgQnV0IGZldHRsZSB5b3VyIGZpbmUgam9pbnRzICdnYWluc3QgVGh1cnNkYXkgbmV4dCwKICAgIFRvIGdvIHdpdGggUGFyaXMgdG8gU2FpbnQgUGV0ZXIncyBDaHVyY2gsCiAgICBPciBJIHdpbGwgZHJhZyB0aGVlIG9uIGEgaHVyZGxlIHRoaXRoZXIuCiAgICBPdXQsIHlvdSBncmVlbi1zaWNrbmVzcyBjYXJyaW9uISBvdXQsIHlvdSBiYWdnYWdlIQogICAgWW91IHRhbGxvdy1mYWNlIQoKTEFEWSBDQVBVTEVUCgogICAgRmllLCBmaWUhIHdoYXQsIGFyZSB5b3UgbWFkPwoKSlVMSUVUCgogICAgR29vZCBmYXRoZXIsIEkgYmVzZWVjaCB5b3Ugb24gbXkga25lZXMsCiAgICBIZWFyIG1lIHdpdGggcGF0aWVuY2UgYnV0IHRvIHNwZWFrIGEgd29yZC4KCkNBUFVMRVQKCiAgICBIYW5nIHRoZWUsIHlvdW5nIGJhZ2dhZ2UhIGRpc29iZWRpZW50IHdyZXRjaCEKICAgIEkgdGVsbCB0aGVlIHdoYXQ6IGdldCB0aGVlIHRvIGNodXJjaCBvJyBUaHVyc2RheSwKICAgIE9yIG5ldmVyIGFmdGVyIGxvb2sgbWUgaW4gdGhlIGZhY2U6CiAgICBTcGVhayBub3QsIHJlcGx5IG5vdCwgZG8gbm90IGFuc3dlciBtZTsKICAgIE15IGZpbmdlcnMgaXRjaC4gV2lmZSwgd2Ugc2NhcmNlIHRob3VnaHQgdXMgYmxlc3QKICAgIFRoYXQgR29kIGhhZCBsZW50IHVzIGJ1dCB0aGlzIG9ubHkgY2hpbGQ7CiAgICBCdXQgbm93IEkgc2VlIHRoaXMgb25lIGlzIG9uZSB0b28gbXVjaCwKICAgIEFuZCB0aGF0IHdlIGhhdmUgYSBjdXJzZSBpbiBoYXZpbmcgaGVyOgogICAgT3V0IG9uIGhlciwgaGlsZGluZyEKCk51cnNlCgogICAgR29kIGluIGhlYXZlbiBibGVzcyBoZXIhCiAgICBZb3UgYXJlIHRvIGJsYW1lLCBteSBsb3JkLCB0byByYXRlIGhlciBzby4KCkNBUFVMRVQKCiAgICBBbmQgd2h5LCBteSBsYWR5IHdpc2RvbT8gaG9sZCB5b3VyIHRvbmd1ZSwKICAgIEdvb2QgcHJ1ZGVuY2U7IHNtYXR0ZXIgd2l0aCB5b3VyIGdvc3NpcHMsIGdvLgoKTnVyc2UKCiAgICBJIHNwZWFrIG5vIHRyZWFzb24uCgpDQVBVTEVUCgogICAgTywgR29kIHllIGdvZC1kZW4uCgpOdXJzZQoKICAgIE1heSBub3Qgb25lIHNwZWFrPwoKQ0FQVUxFVAoKICAgIFBlYWNlLCB5b3UgbXVtYmxpbmcgZm9vbCEKICAgIFV0dGVyIHlvdXIgZ3Jhdml0eSBvJ2VyIGEgZ29zc2lwJ3MgYm93bDsKICAgIEZvciBoZXJlIHdlIG5lZWQgaXQgbm90LgoKTEFEWSBDQVBVTEVUCgogICAgWW91IGFyZSB0b28gaG90LgoKQ0FQVUxFVAoKICAgIEdvZCdzIGJyZWFkISBpdCBtYWtlcyBtZSBtYWQ6CiAgICBEYXksIG5pZ2h0LCBob3VyLCB0aWRlLCB0aW1lLCB3b3JrLCBwbGF5LAogICAgQWxvbmUsIGluIGNvbXBhbnksIHN0aWxsIG15IGNhcmUgaGF0aCBiZWVuCiAgICBUbyBoYXZlIGhlciBtYXRjaCdkOiBhbmQgaGF2aW5nIG5vdyBwcm92aWRlZAogICAgQSBnZW50bGVtYW4gb2Ygbm9ibGUgcGFyZW50YWdlLAogICAgT2YgZmFpciBkZW1lc25lcywgeW91dGhmdWwsIGFuZCBub2JseSB0cmFpbidkLAogICAgU3R1ZmYnZCwgYXMgdGhleSBzYXksIHdpdGggaG9ub3VyYWJsZSBwYXJ0cywKICAgIFByb3BvcnRpb24nZCBhcyBvbmUncyB0aG91Z2h0IHdvdWxkIHdpc2ggYSBtYW47CiAgICBBbmQgdGhlbiB0byBoYXZlIGEgd3JldGNoZWQgcHVsaW5nIGZvb2wsCiAgICBBIHdoaW5pbmcgbWFtbWV0LCBpbiBoZXIgZm9ydHVuZSdzIHRlbmRlciwKICAgIFRvIGFuc3dlciAnSSdsbCBub3Qgd2VkOyBJIGNhbm5vdCBsb3ZlLAogICAgSSBhbSB0b28geW91bmc7IEkgcHJheSB5b3UsIHBhcmRvbiBtZS4nCiAgICBCdXQsIGFzIHlvdSB3aWxsIG5vdCB3ZWQsIEknbGwgcGFyZG9uIHlvdToKICAgIEdyYXplIHdoZXJlIHlvdSB3aWxsIHlvdSBzaGFsbCBub3QgaG91c2Ugd2l0aCBtZToKICAgIExvb2sgdG8ndCwgdGhpbmsgb24ndCwgSSBkbyBub3QgdXNlIHRvIGplc3QuCiAgICBUaHVyc2RheSBpcyBuZWFyOyBsYXkgaGFuZCBvbiBoZWFydCwgYWR2aXNlOgogICAgQW4geW91IGJlIG1pbmUsIEknbGwgZ2l2ZSB5b3UgdG8gbXkgZnJpZW5kOwogICAgQW5kIHlvdSBiZSBub3QsIGhhbmcsIGJlZywgc3RhcnZlLCBkaWUgaW4KICAgIHRoZSBzdHJlZXRzLAogICAgRm9yLCBieSBteSBzb3VsLCBJJ2xsIG5lJ2VyIGFja25vd2xlZGdlIHRoZWUsCiAgICBOb3Igd2hhdCBpcyBtaW5lIHNoYWxsIG5ldmVyIGRvIHRoZWUgZ29vZDoKICAgIFRydXN0IHRvJ3QsIGJldGhpbmsgeW91OyBJJ2xsIG5vdCBiZSBmb3Jzd29ybi4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBJcyB0aGVyZSBubyBwaXR5IHNpdHRpbmcgaW4gdGhlIGNsb3VkcywKICAgIFRoYXQgc2VlcyBpbnRvIHRoZSBib3R0b20gb2YgbXkgZ3JpZWYCiAgICBPLCBzd2VldCBteSBtb3RoZXIsIGNhc3QgbWUgbm90IGF3YXkhCiAgICBEZWxheSB0aGlzIG1hcnJpYWdlIGZvciBhIG1vbnRoLCBhIHdlZWs7CiAgICBPciwgaWYgeW91IGRvIG5vdCwgbWFrZSB0aGUgYnJpZGFsIGJlZAogICAgSW4gdGhhdCBkaW0gbW9udW1lbnQgd2hlcmUgVHliYWx0IGxpZXMuCgpMQURZIENBUFVMRVQKCiAgICBUYWxrIG5vdCB0byBtZSwgZm9yIEknbGwgbm90IHNwZWFrIGEgd29yZDoKICAgIERvIGFzIHRob3Ugd2lsdCwgZm9yIEkgaGF2ZSBkb25lIHdpdGggdGhlZS4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIEdvZCEtLU8gbnVyc2UsIGhvdyBzaGFsbCB0aGlzIGJlIHByZXZlbnRlZD8KICAgIE15IGh1c2JhbmQgaXMgb24gZWFydGgsIG15IGZhaXRoIGluIGhlYXZlbjsKICAgIEhvdyBzaGFsbCB0aGF0IGZhaXRoIHJldHVybiBhZ2FpbiB0byBlYXJ0aCwKICAgIFVubGVzcyB0aGF0IGh1c2JhbmQgc2VuZCBpdCBtZSBmcm9tIGhlYXZlbgogICAgQnkgbGVhdmluZyBlYXJ0aD8gY29tZm9ydCBtZSwgY291bnNlbCBtZS4KICAgIEFsYWNrLCBhbGFjaywgdGhhdCBoZWF2ZW4gc2hvdWxkIHByYWN0aXNlIHN0cmF0YWdlbXMKICAgIFVwb24gc28gc29mdCBhIHN1YmplY3QgYXMgbXlzZWxmIQogICAgV2hhdCBzYXknc3QgdGhvdT8gaGFzdCB0aG91IG5vdCBhIHdvcmQgb2Ygam95PwogICAgU29tZSBjb21mb3J0LCBudXJzZS4KCk51cnNlCgogICAgRmFpdGgsIGhlcmUgaXQgaXMuCiAgICBSb21lbyBpcyBiYW5pc2gnZDsgYW5kIGFsbCB0aGUgd29ybGQgdG8gbm90aGluZywKICAgIFRoYXQgaGUgZGFyZXMgbmUnZXIgY29tZSBiYWNrIHRvIGNoYWxsZW5nZSB5b3U7CiAgICBPciwgaWYgaGUgZG8sIGl0IG5lZWRzIG11c3QgYmUgYnkgc3RlYWx0aC4KICAgIFRoZW4sIHNpbmNlIHRoZSBjYXNlIHNvIHN0YW5kcyBhcyBub3cgaXQgZG90aCwKICAgIEkgdGhpbmsgaXQgYmVzdCB5b3UgbWFycmllZCB3aXRoIHRoZSBjb3VudHkuCiAgICBPLCBoZSdzIGEgbG92ZWx5IGdlbnRsZW1hbiEKICAgIFJvbWVvJ3MgYSBkaXNoY2xvdXQgdG8gaGltOiBhbiBlYWdsZSwgbWFkYW0sCiAgICBIYXRoIG5vdCBzbyBncmVlbiwgc28gcXVpY2ssIHNvIGZhaXIgYW4gZXllCiAgICBBcyBQYXJpcyBoYXRoLiBCZXNocmV3IG15IHZlcnkgaGVhcnQsCiAgICBJIHRoaW5rIHlvdSBhcmUgaGFwcHkgaW4gdGhpcyBzZWNvbmQgbWF0Y2gsCiAgICBGb3IgaXQgZXhjZWxzIHlvdXIgZmlyc3Q6IG9yIGlmIGl0IGRpZCBub3QsCiAgICBZb3VyIGZpcnN0IGlzIGRlYWQ7IG9yICd0d2VyZSBhcyBnb29kIGhlIHdlcmUsCiAgICBBcyBsaXZpbmcgaGVyZSBhbmQgeW91IG5vIHVzZSBvZiBoaW0uCgpKVUxJRVQKCiAgICBTcGVha2VzdCB0aG91IGZyb20gdGh5IGhlYXJ0PwoKTnVyc2UKCiAgICBBbmQgZnJvbSBteSBzb3VsIHRvbzsKICAgIE9yIGVsc2UgYmVzaHJldyB0aGVtIGJvdGguCgpKVUxJRVQKCiAgICBBbWVuIQoKTnVyc2UKCiAgICBXaGF0PwoKSlVMSUVUCgogICAgV2VsbCwgdGhvdSBoYXN0IGNvbWZvcnRlZCBtZSBtYXJ2ZWxsb3VzIG11Y2guCiAgICBHbyBpbjogYW5kIHRlbGwgbXkgbGFkeSBJIGFtIGdvbmUsCiAgICBIYXZpbmcgZGlzcGxlYXNlZCBteSBmYXRoZXIsIHRvIExhdXJlbmNlJyBjZWxsLAogICAgVG8gbWFrZSBjb25mZXNzaW9uIGFuZCB0byBiZSBhYnNvbHZlZC4KCk51cnNlCgogICAgTWFycnksIEkgd2lsbDsgYW5kIHRoaXMgaXMgd2lzZWx5IGRvbmUuCgogICAgRXhpdAoKSlVMSUVUCgogICAgQW5jaWVudCBkYW1uYXRpb24hIE8gbW9zdCB3aWNrZWQgZmllbmQhCiAgICBJcyBpdCBtb3JlIHNpbiB0byB3aXNoIG1lIHRodXMgZm9yc3dvcm4sCiAgICBPciB0byBkaXNwcmFpc2UgbXkgbG9yZCB3aXRoIHRoYXQgc2FtZSB0b25ndWUKICAgIFdoaWNoIHNoZSBoYXRoIHByYWlzZWQgaGltIHdpdGggYWJvdmUgY29tcGFyZQogICAgU28gbWFueSB0aG91c2FuZCB0aW1lcz8gR28sIGNvdW5zZWxsb3I7CiAgICBUaG91IGFuZCBteSBib3NvbSBoZW5jZWZvcnRoIHNoYWxsIGJlIHR3YWluLgogICAgSSdsbCB0byB0aGUgZnJpYXIsIHRvIGtub3cgaGlzIHJlbWVkeToKICAgIElmIGFsbCBlbHNlIGZhaWwsIG15c2VsZiBoYXZlIHBvd2VyIHRvIGRpZS4KCiAgICBFeGl0CgpBQ1QgSVYKU0NFTkUgSS4gRnJpYXIgTGF1cmVuY2UncyBjZWxsLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUyAKCkZSSUFSIExBVVJFTkNFCgogICAgT24gVGh1cnNkYXksIHNpcj8gdGhlIHRpbWUgaXMgdmVyeSBzaG9ydC4KClBBUklTCgogICAgTXkgZmF0aGVyIENhcHVsZXQgd2lsbCBoYXZlIGl0IHNvOwogICAgQW5kIEkgYW0gbm90aGluZyBzbG93IHRvIHNsYWNrIGhpcyBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgWW91IHNheSB5b3UgZG8gbm90IGtub3cgdGhlIGxhZHkncyBtaW5kOgogICAgVW5ldmVuIGlzIHRoZSBjb3Vyc2UsIEkgbGlrZSBpdCBub3QuCgpQQVJJUwoKICAgIEltbW9kZXJhdGVseSBzaGUgd2VlcHMgZm9yIFR5YmFsdCdzIGRlYXRoLAogICAgQW5kIHRoZXJlZm9yZSBoYXZlIEkgbGl0dGxlIHRhbGsnZCBvZiBsb3ZlOwogICAgRm9yIFZlbnVzIHNtaWxlcyBub3QgaW4gYSBob3VzZSBvZiB0ZWFycy4KICAgIE5vdywgc2lyLCBoZXIgZmF0aGVyIGNvdW50cyBpdCBkYW5nZXJvdXMKICAgIFRoYXQgc2hlIGRvdGggZ2l2ZSBoZXIgc29ycm93IHNvIG11Y2ggc3dheSwKICAgIEFuZCBpbiBoaXMgd2lzZG9tIGhhc3RlcyBvdXIgbWFycmlhZ2UsCiAgICBUbyBzdG9wIHRoZSBpbnVuZGF0aW9uIG9mIGhlciB0ZWFyczsKICAgIFdoaWNoLCB0b28gbXVjaCBtaW5kZWQgYnkgaGVyc2VsZiBhbG9uZSwKICAgIE1heSBiZSBwdXQgZnJvbSBoZXIgYnkgc29jaWV0eToKICAgIE5vdyBkbyB5b3Uga25vdyB0aGUgcmVhc29uIG9mIHRoaXMgaGFzdGUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFtBc2lkZV0gSSB3b3VsZCBJIGtuZXcgbm90IHdoeSBpdCBzaG91bGQgYmUgc2xvdydkLgogICAgTG9vaywgc2lyLCBoZXJlIGNvbWVzIHRoZSBsYWR5IHRvd2FyZHMgbXkgY2VsbC4KCiAgICBFbnRlciBKVUxJRVQKClBBUklTCgogICAgSGFwcGlseSBtZXQsIG15IGxhZHkgYW5kIG15IHdpZmUhCgpKVUxJRVQKCiAgICBUaGF0IG1heSBiZSwgc2lyLCB3aGVuIEkgbWF5IGJlIGEgd2lmZS4KClBBUklTCgogICAgVGhhdCBtYXkgYmUgbXVzdCBiZSwgbG92ZSwgb24gVGh1cnNkYXkgbmV4dC4KCkpVTElFVAoKICAgIFdoYXQgbXVzdCBiZSBzaGFsbCBiZS4KCkZSSUFSIExBVVJFTkNFCgogICAgVGhhdCdzIGEgY2VydGFpbiB0ZXh0LgoKUEFSSVMKCiAgICBDb21lIHlvdSB0byBtYWtlIGNvbmZlc3Npb24gdG8gdGhpcyBmYXRoZXICgpKVUxJRVQKCiAgICBUbyBhbnN3ZXIgdGhhdCwgSSBzaG91bGQgY29uZmVzcyB0byB5b3UuCgpQQVJJUwoKICAgIERvIG5vdCBkZW55IHRvIGhpbSB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSSB3aWxsIGNvbmZlc3MgdG8geW91IHRoYXQgSSBsb3ZlIGhpbS4KClBBUklTCgogICAgU28gd2lsbCB5ZSwgSSBhbSBzdXJlLCB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSWYgSSBkbyBzbywgaXQgd2lsbCBiZSBvZiBtb3JlIHByaWNlLAogICAgQmVpbmcgc3Bva2UgYmVoaW5kIHlvdXIgYmFjaywgdGhhbiB0byB5b3VyIGZhY2UuCgpQQVJJUwoKICAgIFBvb3Igc291bCwgdGh5IGZhY2UgaXMgbXVjaCBhYnVzZWQgd2l0aCB0ZWFycy4KCkpVTElFVAoKICAgIFRoZSB0ZWFycyBoYXZlIGdvdCBzbWFsbCB2aWN0b3J5IGJ5IHRoYXQ7CiAgICBGb3IgaXQgd2FzIGJhZCBlbm91Z2ggYmVmb3JlIHRoZWlyIHNwaXRlLgoKUEFSSVMKCiAgICBUaG91IHdyb25nJ3N0IGl0LCBtb3JlIHRoYW4gdGVhcnMsIHdpdGggdGhhdCByZXBvcnQuCgpKVUxJRVQKCiAgICBUaGF0IGlzIG5vIHNsYW5kZXIsIHNpciwgd2hpY2ggaXMgYSB0cnV0aDsKICAgIEFuZCB3aGF0IEkgc3Bha2UsIEkgc3Bha2UgaXQgdG8gbXkgZmFjZS4KClBBUklTCgogICAgVGh5IGZhY2UgaXMgbWluZSwgYW5kIHRob3UgaGFzdCBzbGFuZGVyJ2QgaXQuCgpKVUxJRVQKCiAgICBJdCBtYXkgYmUgc28sIGZvciBpdCBpcyBub3QgbWluZSBvd24uCiAgICBBcmUgeW91IGF0IGxlaXN1cmUsIGhvbHkgZmF0aGVyLCBub3c7CiAgICBPciBzaGFsbCBJIGNvbWUgdG8geW91IGF0IGV2ZW5pbmcgbWFzcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTXkgbGVpc3VyZSBzZXJ2ZXMgbWUsIHBlbnNpdmUgZGF1Z2h0ZXIsIG5vdy4KICAgIE15IGxvcmQsIHdlIG11c3QgZW50cmVhdCB0aGUgdGltZSBhbG9uZS4KClBBUklTCgogICAgR29kIHNoaWVsZCBJIHNob3VsZCBkaXN0dXJiIGRldm90aW9uIQogICAgSnVsaWV0LCBvbiBUaHVyc2RheSBlYXJseSB3aWxsIEkgcm91c2UgeWU6CiAgICBUaWxsIHRoZW4sIGFkaWV1OyBhbmQga2VlcCB0aGlzIGhvbHkga2lzcy4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIHNodXQgdGhlIGRvb3IhIGFuZCB3aGVuIHRob3UgaGFzdCBkb25lIHNvLAogICAgQ29tZSB3ZWVwIHdpdGggbWU7IHBhc3QgaG9wZSwgcGFzdCBjdXJlLCBwYXN0IGhlbHAhCgpGUklBUiBMQVVSRU5DRQoKICAgIEFoLCBKdWxpZXQsIEkgYWxyZWFkeSBrbm93IHRoeSBncmllZjsKICAgIEl0IHN0cmFpbnMgbWUgcGFzdCB0aGUgY29tcGFzcyBvZiBteSB3aXRzOgogICAgSSBoZWFyIHRob3UgbXVzdCwgYW5kIG5vdGhpbmcgbWF5IHByb3JvZ3VlIGl0LAogICAgT24gVGh1cnNkYXkgbmV4dCBiZSBtYXJyaWVkIHRvIHRoaXMgY291bnR5LgoKSlVMSUVUCgogICAgVGVsbCBtZSBub3QsIGZyaWFyLCB0aGF0IHRob3UgaGVhcidzdCBvZiB0aGlzLAogICAgVW5sZXNzIHRob3UgdGVsbCBtZSBob3cgSSBtYXkgcHJldmVudCBpdDoKICAgIElmLCBpbiB0aHkgd2lzZG9tLCB0aG91IGNhbnN0IGdpdmUgbm8gaGVscCwKICAgIERvIHRob3UgYnV0IGNhbGwgbXkgcmVzb2x1dGlvbiB3aXNlLAogICAgQW5kIHdpdGggdGhpcyBrbmlmZSBJJ2xsIGhlbHAgaXQgcHJlc2VudGx5LgogICAgR29kIGpvaW4nZCBteSBoZWFydCBhbmQgUm9tZW8ncywgdGhvdSBvdXIgaGFuZHM7CiAgICBBbmQgZXJlIHRoaXMgaGFuZCwgYnkgdGhlZSB0byBSb21lbyBzZWFsJ2QsCiAgICBTaGFsbCBiZSB0aGUgbGFiZWwgdG8gYW5vdGhlciBkZWVkLAogICAgT3IgbXkgdHJ1ZSBoZWFydCB3aXRoIHRyZWFjaGVyb3VzIHJldm9sdAogICAgVHVybiB0byBhbm90aGVyLCB0aGlzIHNoYWxsIHNsYXkgdGhlbSBib3RoOgogICAgVGhlcmVmb3JlLCBvdXQgb2YgdGh5IGxvbmctZXhwZXJpZW5jZWQgdGltZSwKICAgIEdpdmUgbWUgc29tZSBwcmVzZW50IGNvdW5zZWwsIG9yLCBiZWhvbGQsCiAgICAnVHdpeHQgbXkgZXh0cmVtZXMgYW5kIG1lIHRoaXMgYmxvb2R5IGtuaWZlCiAgICBTaGFsbCBwbGF5IHRoZSB1bXBpcmUsIGFyYml0cmF0aW5nIHRoYXQKICAgIFdoaWNoIHRoZSBjb21taXNzaW9uIG9mIHRoeSB5ZWFycyBhbmQgYXJ0CiAgICBDb3VsZCB0byBubyBpc3N1ZSBvZiB0cnVlIGhvbm91ciBicmluZy4KICAgIEJlIG5vdCBzbyBsb25nIHRvIHNwZWFrOyBJIGxvbmcgdG8gZGllLAogICAgSWYgd2hhdCB0aG91IHNwZWFrJ3N0IHNwZWFrIG5vdCBvZiByZW1lZHkuCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvbGQsIGRhdWdodGVyOiBJIGRvIHNweSBhIGtpbmQgb2YgaG9wZSwKICAgIFdoaWNoIGNyYXZlcyBhcyBkZXNwZXJhdGUgYW4gZXhlY3V0aW9uLgogICAgQXMgdGhhdCBpcyBkZXNwZXJhdGUgd2hpY2ggd2Ugd291bGQgcHJldmVudC4KICAgIElmLCByYXRoZXIgdGhhbiB0byBtYXJyeSBDb3VudHkgUGFyaXMsCiAgICBUaG91IGhhc3QgdGhlIHN0cmVuZ3RoIG9mIHdpbGwgdG8gc2xheSB0aHlzZWxmLAogICAgVGhlbiBpcyBpdCBsaWtlbHkgdGhvdSB3aWx0IHVuZGVydGFrZQogICAgQSB0aGluZyBsaWtlIGRlYXRoIHRvIGNoaWRlIGF3YXkgdGhpcyBzaGFtZSwKICAgIFRoYXQgY29wZXN0IHdpdGggZGVhdGggaGltc2VsZiB0byBzY2FwZSBmcm9tIGl0OgogICAgQW5kLCBpZiB0aG91IGRhcmVzdCwgSSdsbCBnaXZlIHRoZWUgcmVtZWR5LgoKSlVMSUVUCgogICAgTywgYmlkIG1lIGxlYXAsIHJhdGhlciB0aGFuIG1hcnJ5IFBhcmlzLAogICAgRnJvbSBvZmYgdGhlIGJhdHRsZW1lbnRzIG9mIHlvbmRlciB0b3dlcjsKICAgIE9yIHdhbGsgaW4gdGhpZXZpc2ggd2F5czsgb3IgYmlkIG1lIGx1cmsKICAgIFdoZXJlIHNlcnBlbnRzIGFyZTsgY2hhaW4gbWUgd2l0aCByb2FyaW5nIGJlYXJzOwogICAgT3Igc2h1dCBtZSBuaWdodGx5IGluIGEgY2hhcm5lbC1ob3VzZSwKICAgIE8nZXItY292ZXInZCBxdWl0ZSB3aXRoIGRlYWQgbWVuJ3MgcmF0dGxpbmcgYm9uZXMsCiAgICBXaXRoIHJlZWt5IHNoYW5rcyBhbmQgeWVsbG93IGNoYXBsZXNzIHNrdWxsczsKICAgIE9yIGJpZCBtZSBnbyBpbnRvIGEgbmV3LW1hZGUgZ3JhdmUKICAgIEFuZCBoaWRlIG1lIHdpdGggYSBkZWFkIG1hbiBpbiBoaXMgc2hyb3VkOwogICAgVGhpbmdzIHRoYXQsIHRvIGhlYXIgdGhlbSB0b2xkLCBoYXZlIG1hZGUgbWUgdHJlbWJsZTsKICAgIEFuZCBJIHdpbGwgZG8gaXQgd2l0aG91dCBmZWFyIG9yIGRvdWJ0LAogICAgVG8gbGl2ZSBhbiB1bnN0YWluJ2Qgd2lmZSB0byBteSBzd2VldCBsb3ZlLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIb2xkLCB0aGVuOyBnbyBob21lLCBiZSBtZXJyeSwgZ2l2ZSBjb25zZW50CiAgICBUbyBtYXJyeSBQYXJpczogV2VkbmVzZGF5IGlzIHRvLW1vcnJvdzoKICAgIFRvLW1vcnJvdyBuaWdodCBsb29rIHRoYXQgdGhvdSBsaWUgYWxvbmU7CiAgICBMZXQgbm90IHRoeSBudXJzZSBsaWUgd2l0aCB0aGVlIGluIHRoeSBjaGFtYmVyOgogICAgVGFrZSB0aG91IHRoaXMgdmlhbCwgYmVpbmcgdGhlbiBpbiBiZWQsCiAgICBBbmQgdGhpcyBkaXN0aWxsZWQgbGlxdW9yIGRyaW5rIHRob3Ugb2ZmOwogICAgV2hlbiBwcmVzZW50bHkgdGhyb3VnaCBhbGwgdGh5IHZlaW5zIHNoYWxsIHJ1bgogICAgQSBjb2xkIGFuZCBkcm93c3kgaHVtb3VyLCBmb3Igbm8gcHVsc2UKICAgIFNoYWxsIGtlZXAgaGlzIG5hdGl2ZSBwcm9ncmVzcywgYnV0IHN1cmNlYXNlOgogICAgTm8gd2FybXRoLCBubyBicmVhdGgsIHNoYWxsIHRlc3RpZnkgdGhvdSBsaXZlc3Q7CiAgICBUaGUgcm9zZXMgaW4gdGh5IGxpcHMgYW5kIGNoZWVrcyBzaGFsbCBmYWRlCiAgICBUbyBwYWx5IGFzaGVzLCB0aHkgZXllcycgd2luZG93cyBmYWxsLAogICAgTGlrZSBkZWF0aCwgd2hlbiBoZSBzaHV0cyB1cCB0aGUgZGF5IG9mIGxpZmU7CiAgICBFYWNoIHBhcnQsIGRlcHJpdmVkIG9mIHN1cHBsZSBnb3Zlcm5tZW50LAogICAgU2hhbGwsIHN0aWZmIGFuZCBzdGFyayBhbmQgY29sZCwgYXBwZWFyIGxpa2UgZGVhdGg6CiAgICBBbmQgaW4gdGhpcyBib3Jyb3cnZCBsaWtlbmVzcyBvZiBzaHJ1bmsgZGVhdGgKICAgIFRob3Ugc2hhbHQgY29udGludWUgdHdvIGFuZCBmb3J0eSBob3VycywKICAgIEFuZCB0aGVuIGF3YWtlIGFzIGZyb20gYSBwbGVhc2FudCBzbGVlcC4KICAgIE5vdywgd2hlbiB0aGUgYnJpZGVncm9vbSBpbiB0aGUgbW9ybmluZyBjb21lcwogICAgVG8gcm91c2UgdGhlZSBmcm9tIHRoeSBiZWQsIHRoZXJlIGFydCB0aG91IGRlYWQ6CiAgICBUaGVuLCBhcyB0aGUgbWFubmVyIG9mIG91ciBjb3VudHJ5IGlzLAogICAgSW4gdGh5IGJlc3Qgcm9iZXMgdW5jb3ZlcidkIG9uIHRoZSBiaWVyCiAgICBUaG91IHNoYWx0IGJlIGJvcm5lIHRvIHRoYXQgc2FtZSBhbmNpZW50IHZhdWx0CiAgICBXaGVyZSBhbGwgdGhlIGtpbmRyZWQgb2YgdGhlIENhcHVsZXRzIGxpZS4KICAgIEluIHRoZSBtZWFuIHRpbWUsIGFnYWluc3QgdGhvdSBzaGFsdCBhd2FrZSwKICAgIFNoYWxsIFJvbWVvIGJ5IG15IGxldHRlcnMga25vdyBvdXIgZHJpZnQsCiAgICBBbmQgaGl0aGVyIHNoYWxsIGhlIGNvbWU6IGFuZCBoZSBhbmQgSQogICAgV2lsbCB3YXRjaCB0aHkgd2FraW5nLCBhbmQgdGhhdCB2ZXJ5IG5pZ2h0CiAgICBTaGFsbCBSb21lbyBiZWFyIHRoZWUgaGVuY2UgdG8gTWFudHVhLgogICAgQW5kIHRoaXMgc2hhbGwgZnJlZSB0aGVlIGZyb20gdGhpcyBwcmVzZW50IHNoYW1lOwogICAgSWYgbm8gaW5jb25zdGFudCB0b3ksIG5vciB3b21hbmlzaCBmZWFyLAogICAgQWJhdGUgdGh5IHZhbG91ciBpbiB0aGUgYWN0aW5nIGl0LgoKSlVMSUVUCgogICAgR2l2ZSBtZSwgZ2l2ZSBtZSEgTywgdGVsbCBub3QgbWUgb2YgZmVhciEKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZDsgZ2V0IHlvdSBnb25lLCBiZSBzdHJvbmcgYW5kIHByb3NwZXJvdXMKICAgIEluIHRoaXMgcmVzb2x2ZTogSSdsbCBzZW5kIGEgZnJpYXIgd2l0aCBzcGVlZAogICAgVG8gTWFudHVhLCB3aXRoIG15IGxldHRlcnMgdG8gdGh5IGxvcmQuCgpKVUxJRVQKCiAgICBMb3ZlIGdpdmUgbWUgc3RyZW5ndGghIGFuZCBzdHJlbmd0aCBzaGFsbCBoZWxwIGFmZm9yZC4KICAgIEZhcmV3ZWxsLCBkZWFyIGZhdGhlciEKCiAgICBFeGV1bnQKClNDRU5FIElJLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIE51cnNlLCBhbmQgdHdvIFNlcnZpbmdtZW4gCgpDQVBVTEVUCgogICAgU28gbWFueSBndWVzdHMgaW52aXRlIGFzIGhlcmUgYXJlIHdyaXQuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGdvIGhpcmUgbWUgdHdlbnR5IGN1bm5pbmcgY29va3MuCgpTZWNvbmQgU2VydmFudAoKICAgIFlvdSBzaGFsbCBoYXZlIG5vbmUgaWxsLCBzaXI7IGZvciBJJ2xsIHRyeSBpZiB0aGV5CiAgICBjYW4gbGljayB0aGVpciBmaW5nZXJzLgoKQ0FQVUxFVAoKICAgIEhvdyBjYW5zdCB0aG91IHRyeSB0aGVtIHNvPwoKU2Vjb25kIFNlcnZhbnQKCiAgICBNYXJyeSwgc2lyLCAndGlzIGFuIGlsbCBjb29rIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBvd24gZmluZ2VyczogdGhlcmVmb3JlIGhlIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBmaW5nZXJzIGdvZXMgbm90IHdpdGggbWUuCgpDQVBVTEVUCgogICAgR28sIGJlIGdvbmUuCgogICAgRXhpdCBTZWNvbmQgU2VydmFudAogICAgV2Ugc2hhbGwgYmUgbXVjaCB1bmZ1cm5pc2hlZCBmb3IgdGhpcyB0aW1lLgogICAgV2hhdCwgaXMgbXkgZGF1Z2h0ZXIgZ29uZSB0byBGcmlhciBMYXVyZW5jZT8KCk51cnNlCgogICAgQXksIGZvcnNvb3RoLgoKQ0FQVUxFVAoKICAgIFdlbGwsIGhlIG1heSBjaGFuY2UgdG8gZG8gc29tZSBnb29kIG9uIGhlcjoKICAgIEEgcGVldmlzaCBzZWxmLXdpbGwnZCBoYXJsb3RyeSBpdCBpcy4KCk51cnNlCgogICAgU2VlIHdoZXJlIHNoZSBjb21lcyBmcm9tIHNocmlmdCB3aXRoIG1lcnJ5IGxvb2suCgogICAgRW50ZXIgSlVMSUVUCgpDQVBVTEVUCgogICAgSG93IG5vdywgbXkgaGVhZHN0cm9uZyEgd2hlcmUgaGF2ZSB5b3UgYmVlbiBnYWRkaW5nPwoKSlVMSUVUCgogICAgV2hlcmUgSSBoYXZlIGxlYXJuJ2QgbWUgdG8gcmVwZW50IHRoZSBzaW4KICAgIE9mIGRpc29iZWRpZW50IG9wcG9zaXRpb24KICAgIFRvIHlvdSBhbmQgeW91ciBiZWhlc3RzLCBhbmQgYW0gZW5qb2luJ2QKICAgIEJ5IGhvbHkgTGF1cmVuY2UgdG8gZmFsbCBwcm9zdHJhdGUgaGVyZSwKICAgIEFuZCBiZWcgeW91ciBwYXJkb246IHBhcmRvbiwgSSBiZXNlZWNoIHlvdSEKICAgIEhlbmNlZm9yd2FyZCBJIGFtIGV2ZXIgcnVsZWQgYnkgeW91LgoKQ0FQVUxFVAoKICAgIFNlbmQgZm9yIHRoZSBjb3VudHk7IGdvIHRlbGwgaGltIG9mIHRoaXM6CiAgICBJJ2xsIGhhdmUgdGhpcyBrbm90IGtuaXQgdXAgdG8tbW9ycm93IG1vcm5pbmcuCgpKVUxJRVQKCiAgICBJIG1ldCB0aGUgeW91dGhmdWwgbG9yZCBhdCBMYXVyZW5jZScgY2VsbDsKICAgIEFuZCBnYXZlIGhpbSB3aGF0IGJlY29tZWQgbG92ZSBJIG1pZ2h0LAogICAgTm90IHN0ZXAgbydlciB0aGUgYm91bmRzIG9mIG1vZGVzdHkuCgpDQVBVTEVUCgogICAgV2h5LCBJIGFtIGdsYWQgb24ndDsgdGhpcyBpcyB3ZWxsOiBzdGFuZCB1cDoKICAgIFRoaXMgaXMgYXMndCBzaG91bGQgYmUuIExldCBtZSBzZWUgdGhlIGNvdW50eTsKICAgIEF5LCBtYXJyeSwgZ28sIEkgc2F5LCBhbmQgZmV0Y2ggaGltIGhpdGhlci4KICAgIE5vdywgYWZvcmUgR29kISB0aGlzIHJldmVyZW5kIGhvbHkgZnJpYXIsCiAgICBPdXIgd2hvbGUgY2l0eSBpcyBtdWNoIGJvdW5kIHRvIGhpbS4KCkpVTElFVAoKICAgIE51cnNlLCB3aWxsIHlvdSBnbyB3aXRoIG1lIGludG8gbXkgY2xvc2V0LAogICAgVG8gaGVscCBtZSBzb3J0IHN1Y2ggbmVlZGZ1bCBvcm5hbWVudHMKICAgIEFzIHlvdSB0aGluayBmaXQgdG8gZnVybmlzaCBtZSB0by1tb3Jyb3cCgpMQURZIENBUFVMRVQKCiAgICBObywgbm90IHRpbGwgVGh1cnNkYXk7IHRoZXJlIGlzIHRpbWUgZW5vdWdoLgoKQ0FQVUxFVAoKICAgIEdvLCBudXJzZSwgZ28gd2l0aCBoZXI6IHdlJ2xsIHRvIGNodXJjaCB0by1tb3Jyb3cuCgogICAgRXhldW50IEpVTElFVCBhbmQgTnVyc2UKCkxBRFkgQ0FQVUxFVAoKICAgIFdlIHNoYWxsIGJlIHNob3J0IGluIG91ciBwcm92aXNpb246CiAgICAnVGlzIG5vdyBuZWFyIG5pZ2h0LgoKQ0FQVUxFVAoKICAgIFR1c2gsIEkgd2lsbCBzdGlyIGFib3V0LAogICAgQW5kIGFsbCB0aGluZ3Mgc2hhbGwgYmUgd2VsbCwgSSB3YXJyYW50IHRoZWUsIHdpZmU6CiAgICBHbyB0aG91IHRvIEp1bGlldCwgaGVscCB0byBkZWNrIHVwIGhlcjsKICAgIEknbGwgbm90IHRvIGJlZCB0by1uaWdodDsgbGV0IG1lIGFsb25lOwogICAgSSdsbCBwbGF5IHRoZSBob3VzZXdpZmUgZm9yIHRoaXMgb25jZS4gV2hhdCwgaG8hCiAgICBUaGV5IGFyZSBhbGwgZm9ydGguIFdlbGwsIEkgd2lsbCB3YWxrIG15c2VsZgogICAgVG8gQ291bnR5IFBhcmlzLCB0byBwcmVwYXJlIGhpbSB1cAogICAgQWdhaW5zdCB0by1tb3Jyb3c6IG15IGhlYXJ0IGlzIHdvbmRyb3VzIGxpZ2h0LAogICAgU2luY2UgdGhpcyBzYW1lIHdheXdhcmQgZ2lybCBpcyBzbyByZWNsYWltJ2QuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEp1bGlldCdzIGNoYW1iZXIuCgogICAgRW50ZXIgSlVMSUVUIGFuZCBOdXJzZSAKCkpVTElFVAoKICAgIEF5LCB0aG9zZSBhdHRpcmVzIGFyZSBiZXN0OiBidXQsIGdlbnRsZSBudXJzZSwKICAgIEkgcHJheSB0aGVlLCBsZWF2ZSBtZSB0byBteSBzZWxmIHRvLW5pZ2h0LAogICAgRm9yIEkgaGF2ZSBuZWVkIG9mIG1hbnkgb3Jpc29ucwogICAgVG8gbW92ZSB0aGUgaGVhdmVucyB0byBzbWlsZSB1cG9uIG15IHN0YXRlLAogICAgV2hpY2gsIHdlbGwgdGhvdSBrbm93J3N0LCBpcyBjcm9zcywgYW5kIGZ1bGwgb2Ygc2luLgoKICAgIEVudGVyIExBRFkgQ0FQVUxFVAoKTEFEWSBDQVBVTEVUCgogICAgV2hhdCwgYXJlIHlvdSBidXN5LCBobz8gbmVlZCB5b3UgbXkgaGVscD8KCkpVTElFVAoKICAgIE5vLCBtYWRhbTsgd2UgaGF2ZSBjdWxsJ2Qgc3VjaCBuZWNlc3NhcmllcwogICAgQXMgYXJlIGJlaG92ZWZ1bCBmb3Igb3VyIHN0YXRlIHRvLW1vcnJvdzoKICAgIFNvIHBsZWFzZSB5b3UsIGxldCBtZSBub3cgYmUgbGVmdCBhbG9uZSwKICAgIEFuZCBsZXQgdGhlIG51cnNlIHRoaXMgbmlnaHQgc2l0IHVwIHdpdGggeW91OwogICAgRm9yLCBJIGFtIHN1cmUsIHlvdSBoYXZlIHlvdXIgaGFuZHMgZnVsbCBhbGwsCiAgICBJbiB0aGlzIHNvIHN1ZGRlbiBidXNpbmVzcy4KCkxBRFkgQ0FQVUxFVAoKICAgIEdvb2QgbmlnaHQ6CiAgICBHZXQgdGhlZSB0byBiZWQsIGFuZCByZXN0OyBmb3IgdGhvdSBoYXN0IG5lZWQuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkpVTElFVAoKICAgIEZhcmV3ZWxsISBHb2Qga25vd3Mgd2hlbiB3ZSBzaGFsbCBtZWV0IGFnYWluLgogICAgSSBoYXZlIGEgZmFpbnQgY29sZCBmZWFyIHRocmlsbHMgdGhyb3VnaCBteSB2ZWlucywKICAgIFRoYXQgYWxtb3N0IGZyZWV6ZXMgdXAgdGhlIGhlYXQgb2YgbGlmZToKICAgIEknbGwgY2FsbCB0aGVtIGJhY2sgYWdhaW4gdG8gY29tZm9ydCBtZToKICAgIE51cnNlISBXaGF0IHNob3VsZCBzaGUgZG8gaGVyZT8KICAgIE15IGRpc21hbCBzY2VuZSBJIG5lZWRzIG11c3QgYWN0IGFsb25lLgogICAgQ29tZSwgdmlhbC4KICAgIFdoYXQgaWYgdGhpcyBtaXh0dXJlIGRvIG5vdCB3b3JrIGF0IGFsbD8KICAgIFNoYWxsIEkgYmUgbWFycmllZCB0aGVuIHRvLW1vcnJvdyBtb3JuaW5nPwogICAgTm8sIG5vOiB0aGlzIHNoYWxsIGZvcmJpZCBpdDogbGllIHRob3UgdGhlcmUuCgogICAgTGF5aW5nIGRvd24gaGVyIGRhZ2dlcgogICAgV2hhdCBpZiBpdCBiZSBhIHBvaXNvbiwgd2hpY2ggdGhlIGZyaWFyCiAgICBTdWJ0bHkgaGF0aCBtaW5pc3RlcidkIHRvIGhhdmUgbWUgZGVhZCwKICAgIExlc3QgaW4gdGhpcyBtYXJyaWFnZSBoZSBzaG91bGQgYmUgZGlzaG9ub3VyJ2QsCiAgICBCZWNhdXNlIGhlIG1hcnJpZWQgbWUgYmVmb3JlIHRvIFJvbWVvPwogICAgSSBmZWFyIGl0IGlzOiBhbmQgeWV0LCBtZXRoaW5rcywgaXQgc2hvdWxkIG5vdCwKICAgIEZvciBoZSBoYXRoIHN0aWxsIGJlZW4gdHJpZWQgYSBob2x5IG1hbi4KICAgIEhvdyBpZiwgd2hlbiBJIGFtIGxhaWQgaW50byB0aGUgdG9tYiwKICAgIEkgd2FrZSBiZWZvcmUgdGhlIHRpbWUgdGhhdCBSb21lbwogICAgQ29tZSB0byByZWRlZW0gbWUIHRoZXJlJ3MgYSBmZWFyZnVsIHBvaW50IQogICAgU2hhbGwgSSBub3QsIHRoZW4sIGJlIHN0aWZsZWQgaW4gdGhlIHZhdWx0LAogICAgVG8gd2hvc2UgZm91bCBtb3V0aCBubyBoZWFsdGhzb21lIGFpciBicmVhdGhlcyBpbiwKICAgIEFuZCB0aGVyZSBkaWUgc3RyYW5nbGVkIGVyZSBteSBSb21lbyBjb21lcz8KICAgIE9yLCBpZiBJIGxpdmUsIGlzIGl0IG5vdCB2ZXJ5IGxpa2UsCiAgICBUaGUgaG9ycmlibGUgY29uY2VpdCBvZiBkZWF0aCBhbmQgbmlnaHQsCiAgICBUb2dldGhlciB3aXRoIHRoZSB0ZXJyb3Igb2YgdGhlIHBsYWNlLC0tCiAgICBBcyBpbiBhIHZhdWx0LCBhbiBhbmNpZW50IHJlY2VwdGFjbGUsCiAgICBXaGVyZSwgZm9yIHRoZXNlIG1hbnkgaHVuZHJlZCB5ZWFycywgdGhlIGJvbmVzCiAgICBPZiBhbGwgbXkgYnVyaWVkIGFuY2VzdG9ycyBhcmUgcGFja2VkOgogICAgV2hlcmUgYmxvb2R5IFR5YmFsdCwgeWV0IGJ1dCBncmVlbiBpbiBlYXJ0aCwKICAgIExpZXMgZmVzdGVyaW5nIGluIGhpcyBzaHJvdWQ7IHdoZXJlLCBhcyB0aGV5IHNheSwKICAgIEF0IHNvbWUgaG91cnMgaW4gdGhlIG5pZ2h0IHNwaXJpdHMgcmVzb3J0Oy0tCiAgICBBbGFjaywgYWxhY2ssIGlzIGl0IG5vdCBsaWtlIHRoYXQgSSwKICAgIFNvIGVhcmx5IHdha2luZywgd2hhdCB3aXRoIGxvYXRoc29tZSBzbWVsbHMsCiAgICBBbmQgc2hyaWVrcyBsaWtlIG1hbmRyYWtlcycgdG9ybiBvdXQgb2YgdGhlIGVhcnRoLAogICAgVGhhdCBsaXZpbmcgbW9ydGFscywgaGVhcmluZyB0aGVtLCBydW4gbWFkOi0tCiAgICBPLCBpZiBJIHdha2UsIHNoYWxsIEkgbm90IGJlIGRpc3RyYXVnaHQsCiAgICBFbnZpcm9uZWQgd2l0aCBhbGwgdGhlc2UgaGlkZW91cyBmZWFycz8KICAgIEFuZCBtYWRseSBwbGF5IHdpdGggbXkgZm9yZWZhdGhlcidzIGpvaW50cz8KICAgIEFuZCBwbHVjayB0aGUgbWFuZ2xlZCBUeWJhbHQgZnJvbSBoaXMgc2hyb3VkPwogICAgQW5kLCBpbiB0aGlzIHJhZ2UsIHdpdGggc29tZSBncmVhdCBraW5zbWFuJ3MgYm9uZSwKICAgIEFzIHdpdGggYSBjbHViLCBkYXNoIG91dCBteSBkZXNwZXJhdGUgYnJhaW5zPwogICAgTywgbG9vayEgbWV0aGlua3MgSSBzZWUgbXkgY291c2luJ3MgZ2hvc3QKICAgIFNlZWtpbmcgb3V0IFJvbWVvLCB0aGF0IGRpZCBzcGl0IGhpcyBib2R5CiAgICBVcG9uIGEgcmFwaWVyJ3MgcG9pbnQ6IHN0YXksIFR5YmFsdCwgc3RheSEKICAgIFJvbWVvLCBJIGNvbWUhIHRoaXMgZG8gSSBkcmluayB0byB0aGVlLgoKICAgIFNoZSBmYWxscyB1cG9uIGhlciBiZWQsIHdpdGhpbiB0aGUgY3VydGFpbnMKClNDRU5FIElWLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgSG9sZCwgdGFrZSB0aGVzZSBrZXlzLCBhbmQgZmV0Y2ggbW9yZSBzcGljZXMsIG51cnNlLgoKTnVyc2UKCiAgICBUaGV5IGNhbGwgZm9yIGRhdGVzIGFuZCBxdWluY2VzIGluIHRoZSBwYXN0cnkuCgogICAgRW50ZXIgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIENvbWUsIHN0aXIsIHN0aXIsIHN0aXIhIHRoZSBzZWNvbmQgY29jayBoYXRoIGNyb3cnZCwKICAgIFRoZSBjdXJmZXctYmVsbCBoYXRoIHJ1bmcsICd0aXMgdGhyZWUgbydjbG9jazoKICAgIExvb2sgdG8gdGhlIGJha2VkIG1lYXRzLCBnb29kIEFuZ2VsaWNhOgogICAgU3BhcmUgbm90IGZvciB0aGUgY29zdC4KCk51cnNlCgogICAgR28sIHlvdSBjb3QtcXVlYW4sIGdvLAogICAgR2V0IHlvdSB0byBiZWQ7IGZhaXRoLCBZb3UnbGwgYmUgc2ljayB0by1tb3Jyb3cKICAgIEZvciB0aGlzIG5pZ2h0J3Mgd2F0Y2hpbmcuCgpDQVBVTEVUCgogICAgTm8sIG5vdCBhIHdoaXQ6IHdoYXQhIEkgaGF2ZSB3YXRjaCdkIGVyZSBub3cKICAgIEFsbCBuaWdodCBmb3IgbGVzc2VyIGNhdXNlLCBhbmQgbmUnZXIgYmVlbiBzaWNrLgoKTEFEWSBDQVBVTEVUCgogICAgQXksIHlvdSBoYXZlIGJlZW4gYSBtb3VzZS1odW50IGluIHlvdXIgdGltZTsKICAgIEJ1dCBJIHdpbGwgd2F0Y2ggeW91IGZyb20gc3VjaCB3YXRjaGluZyBub3cuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBBIGplYWxvdXMgaG9vZCwgYSBqZWFsb3VzIGhvb2QhCgogICAgRW50ZXIgdGhyZWUgb3IgZm91ciBTZXJ2aW5nbWVuLCB3aXRoIHNwaXRzLCBsb2dzLCBhbmQgYmFza2V0cwogICAgTm93LCBmZWxsb3csCiAgICBXaGF0J3MgdGhlcmUCgpGaXJzdCBTZXJ2YW50CgogICAgVGhpbmdzIGZvciB0aGUgY29vaywgc2lyOyBidXQgSSBrbm93IG5vdCB3aGF0LgoKQ0FQVUxFVAoKICAgIE1ha2UgaGFzdGUsIG1ha2UgaGFzdGUuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGZldGNoIGRyaWVyIGxvZ3M6CiAgICBDYWxsIFBldGVyLCBoZSB3aWxsIHNob3cgdGhlZSB3aGVyZSB0aGV5IGFyZS4KClNlY29uZCBTZXJ2YW50CgogICAgSSBoYXZlIGEgaGVhZCwgc2lyLCB0aGF0IHdpbGwgZmluZCBvdXQgbG9ncywKICAgIEFuZCBuZXZlciB0cm91YmxlIFBldGVyIGZvciB0aGUgbWF0dGVyLgoKICAgIEV4aXQKCkNBUFVMRVQKCiAgICBNYXNzLCBhbmQgd2VsbCBzYWlkOyBhIG1lcnJ5IHdob3Jlc29uLCBoYSEKICAgIFRob3Ugc2hhbHQgYmUgbG9nZ2VyLWhlYWQuIEdvb2QgZmFpdGgsICd0aXMgZGF5OgogICAgVGhlIGNvdW50eSB3aWxsIGJlIGhlcmUgd2l0aCBtdXNpYyBzdHJhaWdodCwKICAgIEZvciBzbyBoZSBzYWlkIGhlIHdvdWxkOiBJIGhlYXIgaGltIG5lYXIuCgogICAgTXVzaWMgd2l0aGluCiAgICBOdXJzZSEgV2lmZSEgV2hhdCwgaG8hIFdoYXQsIG51cnNlLCBJIHNheSEKCiAgICBSZS1lbnRlciBOdXJzZQogICAgR28gd2FrZW4gSnVsaWV0LCBnbyBhbmQgdHJpbSBoZXIgdXA7CiAgICBJJ2xsIGdvIGFuZCBjaGF0IHdpdGggUGFyaXM6IGhpZSwgbWFrZSBoYXN0ZSwKICAgIE1ha2UgaGFzdGU7IHRoZSBicmlkZWdyb29tIGhlIGlzIGNvbWUgYWxyZWFkeToKICAgIE1ha2UgaGFzdGUsIEkgc2F5LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gSnVsaWV0J3MgY2hhbWJlci4KCiAgICBFbnRlciBOdXJzZSAKCk51cnNlCgogICAgTWlzdHJlc3MhIHdoYXQsIG1pc3RyZXNzISBKdWxpZXQhIGZhc3QsIEkgd2FycmFudCBoZXIsIHNoZToKICAgIFdoeSwgbGFtYiEgd2h5LCBsYWR5ISBmaWUsIHlvdSBzbHVnLWEtYmVkIQogICAgV2h5LCBsb3ZlLCBJIHNheSEgbWFkYW0hIHN3ZWV0LWhlYXJ0ISB3aHksIGJyaWRlIQogICAgV2hhdCwgbm90IGEgd29yZD8geW91IHRha2UgeW91ciBwZW5ueXdvcnRocyBub3c7CiAgICBTbGVlcCBmb3IgYSB3ZWVrOyBmb3IgdGhlIG5leHQgbmlnaHQsIEkgd2FycmFudCwKICAgIFRoZSBDb3VudHkgUGFyaXMgaGF0aCBzZXQgdXAgaGlzIHJlc3QsCiAgICBUaGF0IHlvdSBzaGFsbCByZXN0IGJ1dCBsaXR0bGUuIEdvZCBmb3JnaXZlIG1lLAogICAgTWFycnksIGFuZCBhbWVuLCBob3cgc291bmQgaXMgc2hlIGFzbGVlcCEKICAgIEkgbXVzdCBuZWVkcyB3YWtlIGhlci4gTWFkYW0sIG1hZGFtLCBtYWRhbSEKICAgIEF5LCBsZXQgdGhlIGNvdW50eSB0YWtlIHlvdSBpbiB5b3VyIGJlZDsKICAgIEhlJ2xsIGZyaWdodCB5b3UgdXAsIGknIGZhaXRoLiBXaWxsIGl0IG5vdCBiZT8KCiAgICBVbmRyYXdzIHRoZSBjdXJ0YWlucwogICAgV2hhdCwgZHJlc3MnZCEgYW5kIGluIHlvdXIgY2xvdGhlcyEgYW5kIGRvd24gYWdhaW4hCiAgICBJIG11c3QgbmVlZHMgd2FrZSB5b3U7IExhZHkhIGxhZHkhIGxhZHkhCiAgICBBbGFzLCBhbGFzISBIZWxwLCBoZWxwISBteSBsYWR5J3MgZGVhZCEKICAgIE8sIHdlbGwtYS1kYXksIHRoYXQgZXZlciBJIHdhcyBib3JuIQogICAgU29tZSBhcXVhIHZpdGFlLCBobyEgTXkgbG9yZCEgbXkgbGFkeSEKCiAgICBFbnRlciBMQURZIENBUFVMRVQKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgaGVyZT8KCk51cnNlCgogICAgTyBsYW1lbnRhYmxlIGRheSEKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgaXMgdGhlIG1hdHRlcj8KCk51cnNlCgogICAgTG9vaywgbG9vayEgTyBoZWF2eSBkYXkhCgpMQURZIENBUFVMRVQKCiAgICBPIG1lLCBPIG1lISBNeSBjaGlsZCwgbXkgb25seSBsaWZlLAogICAgUmV2aXZlLCBsb29rIHVwLCBvciBJIHdpbGwgZGllIHdpdGggdGhlZSEKICAgIEhlbHAsIGhlbHAhIENhbGwgaGVscC4KCiAgICBFbnRlciBDQVBVTEVUCgpDQVBVTEVUCgogICAgRm9yIHNoYW1lLCBicmluZyBKdWxpZXQgZm9ydGg7IGhlciBsb3JkIGlzIGNvbWUuCgpOdXJzZQoKICAgIFNoZSdzIGRlYWQsIGRlY2Vhc2VkLCBzaGUncyBkZWFkOyBhbGFjayB0aGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgQWxhY2sgdGhlIGRheSwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCEKCkNBUFVMRVQKCiAgICBIYSEgbGV0IG1lIHNlZSBoZXI6IG91dCwgYWxhcyEgc2hlJ3MgY29sZDoKICAgIEhlciBibG9vZCBpcyBzZXR0bGVkLCBhbmQgaGVyIGpvaW50cyBhcmUgc3RpZmY7CiAgICBMaWZlIGFuZCB0aGVzZSBsaXBzIGhhdmUgbG9uZyBiZWVuIHNlcGFyYXRlZDoKICAgIERlYXRoIGxpZXMgb24gaGVyIGxpa2UgYW4gdW50aW1lbHkgZnJvc3QKICAgIFVwb24gdGhlIHN3ZWV0ZXN0IGZsb3dlciBvZiBhbGwgdGhlIGZpZWxkLgoKTnVyc2UKCiAgICBPIGxhbWVudGFibGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgTyB3b2Z1bCB0aW1lIQoKQ0FQVUxFVAoKICAgIERlYXRoLCB0aGF0IGhhdGggdGEnZW4gaGVyIGhlbmNlIHRvIG1ha2UgbWUgd2FpbCwKICAgIFRpZXMgdXAgbXkgdG9uZ3VlLCBhbmQgd2lsbCBub3QgbGV0IG1lIHNwZWFrLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUywgd2l0aCBNdXNpY2lhbnMKCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgaXMgdGhlIGJyaWRlIHJlYWR5IHRvIGdvIHRvIGNodXJjaD8KCkNBUFVMRVQKCiAgICBSZWFkeSB0byBnbywgYnV0IG5ldmVyIHRvIHJldHVybi4KICAgIE8gc29uISB0aGUgbmlnaHQgYmVmb3JlIHRoeSB3ZWRkaW5nLWRheQogICAgSGF0aCBEZWF0aCBsYWluIHdpdGggdGh5IHdpZmUuIFRoZXJlIHNoZSBsaWVzLAogICAgRmxvd2VyIGFzIHNoZSB3YXMsIGRlZmxvd2VyZWQgYnkgaGltLgogICAgRGVhdGggaXMgbXkgc29uLWluLWxhdywgRGVhdGggaXMgbXkgaGVpcjsKICAgIE15IGRhdWdodGVyIGhlIGhhdGggd2VkZGVkOiBJIHdpbGwgZGllLAogICAgQW5kIGxlYXZlIGhpbSBhbGw7IGxpZmUsIGxpdmluZywgYWxsIGlzIERlYXRoJ3MuCgpQQVJJUwoKICAgIEhhdmUgSSB0aG91Z2h0IGxvbmcgdG8gc2VlIHRoaXMgbW9ybmluZydzIGZhY2UsCiAgICBBbmQgZG90aCBpdCBnaXZlIG1lIHN1Y2ggYSBzaWdodCBhcyB0aGlzPwoKTEFEWSBDQVBVTEVUCgogICAgQWNjdXJzZWQsIHVuaGFwcHksIHdyZXRjaGVkLCBoYXRlZnVsIGRheSEKICAgIE1vc3QgbWlzZXJhYmxlIGhvdXIgdGhhdCBlJ2VyIHRpbWUgc2F3CiAgICBJbiBsYXN0aW5nIGxhYm91ciBvZiBoaXMgcGlsZ3JpbWFnZSEKICAgIEJ1dCBvbmUsIHBvb3Igb25lLCBvbmUgcG9vciBhbmQgbG92aW5nIGNoaWxkLAogICAgQnV0IG9uZSB0aGluZyB0byByZWpvaWNlIGFuZCBzb2xhY2UgaW4sCiAgICBBbmQgY3J1ZWwgZGVhdGggaGF0aCBjYXRjaCdkIGl0IGZyb20gbXkgc2lnaHQhCgpOdXJzZQoKICAgIE8gd29lISBPIHdvZnVsLCB3b2Z1bCwgd29mdWwgZGF5IQogICAgTW9zdCBsYW1lbnRhYmxlIGRheSwgbW9zdCB3b2Z1bCBkYXksCiAgICBUaGF0IGV2ZXIsIGV2ZXIsIEkgZGlkIHlldCBiZWhvbGQhCiAgICBPIGRheSEgTyBkYXkhIE8gZGF5ISBPIGhhdGVmdWwgZGF5IQogICAgTmV2ZXIgd2FzIHNlZW4gc28gYmxhY2sgYSBkYXkgYXMgdGhpczoKICAgIE8gd29mdWwgZGF5LCBPIHdvZnVsIGRheSEKClBBUklTCgogICAgQmVndWlsZWQsIGRpdm9yY2VkLCB3cm9uZ2VkLCBzcGl0ZWQsIHNsYWluIQogICAgTW9zdCBkZXRlc3RhYmxlIGRlYXRoLCBieSB0aGVlIGJlZ3VpbCdkLAogICAgQnkgY3J1ZWwgY3J1ZWwgdGhlZSBxdWl0ZSBvdmVydGhyb3duIQogICAgTyBsb3ZlISBPIGxpZmUhIG5vdCBsaWZlLCBidXQgbG92ZSBpbiBkZWF0aCEKCkNBUFVMRVQKCiAgICBEZXNwaXNlZCwgZGlzdHJlc3NlZCwgaGF0ZWQsIG1hcnR5cidkLCBraWxsJ2QhCiAgICBVbmNvbWZvcnRhYmxlIHRpbWUsIHdoeSBjYW1lc3QgdGhvdSBub3cKICAgIFRvIG11cmRlciwgbXVyZGVyIG91ciBzb2xlbW5pdHkCiAgICBPIGNoaWxkISBPIGNoaWxkISBteSBzb3VsLCBhbmQgbm90IG15IGNoaWxkIQogICAgRGVhZCBhcnQgdGhvdSEgQWxhY2shIG15IGNoaWxkIGlzIGRlYWQ7CiAgICBBbmQgd2l0aCBteSBjaGlsZCBteSBqb3lzIGFyZSBidXJpZWQuCgpGUklBUiBMQVVSRU5DRQoKICAgIFBlYWNlLCBobywgZm9yIHNoYW1lISBjb25mdXNpb24ncyBjdXJlIGxpdmVzIG5vdAogICAgSW4gdGhlc2UgY29uZnVzaW9ucy4gSGVhdmVuIGFuZCB5b3Vyc2VsZgogICAgSGFkIHBhcnQgaW4gdGhpcyBmYWlyIG1haWQ7IG5vdyBoZWF2ZW4gaGF0aCBhbGwsCiAgICBBbmQgYWxsIHRoZSBiZXR0ZXIgaXMgaXQgZm9yIHRoZSBtYWlkOgogICAgWW91ciBwYXJ0IGluIGhlciB5b3UgY291bGQgbm90IGtlZXAgZnJvbSBkZWF0aCwKICAgIEJ1dCBoZWF2ZW4ga2VlcHMgaGlzIHBhcnQgaW4gZXRlcm5hbCBsaWZlLgogICAgVGhlIG1vc3QgeW91IHNvdWdodCB3YXMgaGVyIHByb21vdGlvbjsKICAgIEZvciAndHdhcyB5b3VyIGhlYXZlbiBzaGUgc2hvdWxkIGJlIGFkdmFuY2VkOgogICAgQW5kIHdlZXAgeWUgbm93LCBzZWVpbmcgc2hlIGlzIGFkdmFuY2VkCiAgICBBYm92ZSB0aGUgY2xvdWRzLCBhcyBoaWdoIGFzIGhlYXZlbiBpdHNlbGYCiAgICBPLCBpbiB0aGlzIGxvdmUsIHlvdSBsb3ZlIHlvdXIgY2hpbGQgc28gaWxsLAogICAgVGhhdCB5b3UgcnVuIG1hZCwgc2VlaW5nIHRoYXQgc2hlIGlzIHdlbGw6CiAgICBTaGUncyBub3Qgd2VsbCBtYXJyaWVkIHRoYXQgbGl2ZXMgbWFycmllZCBsb25nOwogICAgQnV0IHNoZSdzIGJlc3QgbWFycmllZCB0aGF0IGRpZXMgbWFycmllZCB5b3VuZy4KICAgIERyeSB1cCB5b3VyIHRlYXJzLCBhbmQgc3RpY2sgeW91ciByb3NlbWFyeQogICAgT24gdGhpcyBmYWlyIGNvcnNlOyBhbmQsIGFzIHRoZSBjdXN0b20gaXMsCiAgICBJbiBhbGwgaGVyIGJlc3QgYXJyYXkgYmVhciBoZXIgdG8gY2h1cmNoOgogICAgRm9yIHRob3VnaCBmb25kIG5hdHVyZSBiaWRzIHVzIGFuIGxhbWVudCwKICAgIFlldCBuYXR1cmUncyB0ZWFycyBhcmUgcmVhc29uJ3MgbWVycmltZW50LgoKQ0FQVUxFVAoKICAgIEFsbCB0aGluZ3MgdGhhdCB3ZSBvcmRhaW5lZCBmZXN0aXZhbCwKICAgIFR1cm4gZnJvbSB0aGVpciBvZmZpY2UgdG8gYmxhY2sgZnVuZXJhbDsKICAgIE91ciBpbnN0cnVtZW50cyB0byBtZWxhbmNob2x5IGJlbGxzLAogICAgT3VyIHdlZGRpbmcgY2hlZXIgdG8gYSBzYWQgYnVyaWFsIGZlYXN0LAogICAgT3VyIHNvbGVtbiBoeW1ucyB0byBzdWxsZW4gZGlyZ2VzIGNoYW5nZSwKICAgIE91ciBicmlkYWwgZmxvd2VycyBzZXJ2ZSBmb3IgYSBidXJpZWQgY29yc2UsCiAgICBBbmQgYWxsIHRoaW5ncyBjaGFuZ2UgdGhlbSB0byB0aGUgY29udHJhcnkuCgpGUklBUiBMQVVSRU5DRQoKICAgIFNpciwgZ28geW91IGluOyBhbmQsIG1hZGFtLCBnbyB3aXRoIGhpbTsKICAgIEFuZCBnbywgU2lyIFBhcmlzOyBldmVyeSBvbmUgcHJlcGFyZQogICAgVG8gZm9sbG93IHRoaXMgZmFpciBjb3JzZSB1bnRvIGhlciBncmF2ZToKICAgIFRoZSBoZWF2ZW5zIGRvIGxvdXIgdXBvbiB5b3UgZm9yIHNvbWUgaWxsOwogICAgTW92ZSB0aGVtIG5vIG1vcmUgYnkgY3Jvc3NpbmcgdGhlaXIgaGlnaCB3aWxsLgoKICAgIEV4ZXVudCBDQVBVTEVULCBMQURZIENBUFVMRVQsIFBBUklTLCBhbmQgRlJJQVIgTEFVUkVOQ0UKCkZpcnN0IE11c2ljaWFuCgogICAgRmFpdGgsIHdlIG1heSBwdXQgdXAgb3VyIHBpcGVzLCBhbmQgYmUgZ29uZS4KCk51cnNlCgogICAgSG9uZXN0IGdvb2RmZWxsb3dzLCBhaCwgcHV0IHVwLCBwdXQgdXA7CiAgICBGb3IsIHdlbGwgeW91IGtub3csIHRoaXMgaXMgYSBwaXRpZnVsIGNhc2UuCgogICAgRXhpdAoKRmlyc3QgTXVzaWNpYW4KCiAgICBBeSwgYnkgbXkgdHJvdGgsIHRoZSBjYXNlIG1heSBiZSBhbWVuZGVkLgoKICAgIEVudGVyIFBFVEVSCgpQRVRFUgoKICAgIE11c2ljaWFucywgTywgbXVzaWNpYW5zLCAnSGVhcnQncyBlYXNlLCBIZWFydCdzCiAgICBlYXNlOicgTywgYW4geW91IHdpbGwgaGF2ZSBtZSBsaXZlLCBwbGF5ICdIZWFydCdzIGVhc2UuJwoKRmlyc3QgTXVzaWNpYW4KCiAgICBXaHkgJ0hlYXJ0J3MgZWFzZT8nCgpQRVRFUgoKICAgIE8sIG11c2ljaWFucywgYmVjYXVzZSBteSBoZWFydCBpdHNlbGYgcGxheXMgJ015CiAgICBoZWFydCBpcyBmdWxsIG9mIHdvZTonIE8sIHBsYXkgbWUgc29tZSBtZXJyeSBkdW1wLAogICAgdG8gY29tZm9ydCBtZS4KCkZpcnN0IE11c2ljaWFuCgogICAgTm90IGEgZHVtcCB3ZTsgJ3RpcyBubyB0aW1lIHRvIHBsYXkgbm93LgoKUEVURVIKCiAgICBZb3Ugd2lsbCBub3QsIHRoZW4CgpGaXJzdCBNdXNp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Rocm9uZTsKICAgIEFuZCBhbGwgdGhpcyBkYXkgYW4gdW5hY2N1c3RvbSdkIHNwaXJpdAogICAgTGlmdHMgbWUgYWJvdmUgdGhlIGdyb3VuZCB3aXRoIGNoZWVyZnVsIHRob3VnaHRzLgogICAgSSBkcmVhbXQgbXkgbGFkeSBjYW1lIGFuZCBmb3VuZCBtZSBkZWFkLS0KICAgIFN0cmFuZ2UgZHJlYW0sIHRoYXQgZ2l2ZXMgYSBkZWFkIG1hbiBsZWF2ZQogICAgdG8gdGhpbmshLS0KICAgIEFuZCBicmVhdGhlZCBzdWNoIGxpZmUgd2l0aCBraXNzZXMgaW4gbXkgbGlwcywKICAgIFRoYXQgSSByZXZpdmVkLCBhbmQgd2FzIGFuIGVtcGVyb3IuCiAgICBBaCBtZSEgaG93IHN3ZWV0IGlzIGxvdmUgaXRzZWxmIHBvc3Nlc3MnZCwKICAgIFdoZW4gYnV0IGxvdmUncyBzaGFkb3dzIGFyZSBzbyByaWNoIGluIGpveSEKCiAgICBFbnRlciBCQUxUSEFTQVIsIGJvb3RlZAogICAgTmV3cyBmcm9tIFZlcm9uYSEtLUhvdyBub3csIEJhbHRoYXNhciEKICAgIERvc3QgdGhvdSBub3QgYnJpbmcgbWUgbGV0dGVycyBmcm9tIHRoZSBmcmlhcj8KICAgIEhvdyBkb3RoIG15IGxhZHkIElzIG15IGZhdGhlciB3ZWxsPwogICAgSG93IGZhcmVzIG15IEp1bGlldD8gdGhhdCBJIGFzayBhZ2FpbjsKICAgIEZvciBub3RoaW5nIGNhbiBiZSBpbGwsIGlmIHNoZSBiZSB3ZWxsLgoKQkFMVEhBU0FSCgogICAgVGhlbiBzaGUgaXMgd2VsbCwgYW5kIG5vdGhpbmcgY2FuIGJlIGlsbDoKICAgIEhlciBib2R5IHNsZWVwcyBpbiBDYXBlbCdzIG1vbnVtZW50LAogICAgQW5kIGhlciBpbW1vcnRhbCBwYXJ0IHdpdGggYW5nZWxzIGxpdmVzLgogICAgSSBzYXcgaGVyIGxhaWQgbG93IGluIGhlciBraW5kcmVkJ3MgdmF1bHQsCiAgICBBbmQgcHJlc2VudGx5IHRvb2sgcG9zdCB0byB0ZWxsIGl0IHlvdToKICAgIE8sIHBhcmRvbiBtZSBmb3IgYnJpbmdpbmcgdGhlc2UgaWxsIG5ld3MsCiAgICBTaW5jZSB5b3UgZGlkIGxlYXZlIGl0IGZvciBteSBvZmZpY2UsIHNpci4KClJPTUVPCgogICAgSXMgaXQgZXZlbiBzbz8gdGhlbiBJIGRlZnkgeW91LCBzdGFycyEKICAgIFRob3Uga25vdydzdCBteSBsb2RnaW5nOiBnZXQgbWUgaW5rIGFuZCBwYXBlciwKICAgIEFuZCBoaXJlIHBvc3QtaG9yc2VzOyBJIHdpbGwgaGVuY2UgdG8tbmlnaHQuCgpCQUxUSEFTQVIKCiAgICBJIGRvIGJlc2VlY2ggeW91LCBzaXIsIGhhdmUgcGF0aWVuY2U6CiAgICBZb3VyIGxvb2tzIGFyZSBwYWxlIGFuZCB3aWxkLCBhbmQgZG8gaW1wb3J0CiAgICBTb21lIG1pc2FkdmVudHVyZS4KClJPTUVPCgogICAgVHVzaCwgdGhvdSBhcnQgZGVjZWl2ZWQ6CiAgICBMZWF2ZSBtZSwgYW5kIGRvIHRoZSB0aGluZyBJIGJpZCB0aGVlIGRvLgogICAgSGFzdCB0aG91IG5vIGxldHRlcnMgdG8gbWUgZnJvbSB0aGUgZnJpYXICgpCQUxUSEFTQVIKCiAgICBObywgbXkgZ29vZCBsb3JkLgoKUk9NRU8KCiAgICBObyBtYXR0ZXI6IGdldCB0aGVlIGdvbmUsCiAgICBBbmQgaGlyZSB0aG9zZSBob3JzZXM7IEknbGwgYmUgd2l0aCB0aGVlIHN0cmFpZ2h0LgoKICAgIEV4aXQgQkFMVEhBU0FSCiAgICBXZWxsLCBKdWxpZXQsIEkgd2lsbCBsaWUgd2l0aCB0aGVlIHRvLW5pZ2h0LgogICAgTGV0J3Mgc2VlIGZvciBtZWFuczogTyBtaXNjaGllZiwgdGhvdSBhcnQgc3dpZnQKICAgIFRvIGVudGVyIGluIHRoZSB0aG91Z2h0cyBvZiBkZXNwZXJhdGUgbWVuIQogICAgSSBkbyByZW1lbWJlciBhbiBhcG90aGVjYXJ5LC0tCiAgICBBbmQgaGVyZWFib3V0cyBoZSBkd2VsbHMsLS13aGljaCBsYXRlIEkgbm90ZWQKICAgIEluIHRhdHRlcidkIHdlZWRzLCB3aXRoIG92ZXJ3aGVsbWluZyBicm93cywKICAgIEN1bGxpbmcgb2Ygc2ltcGxlczsgbWVhZ3JlIHdlcmUgaGlzIGxvb2tzLAogICAgU2hhcnAgbWlzZXJ5IGhhZCB3b3JuIGhpbSB0byB0aGUgYm9uZXM6CiAgICBBbmQgaW4gaGlzIG5lZWR5IHNob3AgYSB0b3J0b2lzZSBodW5nLAogICAgQW4gYWxsaWdhdG9yIHN0dWZmJ2QsIGFuZCBvdGhlciBza2lucwogICAgT2YgaWxsLXNoYXBlZCBmaXNoZXM7IGFuZCBhYm91dCBoaXMgc2hlbHZlcwogICAgQSBiZWdnYXJseSBhY2NvdW50IG9mIGVtcHR5IGJveGVzLAogICAgR3JlZW4gZWFydGhlbiBwb3RzLCBibGFkZGVycyBhbmQgbXVzdHkgc2VlZHMsCiAgICBSZW1uYW50cyBvZiBwYWNrdGhyZWFkIGFuZCBvbGQgY2FrZXMgb2Ygcm9zZXMsCiAgICBXZXJlIHRoaW5seSBzY2F0dGVyJ2QsIHRvIG1ha2UgdXAgYSBzaG93LgogICAgTm90aW5nIHRoaXMgcGVudXJ5LCB0byBteXNlbGYgSSBzYWlkCiAgICAnQW4gaWYgYSBtYW4gZGlkIG5lZWQgYSBwb2lzb24gbm93LAogICAgV2hvc2Ugc2FsZSBpcyBwcmVzZW50IGRlYXRoIGluIE1hbnR1YSwKICAgIEhlcmUgbGl2ZXMgYSBjYWl0aWZmIHdyZXRjaCB3b3VsZCBzZWxsIGl0IGhpbS4nCiAgICBPLCB0aGlzIHNhbWUgdGhvdWdodCBkaWQgYnV0IGZvcmVydW4gbXkgbmVlZDsKICAgIEFuZCB0aGlzIHNhbWUgbmVlZHkgbWFuIG11c3Qgc2VsbCBpdCBtZS4KICAgIEFzIEkgcmVtZW1iZXIsIHRoaXMgc2hvdWxkIGJlIHRoZSBob3VzZS4KICAgIEJlaW5nIGhvbGlkYXksIHRoZSBiZWdnYXIncyBzaG9wIGlzIHNodXQuCiAgICBXaGF0LCBobyEgYXBvdGhlY2FyeSEKCiAgICBFbnRlciBBcG90aGVjYXJ5CgpBcG90aGVjYXJ5CgogICAgV2hvIGNhbGxzIHNvIGxvdWQCgpST01FTwoKICAgIENvbWUgaGl0aGVyLCBtYW4uIEkgc2VlIHRoYXQgdGhvdSBhcnQgcG9vcjoKICAgIEhvbGQsIHRoZXJlIGlzIGZvcnR5IGR1Y2F0czogbGV0IG1lIGhhdmUKICAgIEEgZHJhbSBvZiBwb2lzb24sIHN1Y2ggc29vbi1zcGVlZGluZyBnZWFyCiAgICBBcyB3aWxsIGRpc3BlcnNlIGl0c2VsZiB0aHJvdWdoIGFsbCB0aGUgdmVpbnMKICAgIFRoYXQgdGhlIGxpZmUtd2VhcnkgdGFrZXIgbWF5IGZhbGwgZGVhZAogICAgQW5kIHRoYXQgdGhlIHRydW5rIG1heSBiZSBkaXNjaGFyZ2VkIG9mIGJyZWF0aAogICAgQXMgdmlvbGVudGx5IGFzIGhhc3R5IHBvd2RlciBmaXJlZAogICAgRG90aCBodXJyeSBmcm9tIHRoZSBmYXRhbCBjYW5ub24ncyB3b21iLgoKQXBvdGhlY2FyeQoKICAgIFN1Y2ggbW9ydGFsIGRydWdzIEkgaGF2ZTsgYnV0IE1hbnR1YSdzIGxhdwogICAgSXMgZGVhdGggdG8gYW55IGhlIHRoYXQgdXR0ZXJzIHRoZW0uCgpST01FTwoKICAgIEFydCB0aG91IHNvIGJhcmUgYW5kIGZ1bGwgb2Ygd3JldGNoZWRuZXNzLAogICAgQW5kIGZlYXInc3QgdG8gZGllPyBmYW1pbmUgaXMgaW4gdGh5IGNoZWVrcywKICAgIE5lZWQgYW5kIG9wcHJlc3Npb24gc3RhcnZldGggaW4gdGhpbmUgZXllcywKICAgIENvbnRlbXB0IGFuZCBiZWdnYXJ5IGhhbmdzIHVwb24gdGh5IGJhY2s7CiAgICBUaGUgd29ybGQgaXMgbm90IHRoeSBmcmllbmQgbm9yIHRoZSB3b3JsZCdzIGxhdzsKICAgIFRoZSB3b3JsZCBhZmZvcmRzIG5vIGxhdyB0byBtYWtlIHRoZWUgcmljaDsKICAgIFRoZW4gYmUgbm90IHBvb3IsIGJ1dCBicmVhayBpdCwgYW5kIHRha2UgdGhpcy4KCkFwb3RoZWNhcnkKCiAgICBNeSBwb3ZlcnR5LCBidXQgbm90IG15IHdpbGwsIGNvbnNlbnRzLgoKUk9NRU8KCiAgICBJIHBheSB0aHkgcG92ZXJ0eSwgYW5kIG5vdCB0aHkgd2lsbC4KCkFwb3RoZWNhcnkKCiAgICBQdXQgdGhpcyBpbiBhbnkgbGlxdWlkIHRoaW5nIHlvdSB3aWxsLAogICAgQW5kIGRyaW5rIGl0IG9mZjsgYW5kLCBpZiB5b3UgaGFkIHRoZSBzdHJlbmd0aAogICAgT2YgdHdlbnR5IG1lbiwgaXQgd291bGQgZGlzcGF0Y2ggeW91IHN0cmFpZ2h0LgoKUk9NRU8KCiAgICBUaGVyZSBpcyB0aHkgZ29sZCwgd29yc2UgcG9pc29uIHRvIG1lbidzIHNvdWxzLAogICAgRG9pbmcgbW9yZSBtdXJkZXJzIGluIHRoaXMgbG9hdGhzb21lIHdvcmxkLAogICAgVGhhbiB0aGVzZSBwb29yIGNvbXBvdW5kcyB0aGF0IHRob3UgbWF5c3Qgbm90IHNlbGwuCiAgICBJIHNlbGwgdGhlZSBwb2lzb247IHRob3UgaGFzdCBzb2xkIG1lIG5vbmUuCiAgICBGYXJld2VsbDogYnV5IGZvb2QsIGFuZCBnZXQgdGh5c2VsZiBpbiBmbGVzaC4KICAgIENvbWUsIGNvcmRpYWwgYW5kIG5vdCBwb2lzb24sIGdvIHdpdGggbWUKICAgIFRvIEp1bGlldCdzIGdyYXZlOyBmb3IgdGhlcmUgbXVzdCBJIHVzZSB0aGVlLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBKT0hOIAoKRlJJQVIgSk9ITgoKICAgIEhvbHkgRnJhbmNpc2NhbiBmcmlhciEgYnJvdGhlciwgaG8hCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UKCkZSSUFSIExBVVJFTkNFCgogICAgVGhpcyBzYW1lIHNob3VsZCBiZSB0aGUgdm9pY2Ugb2YgRnJpYXIgSm9obi4KICAgIFdlbGNvbWUgZnJvbSBNYW50dWE6IHdoYXQgc2F5cyBSb21lbz8KICAgIE9yLCBpZiBoaXMgbWluZCBiZSB3cml0LCBnaXZlIG1lIGhpcyBsZXR0ZXIuCgpGUklBUiBKT0hOCgogICAgR29pbmcgdG8gZmluZCBhIGJhcmUtZm9vdCBicm90aGVyIG91dAogICAgT25lIG9mIG91ciBvcmRlciwgdG8gYXNzb2NpYXRlIG1lLAogICAgSGVyZSBpbiB0aGlzIGNpdHkgdmlzaXRpbmcgdGhlIHNpY2ssCiAgICBBbmQgZmluZGluZyBoaW0sIHRoZSBzZWFyY2hlcnMgb2YgdGhlIHRvd24sCiAgICBTdXNwZWN0aW5nIHRoYXQgd2UgYm90aCB3ZXJlIGluIGEgaG91c2UKICAgIFdoZXJlIHRoZSBpbmZlY3Rpb3VzIHBlc3RpbGVuY2UgZGlkIHJlaWduLAogICAgU2VhbCdkIHVwIHRoZSBkb29ycywgYW5kIHdvdWxkIG5vdCBsZXQgdXMgZm9ydGg7CiAgICBTbyB0aGF0IG15IHNwZWVkIHRvIE1hbnR1YSB0aGVyZSB3YXMgc3RheSdkLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXaG8gYmFyZSBteSBsZXR0ZXIsIHRoZW4sIHRvIFJvbWVvPwoKRlJJQVIgSk9ITgoKICAgIEkgY291bGQgbm90IHNlbmQgaXQsLS1oZXJlIGl0IGlzIGFnYWluLC0tCiAgICBOb3IgZ2V0IGEgbWVzc2VuZ2VyIHRvIGJyaW5nIGl0IHRoZWUsCiAgICBTbyBmZWFyZnVsIHdlcmUgdGhleSBvZiBpbmZlY3Rpb24uCgpGUklBUiBMQVVSRU5DRQoKICAgIFVuaGFwcHkgZm9ydHVuZSEgYnkgbXkgYnJvdGhlcmhvb2QsCiAgICBUaGUgbGV0dGVyIHdhcyBub3QgbmljZSBidXQgZnVsbCBvZiBjaGFyZ2UKICAgIE9mIGRlYXIgaW1wb3J0LCBhbmQgdGhlIG5lZ2xlY3RpbmcgaXQKICAgIE1heSBkbyBtdWNoIGRhbmdlci4gRnJpYXIgSm9obiwgZ28gaGVuY2U7CiAgICBHZXQgbWUgYW4gaXJvbiBjcm93LCBhbmQgYnJpbmcgaXQgc3RyYWlnaHQKICAgIFVudG8gbXkgY2VsbC4KCkZSSUFSIEpPSE4KCiAgICBCcm90aGVyLCBJJ2xsIGdvIGFuZCBicmluZyBpdCB0aGVlLgoKICAgIEV4aXQKCkZSSUFSIExBVVJFTkNFCgogICAgTm93IG11c3QgSSB0byB0aGUgbW9udW1lbnQgYWxvbmU7CiAgICBXaXRoaW4gdGhyZWUgaG91cnMgd2lsbCBmYWlyIEp1bGlldCB3YWtlOgogICAgU2hlIHdpbGwgYmVzaHJldyBtZSBtdWNoIHRoYXQgUm9tZW8KICAgIEhhdGggaGFkIG5vIG5vdGljZSBvZiB0aGVzZSBhY2NpZGVudHM7CiAgICBCdXQgSSB3aWxsIHdyaXRlIGFnYWluIHRvIE1hbnR1YSwKICAgIEFuZCBrZWVwIGhlciBhdCBteSBjZWxsIHRpbGwgUm9tZW8gY29tZTsKICAgIFBvb3IgbGl2aW5nIGNvcnNlLCBjbG9zZWQgaW4gYSBkZWFkIG1hbidzIHRvbWIhCgogICAgRXhpdAoKU0NFTkUgSUlJLiBBIGNodXJjaHlhcmQ7IGluIGl0IGEgdG9tYiBiZWxvbmdpbmcgdG8gdGhlIENhcHVsZXRzLgoKICAgIEVudGVyIFBBUklTLCBhbmQgaGlzIFBhZ2UgYmVhcmluZyBmbG93ZXJzIGFuZCBhIHRvcmNoIAoKUEFSSVMKCiAgICBHaXZlIG1lIHRoeSB0b3JjaCwgYm95OiBoZW5jZSwgYW5kIHN0YW5kIGFsb29mOgogICAgWWV0IHB1dCBpdCBvdXQsIGZvciBJIHdvdWxkIG5vdCBiZSBzZWVuLgogICAgVW5kZXIgeW9uZCB5ZXctdHJlZXMgbGF5IHRoZWUgYWxsIGFsb25nLAogICAgSG9sZGluZyB0aGluZSBlYXIgY2xvc2UgdG8gdGhlIGhvbGxvdyBncm91bmQ7CiAgICBTbyBzaGFsbCBubyBmb290IHVwb24gdGhlIGNodXJjaHlhcmQgdHJlYWQsCiAgICBCZWluZyBsb29zZSwgdW5maXJtLCB3aXRoIGRpZ2dpbmcgdXAgb2YgZ3JhdmVzLAogICAgQnV0IHRob3Ugc2hhbHQgaGVhciBpdDogd2hpc3RsZSB0aGVuIHRvIG1lLAogICAgQXMgc2lnbmFsIHRoYXQgdGhvdSBoZWFyJ3N0IHNvbWV0aGluZyBhcHByb2FjaC4KICAgIEdpdmUgbWUgdGhvc2UgZmxvd2Vycy4gRG8gYXMgSSBiaWQgdGhlZSwgZ28uCgpQQUdFCgogICAgW0FzaWRlXSBJIGFtIGFsbW9zdCBhZnJhaWQgdG8gc3RhbmQgYWxvbmUKICAgIEhlcmUgaW4gdGhlIGNodXJjaHlhcmQ7IHlldCBJIHdpbGwgYWR2ZW50dXJlLgoKICAgIFJldGlyZXMKClBBUklTCgogICAgU3dlZXQgZmxvd2VyLCB3aXRoIGZsb3dlcnMgdGh5IGJyaWRhbCBiZWQgSSBzdHJldywtLQogICAgTyB3b2UhIHRoeSBjYW5vcHkgaXMgZHVzdCBhbmQgc3RvbmVzOy0tCiAgICBXaGljaCB3aXRoIHN3ZWV0IHdhdGVyIG5pZ2h0bHkgSSB3aWxsIGRldywKICAgIE9yLCB3YW50aW5nIHRoYXQsIHdpdGggdGVhcnMgZGlzdGlsbCdkIGJ5IG1vYW5zOgogICAgVGhlIG9ic2VxdWllcyB0aGF0IEkgZm9yIHRoZWUgd2lsbCBrZWVwCiAgICBOaWdodGx5IHNoYWxsIGJlIHRvIHN0cmV3IHRoeSBncmF2ZSBhbmQgd2VlcC4KCiAgICBUaGUgUGFnZSB3aGlzdGxlcwogICAgVGhlIGJveSBnaXZlcyB3YXJuaW5nIHNvbWV0aGluZyBkb3RoIGFwcHJvYWNoLgogICAgV2hhdCBjdXJzZWQgZm9vdCB3YW5kZXJzIHRoaXMgd2F5IHRvLW5pZ2h0LAogICAgVG8gY3Jvc3MgbXkgb2JzZXF1aWVzIGFuZCB0cnVlIGxvdmUncyByaXRlPwogICAgV2hhdCB3aXRoIGEgdG9yY2ghIG11ZmZsZSBtZSwgbmlnaHQsIGF3aGlsZS4KCiAgICBSZXRpcmVzCgogICAgRW50ZXIgUk9NRU8gYW5kIEJBTFRIQVNBUiwgd2l0aCBhIHRvcmNoLCBtYXR0b2NrLCAmIGMKClJPTUVPCgogICAgR2l2ZSBtZSB0aGF0IG1hdHRvY2sgYW5kIHRoZSB3cmVuY2hpbmcgaXJvbi4KICAgIEhvbGQsIHRha2UgdGhpcyBsZXR0ZXI7IGVhcmx5IGluIHRoZSBtb3JuaW5nCiAgICBTZWUgdGhvdSBkZWxpdmVyIGl0IHRvIG15IGxvcmQgYW5kIGZhdGhlci4KICAgIEdpdmUgbWUgdGhlIGxpZ2h0OiB1cG9uIHRoeSBsaWZlLCBJIGNoYXJnZSB0aGVlLAogICAgV2hhdGUnZXIgdGhvdSBoZWFyJ3N0IG9yIHNlZXN0LCBzdGFuZCBhbGwgYWxvb2YsCiAgICBBbmQgZG8gbm90IGludGVycnVwdCBtZSBpbiBteSBjb3Vyc2UuCiAgICBXaHkgSSBkZXNjZW5kIGludG8gdGhpcyBiZWQgb2YgZGVhdGgsCiAgICBJcyBwYXJ0bHkgdG8gYmVob2xkIG15IGxhZHkncyBmYWNlOwogICAgQnV0IGNoaWVmbHkgdG8gdGFrZSB0aGVuY2UgZnJvbSBoZXIgZGVhZCBmaW5nZXIKICAgIEEgcHJlY2lvdXMgcmluZywgYSByaW5nIHRoYXQgSSBtdXN0IHVzZQogICAgSW4gZGVhciBlbXBsb3ltZW50OiB0aGVyZWZvcmUgaGVuY2UsIGJlIGdvbmU6CiAgICBCdXQgaWYgdGhvdSwgamVhbG91cywgZG9zdCByZXR1cm4gdG8gcHJ5CiAgICBJbiB3aGF0IEkgZnVydGhlciBzaGFsbCBpbnRlbmQgdG8gZG8sCiAgICBCeSBoZWF2ZW4sIEkgd2lsbCB0ZWFyIHRoZWUgam9pbnQgYnkgam9pbnQKICAgIEFuZCBzdHJldyB0aGlzIGh1bmdyeSBjaHVyY2h5YXJkIHdpdGggdGh5IGxpbWJzOgogICAgVGhlIHRpbWUgYW5kIG15IGludGVudHMgYXJlIHNhdmFnZS13aWxkLAogICAgTW9yZSBmaWVyY2UgYW5kIG1vcmUgaW5leG9yYWJsZSBmYXIKICAgIFRoYW4gZW1wdHkgdGlnZXJzIG9yIHRoZSByb2FyaW5nIHNlYS4KCkJBTFRIQVNBUgoKICAgIEkgd2lsbCBiZSBnb25lLCBzaXIsIGFuZCBub3QgdHJvdWJsZSB5b3UuCgpST01FTwoKICAgIFNvIHNoYWx0IHRob3Ugc2hvdyBtZSBmcmllbmRzaGlwLiBUYWtlIHRob3UgdGhhdDoKICAgIExpdmUsIGFuZCBiZSBwcm9zcGVyb3VzOiBhbmQgZmFyZXdlbGwsIGdvb2QgZmVsbG93LgoKQkFMVEhBU0FSCgogICAgW0FzaWRlXSBGb3IgYWxsIHRoaXMgc2FtZSwgSSdsbCBoaWRlIG1lIGhlcmVhYm91dDoKICAgIEhpcyBsb29rcyBJIGZlYXIsIGFuZCBoaXMgaW50ZW50cyBJIGRvdWJ0LgoKICAgIFJldGlyZXMKClJPTUVPCgogICAgVGhvdSBkZXRlc3RhYmxlIG1hdywgdGhvdSB3b21iIG9mIGRlYXRoLAogICAgR29yZ2VkIHdpdGggdGhlIGRlYXJlc3QgbW9yc2VsIG9mIHRoZSBlYXJ0aCwKICAgIFRodXMgSSBlbmZvcmNlIHRoeSByb3R0ZW4gamF3cyB0byBvcGVuLAogICAgQW5kLCBpbiBkZXNwaXRlLCBJJ2xsIGNyYW0gdGhlZSB3aXRoIG1vcmUgZm9vZCEKCiAgICBPcGVucyB0aGUgdG9tYgoKUEFSSVMKCiAgICBUaGlzIGlzIHRoYXQgYmFuaXNoJ2QgaGF1Z2h0eSBNb250YWd1ZSwKICAgIFRoYXQgbXVyZGVyJ2QgbXkgbG92ZSdzIGNvdXNpbiwgd2l0aCB3aGljaCBncmllZiwKICAgIEl0IGlzIHN1cHBvc2VkLCB0aGUgZmFpciBjcmVhdHVyZSBkaWVkOwogICAgQW5kIGhlcmUgaXMgY29tZSB0byBkbyBzb21lIHZpbGxhbm91cyBzaGFtZQogICAgVG8gdGhlIGRlYWQgYm9kaWVzOiBJIHdpbGwgYXBwcmVoZW5kIGhpbS4KCiAgICBDb21lcyBmb3J3YXJkCiAgICBTdG9wIHRoeSB1bmhhbGxvdydkIHRvaWwsIHZpbGUgTW9udGFndWUhCiAgICBDYW4gdmVuZ2VhbmNlIGJlIHB1cnN1ZWQgZnVydGhlciB0aGFuIGRlYXRoPwogICAgQ29uZGVtbmVkIHZpbGxhaW4sIEkgZG8gYXBwcmVoZW5kIHRoZWU6CiAgICBPYmV5LCBhbmQgZ28gd2l0aCBtZTsgZm9yIHRob3UgbXVzdCBkaWUuCgpST01FTwoKICAgIEkgbXVzdCBpbmRlZWQ7IGFuZCB0aGVyZWZvcmUgY2FtZSBJIGhpdGhlci4KICAgIEdvb2QgZ2VudGxlIHlvdXRoLCB0ZW1wdCBub3QgYSBkZXNwZXJhdGUgbWFuOwogICAgRmx5IGhlbmNlLCBhbmQgbGVhdmUgbWU6IHRoaW5rIHVwb24gdGhlc2UgZ29uZTsKICAgIExldCB0aGVtIGFmZnJpZ2h0IHRoZWUuIEkgYmVzZWVjaCB0aGVlLCB5b3V0aCwKICAgIFB1dCBub3QgYW5vdGhlciBzaW4gdXBvbiBteSBoZWFkLAogICAgQnkgdXJnaW5nIG1lIHRvIGZ1cnk6IE8sIGJlIGdvbmUhCiAgICBCeSBoZWF2ZW4sIEkgbG92ZSB0aGVlIGJldHRlciB0aGFuIG15c2VsZjsKICAgIEZvciBJIGNvbWUgaGl0aGVyIGFybSdkIGFnYWluc3QgbXlzZWxmOgogICAgU3RheSBub3QsIGJlIGdvbmU7IGxpdmUsIGFuZCBoZXJlYWZ0ZXIgc2F5LAogICAgQSBtYWRtYW4ncyBtZXJjeSBiYWRlIHRoZWUgcnVuIGF3YXkuCgpQQVJJUwoKICAgIEkgZG8gZGVmeSB0aHkgY29uanVyYXRpb25zLAogICAgQW5kIGFwcHJlaGVuZCB0aGVlIGZvciBhIGZlbG9uIGhlcmUuCgpST01FTwoKICAgIFdpbHQgdGhvdSBwcm92b2tlIG1lPyB0aGVuIGhhdmUgYXQgdGhlZSwgYm95IQoKICAgIFRoZXkgZmlnaHQKClBBR0UKCiAgICBPIExvcmQsIHRoZXkgZmlnaHQhIEkgd2lsbCBnbyBjYWxsIHRoZSB3YXRjaC4KCiAgICBFeGl0CgpQQVJJUwoKICAgIE8sIEkgYW0gc2xhaW4hCgogICAgRmFsbHMKICAgIElmIHRob3UgYmUgbWVyY2lmdWwsCiAgICBPcGVuIHRoZSB0b21iLCBsYXkgbWUgd2l0aCBKdWxpZXQuCgogICAgRGllcwoKUk9NRU8KCiAgICBJbiBmYWl0aCwgSSB3aWxsLiBMZXQgbWUgcGVydXNlIHRoaXMgZmFjZS4KICAgIE1lcmN1dGlvJ3Mga2luc21hbiwgbm9ibGUgQ291bnR5IFBhcmlzIQogICAgV2hhdCBzYWlkIG15IG1hbiwgd2hlbiBteSBiZXRvc3NlZCBzb3VsCiAgICBEaWQgbm90IGF0dGVuZCBoaW0gYXMgd2Ugcm9kZT8gSSB0aGluawogICAgSGUgdG9sZCBtZSBQYXJpcyBzaG91bGQgaGF2ZSBtYXJyaWVkIEp1bGlldDoKICAgIFNhaWQgaGUgbm90IHNvPyBvciBkaWQgSSBkcmVhbSBpdCBzbz8KICAgIE9yIGFtIEkgbWFkLCBoZWFyaW5nIGhpbSB0YWxrIG9mIEp1bGlldCwKICAgIFRvIHRoaW5rIGl0IHdhcyBzbz8gTywgZ2l2ZSBtZSB0aHkgaGFuZCwKICAgIE9uZSB3cml0IHdpdGggbWUgaW4gc291ciBtaXNmb3J0dW5lJ3MgYm9vayEKICAgIEknbGwgYnVyeSB0aGVlIGluIGEgdHJpdW1waGFudCBncmF2ZTsKICAgIEEgZ3JhdmUIE8gbm8hIGEgbGFudGVybiwgc2xhdWdodGVyJ2QgeW91dGgsCiAgICBGb3IgaGVyZSBsaWVzIEp1bGlldCwgYW5kIGhlciBiZWF1dHkgbWFrZXMKICAgIFRoaXMgdmF1bHQgYSBmZWFzdGluZyBwcmVzZW5jZSBmdWxsIG9mIGxpZ2h0LgogICAgRGVhdGgsIGxpZSB0aG91IHRoZXJlLCBieSBhIGRlYWQgbWFuIGludGVycidkLgoKICAgIExheWluZyBQQVJJUyBpbiB0aGUgdG9tYgogICAgSG93IG9mdCB3aGVuIG1lbiBhcmUgYXQgdGhlIHBvaW50IG9mIGRlYXRoCiAgICBIYXZlIHRoZXkgYmVlbiBtZXJyeSEgd2hpY2ggdGhlaXIga2VlcGVycyBjYWxsCiAgICBBIGxpZ2h0bmluZyBiZWZvcmUgZGVhdGg6IE8sIGhvdyBtYXkgSQogICAgQ2FsbCB0aGlzIGEgbGlnaHRuaW5nPyBPIG15IGxvdmUhIG15IHdpZmUhCiAgICBEZWF0aCwgdGhhdCBoYXRoIHN1Y2snZCB0aGUgaG9uZXkgb2YgdGh5IGJyZWF0aCwKICAgIEhhdGggaGFkIG5vIHBvd2VyIHlldCB1cG9uIHRoeSBiZWF1dHk6CiAgICBUaG91IGFydCBub3QgY29ucXVlcidkOyBiZWF1dHkncyBlbnNpZ24geWV0CiAgICBJcyBjcmltc29uIGluIHRoeSBsaXBzIGFuZCBpbiB0aHkgY2hlZWtzLAogICAgQW5kIGRlYXRoJ3MgcGFsZSBmbGFnIGlzIG5vdCBhZHZhbmNlZCB0aGVyZS4KICAgIFR5YmFsdCwgbGllc3QgdGhvdSB0aGVyZSBpbiB0aHkgYmxvb2R5IHNoZWV0PwogICAgTywgd2hhdCBtb3JlIGZhdm91ciBjYW4gSSBkbyB0byB0aGVlLAogICAgVGhhbiB3aXRoIHRoYXQgaGFuZCB0aGF0IGN1dCB0aHkgeW91dGggaW4gdHdhaW4KICAgIFRvIHN1bmRlciBoaXMgdGhhdCB3YXMgdGhpbmUgZW5lbXkCiAgICBGb3JnaXZlIG1lLCBjb3VzaW4hIEFoLCBkZWFyIEp1bGlldCwKICAgIFdoeSBhcnQgdGhvdSB5ZXQgc28gZmFpcj8gc2hhbGwgSSBiZWxpZXZlCiAgICBUaGF0IHVuc3Vic3RhbnRpYWwgZGVhdGggaXMgYW1vcm91cywKICAgIEFuZCB0aGF0IHRoZSBsZWFuIGFiaG9ycmVkIG1vbnN0ZXIga2VlcHMKICAgIFRoZWUgaGVyZSBpbiBkYXJrIHRvIGJlIGhpcyBwYXJhbW91cj8KICAgIEZvciBmZWFyIG9mIHRoYXQsIEkgc3RpbGwgd2lsbCBzdGF5IHdpdGggdGhlZTsKICAgIEFuZCBuZXZlciBmcm9tIHRoaXMgcGFsYWNlIG9mIGRpbSBuaWdodAogICAgRGVwYXJ0IGFnYWluOiBoZXJlLCBoZXJlIHdpbGwgSSByZW1haW4KICAgIFdpdGggd29ybXMgdGhhdCBhcmUgdGh5IGNoYW1iZXItbWFpZHM7IE8sIGhlcmUKICAgIFdpbGwgSSBzZXQgdXAgbXkgZXZlcmxhc3RpbmcgcmVzdCwKICAgIEFuZCBzaGFrZSB0aGUgeW9rZSBvZiBpbmF1c3BpY2lvdXMgc3RhcnMKICAgIEZyb20gdGhpcyB3b3JsZC13ZWFyaWVkIGZsZXNoLiBFeWVzLCBsb29rIHlvdXIgbGFzdCEKICAgIEFybXMsIHRha2UgeW91ciBsYXN0IGVtYnJhY2UhIGFuZCwgbGlwcywgTyB5b3UKICAgIFRoZSBkb29ycyBvZiBicmVhdGgsIHNlYWwgd2l0aCBhIHJpZ2h0ZW91cyBraXNzCiAgICBBIGRhdGVsZXNzIGJhcmdhaW4gdG8gZW5ncm9zc2luZyBkZWF0aCEKICAgIENvbWUsIGJpdHRlciBjb25kdWN0LCBjb21lLCB1bnNhdm91cnkgZ3VpZGUhCiAgICBUaG91IGRlc3BlcmF0ZSBwaWxvdCwgbm93IGF0IG9uY2UgcnVuIG9uCiAgICBUaGUgZGFzaGluZyByb2NrcyB0aHkgc2VhLXNpY2sgd2VhcnkgYmFyayEKICAgIEhlcmUncyB0byBteSBsb3ZlIQoKICAgIERyaW5rcwogICAgTyB0cnVlIGFwb3RoZWNhcnkhCiAgICBUaHkgZHJ1Z3MgYXJlIHF1aWNrLiBUaHVzIHdpdGggYSBraXNzIEkgZGllLgoKICAgIERpZXMKCiAgICBFbnRlciwgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgY2h1cmNoeWFyZCwgRlJJQVIgTEFVUkVOQ0UsIHdpdGggYSBsYW50ZXJuLCBjcm93LCBhbmQgc3BhZGUKCkZSSUFSIExBVVJFTkNFCgogICAgU2FpbnQgRnJhbmNpcyBiZSBteSBzcGVlZCEgaG93IG9mdCB0by1uaWdodAogICAgSGF2ZSBteSBvbGQgZmVldCBzdHVtYmxlZCBhdCBncmF2ZXMhIFdobydzIHRoZXJlPwoKQkFMVEhBU0FSCgogICAgSGVyZSdzIG9uZSwgYSBmcmllbmQsIGFuZCBvbmUgdGhhdCBrbm93cyB5b3Ugd2VsbC4KCkZSSUFSIExBVVJFTkNFCgogICAgQmxpc3MgYmUgdXBvbiB5b3UhIFRlbGwgbWUsIGdvb2QgbXkgZnJpZW5kLAogICAgV2hhdCB0b3JjaCBpcyB5b25kLCB0aGF0IHZhaW5seSBsZW5kcyBoaXMgbGlnaHQKICAgIFRvIGdydWJzIGFuZCBleWVsZXNzIHNrdWxscz8gYXMgSSBkaXNjZXJuLAogICAgSXQgYnVybmV0aCBpbiB0aGUgQ2FwZWwncyBtb251bWVudC4KCkJBTFRIQVNBUgoKICAgIEl0IGRvdGggc28sIGhvbHkgc2lyOyBhbmQgdGhlcmUncyBteSBtYXN0ZXIsCiAgICBPbmUgdGhhdCB5b3UgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2hvIGlzIGl0PwoKQkFMVEhBU0FSCgogICAgUm9tZW8uCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvdyBsb25nIGhhdGggaGUgYmVlbiB0aGVyZT8KCkJBTFRIQVNBUgoKICAgIEZ1bGwgaGFsZiBhbiBob3VyLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHbyB3aXRoIG1lIHRvIHRoZSB2YXVsdC4KCkJBTFRIQVNBUgoKICAgIEkgZGFyZSBub3QsIHNpcgogICAgTXkgbWFzdGVyIGtub3dzIG5vdCBidXQgSSBhbSB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CwgYm95OiB3aGljaCB3YXkCgpKVUxJRVQKCiAgICBZZWEsIG5vaXNlPyB0aGVuIEknbGwgYmUgYnJpZWYuIE8gaGFwcHkgZGFnZ2VyIQoKICAgIFNuYXRjaGluZyBST01FTydzIGRhZ2dlcgogICAgVGhpcyBpcyB0aHkgc2hlYXRoOwoKICAgIFN0YWJzIGhlcnNlbGYKICAgIHRoZXJlIHJ1c3QsIGFuZCBsZXQgbWUgZGllLgoKICAgIEZhbGxzIG9uIFJPTUVPJ3MgYm9keSwgYW5kIGRpZXMKCiAgICBFbnRlciBXYXRjaCwgd2l0aCB0aGUgUGFnZSBvZiBQQVJJUwoKUEFHRQoKICAgIFRoaXMgaXMgdGhlIHBsYWNlOyB0aGVyZSwgd2hlcmUgdGhlIHRvcmNoIGRvdGggYnVybi4KCkZpcnN0IFdhdGNobWFuCgogICAgVGhlIGdyb3VuZCBpcyBibG9vZHk7IHNlYXJjaCBhYm91dCB0aGUgY2h1cmNoeWFyZDoKICAgIEdvLCBzb21lIG9mIHlvdSwgd2hvZSdlciB5b3UgZmluZCBhdHRhY2guCiAgICBQaXRpZnVsIHNpZ2h0ISBoZXJlIGxpZXMgdGhlIGNvdW50eSBzbGFpbiwKICAgIEFuZCBKdWxpZXQgYmxlZWRpbmcsIHdhcm0sIGFuZCBuZXdseSBkZWFkLAogICAgV2hvIGhlcmUgaGF0aCBsYWluIHRoZXNlIHR3byBkYXlzIGJ1cmllZC4KICAgIEdvLCB0ZWxsIHRoZSBwcmluY2U6IHJ1biB0byB0aGUgQ2FwdWxldHM6CiAgICBSYWlzZSB1cCB0aGUgTW9udGFndWVzOiBzb21lIG90aGVycyBzZWFyY2g6CiAgICBXZSBzZWUgdGhlIGdyb3VuZCB3aGVyZW9uIHRoZXNlIHdvZXMgZG8gbGllOwogICAgQnV0IHRoZSB0cnVlIGdyb3VuZCBvZiBhbGwgdGhlc2UgcGl0ZW91cyB3b2VzCiAgICBXZSBjYW5ub3Qgd2l0aG91dCBjaXJjdW1zdGFuY2UgZGVzY3J5LgoKICAgIFJlLWVudGVyIHNvbWUgb2YgdGhlIFdhdGNoLCB3aXRoIEJBTFRIQVNBUgoKU2Vjb25kIFdhdGNobWFuCgogICAgSGVyZSdzIFJvbWVvJ3MgbWFuOyB3ZSBmb3VuZCBoaW0gaW4gdGhlIGNodXJjaHlhcmQuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhvbGQgaGltIGluIHNhZmV0eSwgdGlsbCB0aGUgcHJpbmNlIGNvbWUgaGl0aGVyLgoKICAgIFJlLWVudGVyIG90aGVycyBvZiB0aGUgV2F0Y2gsIHdpdGggRlJJQVIgTEFVUkVOQ0UKClRoaXJkIFdhdGNobWFuCgogICAgSGVyZSBpcyBhIGZyaWFyLCB0aGF0IHRyZW1ibGVzLCBzaWdocyBhbmQgd2VlcHM6CiAgICBXZSB0b29rIHRoaXMgbWF0dG9jayBhbmQgdGhpcyBzcGFkZSBmcm9tIGhpbSwKICAgIEFzIGhlIHdhcyBjb21pbmcgZnJvbSB0aGlzIGNodXJjaHlhcmQgc2lkZS4KCkZpcnN0IFdhdGNobWFuCgogICAgQSBncmVhdCBzdXNwaWNpb246IHN0YXkgdGhlIGZyaWFyIHRvby4KCiAgICBFbnRlciB0aGUgUFJJTkNFIGFuZCBBdHRlbmRhbnRzCgpQUklOQ0UKCiAgICBXaGF0IG1pc2FkdmVudHVyZSBpcyBzbyBlYXJseSB1cCwKICAgIFRoYXQgY2FsbHMgb3VyIHBlcnNvbiBmcm9tIG91ciBtb3JuaW5nJ3MgcmVzdD8KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIGFuZCBvdGhlcnMKCkNBUFVMRVQKCiAgICBXaGF0IHNob3VsZCBpdCBiZSwgdGhhdCB0aGV5IHNvIHNocmllayBhYnJvYWQCgpMQURZIENBUFVMRVQKCiAgICBUaGUgcGVvcGxlIGluIHRoZSBzdHJlZXQgY3J5IFJvbWVvLAogICAgU29tZSBKdWxpZXQsIGFuZCBzb21lIFBhcmlzOyBhbmQgYWxsIHJ1biwKICAgIFdpdGggb3BlbiBvdXRjcnkgdG93YXJkIG91ciBtb251bWVudC4KClBSSU5DRQoKICAgIFdoYXQgZmVhciBpcyB0aGlzIHdoaWNoIHN0YXJ0bGVzIGluIG91ciBlYXJzPwoKRmlyc3QgV2F0Y2htYW4KCiAgICBTb3ZlcmVpZ24sIGhlcmUgbGllcyB0aGUgQ291bnR5IFBhcmlzIHNsYWluOwogICAgQW5kIFJvbWVvIGRlYWQ7IGFuZCBKdWxpZXQsIGRlYWQgYmVmb3JlLAogICAgV2FybSBhbmQgbmV3IGtpbGwnZC4KClBSSU5DRQoKICAgIFNlYXJjaCwgc2VlaywgYW5kIGtub3cgaG93IHRoaXMgZm91bCBtdXJkZXIgY29tZXMuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhlcmUgaXMgYSBmcmlhciwgYW5kIHNsYXVnaHRlcidkIFJvbWVvJ3MgbWFuOwogICAgV2l0aCBpbnN0cnVtZW50cyB1cG9uIHRoZW0sIGZpdCB0byBvcGVuCiAgICBUaGVzZSBkZWFkIG1lbidzIHRvbWJzLgoKQ0FQVUxFVAoKICAgIE8gaGVhdmVucyEgTyB3aWZlLCBsb29rIGhvdyBvdXIgZGF1Z2h0ZXIgYmxlZWRzIQogICAgVGhpcyBkYWdnZXIgaGF0aCBtaXN0YSdlbi0tZm9yLCBsbywgaGlzIGhvdXNlCiAgICBJcyBlbXB0eSBvbiB0aGUgYmFjayBvZiBNb250YWd1ZSwtLQogICAgQW5kIGl0IG1pcy1zaGVhdGhlZCBpbiBteSBkYXVnaHRlcidzIGJvc29tIQoKTEFEWSBDQVBVTEVUCgogICAgTyBtZSEgdGhpcyBzaWdodCBvZiBkZWF0aCBpcyBhcyBhIGJlbGwsCiAgICBUaGF0IHdhcm5zIG15IG9sZCBhZ2UgdG8gYSBzZXB1bGNocmUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIG90aGVycwoKUFJJTkNFCgogICAgQ29tZSwgTW9udGFndWU7IGZvciB0aG91IGFydCBlYXJseSB1cCwKICAgIFRvIHNlZSB0aHkgc29uIGFuZCBoZWlyIG1vcmUgZWFybHkgZG93bi4KCk1PTlRBR1VFCgogICAgQWxhcywgbXkgbGllZ2UsIG15IHdpZmUgaXMgZGVhZCB0by1uaWdodDsKICAgIEdyaWVmIG9mIG15IHNvbidzIGV4aWxlIGhhdGggc3RvcHAnZCBoZXIgYnJlYXRoOgogICAgV2hhdCBmdXJ0aGVyIHdvZSBjb25zcGlyZXMgYWdhaW5zdCBtaW5lIGFnZT8KClBSSU5DRQoKICAgIExvb2ssIGFuZCB0aG91IHNoYWx0IHNlZS4KCk1PTlRBR1VFCgogICAgTyB0aG91IHVudGF1Z2h0ISB3aGF0IG1hbm5lcnMgaXMgaW4gdGhpcz8KICAgIFRvIHByZXNzIGJlZm9yZSB0aHkgZmF0aGVyIHRvIGEgZ3JhdmUCgpQUklOQ0UKCiAgICBTZWFsIHVwIHRoZSBtb3V0aCBvZiBvdXRyYWdlIGZvciBhIHdoaWxlLAogICAgVGlsbCB3ZSBjYW4gY2xlYXIgdGhlc2UgYW1iaWd1aXRpZXMsCiAgICBBbmQga25vdyB0aGVpciBzcHJpbmcsIHRoZWlyIGhlYWQsIHRoZWlyCiAgICB0cnVlIGRlc2NlbnQ7CiAgICBBbmQgdGhlbiB3aWxsIEkgYmUgZ2VuZXJhbCBvZiB5b3VyIHdvZXMsCiAgICBBbmQgbGVhZCB5b3UgZXZlbiB0byBkZWF0aDogbWVhbnRpbWUgZm9yYmVhciwKICAgIEFuZCBsZXQgbWlzY2hhbmNlIGJlIHNsYXZlIHRvIHBhdGllbmNlLgogICAgQnJpbmcgZm9ydGggdGhlIHBhcnRpZXMgb2Ygc3VzcGljaW9uLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJIGFtIHRoZSBncmVhdGVzdCwgYWJsZSB0byBkbyBsZWFzdCwKICAgIFlldCBtb3N0IHN1c3BlY3RlZCwgYXMgdGhlIHRpbWUgYW5kIHBsYWNlCiAgICBEb3RoIG1ha2UgYWdhaW5zdCBtZSBvZiB0aGlzIGRpcmVmdWwgbXVyZGVyOwogICAgQW5kIGhlcmUgSSBzdGFuZCwgYm90aCB0byBpbXBlYWNoIGFuZCBwdXJnZQogICAgTXlzZWxmIGNvbmRlbW5lZCBhbmQgbXlzZWxmIGV4Y3VzZWQuCgpQUklOQ0UKCiAgICBUaGVuIHNheSBhdCBvbmNlIHdoYXQgdGhvdSBkb3N0IGtub3cgaW4gdGhpcy4KCkZSSUFSIExBVVJFTkNFCgogICAgSSB3aWxsIGJlIGJyaWVmLCBmb3IgbXkgc2hvcnQgZGF0ZSBvZiBicmVhdGgKICAgIElzIG5vdCBzbyBsb25nIGFzIGlzIGEgdGVkaW91cyB0YWxlLgogICAgUm9tZW8sIHRoZXJlIGRlYWQsIHdhcyBodXNiYW5kIHRvIHRoYXQgSnVsaWV0OwogICAgQW5kIHNoZSwgdGhlcmUgZGVhZCwgdGhhdCBSb21lbydzIGZhaXRoZnVsIHdpZmU6CiAgICBJIG1hcnJpZWQgdGhlbTsgYW5kIHRoZWlyIHN0b2wnbiBtYXJyaWFnZS1kYXkKICAgIFdhcyBUeWJhbHQncyBkb29tcy1kYXksIHdob3NlIHVudGltZWx5IGRlYXRoCiAgICBCYW5pc2gnZCB0aGUgbmV3LW1hZGUgYnJpZGVncm9vbSBmcm9tIHRoZSBjaXR5LAogICAgRm9yIHdob20sIGFuZCBub3QgZm9yIFR5YmFsdCwgSnVsaWV0IHBpbmVkLgogICAgWW91LCB0byByZW1vdmUgdGhhdCBzaWVnZSBvZiBncmllZiBmcm9tIGhlciwKICAgIEJldHJvdGgnZCBhbmQgd291bGQgaGF2ZSBtYXJyaWVkIGhlciBwZXJmb3JjZQogICAgVG8gQ291bnR5IFBhcmlzOiB0aGVuIGNvbWVzIHNoZSB0byBtZSwKICAgIEFuZCwgd2l0aCB3aWxkIGxvb2tzLCBiaWQgbWUgZGV2aXNlIHNvbWUgbWVhbgogICAgVG8gcmlkIGhlciBmcm9tIHRoaXMgc2Vjb25kIG1hcnJpYWdlLAogICAgT3IgaW4gbXkgY2VsbCB0aGVyZSB3b3VsZCBzaGUga2lsbCBoZXJzZWxmLgogICAgVGhlbiBnYXZlIEkgaGVyLCBzbyB0dXRvcidkIGJ5IG15IGFydCwKICAgIEEgc2xlZXBpbmcgcG90aW9uOyB3aGljaCBzbyB0b29rIGVmZmVjdAogICAgQXMgSSBpbnRlbmRlZCwgZm9yIGl0IHdyb3VnaHQgb24gaGVyCiAgICBUaGUgZm9ybSBvZiBkZWF0aDogbWVhbnRpbWUgSSB3cml0IHRvIFJvbWVvLAogICAgVGhhdCBoZSBzaG91bGQgaGl0aGVyIGNvbWUgYXMgdGhpcyBkaXJlIG5pZ2h0LAogICAgVG8gaGVscCB0byB0YWtlIGhlciBmcm9tIGhlciBib3Jyb3cnZCBncmF2ZSwKICAgIEJlaW5nIHRoZSB0aW1lIHRoZSBwb3Rpb24ncyBmb3JjZSBzaG91bGQgY2Vhc2UuCiAgICBCdXQgaGUgd2hpY2ggYm9yZSBteSBsZXR0ZXIsIEZyaWFyIEpvaG4sCiAgICBXYXMgc3RheSdkIGJ5IGFjY2lkZW50LCBhbmQgeWVzdGVybmlnaHQKICAgIFJldHVybidkIG15IGxldHRlciBiYWNrLiBUaGVuIGFsbCBhbG9uZQogICAgQXQgdGhlIHByZWZpeGVkIGhvdXIgb2YgaGVyIHdha2luZywKICAgIENhbWUgSSB0byB0YWtlIGhlciBmcm9tIGhlciBraW5kcmVkJ3MgdmF1bHQ7CiAgICBNZWFuaW5nIHRvIGtlZXAgaGVyIGNsb3NlbHkgYXQgbXkgY2VsbCwKICAgIFRpbGwgSSBjb252ZW5pZW50bHkgY291bGQgc2VuZCB0byBSb21lbzoKICAgIEJ1dCB3aGVuIEkgY2FtZSwgc29tZSBtaW51dGUgZXJlIHRoZSB0aW1lCiAgICBPZiBoZXIgYXdha2luZywgaGVyZSB1bnRpbWVseSBsYXkKICAgIFRoZSBub2JsZSBQYXJpcyBhbmQgdHJ1ZSBSb21lbyBkZWFkLgogICAgU2hlIHdha2VzOyBhbmQgSSBlbnRyZWF0ZWQgaGVyIGNvbWUgZm9ydGgsCiAgICBBbmQgYmVhciB0aGlzIHdvcmsgb2YgaGVhdmVuIHdpdGggcGF0aWVuY2U6CiAgICBCdXQgdGhlbiBhIG5vaXNlIGRpZCBzY2FyZSBtZSBmcm9tIHRoZSB0b21iOwogICAgQW5kIHNoZSwgdG9vIGRlc3BlcmF0ZSwgd291bGQgbm90IGdvIHdpdGggbWUsCiAgICBCdXQsIGFzIGl0IHNlZW1zLCBkaWQgdmlvbGVuY2Ugb24gaGVyc2VsZi4KICAgIEFsbCB0aGlzIEkga25vdzsgYW5kIHRvIHRoZSBtYXJyaWFnZQogICAgSGVyIG51cnNlIGlzIHByaXZ5OiBhbmQsIGlmIGF1Z2h0IGluIHRoaXMKICAgIE1pc2NhcnJpZWQgYnkgbXkgZmF1bHQsIGxldCBteSBvbGQgbGlmZQogICAgQmUgc2FjcmlmaWNlZCwgc29tZSBob3VyIGJlZm9yZSBoaXMgdGltZSwKICAgIFVudG8gdGhlIHJpZ291ciBvZiBzZXZlcmVzdCBsYXcuCgpQUklOQ0UKCiAgICBXZSBzdGlsbCBoYXZlIGtub3duIHRoZWUgZm9yIGEgaG9seSBtYW4uCiAgICBXaGVyZSdzIFJvbWVvJ3MgbWFuPyB3aGF0IGNhbiBoZSBzYXkgaW4gdGhpcz8KCkJBTFRIQVNBUgoKICAgIEkgYnJvdWdodCBteSBtYXN0ZXIgbmV3cyBvZiBKdWxpZXQncyBkZWF0aDsKICAgIEFuZCB0aGVuIGluIHBvc3QgaGUgY2FtZSBmcm9tIE1hbnR1YQogICAgVG8gdGhpcyBzYW1lIHBsYWNlLCB0byB0aGlzIHNhbWUgbW9udW1lbnQuCiAgICBUaGlzIGxldHRlciBoZSBlYXJseSBiaWQgbWUgZ2l2ZSBoaXMgZmF0aGVyLAogICAgQW5kIHRocmVhdGVuZWQgbWUgd2l0aCBkZWF0aCwgZ29pbmcgaW4gdGhlIHZhdWx0LAogICAgSSBkZXBhcnRlZCBub3QgYW5kIGxlZnQgaGltIHRoZXJlLgoKUFJJTkNFCgogICAgR2l2ZSBtZSB0aGUgbGV0dGVyOyBJIHdpbGwgbG9vayBvbiBpdC4KICAgIFdoZXJlIGlzIHRoZSBjb3VudHkncyBwYWdlLCB0aGF0IHJhaXNlZCB0aGUgd2F0Y2gCiAgICBTaXJyYWgsIHdoYXQgbWFkZSB5b3VyIG1hc3RlciBpbiB0aGlzIHBsYWNlPwoKUEFHRQoKICAgIEhlIGNhbWUgd2l0aCBmbG93ZXJzIHRvIHN0cmV3IGhpcyBsYWR5J3MgZ3JhdmU7CiAgICBBbmQgYmlkIG1lIHN0YW5kIGFsb29mLCBhbmQgc28gSSBkaWQ6CiAgICBBbm9uIGNvbWVzIG9uZSB3aXRoIGxpZ2h0IHRvIG9wZSB0aGUgdG9tYjsKICAgIEFuZCBieSBhbmQgYnkgbXkgbWFzdGVyIGRyZXcgb24gaGltOwogICAgQW5kIHRoZW4gSSByYW4gYXdheSB0byBjYWxsIHRoZSB3YXRjaC4KClBSSU5DRQoKICAgIFRoaXMgbGV0dGVyIGRvdGggbWFrZSBnb29kIHRoZSBmcmlhcidzIHdvcmRzLAogICAgVGhlaXIgY291cnNlIG9mIGxvdmUsIHRoZSB0aWRpbmdzIG9mIGhlciBkZWF0aDoKICAgIEFuZCBoZXJlIGhlIHdyaXRlcyB0aGF0IGhlIGRpZCBidXkgYSBwb2lzb24KICAgIE9mIGEgcG9vciAncG90aGVjYXJ5LCBhbmQgdGhlcmV3aXRoYWwKICAgIENhbWUgdG8gdGhpcyB2YXVsdCB0byBkaWUsIGFuZCBsaWUgd2l0aCBKdWxpZXQuCiAgICBXaGVyZSBiZSB0aGVzZSBlbmVtaWVzPyBDYXB1bGV0ISBNb250YWd1ZSEKICAgIFNlZSwgd2hhdCBhIHNjb3VyZ2UgaXMgbGFpZCB1cG9uIHlvdXIgaGF0ZSwKICAgIFRoYXQgaGVhdmVuIGZpbmRzIG1lYW5zIHRvIGtpbGwgeW91ciBqb3lzIHdpdGggbG92ZS4KICAgIEFuZCBJIGZvciB3aW5raW5nIGF0IHlvdXIgZGlzY29yZHMgdG9vCiAgICBIYXZlIGxvc3QgYSBicmFjZSBvZiBraW5zbWVuOiBhbGwgYXJlIHB1bmlzaCdkLgoKQ0FQVUxFVAoKICAgIE8gYnJvdGhlciBNb250YWd1ZSwgZ2l2ZSBtZSB0aHkgaGFuZDoKICAgIFRoaXMgaXMgbXkgZGF1Z2h0ZXIncyBqb2ludHVyZSwgZm9yIG5vIG1vcmUKICAgIENhbiBJIGRlbWFuZC4KCk1PTlRBR1VFCgogICAgQnV0IEkgY2FuIGdpdmUgdGhlZSBtb3JlOgogICAgRm9yIEkgd2lsbCByYWlzZSBoZXIgc3RhdHVlIGluIHB1cmUgZ29sZDsKICAgIFRoYXQgd2hpbGUgVmVyb25hIGJ5IHRoYXQgbmFtZSBpcyBrbm93biwKICAgIFRoZXJlIHNoYWxsIG5vIGZpZ3VyZSBhdCBzdWNoIHJhdGUgYmUgc2V0CiAgICBBcyB0aGF0IG9mIHRydWUgYW5kIGZhaXRoZnVsIEp1bGlldC4KCkNBUFVMRVQKCiAgICBBcyByaWNoIHNoYWxsIFJvbWVvJ3MgYnkgaGlzIGxhZHkncyBsaWU7CiAgICBQb29yIHNhY3JpZmljZXMgb2Ygb3VyIGVubWl0eSEKClBSSU5DRQoKICAgIEEgZ2xvb21pbmcgcGVhY2UgdGhpcyBtb3JuaW5nIHdpdGggaXQgYnJpbmdzOwogICAgVGhlIHN1biwgZm9yIHNvcnJvdywgd2lsbCBub3Qgc2hvdyBoaXMgaGVhZDoKICAgIEdvIGhlbmNlLCB0byBoYXZlIG1vcmUgdGFsayBvZiB0aGVzZSBzYWQgdGhpbmdzOwogICAgU29tZSBzaGFsbCBiZSBwYXJkb24nZCwgYW5kIHNvbWUgcHVuaXNoZWQ6CiAgICBGb3IgbmV2ZXIgd2FzIGEgc3Rvcnkgb2YgbW9yZSB3b2UKICAgIFRoYW4gdGhpcyBvZiBKdWxpZXQgYW5kIGhlciBSb21lby4KCiAgICBFeGV1bnQK

Chuck Cartledge
Chuck Cartledge
Chuck Cartledge

httpantonio-ferraroeupnword-clouds-in-r-packages-wordcloud2-and-tmrm(list=ls())library(wordcloud2)library(NLP)library(tm)library(RCurl) Necessary steps 1 Use imagesgooglecom to find an outline of the shape to fill (tmpusapng) 2 Use gimp to fill the outline with black 3 Use a command like wordcloud2(TDMasDF size = 20 figPath=tmpusapng backgroundColor = white fontFamily=Loma) to populate shape 4 Result is a web page with javascript embedded to create image and allow mouse overs Clean corpuscleanCorpus lt- function(corpus) corpustmp lt- tm_map(corpus removePunctuation) corpustmp lt- tm_map(corpustmpstripWhitespace) corpustmp lt- tm_map(corpustmptolower) corpustmp lt- tm_map(corpustmp PlainTextDocument) corpustmp lt- tm_map(corpustmpremoveWords stopwords(english)) return(corpustmp) Build TDMgenerateTDM lt- function(path) sdir lt-path scor lt-Corpus(DirSource(directory = sdir encoding= UTF-8)) scorcl lt- cleanCorpus(scor) stdm lt- TermDocumentMatrix(scorcl) stdminitData lt- function(path) if (direxists(path) == FALSE) If the directory does not exist create and populate with dummy data dummyDataFile lt- romeoAndJulietbase64 fileName lt- sprintf(sdummyDatatxt path) print(sprintf(Creating and populating the file s with dummy data fileName)) dircreate(path recursive = TRUE) write(base64( paste( readLines(dummyDataFile) collapse=) encode=FALSE) file=fileName) main lt- function() options(stringsAsFactors = FALSE) The working directory pathName lt- Text initData(pathName) Get the Term Document Matrix TDM lt- generateTDM(pathName) Do I need a matrix or a DF We will see TDMasMatrix lt- asmatrix(TDM) TDMasDFlt-dataframe(TDMasMatrix) TDMasDF$words lt-rownames(TDMasDF) Column headers colnames(TDMasDF) lt- c(freq word) TDMasDFlt-TDMasDF[ c(word freq)] TDMasDF lt- TDMasDF[order(TDMasDF$freqdecreasing=TRUE)] The results a lt- wordcloud2(TDMasDF size = 03 shape=star backgroundColor = black fontFamily=Loma) print(a) a lt- letterCloud(TDMasDF word=USA size = 03 fontFamily=Loma backgroundColor = black) print(a) a lt- wordcloud2(TDMasDF size = 13 figPath=heartpng backgroundColor = white fontFamily=Loma color=red) print(a) TDMasDF$freq lt- log(TDMasDF$freq) a lt- wordcloud2(TDMasDF size = 12 figPath=usapng backgroundColor = white shuffle=FALSE minRotation = 0 maxRotation = 2pi) print(a) print(The program has ended)main()

Chuck Cartledge
Page 7: Creating Shaped Wordclouds Using R - clc-ent.comThe wordcloud2 function behaves slightly di erently than most of the other R plot func-tions that I’ve used. The result from both

Figure 5 A filled USA word cloud figure

The wordcloud2 function behaves slightly differently than most of the other R plot func-tions that Irsquove used The result from both wordcloud2 and letterCloud is not displayablewithin R These functions actually create an HTML page in a temporary directory with em-bedded JavaScript that performs the placement of the words within the shape and providesa level of interaction after the page is displayed R ldquounderstandsrdquo that the product fromthese functions is an HTML widget and starts up the default browser to show the page Thepage and its sub-directories are removed when R ends

The fact that the page uses JavaScript introduces some interesting aspects Buried in theJavaScript used by the page to place the words in the cloud are a plethora of Mathrandom()calls The JavaScript specification says that the Mathrandom() function has to return avalue greater than or equal to 0 and less than 1 which is reasonable for a random functionThe specification also says that the implementation of the random function is up to theJavaScript application and does not specify how the numbers are to be generated Meaningthat the same HTML page being viewed by two different browsers may generate two differentsequences of random numbers Most random number generators have the capability of settinga seed value so that a repeatable sequence can be generated JavaScript does not supportthe idea of a random number seed The HTML page and collection of directories can bemoved to a server where they are available for use and support

All of this means that each loading and viewing of the page will generate a different

1Available fromhttpsgithubcomLchiffonwordcloud2

6

image and there is no practical way to ldquoget backrdquo to an image that was goodIn the Files section (see Section A on page 9) is an R script and support files to work

with The R script was used to create various images (see Figure 6 on the following page)

3 Conclusion

The wordcloud2 library enables you to create word clouds of arbitrary shape inside an HTMLusing JavaScript to position and orient each word Each HTML page and its associatedlibrary files are placed in individual directories that are removed when the creating R processterminates Pages and files can be moved or copied for safe keeping if desired Because thepages use the Mathrandom() JavaScript function each time the page is loaded words willbe positioned differently in the cloud If the desired shape has an internal hole then it ispossible that some words may not be placed in the cloud

wordcloud2 allows you to create word clouds to support your data visualization needs

7

(a) A heart

(b) The letters ldquoUSArdquo

(c) A star

(d) The USA

Figure 6 A collection of sample word clouds These images were created with the attachedR script

8

A Misc files

The files used to create all these figures are attached to this report They are

1 romeoAndJulietbase64 ndash default text used to demonstrate the software

2 heartpng ndash a heart shape with a hole

3 usapng ndash an outline of the continental United States

4 wordCloudR ndash an R script to demonstrate making word clouds

9

ClJvbWVvIGFuZCBKdWxpZXQKU2hha2VzcGVhcmUgaG9tZXBhZ2UgfCBSb21lbyBhbmQgSnVsaWV0IHwgRW50aXJlIHBsYXkKQUNUIEkKUFJPTE9HVUUKCiAgICBUd28gaG91c2Vob2xkcywgYm90aCBhbGlrZSBpbiBkaWduaXR5LAogICAgSW4gZmFpciBWZXJvbmEsIHdoZXJlIHdlIGxheSBvdXIgc2NlbmUsCiAgICBGcm9tIGFuY2llbnQgZ3J1ZGdlIGJyZWFrIHRvIG5ldyBtdXRpbnksCiAgICBXaGVyZSBjaXZpbCBibG9vZCBtYWtlcyBjaXZpbCBoYW5kcyB1bmNsZWFuLgogICAgRnJvbSBmb3J0aCB0aGUgZmF0YWwgbG9pbnMgb2YgdGhlc2UgdHdvIGZvZXMKICAgIEEgcGFpciBvZiBzdGFyLWNyb3NzJ2QgbG92ZXJzIHRha2UgdGhlaXIgbGlmZTsKICAgIFdob3NlIG1pc2FkdmVudHVyZWQgcGl0ZW91cyBvdmVydGhyb3dzCiAgICBEbyB3aXRoIHRoZWlyIGRlYXRoIGJ1cnkgdGhlaXIgcGFyZW50cycgc3RyaWZlLgogICAgVGhlIGZlYXJmdWwgcGFzc2FnZSBvZiB0aGVpciBkZWF0aC1tYXJrJ2QgbG92ZSwKICAgIEFuZCB0aGUgY29udGludWFuY2Ugb2YgdGhlaXIgcGFyZW50cycgcmFnZSwKICAgIFdoaWNoLCBidXQgdGhlaXIgY2hpbGRyZW4ncyBlbmQsIG5vdWdodCBjb3VsZCByZW1vdmUsCiAgICBJcyBub3cgdGhlIHR3byBob3VycycgdHJhZmZpYyBvZiBvdXIgc3RhZ2U7CiAgICBUaGUgd2hpY2ggaWYgeW91IHdpdGggcGF0aWVudCBlYXJzIGF0dGVuZCwKICAgIFdoYXQgaGVyZSBzaGFsbCBtaXNzLCBvdXIgdG9pbCBzaGFsbCBzdHJpdmUgdG8gbWVuZC4KClNDRU5FIEkuIFZlcm9uYS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgU0FNUFNPTiBhbmQgR1JFR09SWSwgb2YgdGhlIGhvdXNlIG9mIENhcHVsZXQsIGFybWVkIHdpdGggc3dvcmRzIGFuZCBidWNrbGVycyAKClNBTVBTT04KCiAgICBHcmVnb3J5LCBvJyBteSB3b3JkLCB3ZSdsbCBub3QgY2FycnkgY29hbHMuCgpHUkVHT1JZCgogICAgTm8sIGZvciB0aGVuIHdlIHNob3VsZCBiZSBjb2xsaWVycy4KClNBTVBTT04KCiAgICBJIG1lYW4sIGFuIHdlIGJlIGluIGNob2xlciwgd2UnbGwgZHJhdy4KCkdSRUdPUlkKCiAgICBBeSwgd2hpbGUgeW91IGxpdmUsIGRyYXcgeW91ciBuZWNrIG91dCBvJyB0aGUgY29sbGFyLgoKU0FNUFNPTgoKICAgIEkgc3RyaWtlIHF1aWNrbHksIGJlaW5nIG1vdmVkLgoKR1JFR09SWQoKICAgIEJ1dCB0aG91IGFydCBub3QgcXVpY2tseSBtb3ZlZCB0byBzdHJpa2UuCgpTQU1QU09OCgogICAgQSBkb2cgb2YgdGhlIGhvdXNlIG9mIE1vbnRhZ3VlIG1vdmVzIG1lLgoKR1JFR09SWQoKICAgIFRvIG1vdmUgaXMgdG8gc3RpcjsgYW5kIHRvIGJlIHZhbGlhbnQgaXMgdG8gc3RhbmQ6CiAgICB0aGVyZWZvcmUsIGlmIHRob3UgYXJ0IG1vdmVkLCB0aG91IHJ1bm4nc3QgYXdheS4KClNBTVBTT04KCiAgICBBIGRvZyBvZiB0aGF0IGhvdXNlIHNoYWxsIG1vdmUgbWUgdG8gc3RhbmQ6IEkgd2lsbAogICAgdGFrZSB0aGUgd2FsbCBvZiBhbnkgbWFuIG9yIG1haWQgb2YgTW9udGFndWUncy4KCkdSRUdPUlkKCiAgICBUaGF0IHNob3dzIHRoZWUgYSB3ZWFrIHNsYXZlOyBmb3IgdGhlIHdlYWtlc3QgZ29lcwogICAgdG8gdGhlIHdhbGwuCgpTQU1QU09OCgogICAgVHJ1ZTsgYW5kIHRoZXJlZm9yZSB3b21lbiwgYmVpbmcgdGhlIHdlYWtlciB2ZXNzZWxzLAogICAgYXJlIGV2ZXIgdGhydXN0IHRvIHRoZSB3YWxsOiB0aGVyZWZvcmUgSSB3aWxsIHB1c2gKICAgIE1vbnRhZ3VlJ3MgbWVuIGZyb20gdGhlIHdhbGwsIGFuZCB0aHJ1c3QgaGlzIG1haWRzCiAgICB0byB0aGUgd2FsbC4KCkdSRUdPUlkKCiAgICBUaGUgcXVhcnJlbCBpcyBiZXR3ZWVuIG91ciBtYXN0ZXJzIGFuZCB1cyB0aGVpciBtZW4uCgpTQU1QU09OCgogICAgJ1RpcyBhbGwgb25lLCBJIHdpbGwgc2hvdyBteXNlbGYgYSB0eXJhbnQ6IHdoZW4gSQogICAgaGF2ZSBmb3VnaHQgd2l0aCB0aGUgbWVuLCBJIHdpbGwgYmUgY3J1ZWwgd2l0aCB0aGUKICAgIG1haWRzLCBhbmQgY3V0IG9mZiB0aGVpciBoZWFkcy4KCkdSRUdPUlkKCiAgICBUaGUgaGVhZHMgb2YgdGhlIG1haWRzPwoKU0FNUFNPTgoKICAgIEF5LCB0aGUgaGVhZHMgb2YgdGhlIG1haWRzLCBvciB0aGVpciBtYWlkZW5oZWFkczsKICAgIHRha2UgaXQgaW4gd2hhdCBzZW5zZSB0aG91IHdpbHQuCgpHUkVHT1JZCgogICAgVGhleSBtdXN0IHRha2UgaXQgaW4gc2Vuc2UgdGhhdCBmZWVsIGl0LgoKU0FNUFNPTgoKICAgIE1lIHRoZXkgc2hhbGwgZmVlbCB3aGlsZSBJIGFtIGFibGUgdG8gc3RhbmQ6IGFuZAogICAgJ3RpcyBrbm93biBJIGFtIGEgcHJldHR5IHBpZWNlIG9mIGZsZXNoLgoKR1JFR09SWQoKICAgICdUaXMgd2VsbCB0aG91IGFydCBub3QgZmlzaDsgaWYgdGhvdSBoYWRzdCwgdGhvdQogICAgaGFkc3QgYmVlbiBwb29yIEpvaG4uIERyYXcgdGh5IHRvb2whIGhlcmUgY29tZXMKICAgIHR3byBvZiB0aGUgaG91c2Ugb2YgdGhlIE1vbnRhZ3Vlcy4KClNBTVBTT04KCiAgICBNeSBuYWtlZCB3ZWFwb24gaXMgb3V0OiBxdWFycmVsLCBJIHdpbGwgYmFjayB0aGVlLgoKR1JFR09SWQoKICAgIEhvdyEgdHVybiB0aHkgYmFjayBhbmQgcnVuPwoKU0FNUFNPTgoKICAgIEZlYXIgbWUgbm90LgoKR1JFR09SWQoKICAgIE5vLCBtYXJyeTsgSSBmZWFyIHRoZWUhCgpTQU1QU09OCgogICAgTGV0IHVzIHRha2UgdGhlIGxhdyBvZiBvdXIgc2lkZXM7IGxldCB0aGVtIGJlZ2luLgoKR1JFR09SWQoKICAgIEkgd2lsbCBmcm93biBhcyBJIHBhc3MgYnksIGFuZCBsZXQgdGhlbSB0YWtlIGl0IGFzCiAgICB0aGV5IGxpc3QuCgpTQU1QU09OCgogICAgTmF5LCBhcyB0aGV5IGRhcmUuIEkgd2lsbCBiaXRlIG15IHRodW1iIGF0IHRoZW07CiAgICB3aGljaCBpcyBhIGRpc2dyYWNlIHRvIHRoZW0sIGlmIHRoZXkgYmVhciBpdC4KCiAgICBFbnRlciBBQlJBSEFNIGFuZCBCQUxUSEFTQVIKCkFCUkFIQU0KCiAgICBEbyB5b3UgYml0ZSB5b3VyIHRodW1iIGF0IHVzLCBzaXICgpTQU1QU09OCgogICAgSSBkbyBiaXRlIG15IHRodW1iLCBzaXIuCgpBQlJBSEFNCgogICAgRG8geW91IGJpdGUgeW91ciB0aHVtYiBhdCB1cywgc2lyPwoKU0FNUFNPTgoKICAgIFtBc2lkZSB0byBHUkVHT1JZXSBJcyB0aGUgbGF3IG9mIG91ciBzaWRlLCBpZiBJIHNheQogICAgYXkCgpHUkVHT1JZCgogICAgTm8uCgpTQU1QU09OCgogICAgTm8sIHNpciwgSSBkbyBub3QgYml0ZSBteSB0aHVtYiBhdCB5b3UsIHNpciwgYnV0IEkKICAgIGJpdGUgbXkgdGh1bWIsIHNpci4KCkdSRUdPUlkKCiAgICBEbyB5b3UgcXVhcnJlbCwgc2lyPwoKQUJSQUhBTQoKICAgIFF1YXJyZWwgc2lyISBubywgc2lyLgoKU0FNUFNPTgoKICAgIElmIHlvdSBkbywgc2lyLCBJIGFtIGZvciB5b3U6IEkgc2VydmUgYXMgZ29vZCBhIG1hbiBhcyB5b3UuCgpBQlJBSEFNCgogICAgTm8gYmV0dGVyLgoKU0FNUFNPTgoKICAgIFdlbGwsIHNpci4KCkdSRUdPUlkKCiAgICBTYXkgJ2JldHRlcjonIGhlcmUgY29tZXMgb25lIG9mIG15IG1hc3RlcidzIGtpbnNtZW4uCgpTQU1QU09OCgogICAgWWVzLCBiZXR0ZXIsIHNpci4KCkFCUkFIQU0KCiAgICBZb3UgbGllLgoKU0FNUFNPTgoKICAgIERyYXcsIGlmIHlvdSBiZSBtZW4uIEdyZWdvcnksIHJlbWVtYmVyIHRoeSBzd2FzaGluZyBibG93LgoKICAgIFRoZXkgZmlnaHQKCiAgICBFbnRlciBCRU5WT0xJTwoKQkVOVk9MSU8KCiAgICBQYXJ0LCBmb29scyEKICAgIFB1dCB1cCB5b3VyIHN3b3JkczsgeW91IGtub3cgbm90IHdoYXQgeW91IGRvLgoKICAgIEJlYXRzIGRvd24gdGhlaXIgc3dvcmRzCgogICAgRW50ZXIgVFlCQUxUCgpUWUJBTFQKCiAgICBXaGF0LCBhcnQgdGhvdSBkcmF3biBhbW9uZyB0aGVzZSBoZWFydGxlc3MgaGluZHMCiAgICBUdXJuIHRoZWUsIEJlbnZvbGlvLCBsb29rIHVwb24gdGh5IGRlYXRoLgoKQkVOVk9MSU8KCiAgICBJIGRvIGJ1dCBrZWVwIHRoZSBwZWFjZTogcHV0IHVwIHRoeSBzd29yZCwKICAgIE9yIG1hbmFnZSBpdCB0byBwYXJ0IHRoZXNlIG1lbiB3aXRoIG1lLgoKVFlCQUxUCgogICAgV2hhdCwgZHJhd24sIGFuZCB0YWxrIG9mIHBlYWNlISBJIGhhdGUgdGhlIHdvcmQsCiAgICBBcyBJIGhhdGUgaGVsbCwgYWxsIE1vbnRhZ3VlcywgYW5kIHRoZWU6CiAgICBIYXZlIGF0IHRoZWUsIGNvd2FyZCEKCiAgICBUaGV5IGZpZ2h0CgogICAgRW50ZXIsIHNldmVyYWwgb2YgYm90aCBob3VzZXMsIHdobyBqb2luIHRoZSBmcmF5OyB0aGVuIGVudGVyIENpdGl6ZW5zLCB3aXRoIGNsdWJzCgpGaXJzdCBDaXRpemVuCgogICAgQ2x1YnMsIGJpbGxzLCBhbmQgcGFydGlzYW5zISBzdHJpa2UhIGJlYXQgdGhlbSBkb3duIQogICAgRG93biB3aXRoIHRoZSBDYXB1bGV0cyEgZG93biB3aXRoIHRoZSBNb250YWd1ZXMhCgogICAgRW50ZXIgQ0FQVUxFVCBpbiBoaXMgZ293biwgYW5kIExBRFkgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgdGhpcz8gR2l2ZSBtZSBteSBsb25nIHN3b3JkLCBobyEKCkxBRFkgQ0FQVUxFVAoKICAgIEEgY3J1dGNoLCBhIGNydXRjaCEgd2h5IGNhbGwgeW91IGZvciBhIHN3b3JkPwoKQ0FQVUxFVAoKICAgIE15IHN3b3JkLCBJIHNheSEgT2xkIE1vbnRhZ3VlIGlzIGNvbWUsCiAgICBBbmQgZmxvdXJpc2hlcyBoaXMgYmxhZGUgaW4gc3BpdGUgb2YgbWUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIExBRFkgTU9OVEFHVUUKCk1PTlRBR1VFCgogICAgVGhvdSB2aWxsYWluIENhcHVsZXQsLS1Ib2xkIG1lIG5vdCwgbGV0IG1lIGdvLgoKTEFEWSBNT05UQUdVRQoKICAgIFRob3Ugc2hhbHQgbm90IHN0aXIgYSBmb290IHRvIHNlZWsgYSBmb2UuCgogICAgRW50ZXIgUFJJTkNFLCB3aXRoIEF0dGVuZGFudHMKClBSSU5DRQoKICAgIFJlYmVsbGlvdXMgc3ViamVjdHMsIGVuZW1pZXMgdG8gcGVhY2UsCiAgICBQcm9mYW5lcnMgb2YgdGhpcyBuZWlnaGJvdXItc3RhaW5lZCBzdGVlbCwtLQogICAgV2lsbCB0aGV5IG5vdCBoZWFyPyBXaGF0LCBobyEgeW91IG1lbiwgeW91IGJlYXN0cywKICAgIFRoYXQgcXVlbmNoIHRoZSBmaXJlIG9mIHlvdXIgcGVybmljaW91cyByYWdlCiAgICBXaXRoIHB1cnBsZSBmb3VudGFpbnMgaXNzdWluZyBmcm9tIHlvdXIgdmVpbnMsCiAgICBPbiBwYWluIG9mIHRvcnR1cmUsIGZyb20gdGhvc2UgYmxvb2R5IGhhbmRzCiAgICBUaHJvdyB5b3VyIG1pc3RlbXBlcidkIHdlYXBvbnMgdG8gdGhlIGdyb3VuZCwKICAgIEFuZCBoZWFyIHRoZSBzZW50ZW5jZSBvZiB5b3VyIG1vdmVkIHByaW5jZS4KICAgIFRocmVlIGNpdmlsIGJyYXdscywgYnJlZCBvZiBhbiBhaXJ5IHdvcmQsCiAgICBCeSB0aGVlLCBvbGQgQ2FwdWxldCwgYW5kIE1vbnRhZ3VlLAogICAgSGF2ZSB0aHJpY2UgZGlzdHVyYidkIHRoZSBxdWlldCBvZiBvdXIgc3RyZWV0cywKICAgIEFuZCBtYWRlIFZlcm9uYSdzIGFuY2llbnQgY2l0aXplbnMKICAgIENhc3QgYnkgdGhlaXIgZ3JhdmUgYmVzZWVtaW5nIG9ybmFtZW50cywKICAgIFRvIHdpZWxkIG9sZCBwYXJ0aXNhbnMsIGluIGhhbmRzIGFzIG9sZCwKICAgIENhbmtlcidkIHdpdGggcGVhY2UsIHRvIHBhcnQgeW91ciBjYW5rZXInZCBoYXRlOgogICAgSWYgZXZlciB5b3UgZGlzdHVyYiBvdXIgc3RyZWV0cyBhZ2FpbiwKICAgIFlvdXIgbGl2ZXMgc2hhbGwgcGF5IHRoZSBmb3JmZWl0IG9mIHRoZSBwZWFjZS4KICAgIEZvciB0aGlzIHRpbWUsIGFsbCB0aGUgcmVzdCBkZXBhcnQgYXdheToKICAgIFlvdSBDYXB1bGV0OyBzaGFsbCBnbyBhbG9uZyB3aXRoIG1lOgogICAgQW5kLCBNb250YWd1ZSwgY29tZSB5b3UgdGhpcyBhZnRlcm5vb24sCiAgICBUbyBrbm93IG91ciBmdXJ0aGVyIHBsZWFzdXJlIGluIHRoaXMgY2FzZSwKICAgIFRvIG9sZCBGcmVlLXRvd24sIG91ciBjb21tb24ganVkZ21lbnQtcGxhY2UuCiAgICBPbmNlIG1vcmUsIG9uIHBhaW4gb2YgZGVhdGgsIGFsbCBtZW4gZGVwYXJ0LgoKICAgIEV4ZXVudCBhbGwgYnV0IE1PTlRBR1VFLCBMQURZIE1PTlRBR1VFLCBhbmQgQkVOVk9MSU8KCk1PTlRBR1VFCgogICAgV2hvIHNldCB0aGlzIGFuY2llbnQgcXVhcnJlbCBuZXcgYWJyb2FjaD8KICAgIFNwZWFrLCBuZXBoZXcsIHdlcmUgeW91IGJ5IHdoZW4gaXQgYmVnYW4CgpCRU5WT0xJTwoKICAgIEhlcmUgd2VyZSB0aGUgc2VydmFudHMgb2YgeW91ciBhZHZlcnNhcnksCiAgICBBbmQgeW91cnMsIGNsb3NlIGZpZ2h0aW5nIGVyZSBJIGRpZCBhcHByb2FjaDoKICAgIEkgZHJldyB0byBwYXJ0IHRoZW06IGluIHRoZSBpbnN0YW50IGNhbWUKICAgIFRoZSBmaWVyeSBUeWJhbHQsIHdpdGggaGlzIHN3b3JkIHByZXBhcmVkLAogICAgV2hpY2gsIGFzIGhlIGJyZWF0aGVkIGRlZmlhbmNlIHRvIG15IGVhcnMsCiAgICBIZSBzd3VuZyBhYm91dCBoaXMgaGVhZCBhbmQgY3V0IHRoZSB3aW5kcywKICAgIFdobyBub3RoaW5nIGh1cnQgd2l0aGFsIGhpc3MnZCBoaW0gaW4gc2Nvcm46CiAgICBXaGlsZSB3ZSB3ZXJlIGludGVyY2hhbmdpbmcgdGhydXN0cyBhbmQgYmxvd3MsCiAgICBDYW1lIG1vcmUgYW5kIG1vcmUgYW5kIGZvdWdodCBvbiBwYXJ0IGFuZCBwYXJ0LAogICAgVGlsbCB0aGUgcHJpbmNlIGNhbWUsIHdobyBwYXJ0ZWQgZWl0aGVyIHBhcnQuCgpMQURZIE1PTlRBR1VFCgogICAgTywgd2hlcmUgaXMgUm9tZW8IHNhdyB5b3UgaGltIHRvLWRheT8KICAgIFJpZ2h0IGdsYWQgSSBhbSBoZSB3YXMgbm90IGF0IHRoaXMgZnJheS4KCkJFTlZPTElPCgogICAgTWFkYW0sIGFuIGhvdXIgYmVmb3JlIHRoZSB3b3JzaGlwcCdkIHN1bgogICAgUGVlcidkIGZvcnRoIHRoZSBnb2xkZW4gd2luZG93IG9mIHRoZSBlYXN0LAogICAgQSB0cm91YmxlZCBtaW5kIGRyYXZlIG1lIHRvIHdhbGsgYWJyb2FkOwogICAgV2hlcmUsIHVuZGVybmVhdGggdGhlIGdyb3ZlIG9mIHN5Y2Ftb3JlCiAgICBUaGF0IHdlc3R3YXJkIHJvb3RldGggZnJvbSB0aGUgY2l0eSdzIHNpZGUsCiAgICBTbyBlYXJseSB3YWxraW5nIGRpZCBJIHNlZSB5b3VyIHNvbjoKICAgIFRvd2FyZHMgaGltIEkgbWFkZSwgYnV0IGhlIHdhcyB3YXJlIG9mIG1lCiAgICBBbmQgc3RvbGUgaW50byB0aGUgY292ZXJ0IG9mIHRoZSB3b29kOgogICAgSSwgbWVhc3VyaW5nIGhpcyBhZmZlY3Rpb25zIGJ5IG15IG93biwKICAgIFRoYXQgbW9zdCBhcmUgYnVzaWVkIHdoZW4gdGhleSdyZSBtb3N0IGFsb25lLAogICAgUHVyc3VlZCBteSBodW1vdXIgbm90IHB1cnN1aW5nIGhpcywKICAgIEFuZCBnbGFkbHkgc2h1bm4nZCB3aG8gZ2xhZGx5IGZsZWQgZnJvbSBtZS4KCk1PTlRBR1VFCgogICAgTWFueSBhIG1vcm5pbmcgaGF0aCBoZSB0aGVyZSBiZWVuIHNlZW4sCiAgICBXaXRoIHRlYXJzIGF1Z21lbnRpbmcgdGhlIGZyZXNoIG1vcm5pbmcgZGV3LgogICAgQWRkaW5nIHRvIGNsb3VkcyBtb3JlIGNsb3VkcyB3aXRoIGhpcyBkZWVwIHNpZ2hzOwogICAgQnV0IGFsbCBzbyBzb29uIGFzIHRoZSBhbGwtY2hlZXJpbmcgc3VuCiAgICBTaG91bGQgaW4gdGhlIGZ1cnRoZXN0IGVhc3QgYmVnaW4gdG8gZHJhdwogICAgVGhlIHNoYWR5IGN1cnRhaW5zIGZyb20gQXVyb3JhJ3MgYmVkLAogICAgQXdheSBmcm9tIHRoZSBsaWdodCBzdGVhbHMgaG9tZSBteSBoZWF2eSBzb24sCiAgICBBbmQgcHJpdmF0ZSBpbiBoaXMgY2hhbWJlciBwZW5zIGhpbXNlbGYsCiAgICBTaHV0cyB1cCBoaXMgd2luZG93cywgbG9ja3MgZmFyIGRheWxpZ2h0IG91dAogICAgQW5kIG1ha2VzIGhpbXNlbGYgYW4gYXJ0aWZpY2lhbCBuaWdodDoKICAgIEJsYWNrIGFuZCBwb3J0ZW50b3VzIG11c3QgdGhpcyBodW1vdXIgcHJvdmUsCiAgICBVbmxlc3MgZ29vZCBjb3Vuc2VsIG1heSB0aGUgY2F1c2UgcmVtb3ZlLgoKQkVOVk9MSU8KCiAgICBNeSBub2JsZSB1bmNsZSwgZG8geW91IGtub3cgdGhlIGNhdXNlPwoKTU9OVEFHVUUKCiAgICBJIG5laXRoZXIga25vdyBpdCBub3IgY2FuIGxlYXJuIG9mIGhpbS4KCkJFTlZPTElPCgogICAgSGF2ZSB5b3UgaW1wb3J0dW5lZCBoaW0gYnkgYW55IG1lYW5zPwoKTU9OVEFHVUUKCiAgICBCb3RoIGJ5IG15c2VsZiBhbmQgbWFueSBvdGhlciBmcmllbmRzOgogICAgQnV0IGhlLCBoaXMgb3duIGFmZmVjdGlvbnMnIGNvdW5zZWxsb3IsCiAgICBJcyB0byBoaW1zZWxmLS1JIHdpb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UVPCgogICAgR29vZCBoZWFydCwgYXQgd2hhdD8KCkJFTlZPTElPCgogICAgQXQgdGh5IGdvb2QgaGVhcnQncyBvcHByZXNzaW9uLgoKUk9NRU8KCiAgICBXaHksIHN1Y2ggaXMgbG92ZSdzIHRyYW5zZ3Jlc3Npb24uCiAgICBHcmllZnMgb2YgbWluZSBvd24gbGllIGhlYXZ5IGluIG15IGJyZWFzdCwKICAgIFdoaWNoIHRob3Ugd2lsdCBwcm9wYWdhdGUsIHRvIGhhdmUgaXQgcHJlc3QKICAgIFdpdGggbW9yZSBvZiB0aGluZTogdGhpcyBsb3ZlIHRoYXQgdGhvdSBoYXN0IHNob3duCiAgICBEb3RoIGFkZCBtb3JlIGdyaWVmIHRvIHRvbyBtdWNoIG9mIG1pbmUgb3duLgogICAgTG92ZSBpcyBhIHNtb2tlIHJhaXNlZCB3aXRoIHRoZSBmdW1lIG9mIHNpZ2hzOwogICAgQmVpbmcgcHVyZ2VkLCBhIGZpcmUgc3BhcmtsaW5nIGluIGxvdmVycycgZXllczsKICAgIEJlaW5nIHZleCdkIGEgc2VhIG5vdXJpc2gnZCB3aXRoIGxvdmVycycgdGVhcnM6CiAgICBXaGF0IGlzIGl0IGVsc2UIGEgbWFkbmVzcyBtb3N0IGRpc2NyZWV0LAogICAgQSBjaG9raW5nIGdhbGwgYW5kIGEgcHJlc2VydmluZyBzd2VldC4KICAgIEZhcmV3ZWxsLCBteSBjb3ouCgpCRU5WT0xJTwoKICAgIFNvZnQhIEkgd2lsbCBnbyBhbG9uZzsKICAgIEFuIGlmIHlvdSBsZWF2ZSBtZSBzbywgeW91IGRvIG1lIHdyb25nLgoKUk9NRU8KCiAgICBUdXQsIEkgaGF2ZSBsb3N0IG15c2VsZjsgSSBhbSBub3QgaGVyZTsKICAgIFRoaXMgaXMgbm90IFJvbWVvLCBoZSdzIHNvbWUgb3RoZXIgd2hlcmUuCgpCRU5WT0xJTwoKICAgIFRlbGwgbWUgaW4gc2FkbmVzcywgd2hvIGlzIHRoYXQgeW91IGxvdmUuCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIEkgZ3JvYW4gYW5kIHRlbGwgdGhlZT8KCkJFTlZPTElPCgogICAgR3JvYW4hIHdoeSwgbm8uCiAgICBCdXQgc2FkbHkgdGVsbCBtZSB3aG8uCgpST01FTwoKICAgIEJpZCBhIHNpY2sgbWFuIGluIHNhZG5lc3MgbWFrZSBoaXMgd2lsbDoKICAgIEFoLCB3b3JkIGlsbCB1cmdlZCB0byBvbmUgdGhhdCBpcyBzbyBpbGwhCiAgICBJbiBzYWRuZXNzLCBjb3VzaW4sIEkgZG8gbG92ZSBhIHdvbWFuLgoKQkVOVk9MSU8KCiAgICBJIGFpbSdkIHNvIG5lYXIsIHdoZW4gSSBzdXBwb3NlZCB5b3UgbG92ZWQuCgpST01FTwoKICAgIEEgcmlnaHQgZ29vZCBtYXJrLW1hbiEgQW5kIHNoZSdzIGZhaXIgSSBsb3ZlLgoKQkVOVk9MSU8KCiAgICBBIHJpZ2h0IGZhaXIgbWFyaywgZmFpciBjb3osIGlzIHNvb25lc3QgaGl0LgoKUk9NRU8KCiAgICBXZWxsLCBpbiB0aGF0IGhpdCB5b3UgbWlzczogc2hlJ2xsIG5vdCBiZSBoaXQKICAgIFdpdGggQ3VwaWQncyBhcnJvdzsgc2hlIGhhdGggRGlhbidzIHdpdDsKICAgIEFuZCwgaW4gc3Ryb25nIHByb29mIG9mIGNoYXN0aXR5IHdlbGwgYXJtJ2QsCiAgICBGcm9tIGxvdmUncyB3ZWFrIGNoaWxkaXNoIGJvdyBzaGUgbGl2ZXMgdW5oYXJtJ2QuCiAgICBTaGUgd2lsbCBub3Qgc3RheSB0aGUgc2llZ2Ugb2YgbG92aW5nIHRlcm1zLAogICAgTm9yIGJpZGUgdGhlIGVuY291bnRlciBvZiBhc3NhaWxpbmcgZXllcywKICAgIE5vciBvcGUgaGVyIGxhcCB0byBzYWludC1zZWR1Y2luZyBnb2xkOgogICAgTywgc2hlIGlzIHJpY2ggaW4gYmVhdXR5LCBvbmx5IHBvb3IsCiAgICBUaGF0IHdoZW4gc2hlIGRpZXMgd2l0aCBiZWF1dHkgZGllcyBoZXIgc3RvcmUuCgpCRU5WT0xJTwoKICAgIFRoZW4gc2hlIGhhdGggc3dvcm4gdGhhdCBzaGUgd2lsbCBzdGlsbCBsaXZlIGNoYXN0ZT8KClJPTUVPCgogICAgU2hlIGhhdGgsIGFuZCBpbiB0aGF0IHNwYXJpbmcgbWFrZXMgaHVnZSB3YXN0ZSwKICAgIEZvciBiZWF1dHkgc3RhcnZlZCB3aXRoIGhlciBzZXZlcml0eQogICAgQ3V0cyBiZWF1dHkgb2ZmIGZyb20gYWxsIHBvc3Rlcml0eS4KICAgIFNoZSBpcyB0b28gZmFpciwgdG9vIHdpc2UsIHdpc2VseSB0b28gZmFpciwKICAgIFRvIG1lcml0IGJsaXNzIGJ5IG1ha2luZyBtZSBkZXNwYWlyOgogICAgU2hlIGhhdGggZm9yc3dvcm4gdG8gbG92ZSwgYW5kIGluIHRoYXQgdm93CiAgICBEbyBJIGxpdmUgZGVhZCB0aGF0IGxpdmUgdG8gdGVsbCBpdCBub3cuCgpCRU5WT0xJTwoKICAgIEJlIHJ1bGVkIGJ5IG1lLCBmb3JnZXQgdG8gdGhpbmsgb2YgaGVyLgoKUk9NRU8KCiAgICBPLCB0ZWFjaCBtZSBob3cgSSBzaG91bGQgZm9yZ2V0IHRvIHRoaW5rLgoKQkVOVk9MSU8KCiAgICBCeSBnaXZpbmcgbGliZXJ0eSB1bnRvIHRoaW5lIGV5ZXM7CiAgICBFeGFtaW5lIG90aGVyIGJlYXV0aWVzLgoKUk9NRU8KCiAgICAnVGlzIHRoZSB3YXkKICAgIFRvIGNhbGwgaGVycyBleHF1aXNpdGUsIGluIHF1ZXN0aW9uIG1vcmU6CiAgICBUaGVzZSBoYXBweSBtYXNrcyB0aGF0IGtpc3MgZmFpciBsYWRpZXMnIGJyb3dzCiAgICBCZWluZyBibGFjayBwdXQgdXMgaW4gbWluZCB0aGV5IGhpZGUgdGhlIGZhaXI7CiAgICBIZSB0aGF0IGlzIHN0cnVja2VuIGJsaW5kIGNhbm5vdCBmb3JnZXQKICAgIFRoZSBwcmVjaW91cyB0cmVhc3VyZSBvZiBoaXMgZXllc2lnaHQgbG9zdDoKICAgIFNob3cgbWUgYSBtaXN0cmVzcyB0aGF0IGlzIHBhc3NpbmcgZmFpciwKICAgIFdoYXQgZG90aCBoZXIgYmVhdXR5IHNlcnZlLCBidXQgYXMgYSBub3RlCiAgICBXaGVyZSBJIG1heSByZWFkIHdobyBwYXNzJ2QgdGhhdCBwYXNzaW5nIGZhaXICiAgICBGYXJld2VsbDogdGhvdSBjYW5zdCBub3QgdGVhY2ggbWUgdG8gZm9yZ2V0LgoKQkVOVk9MSU8KCiAgICBJJ2xsIHBheSB0aGF0IGRvY3RyaW5lLCBvciBlbHNlIGRpZSBpbiBkZWJ0LgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEEgc3RyZWV0LgoKICAgIEVudGVyIENBUFVMRVQsIFBBUklTLCBhbmQgU2VydmFudCAKCkNBUFVMRVQKCiAgICBCdXQgTW9udGFndWUgaXMgYm91bmQgYXMgd2VsbCBhcyBJLAogICAgSW4gcGVuYWx0eSBhbGlrZTsgYW5kICd0aXMgbm90IGhhcmQsIEkgdGhpbmssCiAgICBGb3IgbWVuIHNvIG9sZCBhcyB3ZSB0byBrZWVwIHRoZSBwZWFjZS4KClBBUklTCgogICAgT2YgaG9ub3VyYWJsZSByZWNrb25pbmcgYXJlIHlvdSBib3RoOwogICAgQW5kIHBpdHkgJ3RpcyB5b3UgbGl2ZWQgYXQgb2RkcyBzbyBsb25nLgogICAgQnV0IG5vdywgbXkgbG9yZCwgd2hhdCBzYXkgeW91IHRvIG15IHN1aXQCgpDQVBVTEVUCgogICAgQnV0IHNheWluZyBvJ2VyIHdoYXQgSSBoYXZlIHNhaWQgYmVmb3JlOgogICAgTXkgY2hpbGQgaXMgeWV0IGEgc3RyYW5nZXIgaW4gdGhlIHdvcmxkOwogICAgU2hlIGhhdGggbm90IHNlZW4gdGhlIGNoYW5nZSBvZiBmb3VydGVlbiB5ZWFycywKICAgIExldCB0d28gbW9yZSBzdW1tZXJzIHdpdGhlciBpbiB0aGVpciBwcmlkZSwKICAgIEVyZSB3ZSBtYXkgdGhpbmsgaGVyIHJpcGUgdG8gYmUgYSBicmlkZS4KClBBUklTCgogICAgWW91bmdlciB0aGFuIHNoZSBhcmUgaGFwcHkgbW90aGVycyBtYWRlLgoKQ0FQVUxFVAoKICAgIEFuZCB0b28gc29vbiBtYXJyJ2QgYXJlIHRob3NlIHNvIGVhcmx5IG1hZGUuCiAgICBUaGUgZWFydGggaGF0aCBzd2FsbG93J2QgYWxsIG15IGhvcGVzIGJ1dCBzaGUsCiAgICBTaGUgaXMgdGhlIGhvcGVmdWwgbGFkeSBvZiBteSBlYXJ0aDoKICAgIEJ1dCB3b28gaGVyLCBnZW50bGUgUGFyaXMsIGdldCBoZXIgaGVhcnQsCiAgICBNeSB3aWxsIHRvIGhlciBjb25zZW50IGlzIGJ1dCBhIHBhcnQ7CiAgICBBbiBzaGUgYWdyZWUsIHdpdGhpbiBoZXIgc2NvcGUgb2YgY2hvaWNlCiAgICBMaWVzIG15IGNvbnNlbnQgYW5kIGZhaXIgYWNjb3JkaW5nIHZvaWNlLgogICAgVGhpcyBuaWdodCBJIGhvbGQgYW4gb2xkIGFjY3VzdG9tJ2QgZmVhc3QsCiAgICBXaGVyZXRvIEkgaGF2ZSBpbnZpdGVkIG1hbnkgYSBndWVzdCwKICAgIFN1Y2ggYXMgSSBsb3ZlOyBhbmQgeW91LCBhbW9uZyB0aGUgc3RvcmUsCiAgICBPbmUgbW9yZSwgbW9zdCB3ZWxjb21lLCBtYWtlcyBteSBudW1iZXIgbW9yZS4KICAgIEF0IG15IHBvb3IgaG91c2UgbG9vayB0byBiZWhvbGQgdGhpcyBuaWdodAogICAgRWFydGgtdHJlYWRpbmcgc3RhcnMgdGhhdCBtYWtlIGRhcmsgaGVhdmVuIGxpZ2h0OgogICAgU3VjaCBjb21mb3J0IGFzIGRvIGx1c3R5IHlvdW5nIG1lbiBmZWVsCiAgICBXaGVuIHdlbGwtYXBwYXJlbGwnZCBBcHJpbCBvbiB0aGUgaGVlbAogICAgT2YgbGltcGluZyB3aW50ZXIgdHJlYWRzLCBldmVuIHN1Y2ggZGVsaWdodAogICAgQW1vbmcgZnJlc2ggZmVtYWxlIGJ1ZHMgc2hhbGwgeW91IHRoaXMgbmlnaHQKICAgIEluaGVyaXQgYXQgbXkgaG91c2U7IGhlYXIgYWxsLCBhbGwgc2VlLAogICAgQW5kIGxpa2UgaGVyIG1vc3Qgd2hvc2UgbWVyaXQgbW9zdCBzaGFsbCBiZToKICAgIFdoaWNoIG9uIG1vcmUgdmlldywgb2YgbWFueSBtaW5lIGJlaW5nIG9uZQogICAgTWF5IHN0YW5kIGluIG51bWJlciwgdGhvdWdoIGluIHJlY2tvbmluZyBub25lLAogICAgQ29tZSwgZ28gd2l0aCBtZS4KCiAgICBUbyBTZXJ2YW50LCBnaXZpbmcgYSBwYXBlcgogICAgR28sIHNpcnJhaCwgdHJ1ZGdlIGFib3V0CiAgICBUaHJvdWdoIGZhaXIgVmVyb25hOyBmaW5kIHRob3NlIHBlcnNvbnMgb3V0CiAgICBXaG9zZSBuYW1lcyBhcmUgd3JpdHRlbiB0aGVyZSwgYW5kIHRvIHRoZW0gc2F5LAogICAgTXkgaG91c2UgYW5kIHdlbGNvbWUgb24gdGhlaXIgcGxlYXN1cmUgc3RheS4KCiAgICBFeGV1bnQgQ0FQVUxFVCBhbmQgUEFSSVMKClNlcnZhbnQKCiAgICBGaW5kIHRoZW0gb3V0IHdob3NlIG5hbWVzIGFyZSB3cml0dGVuIGhlcmUhIEl0IGlzCiAgICB3cml0dGVuLCB0aGF0IHRoZSBzaG9lbWFrZXIgc2hvdWxkIG1lZGRsZSB3aXRoIGhpcwogICAgeWFyZCwgYW5kIHRoZSB0YWlsb3Igd2l0aCBoaXMgbGFzdCwgdGhlIGZpc2hlciB3aXRoCiAgICBoaXMgcGVuY2lsLCBhbmQgdGhlIHBhaW50ZXIgd2l0aCBoaXMgbmV0czsgYnV0IEkgYW0KICAgIHNlbnQgdG8gZmluZCB0aG9zZSBwZXJzb25zIHdob3NlIG5hbWVzIGFyZSBoZXJlCiAgICB3cml0LCBhbmQgY2FuIG5ldmVyIGZpbmQgd2hhdCBuYW1lcyB0aGUgd3JpdGluZwogICAgcGVyc29uIGhhdGggaGVyZSB3cml0LiBJIG11c3QgdG8gdGhlIGxlYXJuZWQuLS1JbiBnb29kIHRpbWUuCgogICAgRW50ZXIgQkVOVk9MSU8gYW5kIFJPTUVPCgpCRU5WT0xJTwoKICAgIFR1dCwgbWFuLCBvbmUgZmlyZSBidXJucyBvdXQgYW5vdGhlcidzIGJ1cm5pbmcsCiAgICBPbmUgcGFpbiBpcyBsZXNzZW4nZCBieSBhbm90aGVyJ3MgYW5ndWlzaDsKICAgIFR1cm4gZ2lkZHksIGFuZCBiZSBob2xwIGJ5IGJhY2t3YXJkIHR1cm5pbmc7CiAgICBPbmUgZGVzcGVyYXRlIGdyaWVmIGN1cmVzIHdpdGggYW5vdGhlcidzIGxhbmd1aXNoOgogICAgVGFrZSB0aG91IHNvbWUgbmV3IGluZmVjdGlvbiB0byB0aHkgZXllLAogICAgQW5kIHRoZSByYW5rIHBvaXNvbiBvZiB0aGUgb2xkIHdpbGwgZGllLgoKUk9NRU8KCiAgICBZb3VyIHBsYWludGFpbi1sZWFmIGlzIGV4Y2VsbGVudCBmb3IgdGhhdC4KCkJFTlZPTElPCgogICAgRm9yIHdoYXQsIEkgcHJheSB0aGVlPwoKUk9NRU8KCiAgICBGb3IgeW91ciBicm9rZW4gc2hpbi4KCkJFTlZPTElPCgogICAgV2h5LCBSb21lbywgYXJ0IHRob3UgbWFkPwoKUk9NRU8KCiAgICBOb3QgbWFkLCBidXQgYm91bmQgbW9yZSB0aGFuIGEgbWFkLW1hbiBpczsKICAgIFNodXQgdXAgaW4gcHJpc29uLCBrZXB0IHdpdGhvdXQgbXkgZm9vZCwKICAgIFdoaXBwJ2QgYW5kIHRvcm1lbnRlZCBhbmQtLUdvZC1kZW4sIGdvb2QgZmVsbG93LgoKU2VydmFudAoKICAgIEdvZCBnaScgZ29kLWRlbi4gSSBwcmF5LCBzaXIsIGNhbiB5b3UgcmVhZD8KClJPTUVPCgogICAgQXksIG1pbmUgb3duIGZvcnR1bmUgaW4gbXkgbWlzZXJ5LgoKU2VydmFudAoKICAgIFBlcmhhcHMgeW91IGhhdmUgbGVhcm5lZCBpdCB3aXRob3V0IGJvb2s6IGJ1dCwgSQogICAgcHJheSwgY2FuIHlvdSByZWFkIGFueSB0aGluZyB5b3Ugc2VlPwoKUk9NRU8KCiAgICBBeSwgaWYgSSBrbm93IHRoZSBsZXR0ZXJzIGFuZCB0aGUgbGFuZ3VhZ2UuCgpTZXJ2YW50CgogICAgWWUgc2F5IGhvbmVzdGx5OiByZXN0IHlvdSBtZXJyeSEKClJPTUVPCgogICAgU3RheSwgZmVsbG93OyBJIGNhbiByZWFkLgoKICAgIFJlYWRzCiAgICAnU2lnbmlvciBNYXJ0aW5vIGFuZCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOwogICAgQ291bnR5IEFuc2VsbWUgYW5kIGhpcyBiZWF1dGVvdXMgc2lzdGVyczsgdGhlIGxhZHkKICAgIHdpZG93IG9mIFZpdHJhdmlvOyBTaWduaW9yIFBsYWNlbnRpbyBhbmQgaGlzIGxvdmVseQogICAgbmllY2VzOyBNZXJjdXRpbyBhbmQgaGlzIGJyb3RoZXIgVmFsZW50aW5lOyBtaW5lCiAgICB1bmNsZSBDYXB1bGV0LCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOyBteSBmYWlyIG5pZWNlCiAgICBSb3NhbGluZTsgTGl2aWE7IFNpZ25pb3IgVmFsZW50aW8gYW5kIGhpcyBjb3VzaW4KICAgIFR5YmFsdCwgTHVjaW8gYW5kIHRoZSBsaXZlbHkgSGVsZW5hLicgQSBmYWlyCiAgICBhc3NlbWJseTogd2hpdGhlciBzaG91bGQgdGhleSBjb21lPwoKU2VydmFudAoKICAgIFVwLgoKUk9NRU8KCiAgICBXaGl0aGVyPwoKU2VydmFudAoKICAgIFRvIHN1cHBlcjsgdG8gb3VyIGhvdXNlLgoKUk9NRU8KCiAgICBXaG9zZSBob3VzZT8KClNlcnZhbnQKCiAgICBNeSBtYXN0ZXIncy4KClJPTUVPCgogICAgSW5kZWVkLCBJIHNob3VsZCBoYXZlIGFzaydkIHlvdSB0aGF0IGJlZm9yZS4KClNlcnZhbnQKCiAgICBOb3cgSSdsbCB0ZWxsIHlvdSB3aXRob3V0IGFza2luZzogbXkgbWFzdGVyIGlzIHRoZQogICAgZ3JlYXQgcmljaCBDYXB1bGV0OyBhbmQgaWYgeW91IGJlIG5vdCBvZiB0aGUgaG91c2UKICAgIG9mIE1vbnRhZ3VlcywgSSBwcmF5LCBjb21lIGFuZCBjcnVzaCBhIGN1cCBvZiB3aW5lLgogICAgUmVzdCB5b3UgbWVycnkhCgogICAgRXhpdAoKQkVOVk9MSU8KCiAgICBBdCB0aGlzIHNhbWUgYW5jaWVudCBmZWFzdCBvZiBDYXB1bGV0J3MKICAgIFN1cHMgdGhlIGZhaXIgUm9zYWxpbmUgd2hvbSB0aG91IHNvIGxvdmVzdCwKICAgIFdpdGggYWxsIHRoZSBhZG1pcmVkIGJlYXV0aWVzIG9mIFZlcm9uYToKICAgIEdvIHRoaXRoZXI7IGFuZCwgd2l0aCB1bmF0dGFpbnRlZCBleWUsCiAgICBDb21wYXJlIGhlciBmYWNlIHdpdGggc29tZSB0aGF0IEkgc2hhbGwgc2hvdywKICAgIEFuZCBJIHdpbGwgbWFrZSB0aGVlIHRoaW5rIHRoeSBzd2FuIGEgY3Jvdy4KClJPTUVPCgogICAgV2hlbiB0aGUgZGV2b3V0IHJlbGlnaW9uIG9mIG1pbmUgZXllCiAgICBNYWludGFpbnMgc3VjaCBmYWxzZWhvb2QsIHRoZW4gdHVybiB0ZWFycyB0byBmaXJlczsKICAgIEFuZCB0aGVzZSwgd2hvIG9mdGVuIGRyb3duJ2QgY291bGQgbmV2ZXIgZGllLAogICAgVHJhbnNwYXJlbnQgaGVyZXRpY3MsIGJlIGJ1cm50IGZvciBsaWFycyEKICAgIE9uZSBmYWlyZXIgdGhhbiBteSBsb3ZlISB0aGUgYWxsLXNlZWluZyBzdW4KICAgIE5lJ2VyIHNhdyBoZXIgbWF0Y2ggc2luY2UgZmlyc3QgdGhlIHdvcmxkIGJlZ3VuLgoKQkVOVk9MSU8KCiAgICBUdXQsIHlvdSBzYXcgaGVyIGZhaXIsIG5vbmUgZWxzZSBiZWluZyBieSwKICAgIEhlcnNlbGYgcG9pc2VkIHdpdGggaGVyc2VsZiBpbiBlaXRoZXIgZXllOgogICAgQnV0IGluIHRoYXQgY3J5c3RhbCBzY2FsZXMgbGV0IHRoZXJlIGJlIHdlaWdoJ2QKICAgIFlvdXIgbGFkeSdzIGxvdmUgYWdhaW5zdCBzb21lIG90aGVyIG1haWQKICAgIFRoYXQgSSB3aWxsIHNob3cgeW91IHNoaW5pbmcgYXQgdGhpcyBmZWFzdCwKICAgIEFuZCBzaGUgc2hhbGwgc2NhbnQgc2hvdyB3ZWxsIHRoYXQgbm93IHNob3dzIGJlc3QuCgpST01FTwoKICAgIEknbGwgZ28gYWxvbmcsIG5vIHN1Y2ggc2lnaHQgdG8gYmUgc2hvd24sCiAgICBCdXQgdG8gcmVqb2ljZSBpbiBzcGxlbmRvciBvZiBtaW5lIG93bi4KCiAgICBFeGV1bnQKClNDRU5FIElJSS4gQSByb29tIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgTnVyc2UsIHdoZXJlJ3MgbXkgZGF1Z2h0ZXIIGNhbGwgaGVyIGZvcnRoIHRvIG1lLgoKTnVyc2UKCiAgICBOb3csIGJ5IG15IG1haWRlbmhlYWQsIGF0IHR3ZWx2ZSB5ZWFyIG9sZCwKICAgIEkgYmFkZSBoZXIgY29tZS4gV2hhdCwgbGFtYiEgd2hhdCwgbGFkeWJpcmQhCiAgICBHb2QgZm9yYmlkISBXaGVyZSdzIHRoaXMgZ2lybD8gV2hhdCwgSnVsaWV0IQoKICAgIEVudGVyIEpVTElFVAoKSlVMSUVUCgogICAgSG93IG5vdyEgd2hvIGNhbGxzPwoKTnVyc2UKCiAgICBZb3VyIG1vdGhlci4KCkpVTElFVAoKICAgIE1hZGFtLCBJIGFtIGhlcmUuCiAgICBXaGF0IGlzIHlvdXIgd2lsbD8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoaXMgaXMgdGhlIG1hdHRlcjotLU51cnNlLCBnaXZlIGxlYXZlIGF3aGlsZSwKICAgIFdlIG11c3QgdGFsayBpbiBzZWNyZXQ6LS1udXJzZSwgY29tZSBiYWNrIGFnYWluOwogICAgSSBoYXZlIHJlbWVtYmVyJ2QgbWUsIHRob3UncyBoZWFyIG91ciBjb3Vuc2VsLgogICAgVGhvdSBrbm93J3N0IG15IGRhdWdodGVyJ3Mgb2YgYSBwcmV0dHkgYWdlLgoKTnVyc2UKCiAgICBGYWl0aCwgSSBjYW4gdGVsbCBoZXIgYWdlIHVudG8gYW4gaG91ci4KCkxBRFkgQ0FQVUxFVAoKICAgIFNoZSdzIG5vdCBmb3VydGVlbi4KCk51cnNlCgogICAgSSdsbCBsYXkgZm91cnRlZW4gb2YgbXkgdGVldGgsLS0KICAgIEFuZCB5ZXQsIHRvIG15IHRlZXRoIGJlIGl0IHNwb2tlbiwgSSBoYXZlIGJ1dCBmb3VyLS0KICAgIFNoZSBpcyBub3QgZm91cnRlZW4uIEhvdyBsb25nIGlzIGl0IG5vdwogICAgVG8gTGFtbWFzLXRpZGUCgpMQURZIENBUFVMRVQKCiAgICBBIGZvcnRuaWdodCBhbmQgb2RkIGRheXMuCgpOdXJzZQoKICAgIEV2ZW4gb3Igb2RkLCBvZiBhbGwgZGF5cyBpbiB0aGUgeWVhciwKICAgIENvbWUgTGFtbWFzLWV2ZSBhdCBuaWdodCBzaGFsbCBzaGUgYmUgZm91cnRlZW4uCiAgICBTdXNhbiBhbmQgc2hlLS1Hb2QgcmVzdCBhbGwgQ2hyaXN0aWFuIHNvdWxzIS0tCiAgICBXZXJlIG9mIGFuIGFnZTogd2VsbCwgU3VzYW4gaXMgd2l0aCBHb2Q7CiAgICBTaGUgd2FzIHRvbyBnb29kIGZvciBtZTogYnV0LCBhcyBJIHNhaWQsCiAgICBPbiBMYW1tYXMtZXZlIGF0IG5pZ2h0IHNoYWxsIHNoZSBiZSBmb3VydGVlbjsKICAgIFRoYXQgc2hhbGwgc2hlLCBtYXJyeTsgSSByZW1lbWJlciBpdCB3ZWxsLgogICAgJ1RpcyBzaW5jZSB0aGUgZWFydGhxdWFrZSBub3cgZWxldmVuIHllYXJzOwogICAgQW5kIHNoZSB3YXMgd2VhbidkLC0tSSBuZXZlciBzaGFsbCBmb3JnZXQgaXQsLS0KICAgIE9mIGFsbCB0aGUgZGF5cyBvZiB0aGUgeWVhciwgdXBvbiB0aGF0IGRheToKICAgIEZvciBJIGhhZCB0aGVuIGxhaWQgd29ybXdvb2QgdG8gbXkgZHVnLAogICAgU2l0dGluZyBpbiB0aGUgc3VuIHVuZGVyIHRoZSBkb3ZlLWhvdXNlIHdhbGw7CiAgICBNeSBsb3JkIGFuZCB5b3Ugd2VyZSB0aGVuIGF0IE1hbnR1YTotLQogICAgTmF5LCBJIGRvIGJlYXIgYSBicmFpbjotLWJ1dCwgYXMgSSBzYWlkLAogICAgV2hlbiBpdCBkaWQgdGFzdGUgdGhlIHdvcm13b29kIG9uIHRoZSBuaXBwbGUKICAgIE9mIG15IGR1ZyBhbmQgZmVsdCBpdCBiaXR0ZXIsIHByZXR0eSBmb29sLAogICAgVG8gc2VlIGl0IHRldGNoeSBhbmQgZmFsbCBvdXQgd2l0aCB0aGUgZHVnIQogICAgU2hha2UgcXVvdGggdGhlIGRvdmUtaG91c2U6ICd0d2FzIG5vIG5lZWQsIEkgdHJvdywKICAgIFRvIGJpZCBtZSB0cnVkZ2U6CiAgICBBbmQgc2luY2UgdGhhdCB0aW1lIGl0IGlzIGVsZXZlbiB5ZWFyczsKICAgIEZvciB0aGVuIHNoZSBjb3VsZCBzdGFuZCBhbG9uZTsgbmF5LCBieSB0aGUgcm9vZCwKICAgIFNoZSBjb3VsZCBoYXZlIHJ1biBhbmQgd2FkZGxlZCBhbGwgYWJvdXQ7CiAgICBGb3IgZXZlbiB0aGUgZGF5IGJlZm9yZSwgc2hlIGJyb2tlIGhlciBicm93OgogICAgQW5kIHRoZW4gbXkgaHVzYmFuZC0tR29kIGJlIHdpdGggaGlzIHNvdWwhCiAgICBBJyB3YXMgYSBtZXJyeSBtYW4tLXRvb2sgdXAgdGhlIGNoaWxkOgogICAgJ1llYSwnIHF1b3RoIGhlLCAnZG9zdCB0aG91IGZhbGwgdXBvbiB0aHkgZmFjZT8KICAgIFRob3Ugd2lsdCBmYWxsIGJhY2t3YXJkIHdoZW4gdGhvdSBoYXN0IG1vcmUgd2l0OwogICAgV2lsdCB0aG91IG5vdCwgSnVsZT8nIGFuZCwgYnkgbXkgaG9saWRhbWUsCiAgICBUaGUgcHJldHR5IHdyZXRjaCBsZWZ0IGNyeWluZyBhbmQgc2FpZCAnQXkuJwogICAgVG8gc2VlLCBub3csIGhvdyBhIGplc3Qgc2hhbGwgY29tZSBhYm91dCEKICAgIEkgd2FycmFudCwgYW4gSSBzaG91bGQgbGl2ZSBhIHRob3VzYW5kIHllYXJzLAogICAgSSBuZXZlciBzaG91bGQgZm9yZ2V0IGl0OiAnV2lsdCB0aG91IG5vdCwgSnVsZT8nIHF1b3RoIGhlOwogICAgQW5kLCBwcmV0dHkgZm9vbCwgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKTEFEWSBDQVBVTEVUCgogICAgRW5vdWdoIG9mIHRoaXM7IEkgcHJheSB0aGVlLCBob2xkIHRoeSBwZWFjZS4KCk51cnNlCgogICAgWWVzLCBtYWRhbTogeWV0IEkgY2Fubm90IGNob29zZSBidXQgbGF1Z2gsCiAgICBUbyB0aGluayBpdCBzaG91bGQgbGVhdmUgY3J5aW5nIGFuZCBzYXkgJ0F5LicKICAgIEFuZCB5ZXQsIEkgd2FycmFudCwgaXQgaGFkIHVwb24gaXRzIGJyb3cKICAgIEEgYnVtcCBhcyBiaWcgYXMgYSB5b3VuZyBjb2NrZXJlbCdzIHN0b25lOwogICAgQSBwYXJsb3VzIGtub2NrOyBhbmQgaXQgY3JpZWQgYml0dGVybHk6CiAgICAnWWVhLCcgcXVvdGggbXkgaHVzYmFuZCwnZmFsbCdzdCB1cG9uIHRoeSBmYWNlPwogICAgVGhvdSB3aWx0IGZhbGwgYmFja3dhcmQgd2hlbiB0aG91IGNvbWVzdCB0byBhZ2U7CiAgICBXaWx0IHRob3Ugbm90LCBKdWxlPycgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKSlVMSUVUCgogICAgQW5kIHN0aW50IHRob3UgdG9vLCBJIHByYXkgdGhlZSwgbnVyc2UsIHNheSBJLgoKTnVyc2UKCiAgICBQZWFjZSwgSSBoYXZlIGRvbmUuIEdvZCBtYXJrIHRoZWUgdG8gaGlzIGdyYWNlIQogICAgVGhvdSB3YXN0IHRoZSBwcmV0dGllc3QgYmFiZSB0aGF0IGUnZXIgSSBudXJzZWQ6CiAgICBBbiBJIG1pZ2h0IGxpdmUgdG8gc2VlIHRoZWUgbWFycmllZCBvbmNlLAogICAgSSBoYXZlIG15IHdpc2guCgpMQURZIENBUFVMRVQKCiAgICBNYXJyeSwgdGhhdCAnbWFycnknIGlzIHRoZSB2ZXJ5IHRoZW1lCiAgICBJIGNhbWUgdG8gdGFsayBvZi4gVGVsbCBtZSwgZGF1Z2h0ZXIgSnVsaWV0LAogICAgSG93IHN0YW5kcyB5b3VyIGRpc3Bvc2l0aW9uIHRvIGJlIG1hcnJpZWQCgpKVUxJRVQKCiAgICBJdCBpcyBhbiBob25vdXIgdGhhdCBJIGRyZWFtIG5vdCBvZi4KCk51cnNlCgogICAgQW4gaG9ub3VyISB3ZXJlIG5vdCBJIHRoaW5lIG9ubHkgbnVyc2UsCiAgICBJIHdvdWxkIHNheSB0aG91IGhhZHN0IHN1Y2snZCB3aXNkb20gZnJvbSB0aHkgdGVhdC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHRoaW5rIG9mIG1hcnJpYWdlIG5vdzsgeW91bmdlciB0aGFuIHlvdSwKICAgIEhlcmUgaW4gVmVyb25hLCBsYWRpZXMgb2YgZXN0ZWVtLAogICAgQXJlIG1hZGUgYWxyZWFkeSBtb3RoZXJzOiBieSBteSBjb3VudCwKICAgIEkgd2FzIHlvdXIgbW90aGVyIG11Y2ggdXBvbiB0aGVzZSB5ZWFycwogICAgVGhhdCB5b3UgYXJlIG5vdyBhIG1haWQuIFRodXMgdGhlbiBpbiBicmllZjoKICAgIFRoZSB2YWxpYW50IFBhcmlzIHNlZWtzIHlvdSBmb3IgaGlzIGxvdmUuCgpOdXJzZQoKICAgIEEgbWFuLCB5b3VuZyBsYWR5ISBsYWR5LCBzdWNoIGEgbWFuCiAgICBBcyBhbGwgdGhlIHdvcmxkLS13aHksIGhlJ3MgYSBtYW4gb2Ygd2F4LgoKTEFEWSBDQVBVTEVUCgogICAgVmVyb25hJ3Mgc3VtbWVyIGhhdGggbm90IHN1Y2ggYSBmbG93ZXIuCgpOdXJzZQoKICAgIE5heSwgaGUncyBhIGZsb3dlcjsgaW4gZmFpdGgsIGEgdmVyeSBmbG93ZXIuCgpMQURZIENBUFVMRVQKCiAgICBXaGF0IHNheSB5b3UIGNhbiB5b3UgbG92ZSB0aGUgZ2VudGxlbWFuPwogICAgVGhpcyBuaWdodCB5b3Ugc2hhbGwgYmVob2xkIGhpbSBhdCBvdXIgZmVhc3Q7CiAgICBSZWFkIG8nZXIgdGhlIHZvbHVtZSBvZiB5b3VuZyBQYXJpcycgZmFjZSwKICAgIEFuZCBmaW5kIGRlbGlnaHQgd3JpdCB0aGVyZSB3aXRoIGJlYXV0eSdzIHBlbjsKICAgIEV4YW1pbmUgZXZlcnkgbWFycmllZCBsaW5lYW1lbnQsCiAgICBBbmQgc2VlIGhvdyBvbmUgYW5vdGhlciBsZW5kcyBjb250ZW50CiAgICBBbmQgd2hhdCBvYnNjdXJlZCBpbiB0aGlzIGZhaXIgdm9sdW1lIGxpZXMKICAgIEZpbmQgd3JpdHRlbiBpbiB0aGUgbWFyZ2VudCBvZiBoaXMgZXllcy4KICAgIFRoaXMgcHJlY2lvdXMgYm9vayBvZiBsb3ZlLCB0aGlzIHVuYm91bmQgbG92ZXIsCiAgICBUbyBiZWF1dGlmeSBoaW0sIG9ubHkgbGFja3MgYSBjb3ZlcjoKICAgIFRoZSBmaXNoIGxpdmVzIGluIHRoZSBzZWEsIGFuZCAndGlzIG11Y2ggcHJpZGUKICAgIEZvciBmYWlyIHdpdGhvdXQgdGhlIGZhaXIgd2l0aGluIHRvIGhpZGU6CiAgICBUaGF0IGJvb2sgaW4gbWFueSdzIGV5ZXMgZG90aCBzaGFyZSB0aGUgZ2xvcnksCiAgICBUaGF0IGluIGdvbGQgY2xhc3BzIGxvY2tzIGluIHRoZSBnb2xkZW4gc3Rvcnk7CiAgICBTbyBzaGFsbCB5b3Ugc2hhcmUgYWxsIHRoYXQgaGUgZG90aCBwb3NzZXNzLAogICAgQnkgaGF2aW5nIGhpbSwgbWFraW5nIHlvdXJzZWxmIG5vIGxlc3MuCgpOdXJzZQoKICAgIE5vIGxlc3MhIG5heSwgYmlnZ2VyOyB3b21lbiBncm93IGJ5IG1lbi4KCkxBRFkgQ0FQVUxFVAoKICAgIFNwZWFrIGJyaWVmbHksIGNhbiB5b3UgbGlrZSBvZiBQYXJpcycgbG92ZT8KCkpVTElFVAoKICAgIEknbGwgbG9vayB0byBsaWtlLCBpZiBsb29raW5nIGxpa2luZyBtb3ZlOgogICAgQnV0IG5vIG1vcmUgZGVlcCB3aWxsIEkgZW5kYXJ0IG1pbmUgZXllCiAgICBUaGFuIHlvdXIgY29uc2VudCBnaXZlcyBzdHJlbmd0aCB0byBtYWtlIGl0IGZseS4KCiAgICBFbnRlciBhIFNlcnZhbnQKClNlcnZhbnQKCiAgICBNYWRhbSwgdGhlIGd1ZXN0cyBhcmUgY29tZSwgc3VwcGVyIHNlcnZlZCB1cCwgeW91CiAgICBjYWxsZWQsIG15IHlvdW5nIGxhZHkgYXNrZWQgZm9yLCB0aGUgbnVyc2UgY3Vyc2VkIGluCiAgICB0aGUgcGFudHJ5LCBhbmQgZXZlcnkgdGhpbmcgaW4gZXh0cmVtaXR5LiBJIG11c3QKICAgIGhlbmNlIHRvIHdhaXQ7IEkgYmVzZWVjaCB5b3UsIGZvbGxvdyBzdHJhaWdodC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlIGZvbGxvdyB0aGVlLgoKICAgIEV4aXQgU2VydmFudAogICAgSnVsaWV0LCB0aGUgY291bnR5IHN0YXlzLgoKTnVyc2UKCiAgICBHbywgZ2lybCwgc2VlayBoYXBweSBuaWdodHMgdG8gaGFwcHkgZGF5cy4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBST01FTywgTUVSQ1VUSU8sIEJFTlZPTElPLCB3aXRoIGZpdmUgb3Igc2l4IE1hc2tlcnMsIFRvcmNoLWJlYXJlcnMsIGFuZCBvdGhlcnMgCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIHRoaXMgc3BlZWNoIGJlIHNwb2tlIGZvciBvdXIgZXhjdXNlPwogICAgT3Igc2hhbGwgd2Ugb24gd2l0aG91dCBhIGFwb2xvZ3kCgpCRU5WT0xJTwoKICAgIFRoZSBkYXRlIGlzIG91dCBvZiBzdWNoIHByb2xpeGl0eToKICAgIFdlJ2xsIGhhdmUgbm8gQ3VwaWQgaG9vZHdpbmsnZCB3aXRoIGEgc2NhcmYsCiAgICBCZWFyaW5nIGEgVGFydGFyJ3MgcGFpbnRlZCBib3cgb2YgbGF0aCwKICAgIFNjYXJpbmcgdGhlIGxhZGllcyBsaWtlIGEgY3Jvdy1rZWVwZXI7CiAgICBOb3Igbm8gd2l0aG91dC1ib29rIHByb2xvZ3VlLCBmYWludGx5IHNwb2tlCiAgICBBZnRlciB0aGUgcHJvbXB0ZXIsIGZvciBvdXIgZW50cmFuY2U6CiAgICBCdXQgbGV0IHRoZW0gbWVhc3VyZSB1cyBieSB3aGF0IHRoZXkgd2lsbDsKICAgIFdlJ2xsIG1lYXN1cmUgdGhlbSBhIG1lYXN1cmUsIGFuZCBiZSBnb25lLgoKUk9NRU8KCiAgICBHaXZlIG1lIGEgdG9yY2g6IEkgYW0gbm90IGZvciB0aGlzIGFtYmxpbmc7CiAgICBCZWluZyBidXQgaGVhdnksIEkgd2lsbCBiZWFyIHRoZSBsaWdodC4KCk1FUkNVVElPCgogICAgTmF5LCBnZW50bGUgUm9tZW8sIHdlIG11c3QgaGF2ZSB5b3UgZGFuY2UuCgpST01FTwoKICAgIE5vdCBJLCBiZWxpZXZlIG1lOiB5b3UgaGF2ZSBkYW5jaW5nIHNob2VzCiAgICBXaXRoIG5pbWJsZSBzb2xlczogSSBoYXZlIGEgc291bCBvZiBsZWFkCiAgICBTbyBzdGFrZXMgbWUgdG8gdGhlIGdyb3VuZCBJIGNhbm5vdCBtb3ZlLgoKTUVSQ1VUSU8KCiAgICBZb3UgYXJlIGEgbG92ZXI7IGJvcnJvdyBDdXBpZCdzIHdpbmdzLAogICAgQW5kIHNvYXIgd2l0aCB0aGVtIGFib3ZlIGEgY29tbW9uIGJvdW5kLgoKUk9NRU8KCiAgICBJIGFtIHRvbyBzb3JlIGVucGllcmNlZCB3aXRoIGhpcyBzaGFmdAogICAgVG8gc29hciB3aXRoIGhpcyBsaWdodCBmZWF0aGVycywgYW5kIHNvIGJvdW5kLAogICAgSSBjYW5ub3QgYm91bmQgYSBwaXRjaCBhYm92ZSBkdWxsIHdvZToKICAgIFVuZGVyIGxvdmUncyBoZWF2eSBidXJkZW4gZG8gSSBzaW5rLgoKTUVSQ1VUSU8KCiAgICBBbmQsIHRvIHNpbmsgaW4gaXQsIHNob3VsZCB5b3UgYnVyZGVuIGxvdmU7CiAgICBUb28gZ3JlYXQgb3BwcmVzc2lvbiBmb3IgYSB0ZW5kZXIgdGhpbmcuCgpST01FTwoKICAgIElzIGxvdmUgYSB0ZW5kZXIgdGhpbmcIGl0IGlzIHRvbyByb3VnaCwKICAgIFRvbyBydWRlLCB0b28gYm9pc3Rlcm91cywgYW5kIGl0IHByaWNrcyBsaWtlIHRob3JuLgoKTUVSQ1VUSU8KCiAgICBJZiBsb3ZlIGJlIHJvdWdoIHdpdGggeW91LCBiZSByb3VnaCB3aXRoIGxvdmU7CiAgICBQcmljayBsb3ZlIGZvciBwcmlja2luZywgYW5kIHlvdSBiZWF0IGxvdmUgZG93bi4KICAgIEdpdmUgbWUgYSBjYXNlIHRvIHB1dCBteSB2aXNhZ2UgaW46CiAgICBBIHZpc29yIGZvciBhIHZpc29yISB3aGF0IGNhcmUgSQogICAgV2hhdCBjdXJpb3VzIGV5ZSBkb3RoIHF1b3RlIGRlZm9ybWl0aWVzPwogICAgSGVyZSBhcmUgdGhlIGJlZXRsZSBicm93cyBzaGFsbCBibHVzaCBmb3IgbWUuCgpCRU5WT0xJTwoKICAgIENvbWUsIGtub2NrIGFuZCBlbnRlcjsgYW5kIG5vIHNvb25lciBpbiwKICAgIEJ1dCBldmVyeSBtYW4gYmV0YWtlIGhpbSB0byBoaXMgbGVncy4KClJPTUVPCgogICAgQSB0b3JjaCBmb3IgbWU6IGxldCB3YW50b25zIGxpZ2h0IG9mIGhlYXJ0CiAgICBUaWNrbGUgdGhlIHNlbnNlbGVzcyBydXNoZXMgd2l0aCB0aGVpciBoZWVscywKICAgIEZvciBJIGFtIHByb3ZlcmInZCB3aXRoIGEgZ3JhbmRzaXJlIHBocmFzZTsKICAgIEknbGwgYmUgYSBjYW5kbGUtaG9sZGVyLCBhbmQgbG9vayBvbi4KICAgIFRoZSBnYW1lIHdhcyBuZSdlciBzbyBmYWlyLCBhbmQgSSBhbSBkb25lLgoKTUVSQ1VUSU8KCiAgICBUdXQsIGR1bidzIHRoZSBtb3VzZSwgdGhlIGNvbnN0YWJsZSdzIG93biB3b3JkOgogICAgSWYgdGhvdSBhcnQgZHVuLCB3ZSdsbCBkcmF3IHRoZWUgZnJvbSB0aGUgbWlyZQogICAgT2YgdGhpcyBzaXItcmV2ZXJlbmNlIGxvdmUsIHdoZXJlaW4gdGhvdSBzdGljaydzdAogICAgVXAgdG8gdGhlIGVhcnMuIENvbWUsIHdlIGJ1cm4gZGF5bGlnaHQsIGhvIQoKUk9NRU8KCiAgICBOYXksIHRoYXQncyBub3Qgc28uCgpNRVJDVVRJTwoKICAgIEkgbWVhbiwgc2lyLCBpbiBkZWxheQogICAgV2Ugd2FzdGUgb3VyIGxpZ2h0cyBpbiB2YWluLCBsaWtlIGxhbXBzIGJ5IGRheS4KICAgIFRha2Ugb3VyIGdvb2QgbWVhbmluZywgZm9yIG91ciBqdWRnbWVudCBzaXRzCiAgICBGaXZlIHRpbWVzIGluIHRoYXQgZXJlIG9uY2UgaW4gb3VyIGZpdmUgd2l0cy4KClJPTUVPCgogICAgQW5kIHdlIG1lYW4gd2VsbCBpbiBnb2luZyB0byB0aGlzIG1hc2s7CiAgICBCdXQgJ3RpcyBubyB3aXQgdG8gZ28uCgpNRVJDVVRJTwoKICAgIFdoeSwgbWF5IG9uZSBhc2sCgpST01FTwoKICAgIEkgZHJlYW0nZCBhIGRyZWFtIHRvLW5pZ2h0LgoKTUVSQ1VUSU8KCiAgICBBbmQgc28gZGlkIEkuCgpST01FTwoKICAgIFdlbGwsIHdoYXQgd2FzIHlvdXJzPwoKTUVSQ1VUSU8KCiAgICBUaGF0IGRyZWFtZXJzIG9mdGVuIGxpZS4KClJPTUVPCgogICAgSW4gYmVkIGFzbGVlcCwgd2hpbGUgdGhleSBkbyBkcmVhbSB0aGluZ3MgdHJ1ZS4KCk1FUkNVVElPCgogICAgTywgdGhlbiwgSSBzZWUgUXVlZW4gTWFiIGhhdGggYmVlbiB3aXRoIHlvdS4KICAgIFNoZSBpcyB0aGUgZmFpcmllcycgbWlkd2lmZSwgYW5kIHNoZSBjb21lcwogICAgSW4gc2hhcGUgbm8gYmlnZ2VyIHRoYW4gYW4gYWdhdGUtc3RvbmUKICAgIE9uIHRoZSBmb3JlLWZpbmdlciBvZiBhbiBhbGRlcm1hbiwKICAgIERyYXduIHdpdGggYSB0ZWFtIG9mIGxpdHRsZSBhdG9taWVzCiAgICBBdGh3YXJ0IG1lbidzIG5vc2VzIGFzIHRoZXkgbGllIGFzbGVlcDsKICAgIEhlciB3YWdvbi1zcG9rZXMgbWFkZSBvZiBsb25nIHNwaWRlcnMnIGxlZ3MsCiAgICBUaGUgY292ZXIgb2YgdGhlIHdpbmdzIG9mIGdyYXNzaG9wcGVycywKICAgIFRoZSB0cmFjZXMgb2YgdGhlIHNtYWxsZXN0IHNwaWRlcidzIHdlYiwKICAgIFRoZSBjb2xsYXJzIG9mIHRoZSBtb29uc2hpbmUncyB3YXRlcnkgYmVhbXMsCiAgICBIZXIgd2hpcCBvZiBjcmlja2V0J3MgYm9uZSwgdGhlIGxhc2ggb2YgZmlsbSwKICAgIEhlciB3YWdvbmVyIGEgc21hbGwgZ3JleS1jb2F0ZWQgZ25hdCwKICAgIE5vdCBzbyBiaWcgYXMgYSByb3VuZCBsaXR0bGUgd29ybQogICAgUHJpY2snZCBmcm9tIHRoZSBsYXp5IGZpbmdlciBvZiBhIG1haWQ7CiAgICBIZXIgY2hhcmlvdCBpcyBhbiBlbXB0eSBoYXplbC1udXQKICAgIE1hZGUgYnkgdGhlIGpvaW5lciBzcXVpcnJlbCBvciBvbGQgZ3J1YiwKICAgIFRpbWUgb3V0IG8nIG1pbmQgdGhlIGZhaXJpZXMnIGNvYWNobWFrZXJzLgogICAgQW5kIGluIHRoaXMgc3RhdGUgc2hlIGdhbGxvcHMgbmlnaHQgYnkgbmlnaHQKICAgIFRocm91Z2ggbG92ZXJzJyBicmFpbnMsIGFuZCB0aGVuIHRoZXkgZHJlYW0gb2YgbG92ZTsKICAgIE8nZXIgY291cnRpZXJzJyBrbmVlcywgdGhhdCBkcmVhbSBvbiBjb3VydCdzaWVzIHN0cmFpZ2h0LAogICAgTydlciBsYXd5ZXJzJyBmaW5nZXJzLCB3aG8gc3RyYWlnaHQgZHJlYW0gb24gZmVlcywKICAgIE8nZXIgbGFkaWVzICcgbGlwcywgd2hvIHN0cmFpZ2h0IG9uIGtpc3NlcyBkcmVhbSwKICAgIFdoaWNoIG9mdCB0aGUgYW5ncnkgTWFiIHdpdGggYmxpc3RlcnMgcGxhZ3VlcywKICAgIEJlY2F1c2UgdGhlaXIgYnJlYXRocyB3aXRoIHN3ZWV0bWVhdHMgdGFpbnRlZCBhcmU6CiAgICBTb21ldGltZSBzaGUgZ2FsbG9wcyBvJ2VyIGEgY291cnRpZXIncyBub3NlLAogICAgQW5kIHRoZW4gZHJlYW1zIGhlIG9mIHNtZWxsaW5nIG91dCBhIHN1aXQ7CiAgICBBbmQgc29tZXRpbWUgY29tZXMgc2hlIHdpdGggYSB0aXRoZS1waWcncyB0YWlsCiAgICBUaWNrbGluZyBhIHBhcnNvbidzIG5vc2UgYXMgYScgbGllcyBhc2xlZXAsCiAgICBUaGVuIGRyZWFtcywgaGUgb2YgYW5vdGhlciBiZW5lZmljZToKICAgIFNvbWV0aW1lIHNoZSBkcml2ZXRoIG8nZXIgYSBzb2xkaWVyJ3MgbmVjaywKICAgIEFuZCB0aGVuIGRyZWFtcyBoZSBvZiBjdXR0aW5nIGZvcmVpZ24gdGhyb2F0cywKICAgIE9mIGJyZWFjaGVzLCBhbWJ1c2NhZG9lcywgU3BhbmlzaCBibGFkZXMsCiAgICBPZiBoZWFsdGhzIGZpdmUtZmF0aG9tIGRlZXA7IGFuZCB0aGVuIGFub24KICAgIERydW1zIGluIGhpcyBlYXIsIGF0IHdoaWNoIGhlIHN0YXJ0cyBhbmQgd2FrZXMsCiAgICBBbmQgYmVpbmcgdGh1cyBmcmlnaHRlZCBzd2VhcnMgYSBwcmF5ZXIgb3IgdHdvCiAgICBBbmQgc2xlZXBzIGFnYWluLiBUaGlzIGlzIHRoYXQgdmVyeSBNYWIKICAgIFRoYXQgcGxhdHMgdGhlIG1hbmVzIG9mIGhvcnNlcyBpbiB0aGUgbmlnaHQsCiAgICBBbmQgYmFrZXMgdGhlIGVsZmxvY2tzIGluIGZvdWwgc2x1dHRpc2ggaGFpcnMsCiAgICBXaGljaCBvbmNlIHVudGFuZ2xlZCwgbXVjaCBtaXNmb3J0dW5lIGJvZGVzOgogICAgVGhpcyBpcyB0aGUgaGFnLCB3aGVuIG1haWRzIGxpZSBvbiB0aGVpciBiYWNrcywKICAgIFRoYXQgcHJlc3NlcyB0aGVtIGFuZCBsZWFybnMgdGhlbSBmaXJzdCB0byBiZWFyLAogICAgTWFraW5nIHRoZW0gd29tZW4gb2YgZ29vZCBjYXJyaWFnZToKICAgIFRoaXMgaXMgc2hlLS0KClJPTUVPCgogICAgUGVhY2UsIHBlYWNlLCBNZXJjdXRpbywgcGVhY2UhCiAgICBUaG91IHRhbGsnc3Qgb2Ygbm90aGluZy4KCk1FUkNVVElPCgogICAgVHJ1ZSwgSSB0YWxrIG9mIGRyZWFtcywKICAgIFdoaWNoIGFyZSB0aGUgY2hpbGRyZW4gb2YgYW4gaWRsZSBicmFpbiwKICAgIEJlZ290IG9mIG5vdGhpbmcgYnV0IHZhaW4gZmFudGFzeSwKICAgIFdoaWNoIGlzIGFzIHRoaW4gb2Ygc3Vic3RhbmNlIGFzIHRoZSBhaXIKICAgIEFuZCBtb3JlIGluY29uc3RhbnQgdGhhbiB0aGUgd2luZCwgd2hvIHdvb2VzCiAgICBFdmVuIG5vdyB0aGUgZnJvemVuIGJvc29tIG9mIHRoZSBub3J0aCwKICAgIEFuZCwgYmVpbmcgYW5nZXInZCwgcHVmZnMgYXdheSBmcm9tIHRoZW5jZSwKICAgIFR1cm5pbmcgaGlzIGZhY2UgdG8gdGhlIGRldy1kcm9wcGluZyBzb3V0aC4KCkJFTlZPTElPCgogICAgVGhpcyB3aW5kLCB5b3UgdGFsayBvZiwgYmxvd3MgdXMgZnJvbSBvdXJzZWx2ZXM7CiAgICBTdXBwZXIgaXMgZG9uZSwgYW5kIHdlIHNoYWxsIGNvbWUgdG9vIGxhdGUuCgpST01FTwoKICAgIEkgZmVhciwgdG9vIGVhcmx5OiBmb3IgbXkgbWluZCBtaXNnaXZlcwogICAgU29tZSBjb25zZXF1ZW5jZSB5ZXQgaGFuZ2luZyBpbiB0aGUgc3RhcnMKICAgIFNoYWxsIGJpdHRlcmx5IGJlZ2luIGhpcyBmZWFyZnVsIGRhdGUKICAgIFdpdGggdGhpcyBuaWdodCdzIHJldmVscyBhbmQgZXhwaXJlIHRoZSB0ZXJtCiAgICBPZiBhIGRlc3Bpc2VkIGxpZmUgY2xvc2VkIGluIG15IGJyZWFzdAogICAgQnkgc29tZSB2aWxlIGZvcmZlaXQgb2YgdW50aW1lbHkgZGVhdGguCiAgICBCdXQgSGUsIHRoYXQgaGF0aCB0aGUgc3RlZXJhZ2Ugb2YgbXkgY291cnNlLAogICAgRGlyZWN0IG15IHNhaWwhIE9uLCBsdXN0eSBnZW50bGVtZW4uCgpCRU5WT0xJTwoKICAgIFN0cmlrZSwgZHJ1bS4KCiAgICBFeGV1bnQKClNDRU5FIFYuIEEgaGFsbCBpbiBDYXB1bGV0J3MgaG91c2UuCgogICAgTXVzaWNpYW5zIHdhaXRpbmcuIEVudGVyIFNlcnZpbmdtZW4gd2l0aCBuYXBraW5zIAoKRmlyc3QgU2VydmFudAoKICAgIFdoZXJlJ3MgUG90cGFuLCB0aGF0IGhlIGhlbHBzIG5vdCB0byB0YWtlIGF3YXkIEhlCiAgICBzaGlmdCBhIHRyZW5jaGVyPyBoZSBzY3JhcGUgYSB0cmVuY2hlciEKClNlY29uZCBTZXJ2YW50CgogICAgV2hlbiBnb29kIG1hbm5lcnMgc2hhbGwgbGllIGFsbCBpbiBvbmUgb3IgdHdvIG1lbidzCiAgICBoYW5kcyBhbmQgdGhleSB1bndhc2hlZCB0b28sICd0aXMgYSBmb3VsIHRoaW5nLgoKRmlyc3QgU2VydmFudAoKICAgIEF3YXkgd2l0aCB0aGUgam9pbnQtc3Rvb2xzLCByZW1vdmUgdGhlCiAgICBjb3VydC1jdXBib2FyZCwgbG9vayB0byB0aGUgcGxhdGUuIEdvb2QgdGhvdSwgc2F2ZQogICAgbWUgYSBwaWVjZSBvZiBtYXJjaHBhbmU7IGFuZCwgYXMgdGhvdSBsb3Zlc3QgbWUsIGxldAogICAgdGhlIHBvcnRlciBsZXQgaW4gU3VzYW4gR3JpbmRzdG9uZSBhbmQgTmVsbC4KICAgIEFudG9ueSwgYW5kIFBvdHBhbiEKClNlY29uZCBTZXJ2YW50CgogICAgQXksIGJveSwgcmVhZHkuCgpGaXJzdCBTZXJ2YW50CgogICAgWW91IGFyZSBsb29rZWQgZm9yIGFuZCBjYWxsZWQgZm9yLCBhc2tlZCBmb3IgYW5kCiAgICBzb3VnaHQgZm9yLCBpbiB0aGUgZ3JlYXQgY2hhbWJlci4KClNlY29uZCBTZXJ2YW50CgogICAgV2UgY2Fubm90IGJlIGhlcmUgYW5kIHRoZXJlIHRvby4gQ2hlZXJseSwgYm95czsgYmUKICAgIGJyaXNrIGF3aGlsZSwgYW5kIHRoZSBsb25nZXIgbGl2ZXIgdGFrZSBhbGwuCgogICAgRW50ZXIgQ0FQVUxFVCwgd2l0aCBKVUxJRVQgYW5kIG90aGVycyBvZiBoaXMgaG91c2UsIG1lZXRpbmcgdGhlIEd1ZXN0cyBhbmQgTWFza2VycwoKQ0FQVUxFVAoKICAgIFdlbGNvbWUsIGdlbnRsZW1lbiEgbGFkaWVzIHRoYXQgaGF2ZSB0aGVpciB0b2VzCiAgICBVbnBsYWd1ZWQgd2l0aCBjb3JucyB3aWxsIGhhdmUgYSBib3V0IHdpdGggeW91LgogICAgQWggaGEsIG15IG1pc3RyZXNzZXMhIHdoaWNoIG9mIHlvdSBhbGwKICAgIFdpbGwgbm93IGRlbnkgdG8gZGFuY2UIHNoZSB0aGF0IG1ha2VzIGRhaW50eSwKICAgIFNoZSwgSSdsbCBzd2VhciwgaGF0aCBjb3JuczsgYW0gSSBjb21lIG5lYXIgeWUgbm93PwogICAgV2VsY29tZSwgZ2VudGxlbWVuISBJIGhhdmUgc2VlbiB0aGUgZGF5CiAgICBUaGF0IEkgaGF2ZSB3b3JuIGEgdmlzb3IgYW5kIGNvdWxkIHRlbGwKICAgIEEgd2hpc3BlcmluZyB0YWxlIGluIGEgZmFpciBsYWR5J3MgZWFyLAogICAgU3VjaCBhcyB3b3VsZCBwbGVhc2U6ICd0aXMgZ29uZSwgJ3RpcyBnb25lLCAndGlzIGdvbmU6CiAgICBZb3UgYXJlIHdlbGNvbWUsIGdlbnRsZW1lbiEgY29tZSwgbXVzaWNpYW5zLCBwbGF5LgogICAgQSBoYWxsLCBhIGhhbGwhIGdpdmUgcm9vbSEgYW5kIGZvb3QgaXQsIGdpcmxzLgoKICAgIE11c2ljIHBsYXlzLCBhbmQgdGhleSBkYW5jZQogICAgTW9yZSBsaWdodCwgeW91IGtuYXZlczsgYW5kIHR1cm4gdGhlIHRhYmxlcyB1cCwKICAgIEFuZCBxdWVuY2ggdGhlIGZpcmUsIHRoZSByb29tIGlzIGdyb3duIHRvbyBob3QuCiAgICBBaCwgc2lycmFoLCB0aGlzIHVubG9vaydkLWZvciBzcG9ydCBjb21lcyB3ZWxsLgogICAgTmF5LCBzaXQsIG5heSwgc2l0LCBnb29kIGNvdXNpbiBDYXB1bGV0OwogICAgRm9yIHlvdSBhbmQgSSBhcmUgcGFzdCBvdXIgZGFuY2luZyBkYXlzOgogICAgSG93IGxvbmcgaXMndCBub3cgc2luY2UgbGFzdCB5b3Vyc2VsZiBhbmQgSQogICAgV2VyZSBpbiBhIG1hc2sCgpTZWNvbmQgQ2FwdWxldAoKICAgIEJ5J3IgbGFkeSwgdGhpcnR5IHllYXJzLgoKQ0FQVUxFVAoKICAgIFdoYXQsIG1hbiEgJ3RpcyBub3Qgc28gbXVjaCwgJ3RpcyBub3Qgc28gbXVjaDoKICAgICdUaXMgc2luY2UgdGhlIG51cHRpYWxzIG9mIEx1Y2VudGlvLAogICAgQ29tZSBwZW50ZWNvc3QgYXMgcXVpY2tseSBhcyBpdCB3aWxsLAogICAgU29tZSBmaXZlIGFuZCB0d2VudHkgeWVhcnM7IGFuZCB0aGVuIHdlIG1hc2snZC4KClNlY29uZCBDYXB1bGV0CgogICAgJ1RpcyBtb3JlLCAndGlzIG1vcmUsIGhpcyBzb24gaXMgZWxkZXIsIHNpcjsKICAgIEhpcyBzb24gaXMgdGhpcnR5LgoKQ0FQVUxFVAoKICAgIFdpbGwgeW91IHRlbGwgbWUgdGhhdD8KICAgIEhpcyBzb24gd2FzIGJ1dCBhIHdhcmQgdHdvIHllYXJzIGFnby4KClJPTUVPCgogICAgW1RvIGEgU2VydmluZ21hbl0gV2hhdCBsYWR5IGlzIHRoYXQsIHdoaWNoIGRvdGgKICAgIGVucmljaCB0aGUgaGFuZAogICAgT2YgeW9uZGVyIGtuaWdodD8KClNlcnZhbnQKCiAgICBJIGtub3cgbm90LCBzaXIuCgpST01FTwoKICAgIE8sIHNoZSBkb3RoIHRlYWNoIHRoZSB0b3JjaGVzIHRvIGJ1cm4gYnJpZ2h0IQogICAgSXQgc2VlbXMgc2hlIGhhbmdzIHVwb24gdGhlIGNoZWVrIG9mIG5pZ2h0CiAgICBMaWtlIGEgcmljaCBqZXdlbCBpbiBhbiBFdGhpb3BlJ3MgZWFyOwogICAgQmVhdXR5IHRvbyByaWNoIGZvciB1c2UsIGZvciBlYXJ0aCB0b28gZGVhciEKICAgIFNvIHNob3dzIGEgc25vd3kgZG92ZSB0cm9vcGluZyB3aXRoIGNyb3dzLAogICAgQXMgeW9uZGVyIGxhZHkgbydlciBoZXIgZmVsbG93cyBzaG93cy4KICAgIFRoZSBtZWFzdXJlIGRvbmUsIEknbGwgd2F0Y2ggaGVyIHBsYWNlIG9mIHN0YW5kLAogICAgQW5kLCB0b3VjaGluZyBoZXJzLCBtYWtlIGJsZXNzZWQgbXkgcnVkZSBoYW5kLgogICAgRGlkIG15IGhlYXJ0IGxvdmUgdGlsbCBub3cIGZvcnN3ZWFyIGl0LCBzaWdodCEKICAgIEZvciBJIG5lJ2VyIHNhdyB0cnVlIGJlYXV0eSB0aWxsIHRoaXMgbmlnaHQuCgpUWUJBTFQKCiAgICBUaGlzLCBieSBoaXMgdm9pY2UsIHNob3VsZCBiZSBhIE1vbnRhZ3VlLgogICAgRmV0Y2ggbWUgbXkgcmFwaWVyLCBib3kuIFdoYXQgZGFyZXMgdGhlIHNsYXZlCiAgICBDb21lIGhpdGhlciwgY292ZXInZCB3aXRoIGFuIGFudGljIGZhY2UsCiAgICBUbyBmbGVlciBhbmQgc2Nvcm4gYXQgb3VyIHNvbGVtbml0eT8KICAgIE5vdywgYnkgdGhlIHN0b2NrIGFuZCBob25vdXIgb2YgbXkga2luLAogICAgVG8gc3RyaWtlIGhpbSBkZWFkLCBJIGhvbGQgaXQgbm90IGEgc2luLgoKQ0FQVUxFVAoKICAgIFdoeSwgaG93IG5vdywga2luc21hbiEgd2hlcmVmb3JlIHN0b3JtIHlvdSBzbz8KClRZQkFMVAoKICAgIFVuY2xlLCB0aGlzIGlzIGEgTW9udGFndWUsIG91ciBmb2UsCiAgICBBIHZpbGxhaW4gdGhhdCBpcyBoaXRoZXIgY29tZSBpbiBzcGl0ZSwKICAgIFRvIHNjb3JuIGF0IG91ciBzb2xlbW5pdHkgdGhpcyBuaWdodC4KCkNBUFVMRVQKCiAgICBZb3VuZyBSb21lbyBpcyBpdD8KClRZQkFMVAoKICAgICdUaXMgaGUsIHRoYXQgdmlsbGFpbiBSb21lby4KCkNBUFVMRVQKCiAgICBDb250ZW50IHRoZWUsIGdlbnRsZSBjb3osIGxldCBoaW0gYWxvbmU7CiAgICBIZSBiZWFycyBoaW0gbGlrZSBhIHBvcnRseSBnZW50bGVtYW47CiAgICBBbmQsIHRvIHNheSB0cnV0aCwgVmVyb25hIGJyYWdzIG9mIGhpbQogICAgVG8gYmUgYSB2aXJ0dW91cyBhbmQgd2VsbC1nb3Zlcm4nZCB5b3V0aDoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd2VhbHRoIG9mIGFsbCB0aGUgdG93bgogICAgSGVyZSBpbiBteSBob3VzZSBkbyBoaW0gZGlzcGFyYWdlbWVudDoKICAgIFRoZXJlZm9yZSBiZSBwYXRpZW50LCB0YWtlIG5vIG5vdGUgb2YgaGltOgogICAgSXQgaXMgbXkgd2lsbCwgdGhlIHdoaWNoIGlmIHRob3UgcmVzcGVjdCwKICAgIFNob3cgYSBmYWlyIHByZXNlbmNlIGFuZCBwdXQgb2ZmIHRoZXNlIGZyb3ducywKICAgIEFuZCBpbGwtYmVzZWVtaW5nIHNlbWJsYW5jZSBmb3IgYSBmZWFzdC4KClRZQkFMVAoKICAgIEl0IGZpdHMsIHdoZW4gc3VjaCBhIHZpbGxhaW4gaXMgYSBndWVzdDoKICAgIEknbGwgbm90IGVuZHVyZSBoaW0uCgpDQVBVTEVUCgogICAgSGUgc2hhbGwgYmUgZW5kdXJlZDoKICAgIFdoYXQsIGdvb2RtYW4gYm95ISBJIHNheSwgaGUgc2hhbGw6IGdvIHRvOwogICAgQW0gSSB0aGUgbWFzdGVyIGhlcmUsIG9yIHlvdT8gZ28gdG8uCiAgICBZb3UnbGwgbm90IGVuZHVyZSBoaW0hIEdvZCBzaGFsbCBtZW5kIG15IHNvdWwhCiAgICBZb3UnbGwgbWFrZSBhIG11dGlueSBhbW9uZyBteSBndWVzdHMhCiAgICBZb3Ugd2lsbCBzZXQgY29jay1hLWhvb3AhIHlvdSdsbCBiZSB0aGUgbWFuIQoKVFlCQUxUCgogICAgV2h5LCB1bmNsZSwgJ3RpcyBhIHNoYW1lLgoKQ0FQVUxFVAoKICAgIEdvIHRvLCBnbyB0bzsKICAgIFlvdSBhcmUgYSBzYXVjeSBib3k6IGlzJ3Qgc28sIGluZGVlZD8KICAgIFRoaXMgdHJpY2sgbWF5IGNoYW5jZSB0byBzY2F0aGUgeW91LCBJIGtub3cgd2hhdDoKICAgIFlvdSBtdXN0IGNvbnRyYXJ5IG1lISBtYXJyeSwgJ3RpcyB0aW1lLgogICAgV2VsbCBzYWlkLCBteSBoZWFydHMhIFlvdSBhcmUgYSBwcmluY294OyBnbzoKICAgIEJlIHF1aWV0LCBvci0tTW9yZSBsaWdodCwgbW9yZSBsaWdodCEgRm9yIHNoYW1lIQogICAgSSdsbCBtYWtlIHlvdSBxdWlldC4gV2hhdCwgY2hlZXJseSwgbXkgaGVhcnRzIQoKVFlCQUxUCgogICAgUGF0aWVuY2UgcGVyZm9yY2Ugd2l0aCB3aWxmdWwgY2hvbGVyIG1lZXRpbmcKICAgIE1ha2VzIG15IGZsZXNoIHRyZW1ibGUgaW4gdGhlaXIgZGlmZmVyZW50IGdyZWV0aW5nLgogICAgSSB3aWxsIHdpdGhkcmF3OiBidXQgdGhpcyBpbnRydXNpb24gc2hhbGwKICAgIE5vdyBzZWVtaW5nIHN3ZWV0IGNvbnZlcnQgdG8gYml0dGVyIGdhbGwuCgogICAgRXhpdAoKUk9NRU8KCiAgICBbVG8gSlVMSUVUXSBJZiBJIHByb2ZhbmUgd2l0aCBteSB1bndvcnRoaWVzdCBoYW5kCiAgICBUaGlzIGhvbHkgc2hyaW5lLCB0aGUgZ2VudGxlIGZpbmUgaXMgdGhpczoKICAgIE15IGxpcHMsIHR3byBibHVzaGluZyBwaWxncmltcywgcmVhZHkgc3RhbmQKICAgIFRvIHNtb290aCB0aGF0IHJvdWdoIHRvdWNoIHdpdGggYSB0ZW5kZXIga2lzcy4KCkpVTElFVAoKICAgIEdvb2QgcGlsZ3JpbSwgeW91IGRvIHdyb25nIHlvdXIgaGFuZCB0b28gbXVjaCwKICAgIFdoaWNoIG1hbm5lcmx5IGRldm90aW9uIHNob3dzIGluIHRoaXM7CiAgICBGb3Igc2FpbnRzIGhhdmUgaGFuZHMgdGhhdCBwaWxncmltcycgaGFuZHMgZG8gdG91Y2gsCiAgICBBbmQgcGF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lIGJlIG1hcnJpZWQuCiAgICBNeSBncmF2ZSBpcyBsaWtlIHRvIGJlIG15IHdlZGRpbmcgYmVkLgoKTnVyc2UKCiAgICBIaXMgbmFtZSBpcyBSb21lbywgYW5kIGEgTW9udGFndWU7CiAgICBUaGUgb25seSBzb24gb2YgeW91ciBncmVhdCBlbmVteS4KCkpVTElFVAoKICAgIE15IG9ubHkgbG92ZSBzcHJ1bmcgZnJvbSBteSBvbmx5IGhhdGUhCiAgICBUb28gZWFybHkgc2VlbiB1bmtub3duLCBhbmQga25vd24gdG9vIGxhdGUhCiAgICBQcm9kaWdpb3VzIGJpcnRoIG9mIGxvdmUgaXQgaXMgdG8gbWUsCiAgICBUaGF0IEkgbXVzdCBsb3ZlIGEgbG9hdGhlZCBlbmVteS4KCk51cnNlCgogICAgV2hhdCdzIHRoaXMIHdoYXQncyB0aGlzPwoKSlVMSUVUCgogICAgQSByaHltZSBJIGxlYXJuJ2QgZXZlbiBub3cKICAgIE9mIG9uZSBJIGRhbmNlZCB3aXRoYWwuCgogICAgT25lIGNhbGxzIHdpdGhpbiAnSnVsaWV0LicKCk51cnNlCgogICAgQW5vbiwgYW5vbiEKICAgIENvbWUsIGxldCdzIGF3YXk7IHRoZSBzdHJhbmdlcnMgYWxsIGFyZSBnb25lLgoKICAgIEV4ZXVudAoKQUNUIElJClBST0xPR1VFCgogICAgRW50ZXIgQ2hvcnVzIAoKQ2hvcnVzCgogICAgTm93IG9sZCBkZXNpcmUgZG90aCBpbiBoaXMgZGVhdGgtYmVkIGxpZSwKICAgIEFuZCB5b3VuZyBhZmZlY3Rpb24gZ2FwZXMgdG8gYmUgaGlzIGhlaXI7CiAgICBUaGF0IGZhaXIgZm9yIHdoaWNoIGxvdmUgZ3JvYW4nZCBmb3IgYW5kIHdvdWxkIGRpZSwKICAgIFdpdGggdGVuZGVyIEp1bGlldCBtYXRjaCdkLCBpcyBub3cgbm90IGZhaXIuCiAgICBOb3cgUm9tZW8gaXMgYmVsb3ZlZCBhbmQgbG92ZXMgYWdhaW4sCiAgICBBbGlrZSBiZXR3aXRjaGVkIGJ5IHRoZSBjaGFybSBvZiBsb29rcywKICAgIEJ1dCB0byBoaXMgZm9lIHN1cHBvc2VkIGhlIG11c3QgY29tcGxhaW4sCiAgICBBbmQgc2hlIHN0ZWFsIGxvdmUncyBzd2VldCBiYWl0IGZyb20gZmVhcmZ1bCBob29rczoKICAgIEJlaW5nIGhlbGQgYSBmb2UsIGhlIG1heSBub3QgaGF2ZSBhY2Nlc3MKICAgIFRvIGJyZWF0aGUgc3VjaCB2b3dzIGFzIGxvdmVycyB1c2UgdG8gc3dlYXI7CiAgICBBbmQgc2hlIGFzIG11Y2ggaW4gbG92ZSwgaGVyIG1lYW5zIG11Y2ggbGVzcwogICAgVG8gbWVldCBoZXIgbmV3LWJlbG92ZWQgYW55IHdoZXJlOgogICAgQnV0IHBhc3Npb24gbGVuZHMgdGhlbSBwb3dlciwgdGltZSBtZWFucywgdG8gbWVldAogICAgVGVtcGVyaW5nIGV4dHJlbWl0aWVzIHdpdGggZXh0cmVtZSBzd2VldC4KCiAgICBFeGl0CgpTQ0VORSBJLiBBIGxhbmUgYnkgdGhlIHdhbGwgb2YgQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gCgpST01FTwoKICAgIENhbiBJIGdvIGZvcndhcmQgd2hlbiBteSBoZWFydCBpcyBoZXJlPwogICAgVHVybiBiYWNrLCBkdWxsIGVhcnRoLCBhbmQgZmluZCB0aHkgY2VudHJlIG91dC4KCiAgICBIZSBjbGltYnMgdGhlIHdhbGwsIGFuZCBsZWFwcyBkb3duIHdpdGhpbiBpdAoKICAgIEVudGVyIEJFTlZPTElPIGFuZCBNRVJDVVRJTwoKQkVOVk9MSU8KCiAgICBSb21lbyEgbXkgY291c2luIFJvbWVvIQoKTUVSQ1VUSU8KCiAgICBIZSBpcyB3aXNlOwogICAgQW5kLCBvbiBteSBsaWUsIGhhdGggc3RvbCduIGhpbSBob21lIHRvIGJlZC4KCkJFTlZPTElPCgogICAgSGUgcmFuIHRoaXMgd2F5LCBhbmQgbGVhcCdkIHRoaXMgb3JjaGFyZCB3YWxsOgogICAgQ2FsbCwgZ29vZCBNZXJjdXRpby4KCk1FUkNVVElPCgogICAgTmF5LCBJJ2xsIGNvbmp1cmUgdG9vLgogICAgUm9tZW8hIGh1bW91cnMhIG1hZG1hbiEgcGFzc2lvbiEgbG92ZXIhCiAgICBBcHBlYXIgdGhvdSBpbiB0aGUgbGlrZW5lc3Mgb2YgYSBzaWdoOgogICAgU3BlYWsgYnV0IG9uZSByaHltZSwgYW5kIEkgYW0gc2F0aXNmaWVkOwogICAgQ3J5IGJ1dCAnQXkgbWUhJyBwcm9ub3VuY2UgYnV0ICdsb3ZlJyBhbmQgJ2RvdmU7JwogICAgU3BlYWsgdG8gbXkgZ29zc2lwIFZlbnVzIG9uZSBmYWlyIHdvcmQsCiAgICBPbmUgbmljay1uYW1lIGZvciBoZXIgcHVyYmxpbmQgc29uIGFuZCBoZWlyLAogICAgWW91bmcgQWRhbSBDdXBpZCwgaGUgdGhhdCBzaG90IHNvIHRyaW0sCiAgICBXaGVuIEtpbmcgQ29waGV0dWEgbG92ZWQgdGhlIGJlZ2dhci1tYWlkIQogICAgSGUgaGVhcmV0aCBub3QsIGhlIHN0aXJyZXRoIG5vdCwgaGUgbW92ZXRoIG5vdDsKICAgIFRoZSBhcGUgaXMgZGVhZCwgYW5kIEkgbXVzdCBjb25qdXJlIGhpbS4KICAgIEkgY29uanVyZSB0aGVlIGJ5IFJvc2FsaW5lJ3MgYnJpZ2h0IGV5ZXMsCiAgICBCeSBoZXIgaGlnaCBmb3JlaGVhZCBhbmQgaGVyIHNjYXJsZXQgbGlwLAogICAgQnkgaGVyIGZpbmUgZm9vdCwgc3RyYWlnaHQgbGVnIGFuZCBxdWl2ZXJpbmcgdGhpZ2gKICAgIEFuZCB0aGUgZGVtZXNuZXMgdGhhdCB0aGVyZSBhZGphY2VudCBsaWUsCiAgICBUaGF0IGluIHRoeSBsaWtlbmVzcyB0aG91IGFwcGVhciB0byB1cyEKCkJFTlZPTElPCgogICAgQW5kIGlmIGhlIGhlYXIgdGhlZSwgdGhvdSB3aWx0IGFuZ2VyIGhpbS4KCk1FUkNVVElPCgogICAgVGhpcyBjYW5ub3QgYW5nZXIgaGltOiAndHdvdWxkIGFuZ2VyIGhpbQogICAgVG8gcmFpc2UgYSBzcGlyaXQgaW4gaGlzIG1pc3RyZXNzJyBjaXJjbGUKICAgIE9mIHNvbWUgc3RyYW5nZSBuYXR1cmUsIGxldHRpbmcgaXQgdGhlcmUgc3RhbmQKICAgIFRpbGwgc2hlIGhhZCBsYWlkIGl0IGFuZCBjb25qdXJlZCBpdCBkb3duOwogICAgVGhhdCB3ZXJlIHNvbWUgc3BpdGU6IG15IGludm9jYXRpb24KICAgIElzIGZhaXIgYW5kIGhvbmVzdCwgYW5kIGluIGhpcyBtaXN0cmVzIHMnIG5hbWUKICAgIEkgY29uanVyZSBvbmx5IGJ1dCB0byByYWlzZSB1cCBoaW0uCgpCRU5WT0xJTwoKICAgIENvbWUsIGhlIGhhdGggaGlkIGhpbXNlbGYgYW1vbmcgdGhlc2UgdHJlZXMsCiAgICBUbyBiZSBjb25zb3J0ZWQgd2l0aCB0aGUgaHVtb3JvdXMgbmlnaHQ6CiAgICBCbGluZCBpcyBoaXMgbG92ZSBhbmQgYmVzdCBiZWZpdHMgdGhlIGRhcmsuCgpNRVJDVVRJTwoKICAgIElmIGxvdmUgYmUgYmxpbmQsIGxvdmUgY2Fubm90IGhpdCB0aGUgbWFyay4KICAgIE5vdyB3aWxsIGhlIHNpdCB1bmRlciBhIG1lZGxhciB0cmVlLAogICAgQW5kIHdpc2ggaGlzIG1pc3RyZXNzIHdlcmUgdGhhdCBraW5kIG9mIGZydWl0CiAgICBBcyBtYWlkcyBjYWxsIG1lZGxhcnMsIHdoZW4gdGhleSBsYXVnaCBhbG9uZS4KICAgIFJvbWVvLCB0aGF0IHNoZSB3ZXJlLCBPLCB0aGF0IHNoZSB3ZXJlCiAgICBBbiBvcGVuIGV0IGNhZXRlcmEsIHRob3UgYSBwb3BlcmluIHBlYXIhCiAgICBSb21lbywgZ29vZCBuaWdodDogSSdsbCB0byBteSB0cnVja2xlLWJlZDsKICAgIFRoaXMgZmllbGQtYmVkIGlzIHRvbyBjb2xkIGZvciBtZSB0byBzbGVlcDoKICAgIENvbWUsIHNoYWxsIHdlIGdvPwoKQkVOVk9MSU8KCiAgICBHbywgdGhlbjsgZm9yICd0aXMgaW4gdmFpbgogICAgVG8gc2VlayBoaW0gaGVyZSB0aGF0IG1lYW5zIG5vdCB0byBiZSBmb3VuZC4KCiAgICBFeGV1bnQKClNDRU5FIElJLiBDYXB1bGV0J3Mgb3JjaGFyZC4KCiAgICBFbnRlciBST01FTyAKClJPTUVPCgogICAgSGUgamVzdHMgYXQgc2NhcnMgdGhhdCBuZXZlciBmZWx0IGEgd291bmQuCgogICAgSlVMSUVUIGFwcGVhcnMgYWJvdmUgYXQgYSB3aW5kb3cKICAgIEJ1dCwgc29mdCEgd2hhdCBsaWdodCB0aHJvdWdoIHlvbmRlciB3aW5kb3cgYnJlYWtzPwogICAgSXQgaXMgdGhlIGVhc3QsIGFuZCBKdWxpZXQgaXMgdGhlIHN1bi4KICAgIEFyaXNlLCBmYWlyIHN1biwgYW5kIGtpbGwgdGhlIGVudmlvdXMgbW9vbiwKICAgIFdobyBpcyBhbHJlYWR5IHNpY2sgYW5kIHBhbGUgd2l0aCBncmllZiwKICAgIFRoYXQgdGhvdSBoZXIgbWFpZCBhcnQgZmFyIG1vcmUgZmFpciB0aGFuIHNoZToKICAgIEJlIG5vdCBoZXIgbWFpZCwgc2luY2Ugc2hlIGlzIGVudmlvdXM7CiAgICBIZXIgdmVzdGFsIGxpdmVyeSBpcyBidXQgc2ljayBhbmQgZ3JlZW4KICAgIEFuZCBub25lIGJ1dCBmb29scyBkbyB3ZWFyIGl0OyBjYXN0IGl0IG9mZi4KICAgIEl0IGlzIG15IGxhZHksIE8sIGl0IGlzIG15IGxvdmUhCiAgICBPLCB0aGF0IHNoZSBrbmV3IHNoZSB3ZXJlIQogICAgU2hlIHNwZWFrcyB5ZXQgc2hlIHNheXMgbm90aGluZzogd2hhdCBvZiB0aGF0PwogICAgSGVyIGV5ZSBkaXNjb3Vyc2VzOyBJIHdpbGwgYW5zd2VyIGl0LgogICAgSSBhbSB0b28gYm9sZCwgJ3RpcyBub3QgdG8gbWUgc2hlIHNwZWFrczoKICAgIFR3byBvZiB0aGUgZmFpcmVzdCBzdGFycyBpbiBhbGwgdGhlIGhlYXZlbiwKICAgIEhhdmluZyBzb21lIGJ1c2luZXNzLCBkbyBlbnRyZWF0IGhlciBleWVzCiAgICBUbyB0d2lua2xlIGluIHRoZWlyIHNwaGVyZXMgdGlsbCB0aGV5IHJldHVybi4KICAgIFdoYXQgaWYgaGVyIGV5ZXMgd2VyZSB0aGVyZSwgdGhleSBpbiBoZXIgaGVhZD8KICAgIFRoZSBicmlnaHRuZXNzIG9mIGhlciBjaGVlayB3b3VsZCBzaGFtZSB0aG9zZSBzdGFycywKICAgIEFzIGRheWxpZ2h0IGRvdGggYSBsYW1wOyBoZXIgZXllcyBpbiBoZWF2ZW4KICAgIFdvdWxkIHRocm91Z2ggdGhlIGFpcnkgcmVnaW9uIHN0cmVhbSBzbyBicmlnaHQKICAgIFRoYXQgYmlyZHMgd291bGQgc2luZyBhbmQgdGhpbmsgaXQgd2VyZSBub3QgbmlnaHQuCiAgICBTZWUsIGhvdyBzaGUgbGVhbnMgaGVyIGNoZWVrIHVwb24gaGVyIGhhbmQhCiAgICBPLCB0aGF0IEkgd2VyZSBhIGdsb3ZlIHVwb24gdGhhdCBoYW5kLAogICAgVGhhdCBJIG1pZ2h0IHRvdWNoIHRoYXQgY2hlZWshCgpKVUxJRVQKCiAgICBBeSBtZSEKClJPTUVPCgogICAgU2hlIHNwZWFrczoKICAgIE8sIHNwZWFrIGFnYWluLCBicmlnaHQgYW5nZWwhIGZvciB0aG91IGFydAogICAgQXMgZ2xvcmlvdXMgdG8gdGhpcyBuaWdodCwgYmVpbmcgbydlciBteSBoZWFkCiAgICBBcyBpcyBhIHdpbmdlZCBtZXNzZW5nZXIgb2YgaGVhdmVuCiAgICBVbnRvIHRoZSB3aGl0ZS11cHR1cm5lZCB3b25kZXJpbmcgZXllcwogICAgT2YgbW9ydGFscyB0aGF0IGZhbGwgYmFjayB0byBnYXplIG9uIGhpbQogICAgV2hlbiBoZSBiZXN0cmlkZXMgdGhlIGxhenktcGFjaW5nIGNsb3VkcwogICAgQW5kIHNhaWxzIHVwb24gdGhlIGJvc29tIG9mIHRoZSBhaXIuCgpKVUxJRVQKCiAgICBPIFJvbWVvLCBSb21lbyEgd2hlcmVmb3JlIGFydCB0aG91IFJvbWVvPwogICAgRGVueSB0aHkgZmF0aGVyIGFuZCByZWZ1c2UgdGh5IG5hbWU7CiAgICBPciwgaWYgdGhvdSB3aWx0IG5vdCwgYmUgYnV0IHN3b3JuIG15IGxvdmUsCiAgICBBbmQgSSdsbCBubyBsb25nZXIgYmUgYSBDYXB1bGV0LgoKUk9NRU8KCiAgICBbQXNpZGVdIFNoYWxsIEkgaGVhciBtb3JlLCBvciBzaGFsbCBJIHNwZWFrIGF0IHRoaXMCgpKVUxJRVQKCiAgICAnVGlzIGJ1dCB0aHkgbmFtZSB0aGF0IGlzIG15IGVuZW15OwogICAgVGhvdSBhcnQgdGh5c2VsZiwgdGhvdWdoIG5vdCBhIE1vbnRhZ3VlLgogICAgV2hhdCdzIE1vbnRhZ3VlPyBpdCBpcyBub3IgaGFuZCwgbm9yIGZvb3QsCiAgICBOb3IgYXJtLCBub3IgZmFjZSwgbm9yIGFueSBvdGhlciBwYXJ0CiAgICBCZWxvbmdpbmcgdG8gYSBtYW4uIE8sIGJlIHNvbWUgb3RoZXIgbmFtZSEKICAgIFdoYXQncyBpbiBhIG5hbWUIHRoYXQgd2hpY2ggd2UgY2FsbCBhIHJvc2UKICAgIEJ5IGFueSBvdGhlciBuYW1lIHdvdWxkIHNtZWxsIGFzIHN3ZWV0OwogICAgU28gUm9tZW8gd291bGQsIHdlcmUgaGUgbm90IFJvbWVvIGNhbGwnZCwKICAgIFJldGFpbiB0aGF0IGRlYXIgcGVyZmVjdGlvbiB3aGljaCBoZSBvd2VzCiAgICBXaXRob3V0IHRoYXQgdGl0bGUuIFJvbWVvLCBkb2ZmIHRoeSBuYW1lLAogICAgQW5kIGZvciB0aGF0IG5hbWUgd2hpY2ggaXMgbm8gcGFydCBvZiB0aGVlCiAgICBUYWtlIGFsbCBteXNlbGYuCgpST01FTwoKICAgIEkgdGFrZSB0aGVlIGF0IHRoeSB3b3JkOgogICAgQ2FsbCBtZSBidXQgbG92ZSwgYW5kIEknbGwgYmUgbmV3IGJhcHRpemVkOwogICAgSGVuY2Vmb3J0aCBJIG5ldmVyIHdpbGwgYmUgUm9tZW8uCgpKVUxJRVQKCiAgICBXaGF0IG1hbiBhcnQgdGhvdSB0aGF0IHRodXMgYmVzY3JlZW4nZCBpbiBuaWdodAogICAgU28gc3R1bWJsZXN0IG9uIG15IGNvdW5zZWwCgpST01FTwoKICAgIEJ5IGEgbmFtZQogICAgSSBrbm93IG5vdCBob3cgdG8gdGVsbCB0aGVlIHdobyBJIGFtOgogICAgTXkgbmFtZSwgZGVhciBzYWludCwgaXMgaGF0ZWZ1bCB0byBteXNlbGYsCiAgICBCZWNhdXNlIGl0IGlzIGFuIGVuZW15IHRvIHRoZWU7CiAgICBIYWQgSSBpdCB3cml0dGVuLCBJIHdvdWxkIHRlYXIgdGhlIHdvcmQuCgpKVUxJRVQKCiAgICBNeSBlYXJzIGhhdmUgbm90IHlldCBkcnVuayBhIGh1bmRyZWQgd29yZHMKICAgIE9mIHRoYXQgdG9uZ3VlJ3MgdXR0ZXJhbmNlLCB5ZXQgSSBrbm93IHRoZSBzb3VuZDoKICAgIEFydCB0aG91IG5vdCBSb21lbyBhbmQgYSBNb250YWd1ZT8KClJPTUVPCgogICAgTmVpdGhlciwgZmFpciBzYWludCwgaWYgZWl0aGVyIHRoZWUgZGlzbGlrZS4KCkpVTElFVAoKICAgIEhvdyBjYW1lc3QgdGhvdSBoaXRoZXIsIHRlbGwgbWUsIGFuZCB3aGVyZWZvcmUCiAgICBUaGUgb3JjaGFyZCB3YWxscyBhcmUgaGlnaCBhbmQgaGFyZCB0byBjbGltYiwKICAgIEFuZCB0aGUgcGxhY2UgZGVhdGgsIGNvbnNpZGVyaW5nIHdobyB0aG91IGFydCwKICAgIElmIGFueSBvZiBteSBraW5zbWVuIGZpbmQgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBXaXRoIGxvdmUncyBsaWdodCB3aW5ncyBkaWQgSSBvJ2VyLXBlcmNoIHRoZXNlIHdhbGxzOwogICAgRm9yIHN0b255IGxpbWl0cyBjYW5ub3QgaG9sZCBsb3ZlIG91dCwKICAgIEFuZCB3aGF0IGxvdmUgY2FuIGRvIHRoYXQgZGFyZXMgbG92ZSBhdHRlbXB0OwogICAgVGhlcmVmb3JlIHRoeSBraW5zbWVuIGFyZSBubyBsZXQgdG8gbWUuCgpKVUxJRVQKCiAgICBJZiB0aGV5IGRvIHNlZSB0aGVlLCB0aGV5IHdpbGwgbXVyZGVyIHRoZWUuCgpST01FTwoKICAgIEFsYWNrLCB0aGVyZSBsaWVzIG1vcmUgcGVyaWwgaW4gdGhpbmUgZXllCiAgICBUaGFuIHR3ZW50eSBvZiB0aGVpciBzd29yZHM6IGxvb2sgdGhvdSBidXQgc3dlZXQsCiAgICBBbmQgSSBhbSBwcm9vZiBhZ2FpbnN0IHRoZWlyIGVubWl0eS4KCkpVTElFVAoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd29ybGQgdGhleSBzYXcgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBJIGhhdmUgbmlnaHQncyBjbG9hayB0byBoaWRlIG1lIGZyb20gdGhlaXIgc2lnaHQ7CiAgICBBbmQgYnV0IHRob3UgbG92ZSBtZSwgbGV0IHRoZW0gZmluZCBtZSBoZXJlOgogICAgTXkgbGlmZSB3ZXJlIGJldHRlciBlbmRlZCBieSB0aGVpciBoYXRlLAogICAgVGhhbiBkZWF0aCBwcm9yb2d1ZWQsIHdhbnRpbmcgb2YgdGh5IGxvdmUuCgpKVUxJRVQKCiAgICBCeSB3aG9zZSBkaXJlY3Rpb24gZm91bmQnc3QgdGhvdSBvdXQgdGhpcyBwbGFjZT8KClJPTUVPCgogICAgQnkgbG92ZSwgd2hvIGZpcnN0IGRpZCBwcm9tcHQgbWUgdG8gaW5xdWlyZTsKICAgIEhlIGxlbnQgbWUgY291bnNlbCBhbmQgSSBsZW50IGhpbSBleWVzLgogICAgSSBhbSBubyBwaWxvdDsgeWV0LCB3ZXJ0IHRob3UgYXMgZmFyCiAgICBBcyB0aGF0IHZhc3Qgc2hvcmUgd2FzaCdkIHdpdGggdGhlIGZhcnRoZXN0IHNlYSwKICAgIEkgd291bGQgYWR2ZW50dXJlIGZvciBzdWNoIG1lcmNoYW5kaXNlLgoKSlVMSUVUCgogICAgVGhvdSBrbm93J3N0IHRoZSBtYXNrIG9mIG5pZ2h0IGlzIG9uIG15IGZhY2UsCiAgICBFbHNlIHdvdWxkIGEgbWFpZGVuIGJsdXNoIGJlcGFpbnQgbXkgY2hlZWsKICAgIEZvciB0aGF0IHdoaWNoIHRob3UgaGFzdCBoZWFyZCBtZSBzcGVhayB0by1uaWdodAogICAgRmFpbiB3b3VsZCBJIGR3ZWxsIG9uIGZvcm0sIGZhaW4sIGZhaW4gZGVueQogICAgV2hhdCBJIGhhdmUgc3Bva2U6IGJ1dCBmYXJld2VsbCBjb21wbGltZW50IQogICAgRG9zdCB0aG91IGxvdmUgbWUIEkga25vdyB0aG91IHdpbHQgc2F5ICdBeSwnCiAgICBBbmQgSSB3aWxsIHRha2UgdGh5IHdvcmQ6IHlldCBpZiB0aG91IHN3ZWFyJ3N0LAogICAgVGhvdSBtYXlzdCBwcm92ZSBmYWxzZTsgYXQgbG92ZXJzJyBwZXJqdXJpZXMKICAgIFRoZW4gc2F5LCBKb3ZlIGxhdWdocy4gTyBnZW50bGUgUm9tZW8sCiAgICBJZiB0aG91IGRvc3QgbG92ZSwgcHJvbm91bmNlIGl0IGZhaXRoZnVsbHk6CiAgICBPciBpZiB0aG91IHRoaW5rJ3N0IEkgYW0gdG9vIHF1aWNrbHkgd29uLAogICAgSSdsbCBmcm93biBhbmQgYmUgcGVydmVyc2UgYW4gc2F5IHRoZWUgbmF5LAogICAgU28gdGhvdSB3aWx0IHdvbzsgYnV0IGVsc2UsIG5vdCBmb3IgdGhlIHdvcmxkLgogICAgSW4gdHJ1dGgsIGZhaXIgTW9udGFndWUsIEkgYW0gdG9vIGZvbmQsCiAgICBBbmQgdGhlcmVmb3JlIHRob3UgbWF5c3QgdGhpbmsgbXkgJ2hhdmlvciBsaWdodDoKICAgIEJ1dCB0cnVzdCBtZSwgZ2VudGxlbWFuLCBJJ2xsIHByb3ZlIG1vcmUgdHJ1ZQogICAgVGhhbiB0aG9zZSB0aGF0IGhhdmUgbW9yZSBjdW5uaW5nIHRvIGJlIHN0cmFuZ2UuCiAgICBJIHNob3VsZCBoYXZlIGJlZW4gbW9yZSBzdHJhbmdlLCBJIG11c3QgY29uZmVzcywKICAgIEJ1dCB0aGF0IHRob3Ugb3ZlcmhlYXJkJ3N0LCBlcmUgSSB3YXMgd2FyZSwKICAgIE15IHRydWUgbG92ZSdzIHBhc3Npb246IHRoZXJlZm9yZSBwYXJkb24gbWUsCiAgICBBbmQgbm90IGltcHV0ZSB0aGlzIHlpZWxkaW5nIHRvIGxpZ2h0IGxvdmUsCiAgICBXaGljaCB0aGUgZGFyayBuaWdodCBoYXRoIHNvIGRpc2NvdmVyZWQuCgpST01FTwoKICAgIExhZHksIGJ5IHlvbmRlciBibGVzc2VkIG1vb24gSSBzd2VhcgogICAgVGhhdCB0aXBzIHdpdGggc2lsdmVyIGFsbCB0aGVzZSBmcnVpdC10cmVlIHRvcHMtLQoKSlVMSUVUCgogICAgTywgc3dlYXIgbm90IGJ5IHRoZSBtb29uLCB0aGUgaW5jb25zdGFudCBtb29uLAogICAgVGhhdCBtb250aGx5IGNoYW5nZXMgaW4gaGVyIGNpcmNsZWQgb3JiLAogICAgTGVzdCB0aGF0IHRoeSBsb3ZlIHByb3ZlIGxpa2V3aXNlIHZhcmlhYmxlLgoKUk9NRU8KCiAgICBXaGF0IHNoYWxsIEkgc3dlYXIgYnkCgpKVUxJRVQKCiAgICBEbyBub3Qgc3dlYXIgYXQgYWxsOwogICAgT3IsIGlmIHRob3Ugd2lsdCwgc3dlYXIgYnkgdGh5IGdyYWNpb3VzIHNlbGYsCiAgICBXaGljaCBpcyB0aGUgZ29kIG9mIG15IGlkb2xhdHJ5LAogICAgQW5kIEknbGwgYmVsaWV2ZSB0aGVlLgoKUk9NRU8KCiAgICBJZiBteSBoZWFydCdzIGRlYXIgbG92ZS0tCgpKVUxJRVQKCiAgICBXZWxsLCBkbyBub3Qgc3dlYXI6IGFsdGhvdWdoIEkgam95IGluIHRoZWUsCiAgICBJIGhhdmUgbm8gam95IG9mIHRoaXMgY29udHJhY3QgdG8tbmlnaHQ6CiAgICBJdCBpcyB0b28gcmFzaCwgdG9vIHVuYWR2aXNlZCwgdG9vIHN1ZGRlbjsKICAgIFRvbyBsaWtlIHRoZSBsaWdodG5pbmcsIHdoaWNoIGRvdGggY2Vhc2UgdG8gYmUKICAgIEVyZSBvbmUgY2FuIHNheSAnSXQgbGlnaHRlbnMuJyBTd2VldCwgZ29vZCBuaWdodCEKICAgIFRoaXMgYnVkIG9mIGxvdmUsIGJ5IHN1bW1lcidzIHJpcGVuaW5nIGJyZWF0aCwKICAgIE1heSBwcm92ZSBhIGJlYXV0ZW91cyBmbG93ZXIgd2hlbiBuZXh0IHdlIG1lZXQuCiAgICBHb29kIG5pZ2h0LCBnb29kIG5pZ2h0ISBhcyBzd2VldCByZXBvc2UgYW5kIHJlc3QKICAgIENvbWUgdG8gdGh5IGhlYXJ0IGFzIHRoYXQgd2l0aGluIG15IGJyZWFzdCEKClJPTUVPCgogICAgTywgd2lsdCB0aG91IGxlYXZlIG1lIHNvIHVuc2F0aXNmaWVkPwoKSlVMSUVUCgogICAgV2hhdCBzYXRpc2ZhY3Rpb24gY2Fuc3QgdGhvdSBoYXZlIHRvLW5pZ2h0PwoKUk9NRU8KCiAgICBUaGUgZXhjaGFuZ2Ugb2YgdGh5IGxvdmUncyBmYWl0aGZ1bCB2b3cgZm9yIG1pbmUuCgpKVUxJRVQKCiAgICBJIGdhdmUgdGhlZSBtaW5lIGJlZm9yZSB0aG91IGRpZHN0IHJlcXVlc3QgaXQ6CiAgICBBbmQgeWV0IEkgd291bGQgaXQgd2VyZSB0byBnaXZlIGFnYWluLgoKUk9NRU8KCiAgICBXb3VsZHN0IHRob3Ugd2l0aGRyYXcgaXQIGZvciB3aGF0IHB1cnBvc2UsIGxvdmUCgpKVUxJRVQKCiAgICBCdXQgdG8gYmUgZnJhbmssIGFuZCBnaXZlIGl0IHRoZWUgYWdhaW4uCiAgICBBbmQgeWV0IEkgd2lzaCBidXQgZm9yIHRoZSB0aGluZyBJIGhhdmU6CiAgICBNeSBib3VudHkgaXMgYXMgYm91bmRsZXNzIGFzIHRoZSBzZWEsCiAgICBNeSBsb3ZlIGFzIGRlZXA7IHRoZSBtb3JlIEkgZ2l2ZSB0byB0aGVlLAogICAgVGhlIG1vcmUgSSBoYXZlLCBmb3IgYm90aCBhcmUgaW5maW5pdGUuCgogICAgTnVyc2UgY2FsbHMgd2l0aGluCiAgICBJIGhlYXIgc29tZSBub2lzZSB3aXRoaW47IGRlYXIgbG92ZSwgYWRpZXUhCiAgICBBbm9uLCBnb29kIG51cnNlISBTd2VldCBNb250YWd1ZSwgYmUgdHJ1ZS4KICAgIFN0YXkgYnV0IGEgbGl0dGxlLCBJIHdpbGwgY29tZSBhZ2Fpbi4KCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBPIGJsZXNzZWQsIGJsZXNzZWQgbmlnaHQhIEkgYW0gYWZlYXJkLgogICAgQmVpbmcgaW4gbmlnaHQsIGFsbCB0aGlzIGlzIGJ1dCBhIGRyZWFtLAogICAgVG9vIGZsYXR0ZXJpbmctc3dlZXQgdG8gYmUgc3Vic3RhbnRpYWwuCgogICAgUmUtZW50ZXIgSlVMSUVULCBhYm92ZQoKSlVMSUVUCgogICAgVGhyZWUgd29yZHMsIGRlYXIgUm9tZW8sIGFuZCBnb29kIG5pZ2h0IGluZGVlZC4KICAgIElmIHRoYXQgdGh5IGJlbnQgb2YgbG92ZSBiZSBob25vdXJhYmxlLAogICAgVGh5IHB1cnBvc2UgbWFycmlhZ2UsIHNlbmQgbWUgd29yZCB0by1tb3Jyb3csCiAgICBCeSBvbmUgdGhhdCBJJ2xsIHByb2N1cmUgdG8gY29tZSB0byB0aGVlLAogICAgV2hlcmUgYW5kIHdoYXQgdGltZSB0aG91IHdpbHQgcGVyZm9ybSB0aGUgcml0ZTsKICAgIEFuZCBhbGwgbXkgZm9ydHVuZXMgYXQgdGh5IGZvb3QgSSdsbCBsYXkKICAgIEFuZCBmb2xsb3cgdGhlZSBteSBsb3JkIHRocm91Z2hvdXQgdGhlIHdvcmxkLgoKTnVyc2UKCiAgICBbV2l0aGluXSBNYWRhbSEKCkpVTElFVAoKICAgIEkgY29tZSwgYW5vbi4tLUJ1dCBpZiB0aG91IG1lYW4nc3Qgbm90IHdlbGwsCiAgICBJIGRvIGJlc2VlY2ggdGhlZS0tCgpOdXJzZQoKICAgIFtXaXRoaW5dIE1hZGFtIQoKSlVMSUVUCgogICAgQnkgYW5kIGJ5LCBJIGNvbWU6LS0KICAgIFRvIGNlYXNlIHRoeSBzdWl0LCBhbmQgbGVhdmUgbWUgdG8gbXkgZ3JpZWY6CiAgICBUby1tb3Jyb3cgd2lsbCBJIHNlbmQuCgpST01FTwoKICAgIFNvIHRocml2ZSBteSBzb3VsLS0KCkpVTElFVAoKICAgIEEgdGhvdXNhbmQgdGltZXMgZ29vZCBuaWdodCEKCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBBIHRob3VzYW5kIHRpbWVzIHRoZSB3b3JzZSwgdG8gd2FudCB0aHkgbGlnaHQuCiAgICBMb3ZlIGdvZXMgdG93YXJkIGxvdmUsIGFzIHNjaG9vbGJveXMgZnJvbQogICAgdGhlaXIgYm9va3MsCiAgICBCdXQgbG92ZSBmcm9tIGxvdmUsIHRvd2FyZCBzY2hvb2wgd2l0aCBoZWF2eSBsb29rcy4KCiAgICBSZXRpcmluZwoKICAgIFJlLWVudGVyIEpVTElFVCwgYWJvdmUKCkpVTElFVAoKICAgIEhpc3QhIFJvbWVvLCBoaXN0ISBPLCBmb3IgYSBmYWxjb25lcidzIHZvaWNlLAogICAgVG8gbHVyZSB0aGlzIHRhc3NlbC1nZW50bGUgYmFjayBhZ2FpbiEKICAgIEJvbmRhZ2UgaXMgaG9hcnNlLCBhbmQgbWF5IG5vdCBzcGVhayBhbG91ZDsKICAgIEVsc2Ugd291bGQgSSB0ZWFyIHRoZSBjYXZlIHdoZXJlIEVjaG8gbGllcywKICAgIEFuZCBtYWtlIGhlciBhaXJ5IHRvbmd1ZSBtb3JlIGhvYXJzZSB0aGFuIG1pbmUsCiAgICBXaXRoIHJlcGV0aXRpb24gb2YgbXkgUm9tZW8ncyBuYW1lLgoKUk9NRU8KCiAgICBJdCBpcyBteSBzb3VsIHRoYXQgY2FsbHMgdXBvbiBteSBuYW1lOgogICAgSG93IHNpbHZlci1zd2VldCBzb3VuZCBsb3ZlcnMnIHRvbmd1ZXMgYnkgbmlnaHQsCiAgICBMaWtlIHNvZnRlc3QgbXVzaWMgdG8gYXR0ZW5kaW5nIGVhcnMhCgpKVUxJRVQKCiAgICBSb21lbyEKClJPTUVPCgogICAgTXkgZGVhcj8KCkpVTElFVAoKICAgIEF0IHdoYXQgbydjbG9jayB0by1tb3Jyb3cKICAgIFNoYWxsIEkgc2VuZCB0byB0aGVlPwoKUk9NRU8KCiAgICBBdCB0aGUgaG91ciBvZiBuaW5lLgoKSlVMSUVUCgogICAgSSB3aWxsIG5vdCBmYWlsOiAndGlzIHR3ZW50eSB5ZWFycyB0aWxsIHRoZW4uCiAgICBJIGhhdmUgZm9yZ290IHdoeSBJIGRpZCBjYWxsIHRoZWUgYmFjay4KClJPTUVPCgogICAgTGV0IG1lIHN0YW5kIGhlcmUgdGlsbCB0aG91IHJlbWVtYmVyIGl0LgoKSlVMSUVUCgogICAgSSBzaGFsbCBmb3JnZXQsIHRvIGhhdmUgdGhlZSBzdGlsbCBzdGFuZCB0aGVyZSwKICAgIFJlbWVtYmVyaW5nIGhvdyBJIGxvdmUgdGh5IGNvbXBhbnkuCgpST01FTwoKICAgIEFuZCBJJ2xsIHN0aWxsIHN0YXksIHRvIGhhdmUgdGhlZSBzdGlsbCBmb3JnZXQsCiAgICBGb3JnZXR0aW5nIGFueSBvdGhlciBob21lIGJ1dCB0aGlzLgoKSlVMSUVUCgogICAgJ1RpcyBhbG1vc3QgbW9ybmluZzsgSSB3b3VsZCBoYXZlIHRoZWUgZ29uZToKICAgIEFuZCB5ZXQgbm8gZnVydGhlciB0aGFuIGEgd2FudG9uJ3MgYmlyZDsKICAgIFdobyBsZXRzIGl0IGhvcCBhIGxpdHRsZSBmcm9tIGhlciBoYW5kLAogICAgTGlrZSBhIHBvb3IgcHJpc29uZXIgaW4gaGlzIHR3aXN0ZWQgZ3l2ZXMsCiAgICBBbmQgd2l0aCBhIHNpbGsgdGhyZWFkIHBsdWNrcyBpdCBiYWNrIGFnYWluLAogICAgU28gbG92aW5nLWplYWxvdXMgb2YgaGlzIGxpYmVydHkuCgpST01FTwoKICAgIEkgd291bGQgSSB3ZXJlIHRoeSBiaXJkLgoKSlVMSUVUCgogICAgU3dlZXQsIHNvIHdvdWxkIEk6CiAgICBZZXQgSSBzaG91bGQga2lsbCB0aGVlIHdpdGggbXVjaCBjaGVyaXNoaW5nLgogICAgR29vZCBuaWdodCwgZ29vZCBuaWdodCEgcGFydGluZyBpcyBzdWNoCiAgICBzd2VldCBzb3Jyb3csCiAgICBUaGF0IEkgc2hhbGwgc2F5IGdvb2QgbmlnaHQgdGlsbCBpdCBiZSBtb3Jyb3cuCgogICAgRXhpdCBhYm92ZQoKUk9NRU8KCiAgICBTbGVlcCBkd2VsbCB1cG9uIHRoaW5lIGV5ZXMsIHBlYWNlIGluIHRoeSBicmVhc3QhCiAgICBXb3VsZCBJIHdlcmUgc2xlZXAgYW5kIHBlYWNlLCBzbyBzd2VldCB0byByZXN0IQogICAgSGVuY2Ugd2lsbCBJIHRvIG15IGdob3N0bHkgZmF0aGVyJ3MgY2VsbCwKICAgIEhpcyBoZWxwIHRvIGNyYXZlLCBhbmQgbXkgZGVhciBoYXAgdG8gdGVsbC4KCiAgICBFeGl0CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSwgd2l0aCBhIGJhc2tldCAKCkZSSUFSIExBVVJFTkNFCgogICAgVGhlIGdyZXktZXllZCBtb3JuIHNtaWxlcyBvbiB0aGUgZnJvd25pbmcgbmlnaHQsCiAgICBDaGVxdWVyaW5nIHRoZSBlYXN0ZXJuIGNsb3VkcyB3aXRoIHN0cmVha3Mgb2YgbGlnaHQsCiAgICBBbmQgZmxlY2tlZCBkYXJrbmVzcyBsaWtlIGEgZHJ1bmthcmQgcmVlbHMKICAgIEZyb20gZm9ydGggZGF5J3MgcGF0aCBhbmQgVGl0YW4ncyBmaWVyeSB3aGVlbHM6CiAgICBOb3csIGVyZSB0aGUgc3VuIGFkdmFuY2UgaGlzIGJ1cm5pbmcgZXllLAogICAgVGhlIGRheSB0byBjaGVlciBhbmQgbmlnaHQncyBkYW5rIGRldyB0byBkcnksCiAgICBJIG11c3QgdXAtZmlsbCB0aGlzIG9zaWVyIGNhZ2Ugb2Ygb3VycwogICAgV2l0aCBiYWxlZnVsIHdlZWRzIGFuZCBwcmVjaW91cy1qdWljZWQgZmxvd2Vycy4KICAgIFRoZSBlYXJ0aCB0aGF0J3MgbmF0dXJlJ3MgbW90aGVyIGlzIGhlciB0b21iOwogICAgV2hhdCBpcyBoZXIgYnVyeWluZyBncmF2ZSB0aGF0IGlzIGhlciB3b21iLAogICAgQW5kIGZyb20gaGVyIHdvbWIgY2hpbGRyZW4gb2YgZGl2ZXJzIGtpbmQKICAgIFdlIHN1Y2tpbmcgb24gaGVyIG5hdHVyYWwgYm9zb20gZmluZCwKICAgIE1hbnkgZm9yIG1hbnkgdmlydHVlcyBleGNlbGxlbnQsCiAgICBOb25lIGJ1dCBmb3Igc29tZSBhbmQgeWV0IGFsbCBkaWZmZXJlbnQuCiAgICBPLCBtaWNrbGUgaXMgdGhlIHBvd2VyZnVsIGdyYWNlIHRoYXQgbGllcwogICAgSW4gaGVyYnMsIHBsYW50cywgc3RvbmVzLCBhbmQgdGhlaXIgdHJ1ZSBxdWFsaXRpZXM6CiAgICBGb3Igbm91Z2h0IHNvIHZpbGUgdGhhdCBvbiB0aGUgZWFydGggZG90aCBsaXZlCiAgICBCdXQgdG8gdGhlIGVhcnRoIHNvbWUgc3BlY2lhbCBnb29kIGRvdGggZ2l2ZSwKICAgIE5vciBhdWdodCBzbyBnb29kIGJ1dCBzdHJhaW4nZCBmcm9tIHRoYXQgZmFpciB1c2UKICAgIFJldm9sdHMgZnJvbSB0cnVlIGJpcnRoLCBzdHVtYmxpbmcgb24gYWJ1c2U6CiAgICBWaXJ0dWUgaXRzZWxmIHR1cm5zIHZpY2UsIGJlaW5nIG1pc2FwcGxpZWQ7CiAgICBBbmQgdmljZSBzb21ldGltZXMgYnkgYWN0aW9uIGRpZ25pZmllZC4KICAgIFdpdGhpbiB0aGUgaW5mYW50IHJpbmQgb2YgdGhpcyBzbWFsbCBmbG93ZXIKICAgIFBvaXNvbiBoYXRoIHJlc2lkZW5jZSBhbmQgbWVkaWNpbmUgcG93ZXI6CiAgICBGb3IgdGhpcywgYmVpbmcgc21lbHQsIHdpdGggdGhhdCBwYXJ0IGNoZWVycyBlYWNoIHBhcnQ7CiAgICBCZWluZyB0YXN0ZWQsIHNsYXlzIGFsbCBzZW5zZXMgd2l0aCB0aGUgaGVhcnQuCiAgICBUd28gc3VjaCBvcHBvc2VkIGtpbmdzIGVuY2FtcCB0aGVtIHN0aWxsCiAgICBJbiBtYW4gYXMgd2VsbCBhcyBoZXJicywgZ3JhY2UgYW5kIHJ1ZGUgd2lsbDsKICAgIEFuZCB3aGVyZSB0aGUgd29yc2VyIGlzIHByZWRvbWluYW50LAogICAgRnVsbCBzb29uIHRoZSBjYW5rZXIgZGVhdGggZWF0cyB1cCB0aGF0IHBsYW50LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEdvb2QgbW9ycm93LCBmYXRoZXIuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlbmVkaWNpdGUhCiAgICBXaGF0IGVhcmx5IHRvbmd1ZSBzbyBzd2VldCBzYWx1dGV0aCBtZT8KICAgIFlvdW5nIHNvbiwgaXQgYXJndWVzIGEgZGlzdGVtcGVyJ2QgaGVhZAogICAgU28gc29vbiB0byBiaWQgZ29vZCBtb3Jyb3cgdG8gdGh5IGJlZDoKICAgIENhcmUga2VlcHMgaGlzIHdhdGNoIGluIGV2ZXJ5IG9sZCBtYW4ncyBleWUsCiAgICBBbmQgd2hlcmUgY2FyZSBsb2RnZXMsIHNsZWVwIHdpbGwgbmV2ZXIgbGllOwogICAgQnV0IHdoZXJlIHVuYnJ1aXNlZCB5b3V0aCB3aXRoIHVuc3R1ZmYnZCBicmFpbgogICAgRG90aCBjb3VjaCBoaXMgbGltYnMsIHRoZXJlIGdvbGRlbiBzbGVlcCBkb3RoIHJlaWduOgogICAgVGhlcmVmb3JlIHRoeSBlYXJsaW5lc3MgZG90aCBtZSBhc3N1cmUKICAgIFRob3UgYXJ0IHVwLXJvdXNlZCBieSBzb21lIGRpc3RlbXBlcmF0dXJlOwogICAgT3IgaWYgbm90IHNvLCB0aGVuIGhlcmUgSSBoaXQgaXQgcmlnaHQsCiAgICBPdXIgUm9tZW8gaGF0aCBub3QgYmVlbiBpbiBiZWQgdG8tbmlnaHQuCgpST01FTwoKICAgIFRoYXQgbGFzdCBpcyB0cnVlOyB0aGUgc3dlZXRlciByZXN0IHdhcyBtaW5lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHb2QgcGFyZG9uIHNpbiEgd2FzdCB0aG91IHdpdGggUm9zYWxpbmUCgpST01FTwoKICAgIFdpdGggUm9zYWxpbmUsIG15IGdob3N0bHkgZmF0aGVyPyBubzsKICAgIEkgaGF2ZSBmb3Jnb3QgdGhhdCBuYW1lLCBhbmQgdGhhdCBuYW1lJ3Mgd29lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGF0J3MgbXkgZ29vZCBzb246IGJ1dCB3aGVyZSBoYXN0IHRob3UgYmVlbiwgdGhlbj8KClJPTUVPCgogICAgSSdsbCB0ZWxsIHRoZWUsIGVyZSB0aG91IGFzayBpdCBtZSBhZ2Fpbi4KICAgIEkgaGF2ZSBiZWVuIGZlYXN0aW5nIHdpdGggbWluZSBlbmVteSwKICAgIFdoZXJlIG9uIGEgc3VkZGVuIG9uZSBoYXRoIHdvdW5kZWQgbWUsCiAgICBUaGF0J3MgYnkgbWUgd291bmRlZDogYm90aCBvdXIgcmVtZWRpZXMKICAgIFdpdGhpbiB0aHkgaGVscCBhbmQgaG9seSBwaHlzaWMgbGllczoKICAgIEkgYmVhciBubyBoYXRyZWQsIGJsZXNzZWQgbWFuLCBmb3IsIGxvLAogICAgTXkgaW50ZXJjZXNzaW9uIGxpa2V3aXNlIHN0ZWFkcyBteSBmb2UuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlIHBsYWluLCBnb29kIHNvbiwgYW5kIGhvbWVseSBpbiB0aHkgZHJpZnQ7CiAgICBSaWRkbGluZyBjb25mZXNzaW9uIGZpbmRzIGJ1dCByaWRkbGluZyBzaHJpZnQuCgpST01FTwoKICAgIFRoZW4gcGxhaW5seSBrbm93IG15IGhlYXJ0J3MgZGVhciBsb3ZlIGlzIHNldAogICAgT24gdGhlIGZhaXIgZGF1Z2h0ZXIgb2YgcmljaCBDYXB1bGV0OgogICAgQXMgbWluZSBvbiBoZXJzLCBzbyBoZXJzIGlzIHNldCBvbiBtaW5lOwogICAgQW5kIGFsbCBjb21iaW5lZCwgc2F2ZSB3aGF0IHRob3UgbXVzdCBjb21iaW5lCiAgICBCeSBob2x5IG1hcnJpYWdlOiB3aGVuIGFuZCB3aGVyZSBhbmQgaG93CiAgICBXZSBtZXQsIHdlIHdvbydkIGFuZCBtYWRlIGV4Y2hhbmdlIG9mIHZvdywKICAgIEknbGwgdGVsbCB0aGVlIGFzIHdlIHBhc3M7IGJ1dCB0aGlzIEkgcHJheSwKICAgIFRoYXQgdGhvdSBjb25zZW50IHRvIG1hcnJ5IHVzIHRvLWRheS4KCkZSSUFSIExBVVJFTkNFCgogICAgSG9seSBTYWludCBGcmFuY2lzLCB3aGF0IGEgY2hhbmdlIGlzIGhlcmUhCiAgICBJcyBSb3NhbGluZSwgd2hvbSB0aG91IGRpZHN0IGxvdmUgc28gZGVhciwKICAgIFNvIHNvb24gZm9yc2FrZW4IHlvdW5nIG1lbidzIGxvdmUgdGhlbiBsaWVzCiAgICBOb3QgdHJ1bHkgaW4gdGhlaXIgaGVhcnRzLCBidXQgaW4gdGhlaXIgZXllcy4KICAgIEplc3UgTWFyaWEsIHdoYXQgYSBkZWFsIG9mIGJyaW5lCiAgICBIYXRoIHdhc2gnZCB0aHkgc2FsbG93IGNoZWVrcyBmb3IgUm9zYWxpbmUhCiAgICBIb3cgbXVjaCBzYWx0IHdhdGVyIHRocm93biBhd2F5IGluIHdhc3RlLAogICAgVG8gc2Vhc29uIGxvdmUsIHRoYXQgb2YgaXQgZG90aCBub3QgdGFzdGUhCiAgICBUaGUgc3VuIG5vdCB5ZXQgdGh5IHNpZ2hzIGZyb20gaGVhdmVuIGNsZWFycywKICAgIFRoeSBvbGQgZ3JvYW5zIHJpbmcgeWV0IGluIG15IGFuY2llbnQgZWFyczsKICAgIExvLCBoZXJlIHVwb24gdGh5IGNoZWVrIHRoZSBzdGFpbiBkb3RoIHNpdAogICAgT2YgYW4gb2xkIHRlYXIgdGhhdCBpcyBub3Qgd2FzaCdkIG9mZiB5ZXQ6CiAgICBJZiBlJ2VyIHRob3Ugd2FzdCB0aHlzZWxmIGFuZCB0aGVzZSB3b2VzIHRoaW5lLAogICAgVGhvdSBhbmQgdGhlc2Ugd29lcyB3ZXJlIGFsbCBmb3IgUm9zYWxpbmU6CiAgICBBbmQgYXJ0IHRob3UgY2hhbmdlZD8gcHJvbm91bmNlIHRoaXMgc2VudGVuY2UgdGhlbiwKICAgIFdvbWVuIG1heSBmYWxsLCB3aGVuIHRoZXJlJ3Mgbm8gc3RyZW5ndGggaW4gbWVuLgoKUk9NRU8KCiAgICBUaG91IGNoaWQnc3QgbWUgb2Z0IGZvciBsb3ZpbmcgUm9zYWxpbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIEZvciBkb3RpbmcsIG5vdCBmb3IgbG92aW5nLCBwdXBpbCBtaW5lLgoKUk9NRU8KCiAgICBBbmQgYmFkJ3N0IG1lIGJ1cnkgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTm90IGluIGEgZ3JhdmUsCiAgICBUbyBsYXkgb25lIGluLCBhbm90aGVyIG91dCB0byBoYXZlLgoKUk9NRU8KCiAgICBJIHByYXkgdGhlZSwgY2hpZGUgbm90OyBzaGUgd2hvbSBJIGxvdmUgbm93CiAgICBEb3RoIGdyYWNlIGZvciBncmFjZSBhbmQgbG92ZSBmb3IgbG92ZSBhbGxvdzsKICAgIFRoZSBvdGhlciBkaWQgbm90IHNvLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBPLCBzaGUga25ldyB3ZWxsCiAgICBUaHkgbG92ZSBkaWQgcmVhZCBieSByb3RlIGFuZCBjb3VsZCBub3Qgc3BlbGwuCiAgICBCdXQgY29tZSwgeW91bmcgd2F2ZXJlciwgY29tZSwgZ28gd2l0aCBtZSwKICAgIEluIG9uZSByZXNwZWN0IEknbGwgdGh5IGFzc2lzdGFudCBiZTsKICAgIEZvciB0aGlzIGFsbGlhbmNlIG1heSBzbyBoYXBweSBwcm92ZSwKICAgIFRvIHR1cm4geW91ciBob3VzZWhvbGRzJyByYW5jb3VyIHRvIHB1cmUgbG92ZS4KClJPTUVPCgogICAgTywgbGV0IHVzIGhlbmNlOyBJIHN0YW5kIG9uIHN1ZGRlbiBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2lzZWx5IGFuZCBzbG93OyB0aGV5IHN0dW1ibGUgdGhhdCBydW4gZmFzdC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBCRU5WT0xJTyBhbmQgTUVSQ1VUSU8gCgpNRVJDVVRJTwoKICAgIFdoZXJlIHRoZSBkZXZpbCBzaG91bGQgdGhpcyBSb21lbyBiZT8KICAgIENhbWUgaGUgbm90IGhvbWUgdG8tbmlnaHQCgpCRU5WT0xJTwoKICAgIE5vdCB0byBoaXMgZmF0aGVyJ3M7IEkgc3Bva2Ugd2l0aCBoaXMgbWFuLgoKTUVSQ1VUSU8KCiAgICBBaCwgdGhhdCBzYW1lIHBhbGUgaGFyZC1oZWFydGVkIHdlbmNoLCB0aGF0IFJvc2FsaW5lLgogICAgVG9ybWVudHMgaGltIHNvLCB0aGF0IGhlIHdpbGwgc3VyZSBydW4gbWFkLgoKQkVOVk9MSU8KCiAgICBUeWJhbHQsIHRoZSBraW5zbWFuIG9mIG9sZCBDYXB1bGV0LAogICAgSGF0aCBzZW50IGEgbGV0dGVyIHRvIGhpcyBmYXRoZXIncyBob3VzZS4KCk1FUkNVVElPCgogICAgQSBjaGFsbGVuZ2UsIG9uIG15IGxpZmUuCgpCRU5WT0xJTwoKICAgIFJvbWVvIHdpbGwgYW5zd2VyIGl0LgoKTUVSQ1VUSU8KCiAgICBBbnkgbWFuIHRoYXQgY2FuIHdyaXRlIG1heSBhbnN3ZXIgYSBsZXR0ZXIuCgpCRU5WT0xJTwoKICAgIE5heSwgaGUgd2lsbCBhbnN3ZXIgdGhlIGxldHRlcidzIG1hc3RlciwgaG93IGhlCiAgICBkYXJlcywgYmVpbmcgZGFyZWQuCgpNRVJDVVRJTwoKICAgIEFsYXMgcG9vciBSb21lbyEgaGUgaXMgYWxyZWFkeSBkZWFkOyBzdGFiYmVkIHdpdGggYQogICAgd2hpdGUgd2VuY2gncyBibGFjayBleWU7IHNob3QgdGhyb3VnaCB0aGUgZWFyIHdpdGggYQogICAgbG92ZS1zb25nOyB0aGUgdmVyeSBwaW4gb2YgaGlzIGhlYXJ0IGNsZWZ0IHdpdGggdGhlCiAgICBibGluZCBib3ctYm95J3MgYnV0dC1zaGFmdDogYW5kIGlzIGhlIGEgbWFuIHRvCiAgICBlbmNvdW50ZXIgVHliYWx0PwoKQkVOVk9MSU8KCiAgICBXaHksIHdoYXQgaXMgVHliYWx0PwoKTUVSQ1VUSU8KCiAgICBNb3JlIHRoYW4gcHJpbmNlIG9mIGNhdHMsIEkgY2FuIHRlbGwgeW91LiBPLCBoZSBpcwogICAgdGhlIGNvdXJhZ2VvdXMgY2FwdGFpbiBvZiBjb21wbGltZW50cy4gSGUgZmlnaHRzIGFzCiAgICB5b3Ugc2luZyBwcmljay1zb25nLCBrZWVwcyB0aW1lLCBkaXN0YW5jZSwgYW5kCiAgICBwcm9wb3J0aW9uOyByZXN0cyBtZSBoaXMgbWluaW0gcmVzdCwgb25lLCB0d28sIGFuZAogICAgdGhlIHRoaXJkIGluIHlvdXIgYm9zb206IHRoZSB2ZXJ5IGJ1dGNoZXIgb2YgYSBzaWxrCiAgICBidXR0b24sIGEgZHVlbGxpc3QsIGEgZHVlbGxpc3Q7IGEgZ2VudGxlbWFuIG9mIHRoZQogICAgdmVyeSBmaXJzdCBob3VzZSwgb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2F1c2U6CiAgICBhaCwgdGhlIGltbW9ydGFsIHBhc3NhZG8hIHRoZSBwdW50byByZXZlcnNvISB0aGUKICAgIGhhaSEKCkJFTlZPTElPCgogICAgVGhlIHdoYXQCgpNRVJDVVRJTwoKICAgIFRoZSBwb3ggb2Ygc3VjaCBhbnRpYywgbGlzcGluZywgYWZmZWN0aW5nCiAgICBmYW50YXN0aWNvZXM7IHRoZXNlIG5ldyB0dW5lcnMgb2YgYWNjZW50cyEgJ0J5IEplc3UsCiAgICBhIHZlcnkgZ29vZCBibGFkZSEgYSB2ZXJ5IHRhbGwgbWFuISBhIHZlcnkgZ29vZAogICAgd2hvcmUhJyBXaHksIGlzIG5vdCB0aGlzIGEgbGFtZW50YWJsZSB0aGluZywKICAgIGdyYW5kc2lyZSwgdGhhdCB3ZSBzaG91bGQgYmUgdGh1cyBhZmZsaWN0ZWQgd2l0aAogICAgdGhlc2Ugc3RyYW5nZSBmbGllcywgdGhlc2UgZmFzaGlvbi1tb25nZXJzLCB0aGVzZQogICAgcGVyZG9uYS1taSdzLCB3aG8gc3RhbmQgc28gbXVjaCBvbiB0aGUgbmV3IGZvcm0sCiAgICB0aGF0IHRoZXkgY2Fubm90IGF0IGVhc2Ugb24gdGhlIG9sZCBiZW5jaD8gTywgdGhlaXIKICAgIGJvbmVzLCB0aGVpciBib25lcyEKCiAgICBFbnRlciBST01FTwoKQkVOVk9MSU8KCiAgICBIZXJlIGNvbWVzIFJvbWVvLCBoZXJlIGNvbWVzIFJvbWVvLgoKTUVSQ1VUSU8KCiAgICBXaXRob3V0IGhpcyByb2UsIGxpa2UgYSBkcmllZCBoZXJyaW5nOiBmbGVzaCwgZmxlc2gsCiAgICBob3cgYXJ0IHRob3UgZmlzaGlmaWVkISBOb3cgaXMgaGUgZm9yIHRoZSBudW1iZXJzCiAgICB0aGF0IFBldHJhcmNoIGZsb3dlZCBpbjogTGF1cmEgdG8gaGlzIGxhZHkgd2FzIGJ1dCBhCiAgICBraXRjaGVuLXdlbmNoOyBtYXJyeSwgc2hlIGhhZCBhIGJldHRlciBsb3ZlIHRvCiAgICBiZS1yaHltZSBoZXI7IERpZG8gYSBkb3dkeTsgQ2xlb3BhdHJhIGEgZ2lwc3k7CiAgICBIZWxlbiBhbmQgSGVybyBoaWxkaW5ncyBhbmQgaGFybG90czsgVGhpc2JlIGEgZ3JleQogICAgZXllIG9yIHNvLCBidXQgbm90IHRvIHRoZSBwdXJwb3NlLiBTaWduaW9yCiAgICBSb21lbywgYm9uIGpvdXIhIHRoZXJlJ3MgYSBGcmVuY2ggc2FsdXRhdGlvbgogICAgdG8geW91ciBGcmVuY2ggc2xvcC4gWW91IGdhdmUgdXMgdGhlIGNvdW50ZXJmZWl0CiAgICBmYWlybHkgbGFzdCBuaWdodC4KClJPTUVPCgogICAgR29vZCBtb3Jyb3cgdG8geW91IGJvdGguIFdoYXQgY291bnRlcmZlaXQgZGlkIEkgZ2l2ZSB5b3UCgpNRVJDVVRJTwoKICAgIFRoZSBzaGlwLCBzaXIsIHRoZSBzbGlwOyBjYW4geW91IG5vdCBjb25jZWl2ZT8KClJPTUVPCgogICAgUGFyZG9uLCBnb29kIE1lcmN1dGlvLCBteSBidXNpbmVzcyB3YXMgZ3JlYXQ7IGFuZCBpbgogICAgc3VjaCBhIGNhc2UgYXMgbWluZSBhIG1hbiBtYXkgc3RyYWluIGNvdXJ0ZXN5LgoKTUVSQ1VUSU8KCiAgICBUaGF0J3MgYXMgbXVjaCBhcyB0byBzYXksIHN1Y2ggYSBjYXNlIGFzIHlvdXJzCiAgICBjb25zdHJhaW5zIGEgbWFuIHRvIGJvdyBpbiB0aGUgaGFtcy4KClJPTUVPCgogICAgTWVhbmluZywgdG8gY291cnQnc3kuCgpNRVJDVVRJTwoKICAgIFRob3UgaGFzdCBtb3N0IGtpbmRseSBoaXQgaXQuCgpST01FTwoKICAgIEEgbW9zdCBjb3VydGVvdXMgZXhwb3NpdGlvbi4KCk1FUkNVVElPCgogICAgTmF5LCBJIGFtIHRoZSB2ZXJ5IHBpbmsgb2YgY291cnRlc3kuCgpST01FTwoKICAgIFBpbmsgZm9yIGZsb3dlci4KCk1FUkNVVElPCgogICAgUmlnaHQuCgpST01FTwoKICAgIFdoeSwgdGhlbiBpcyBteSBwdW1wIHdlbGwgZmxvd2VyZWQuCgpNRVJDVVRJTwoKICAgIFdlbGwgc2FpZDogZm9sbG93IG1lIHRoaXMgamVzdCBub3cgdGlsbCB0aG91IGhhc3QKICAgIHdvcm4gb3V0IHRoeSBwdW1wLCB0aGF0IHdoZW4gdGhlIHNpbmdsZSBzb2xlIG9mIGl0CiAgICBpcyB3b3JuLCB0aGUgamVzdCBtYXkgcmVtYWluIGFmdGVyIHRoZSB3ZWFyaW5nIHNvbGUgc2luZ3VsYXIuCgpST01FTwoKICAgIE8gc2luZ2xlLXNvbGVkIGplc3QsIHNvbGVseSBzaW5ndWxhciBmb3IgdGhlCiAgICBzaW5nbGVuZXNzLgoKTUVSQ1VUSU8KCiAgICBDb21lIGJldHdlZW4gdXMsIGdvb2QgQmVudm9saW87IG15IHdpdHMgZmFpbnQuCgpST01FTwoKICAgIFN3aXRjaCBhbmQgc3B1cnMsIHN3aXRjaCBhbmQgc3B1cnM7IG9yIEknbGwgY3J5IGEgbWF0Y2guCgpNRVJDVVRJTwoKICAgIE5heSwgaWYgdGh5IHdpdHMgcnVuIHRoZSB3aWxkLWdvb3NlIGNoYXNlLCBJIGhhdmUKICAgIGRvbmUsIGZvciB0aG91IGhhc3QgbW9yZSBvZiB0aGUgd2lsZC1nb29zZSBpbiBvbmUgb2YKICAgIHRoeSB3aXRzIHRoYW4sIEkgYW0gc3VyZSwgSSBoYXZlIGluIG15IHdob2xlIGZpdmU6CiAgICB3YXMgSSB3aXRoIHlvdSB0aGVyZSBmb3IgdGhlIGdvb3NlPwoKUk9NRU8KCiAgICBUaG91IHdhc3QgbmV2ZXIgd2l0aCBtZSBmb3IgYW55IHRoaW5nIHdoZW4gdGhvdSB3YXN0CiAgICBub3QgdGhlcmUgZm9yIHRoZSBnb29zZS4KCk1FUkNVVElPCgogICAgSSB3aWxsIGJpdGUgdGhlZSBieSB0aGUgZWFyIGZvciB0aGF0IGplc3QuCgpST01FTwoKICAgIE5heSwgZ29vZCBnb29zZSwgYml0ZSBub3QuCgpNRVJDVVRJTwoKICAgIFRoeSB3aXQgaXMgYSB2ZXJ5IGJpdHRlciBzd2VldGluZzsgaXQgaXMgYSBtb3N0CiAgICBzaGFycCBzYXVjZS4KClJPTUVPCgogICAgQW5kIGlzIGl0IG5vdCB3ZWxsIHNlcnZlZCBpbiB0byBhIHN3ZWV0IGdvb3NlPwoKTUVSQ1VUSU8KCiAgICBPIGhlcmUncyBhIHdpdCBvZiBjaGV2ZXJpbCwgdGhhdCBzdHJldGNoZXMgZnJvbSBhbgogICAgaW5jaCBuYXJyb3cgdG8gYW4gZWxsIGJyb2FkIQoKUk9NRU8KCiAgICBJIHN0cmV0Y2ggaXQgb3V0IGZvciB0aGF0IHdvcmQgJ2Jyb2FkOycgd2hpY2ggYWRkZWQKICAgIHRvIHRoZSBnb29zZSwgcHJvdmVzIHRoZWUgZmFyIGFuZCB3aWRlIGEgYnJvYWQgZ29vc2UuCgpNRVJDVVRJTwoKICAgIFdoeSwgaXMgbm90IHRoaXMgYmV0dGVyIG5vdyB0aGFuIGdyb2FuaW5nIGZvciBsb3ZlPwogICAgbm93IGFydCB0aG91IHNvY2lhYmxlLCBub3cgYXJ0IHRob3UgUm9tZW87IG5vdyBhcnQKICAgIHRob3Ugd2hhdCB0aG91IGFydCwgYnkgYXJ0IGFzIHdlbGwgYXMgYnkgbmF0dXJlOgogICAgZm9yIHRoaXMgZHJpdmVsbGluZyBsb3ZlIGlzIGxpa2UgYSBncmVhdCBuYXR1cmFsLAogICAgdGhhdCBydW5zIGxvbGxpbmcgdXAgYW5kIGRvd24gdG8gaGlkZSBoaXMgYmF1YmxlIGluIGEgaG9sZS4KCkJFTlZPTElPCgogICAgU3RvcCB0aGVyZSwgc3RvcCB0aGVyZS4KCk1FUkNVVElPCgogICAgVGhvdSBkZXNpcmVzdCBtZSB0byBzdG9wIGluIG15IHRhbGUgYWdhaW5zdCB0aGUgaGFpci4KCkJFTlZPTElPCgogICAgVGhvdSB3b3VsZHN0IGVsc2UgaGF2ZSBtYWRlIHRoeSB0YWxlIGxhcmdlLgoKTUVSQ1VUSU8KCiAgICBPLCB0aG91IGFydCBkZWNlaXZlZDsgSSB3b3VsZCBoYXZlIG1hZGUgaXQgc2hvcnQ6CiAgICBmb3IgSSB3YXMgY29tZSB0byB0aGUgd2hvbGUgZGVwdGggb2YgbXkgdGFsZTsgYW5kCiAgICBtZWFudCwgaW5kZWVkLCB0byBvY2N1cHkgdGhlIGFyZ3VtZW50IG5vIGxvbmdlci4KClJPTUVPCgogICAgSGVyZSdzIGdvb2RseSBnZWFyIQoKICAgIEVudGVyIE51cnNlIGFuZCBQRVRFUgoKTUVSQ1VUSU8KCiAgICBBIHNhaWwsIGEgc2FpbCEKCkJFTlZPTElPCgogICAgVHdvLCB0d287IGEgc2hpcnQgYW5kIGEgc21vY2suCgpOdXJzZQoKICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBNeSBmYW4sIFBldGVyLgoKTUVSQ1VUSU8KCiAgICBHb29kIFBldGVyLCB0byBoaWRlIGhlciBmYWNlOyBmb3IgaGVyIGZhbidzIHRoZQogICAgZmFpcmVyIGZhY2UuCgpOdXJzZQoKICAgIEdvZCB5ZSBnb29kIG1vcnJvdywgZ2VudGxlbWVuLgoKTUVSQ1VUSU8KCiAgICBHb2QgeWUgZ29vZCBkZW4sIGZhaXIgZ2VudGxld29tYW4uCgpOdXJzZQoKICAgIElzIGl0IGdvb2QgZGVuPwoKTUVSQ1VUSU8KCiAgICAnVGlzIG5vIGxlc3MsIEkgdGVsbCB5b3UsIGZvciB0aGUgYmF3ZHkgaGFuZCBvZiB0aGUKICAgIGRpYWwgaXMgbm93IHVwb24gdGhlIHByaWNrIG9mIG5vb24uCgpOdXJzZQoKICAgIE91dCB1cG9uIHlvdSEgd2hhdCBhIG1hbiBhcmUgeW91IQoKUk9NRU8KCiAgICBPbmUsIGdlbnRsZXdvbWFuLCB0aGF0IEdvZCBoYXRoIG1hZGUgZm9yIGhpbXNlbGYgdG8KICAgIG1hci4KCk51cnNlCgogICAgQnkgbXkgdHJvdGgsIGl0IGlzIHdlbGwgc2FpZDsgJ2ZvciBoaW1zZWxmIHRvIG1hciwnCiAgICBxdW90aCBhJz8gR2VudGxlbWVuLCBjYW4gYW55IG9mIHlvdSB0ZWxsIG1lIHdoZXJlIEkKICAgIG1heSBmaW5kIHRoZSB5b3VuZyBSb21lbz8KClJPTUVPCgogICAgSSBjYW4gdGVsbCB5b3U7IGJ1dCB5b3VuZyBSb21lbyB3aWxsIGJlIG9sZGVyIHdoZW4KICAgIHlvdSBoYXZlIGZvdW5kIGhpbSB0aGFuIGhlIHdhcyB3aGVuIHlvdSBzb3VnaHQgaGltOgogICAgSSBhbSB0aGUgeW91bmdlc3Qgb2YgdGhhdCBuYW1lLCBmb3IgZmF1bHQgb2YgYSB3b3JzZS4KCk51cnNlCgogICAgWW91IHNheSB3ZWxsLgoKTUVSQ1VUSU8KCiAgICBZZWEsIGlzIHRoZSB3b3JzdCB3ZWxsPyB2ZXJ5IHdlbGwgdG9vaywgaScgZmFpdGg7CiAgICB3aXNlbHksIHdpc2VseS4KCk51cnNlCgogICAgaWYgeW91IGJlIGhlLCBzaXIsIEkgZGVzaXJlIHNvbWUgY29uZmlkZW5jZSB3aXRoCiAgICB5b3UuCgpCRU5WT0xJTwoKICAgIFNoZSB3aWxsIGluZGl0ZSBoaW0gdG8gc29tZSBzdXBwZXIuCgpNRVJDVVRJTwoKICAgIEEgYmF3ZCwgYSBiYXdkLCBhIGJhd2QhIHNvIGhvIQoKUk9NRU8KCiAgICBXaGF0IGhhc3QgdGhvdSBmb3VuZD8KCk1FUkNVVElPCgogICAgTm8gaGFyZSwgc2lyOyB1bmxlc3MgYSBoYXJlLCBzaXIsIGluIGEgbGVudGVuIHBpZSwKICAgIHRoYXQgaXMgc29tZXRoaW5nIHN0YWxlIGFuZCBob2FyIGVyZSBpdCBiZSBzcGVudC4KCiAgICBTaW5ncwogICAgQW4gb2xkIGhhcmUgaG9hciwKICAgIEFuZCBhbiBvbGQgaGFyZSBob2FyLAogICAgSXMgdmVyeSBnb29kIG1lYXQgaW4gbGVudAogICAgQnV0IGEgaGFyZSB0aGF0IGlzIGhvYXIKICAgIElzIHRvbyBtdWNoIGZvciBhIHNjb3JlLAogICAgV2hlbiBpdCBob2FycyBlcmUgaXQgYmUgc3BlbnQuCiAgICBSb21lbywgd2lsbCB5b3UgY29tZSB0byB5b3VyIGZhdGhlcidzPyB3ZSdsbAogICAgdG8gZGlubmVyLCB0aGl0aGVyLgoKUk9NRU8KCiAgICBJIHdpbGwgZm9sbG93IHlvdS4KCk1FUkNVVElPCgogICAgRmFyZXdlbGwsIGFuY2llbnQgbGFkeTsgZmFyZXdlbGwsCgogICAgU2luZ2luZwogICAgJ2xhZHksIGxhZHksIGxhZHkuJwoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KCk51cnNlCgogICAgTWFycnksIGZhcmV3ZWxsISBJIHByYXkgeW91LCBzaXIsIHdoYXQgc2F1Y3kKICAgIG1lcmNoYW50IHdhcyB0aGlzLCB0aGF0IHdhcyBzbyBmdWxsIG9mIGhpcyByb3BlcnkCgpST01FTwoKICAgIEEgZ2VudGxlbWFuLCBudXJzZSwgdGhhdCBsb3ZlcyB0byBoZWFyIGhpbXNlbGYgdGFsaywKICAgIGFuZCB3aWxsIHNwZWFrIG1vcmUgaW4gYSBtaW51dGUgdGhhbiBoZSB3aWxsIHN0YW5kCiAgICB0byBpbiBhIG1vbnRoLgoKTnVyc2UKCiAgICBBbiBhJyBzcGVhayBhbnkgdGhpbmcgYWdhaW5zdCBtZSwgSSdsbCB0YWtlIGhpbQogICAgZG93biwgYW4gYScgd2VyZSBsdXN0aWVyIHRoYW4gaGUgaXMsIGFuZCB0d2VudHkgc3VjaAogICAgSmFja3M7IGFuZCBpZiBJIGNhbm5vdCwgSSdsbCBmaW5kIHRob3NlIHRoYXQgc2hhbGwuCiAgICBTY3Vydnkga25hdmUhIEkgYW0gbm9uZSBvZiBoaXMgZmxpcnQtZ2lsbHM7IEkgYW0KICAgIG5vbmUgb2YgaGlzIHNrYWlucy1tYXRlcy4gQW5kIHRob3UgbXVzdCBzdGFuZCBieQogICAgdG9vLCBhbmQgc3VmZmVyIGV2ZXJ5IGtuYXZlIHRvIHVzZSBtZSBhdCBoaXMgcGxlYXN1cmUCgpQRVRFUgoKICAgIEkgc2F3IG5vIG1hbiB1c2UgeW91IGEgcGxlYXN1cmU7IGlmIEkgaGFkLCBteSB3ZWFwb24KICAgIHNob3VsZCBxdWlja2x5IGhhdmUgYmVlbiBvdXQsIEkgd2FycmFudCB5b3U6IEkgZGFyZQogICAgZHJhdyBhcyBzb29uIGFzIGFub3RoZXIgbWFuLCBpZiBJIHNlZSBvY2Nhc2lvbiBpbiBhCiAgICBnb29kIHF1YXJyZWwsIGFuZCB0aGUgbGF3IG9uIG15IHNpZGUuCgpOdXJzZQoKICAgIE5vdywgYWZvcmUgR29kLCBJIGFtIHNvIHZleGVkLCB0aGF0IGV2ZXJ5IHBhcnQgYWJvdXQKICAgIG1lIHF1aXZlcnMuIFNjdXJ2eSBrbmF2ZSEgUHJheSB5b3UsIHNpciwgYSB3b3JkOgogICAgYW5kIGFzIEkgdG9sZCB5b3UsIG15IHlvdW5nIGxhZHkgYmFkZSBtZSBpbnF1aXJlIHlvdQogICAgb3V0OyB3aGF0IHNoZSBiYWRlIG1lIHNheSwgSSB3aWxsIGtlZXAgdG8gbXlzZWxmOgogICAgYnV0IGZpcnN0IGxldCBtZSB0ZWxsIHllLCBpZiB5ZSBzaG91bGQgbGVhZCBoZXIgaW50bwogICAgYSBmb29sJ3MgcGFyYWRpc2UsIGFzIHRoZXkgc2F5LCBpdCB3ZXJlIGEgdmVyeSBncm9zcwogICAga2luZCBvZiBiZWhhdmlvciwgYXMgdGhleSBzYXk6IGZvciB0aGUgZ2VudGxld29tYW4KICAgIGlzIHlvdW5nOyBhbmQsIHRoZXJlZm9yZSwgaWYgeW91IHNob3VsZCBkZWFsIGRvdWJsZQogICAgd2l0aCBoZXIsIHRydWx5IGl0IHdlcmUgYW4gaWxsIHRoaW5nIHRvIGJlIG9mZmVyZWQKICAgIHRvIGFueSBnZW50bGV3b21hbiwgYW5kIHZlcnkgd2VhayBkZWFsaW5nLgoKUk9NRU8KCiAgICBOdXJzZSwgY29tbWVuZCBtZSB0byB0aHkgbGFkeSBhbmQgbWlzdHJlc3MuIEkKICAgIHByb3Rlc3QgdW50byB0aGVlLS0KCk51cnNlCgogICAgR29vZCBoZWFydCwgYW5kLCBpJyBmYWl0aCwgSSB3aWxsIHRlbGwgaGVyIGFzIG11Y2g6CiAgICBMb3JkLCBMb3JkLCBzaGUgd2lsbCBiZSBhIGpveWZ1bCB3b21hbi4KClJPTUVPCgogICAgV2hhdCB3aWx0IHRob3UgdGVsbCBoZXIsIG51cnNlPyB0aG91IGRvc3Qgbm90IG1hcmsgbWUuCgpOdXJzZQoKICAgIEkgd2lsbCB0ZWxsIGhlciwgc2lyLCB0aGF0IHlvdSBkbyBwcm90ZXN0OyB3aGljaCwgYXMKICAgIEkgdGFrZSBpdCwgaXMgYSBnZW50bGVtYW5saWtlIG9mZmVyLgoKUk9NRU8KCiAgICBCaWQgaGVyIGRldmlzZQogICAgU29tZSBtZWFucyB0byBjb21lIHRvIHNocmlmdCB0aGlzIGFmdGVybm9vbjsKICAgIEFuZCB0aGVyZSBzaGUgc2hhbGwgYXQgRnJpYXIgTGF1cmVuY2UnIGNlbGwKICAgIEJlIHNocml2ZWQgYW5kIG1hcnJpZWQuIEhlcmUgaXMgZm9yIHRoeSBwYWlucy4KCk51cnNlCgogICAgTm8gdHJ1bHkgc2lyOyBub3QgYSBwZW5ueS4KClJPTUVPCgogICAgR28gdG87IEkgc2F5IHlvdSBzaGFsbC4KCk51cnNlCgogICAgVGhpcyBhZnRlcm5vb24sIHNpcj8gd2VsbCwgc2hlIHNoYWxsIGJlIHRoZXJlLgoKUk9NRU8KCiAgICBBbmQgc3RheSwgZ29vZCBudXJzZSwgYmVoaW5kIHRoZSBhYmJleSB3YWxsOgogICAgV2l0aGluIHRoaXMgaG91ciBteSBtYW4gc2hhbGwgYmUgd2l0aCB0aGVlCiAgICBBbmQgYnJpbmcgdGhlZSBjb3JkcyBtYWRlIGxpa2UgYSB0YWNrbGVkIHN0YWlyOwogICAgV2hpY2ggdG8gdGhlIGhpZ2ggdG9wLWdhbGxhbnQgb2YgbXkgam95CiAgICBNdXN0IGJlIG15IGNvbnZveSBpbiB0aGUgc2VjcmV0IG5pZ2h0LgogICAgRmFyZXdlbGw7IGJlIHRydXN0eSwgYW5kIEknbGwgcXVpdCB0aHkgcGFpbnM6CiAgICBGYXJld2VsbDsgY29tbWVuZCBtZSB0byB0aHkgbWlzdHJlc3MuCgpOdXJzZQoKICAgIE5vdyBHb2QgaW4gaGVhdmVuIGJsZXNzIHRoZWUhIEhhcmsgeW91LCBzaXIuCgpST01FTwoKICAgIFdoYXQgc2F5J3N0IHRob3UsIG15IGRlYXIgbnVyc2UCgpOdXJzZQoKICAgIElzIHlvdXIgbWFuIHNlY3JldD8gRGlkIHlvdSBuZSdlciBoZWFyIHNheSwKICAgIFR3byBtYXkga2VlcCBjb3Vuc2VsLCBwdXR0aW5nIG9uZSBhd2F5PwoKUk9NRU8KCiAgICBJIHdhcnJhbnQgdGhlZSwgbXkgbWFuJ3MgYXMgdHJ1ZSBhcyBzdGVlbC4KCk5VUlNFCgogICAgV2VsbCwgc2lyOyBteSBtaXN0cmVzcyBpcyB0aGUgc3dlZXRlc3QgbGFkeS0tTG9yZCwKICAgIExvcmQhIHdoZW4gJ3R3YXMgYSBsaXR0bGUgcHJhdGluZyB0aGluZzotLU8sIHRoZXJlCiAgICBpcyBhIG5vYmxlbWFuIGluIHRvd24sIG9uZSBQYXJpcywgdGhhdCB3b3VsZCBmYWluCiAgICBsYXkga25pZmUgYWJvYXJkOyBidXQgc2hlLCBnb29kIHNvdWwsIGhhZCBhcyBsaWVmCiAgICBzZWUgYSB0b2FkLCBhIHZlcnkgdG9hZCwgYXMgc2VlIGhpbS4gSSBhbmdlciBoZXIKICAgIHNvbWV0aW1lcyBhbmQgdGVsbCBoZXIgdGhhdCBQYXJpcyBpcyB0aGUgcHJvcGVyZXIKICAgIG1hbjsgYnV0LCBJJ2xsIHdhcnJhbnQgeW91LCB3aGVuIEkgc2F5IHNvLCBzaGUgbG9va3MKICAgIGFzIHBhbGUgYXMgYW55IGNsb3V0IGluIHRoZSB2ZXJzYWwgd29ybGQuIERvdGggbm90CiAgICByb3NlbWFyeSBhbmQgUm9tZW8gYmVnaW4gYm90aCB3aXRoIGEgbGV0dGVyPwoKUk9NRU8KCiAgICBBeSwgbnVyc2U7IHdoYXQgb2YgdGhhdD8gYm90aCB3aXRoIGFuIFIuCgpOdXJzZQoKICAgIEFoLiBtb2NrZXIhIHRoYXQncyB0aGUgZG9nJ3MgbmFtZTsgUiBpcyBmb3IKICAgIHRoZS0tTm87IEkga25vdyBpdCBiZWdpbnMgd2l0aCBzb21lIG90aGVyCiAgICBsZXR0ZXI6LS1hbmQgc2hlIGhhdGggdGhlIHByZXR0aWVzdCBzZW50ZW50aW91cyBvZgogICAgaXQsIG9mIHlvdSBhbmQgcm9zZW1hcnksIHRoYXQgaXQgd291bGQgZG8geW91IGdvb2QKICAgIHRvIGhlYXIgaXQuCgpST01FTwoKICAgIENvbW1lbmQgbWUgdG8gdGh5IGxhZHkuCgpOdXJzZQoKICAgIEF5LCBhIHRob3VzYW5kIHRpbWVzLgoKICAgIEV4aXQgUm9tZW8KICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBQZXRlciwgdGFrZSBteSBmYW4sIGFuZCBnbyBiZWZvcmUgYW5kIGFwYWNlLgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgSlVMSUVUIAoKSlVMSUVUCgogICAgVGhlIGNsb2NrIHN0cnVjayBuaW5lIHdoZW4gSSBkaWQgc2VuZCB0aGUgbnVyc2U7CiAgICBJbiBoYWxmIGFuIGhvdXIgc2hlIHByb21pc2VkIHRvIHJldHVybi4KICAgIFBlcmNoYW5jZSBzaGUgY2Fubm90IG1lZXQgaGltOiB0aGF0J3Mgbm90IHNvLgogICAgTywgc2hlIGlzIGxhbWUhIGxvdmUncyBoZXJhbGRzIHNob3VsZCBiZSB0aG91Z2h0cywKICAgIFdoaWNoIHRlbiB0aW1lcyBmYXN0ZXIgZ2xpZGUgdGhhbiB0aGUgc3VuJ3MgYmVhbXMsCiAgICBEcml2aW5nIGJhY2sgc2hhZG93cyBvdmVyIGxvdXJpbmcgaGlsbHM6CiAgICBUaGVyZWZvcmUgZG8gbmltYmxlLXBpbmlvbidkIGRvdmVzIGRyYXcgbG92ZSwKICAgIEFuZCB0aGVyZWZvcmUgaGF0aCB0aGUgd2luZC1zd2lmdCBDdXBpZCB3aW5ncy4KICAgIE5vdyBpcyB0aGUgc3VuIHVwb24gdGhlIGhpZ2htb3N0IGhpbGwKICAgIE9mIHRoaXMgZGF5J3Mgam91cm5leSwgYW5kIGZyb20gbmluZSB0aWxsIHR3ZWx2ZQogICAgSXMgdGhyZWUgbG9uZyBob3VycywgeWV0IHNoZSBpcyBub3QgY29tZS4KICAgIEhhZCBzaGUgYWZmZWN0aW9ucyBhbmQgd2FybSB5b3V0aGZ1bCBibG9vZCwKICAgIFNoZSB3b3VsZCBiZSBhcyBzd2lmdCBpbiBtb3Rpb24gYXMgYSBiYWxsOwogICAgTXkgd29yZHMgd291bGQgYmFuZHkgaGVyIHRvIG15IHN3ZWV0IGxvdmUsCiAgICBBbmQgaGlzIHRvIG1lOgogICAgQnV0IG9sZCBmb2xrcywgbWFueSBmZWlnbiBhcyB0aGV5IHdlcmUgZGVhZDsKICAgIFVud2llbGR5LCBzbG93LCBoZWF2eSBhbmQgcGFsZSBhcyBsZWFkLgogICAgTyBHb2QsIHNoZSBjb21lcyEKCiAgICBFbnRlciBOdXJzZSBhbmQgUEVURVIKICAgIE8gaG9uZXkgbnVyc2UsIHdoYXQgbmV3cz8KICAgIEhhc3QgdGhvdSBtZXQgd2l0aCBoaW0IFNlbmQgdGh5IG1hbiBhd2F5LgoKTnVyc2UKCiAgICBQZXRlciwgc3RheSBhdCB0aGUgZ2F0ZS4KCiAgICBFeGl0IFBFVEVSCgpKVUxJRVQKCiAgICBOb3csIGdvb2Qgc3dlZXQgbnVyc2UsLS1PIExvcmQsIHdoeSBsb29rJ3N0IHRob3Ugc2FkPwogICAgVGhvdWdoIG5ld3MgYmUgc2FkLCB5ZXQgdGVsbCB0aGVtIG1lcnJpbHk7CiAgICBJZiBnb29kLCB0aG91IHNoYW1lc3QgdGhlIG11c2ljIG9mIHN3ZWV0IG5ld3MKICAgIEJ5IHBsYXlpbmcgaXQgdG8gbWUgd2l0aCBzbyBzb3VyIGEgZmFjZS4KCk51cnNlCgogICAgSSBhbSBhLXdlYXJ5LCBnaXZlIG1lIGxlYXZlIGF3aGlsZToKICAgIEZpZSwgaG93IG15IGJvbmVzIGFjaGUhIHdoYXQgYSBqYXVudCBoYXZlIEkgaGFkIQoKSlVMSUVUCgogICAgSSB3b3VsZCB0aG91IGhhZHN0IG15IGJvbmVzLCBhbmQgSSB0aHkgbmV3czoKICAgIE5heSwgY29tZSwgSSBwcmF5IHRoZWUsIHNwZWFrOyBnb29kLCBnb29kIG51cnNlLCBzcGVhay4KCk51cnNlCgogICAgSmVzdSwgd2hhdCBoYXN0ZT8gY2FuIHlvdSBub3Qgc3RheSBhd2hpbGUCiAgICBEbyB5b3Ugbm90IHNlZSB0aGF0IEkgYW0gb3V0IG9mIGJyZWF0aD8KCkpVTElFVAoKICAgIEhvdyBhcnQgdGhvdSBvdXQgb2YgYnJlYXRoLCB3aGVuIHRob3UgaGFzdCBicmVhdGgKICAgIFRvIHNheSB0byBtZSB0aGF0IHRob3UgYXJ0IG91dCBvZiBicmVhdGgCiAgICBUaGUgZXhjdXNlIHRoYXQgdGhvdSBkb3N0IG1ha2UgaW4gdGhpcyBkZWxheQogICAgSXMgbG9uZ2VyIHRoYW4gdGhlIHRhbGUgdGhvdSBkb3N0IGV4Y3VzZS4KICAgIElzIHRoeSBuZXdzIGdvb2QsIG9yIGJhZD8gYW5zd2VyIHRvIHRoYXQ7CiAgICBTYXkgZWl0aGVyLCBhbmQgSSdsbCBzdGF5IHRoZSBjaXJjdW1zdGFuY2U6CiAgICBMZXQgbWUgYmUgc2F0aXNmaWVkLCBpcyd0IGdvb2Qgb3IgYmFkPwoKTnVyc2UKCiAgICBXZWxsLCB5b3UgaGF2ZSBtYWRlIGEgc2ltcGxlIGNob2ljZTsgeW91IGtub3cgbm90CiAgICBob3cgdG8gY2hvb3NlIGEgbWFuOiBSb21lbyEgbm8sIG5vdCBoZTsgdGhvdWdoIGhpcwogICAgZmFjZSBiZSBiZXR0ZXIgdGhhbiBhbnkgbWFuJ3MsIHlldCBoaXMgbGVnIGV4Y2VscwogICAgYWxsIG1lbidzOyBhbmQgZm9yIGEgaGFuZCwgYW5kIGEgZm9vdCwgYW5kIGEgYm9keSwKICAgIHRob3VnaCB0aGV5IGJlIG5vdCB0byBiZSB0YWxrZWQgb24sIHlldCB0aGV5IGFyZQogICAgcGFzdCBjb21wYXJlOiBoZSBpcyBub3QgdGhlIGZsb3dlciBvZiBjb3VydGVzeSwKICAgIGJ1dCwgSSdsbCB3YXJyYW50IGhpbSwgYXMgZ2VudGxlIGFzIGEgbGFtYi4gR28gdGh5CiAgICB3YXlzLCB3ZW5jaDsgc2VydmUgR29kLiBXaGF0LCBoYXZlIHlvdSBkaW5lZCBhdCBob21lPwoKSlVMSUVUCgogICAgTm8sIG5vOiBidXQgYWxsIHRoaXMgZGlkIEkga25vdyBiZWZvcmUuCiAgICBXaGF0IHNheXMgaGUgb2Ygb3VyIG1hcnJpYWdlPyB3aGF0IG9mIHRoYXQCgpOdXJzZQoKICAgIExvcmQsIGhvdyBteSBoZWFkIGFjaGVzISB3aGF0IGEgaGVhZCBoYXZlIEkhCiAgICBJdCBiZWF0cyBhcyBpdCB3b3VsZCBmYWxsIGluIHR3ZW50eSBwaWVjZXMuCiAgICBNeSBiYWNrIG8nIHQnIG90aGVyIHNpZGUsLS1PLCBteSBiYWNrLCBteSBiYWNrIQogICAgQmVzaHJldyB5b3VyIGhlYXJ0IGZvciBzZW5kaW5nIG1lIGFib3V0LAogICAgVG8gY2F0Y2ggbXkgZGVhdGggd2l0aCBqYXVudGluZyB1cCBhbmQgZG93biEKCkpVTElFVAoKICAgIEknIGZhaXRoLCBJIGFtIHNvcnJ5IHRoYXQgdGhvdSBhcnQgbm90IHdlbGwuCiAgICBTd2VldCwgc3dlZXQsIHN3ZWV0IG51cnNlLCB0ZWxsIG1lLCB3aGF0IHNheXMgbXkgbG92ZT8KCk51cnNlCgogICAgWW91ciBsb3ZlIHNheXMsIGxpa2UgYW4gaG9uZXN0IGdlbnRsZW1hbiwgYW5kIGEKICAgIGNvdXJ0ZW91cywgYW5kIGEga2luZCwgYW5kIGEgaGFuZHNvbWUsIGFuZCwgSQogICAgd2FycmFudCwgYSB2aXJ0dW91cywtLVdoZXJlIGlzIHlvdXIgbW90aGVyPwoKSlVMSUVUCgogICAgV2hlcmUgaXMgbXkgbW90aGVyISB3aHksIHNoZSBpcyB3aXRoaW47CiAgICBXaGVyZSBzaG91bGQgc2hlIGJlPyBIb3cgb2RkbHkgdGhvdSByZXBsaWVzdCEKICAgICdZb3VyIGxvdmUgc2F5cywgbGlrZSBhbiBob25lc3QgZ2VudGxlbWFuLAogICAgV2hlcmUgaXMgeW91ciBtb3RoZXIJwoKTnVyc2UKCiAgICBPIEdvZCdzIGxhZHkgZGVhciEKICAgIEFyZSB5b3Ugc28gaG90PyBtYXJyeSwgY29tZSB1cCwgSSB0cm93OwogICAgSXMgdGhpcyB0aGUgcG91bHRpY2UgZm9yIG15IGFjaGluZyBib25lcz8KICAgIEhlbmNlZm9yd2FyZCBkbyB5b3VyIG1lc3NhZ2VzIHlvdXJzZWxmLgoKSlVMSUVUCgogICAgSGVyZSdzIHN1Y2ggYSBjb2lsISBjb21lLCB3aGF0IHNheXMgUm9tZW8CgpOdXJzZQoKICAgIEhhdmUgeW91IGdvdCBsZWF2ZSB0byBnbyB0byBzaHJpZnQgdG8tZGF5PwoKSlVMSUVUCgogICAgSSBoYXZlLgoKTnVyc2UKCiAgICBUaGVuIGhpZSB5b3UgaGVuY2UgdG8gRnJpYXIgTGF1cmVuY2UnIGNlbGw7CiAgICBUaGVyZSBzdGF5cyBhIGh1c2JhbmQgdG8gbWFrZSB5b3UgYSB3aWZlOgogICAgTm93IGNvbWVzIHRoZSB3YW50b24gYmxvb2QgdXAgaW4geW91ciBjaGVla3MsCiAgICBUaGV5J2xsIGJlIGluIHNjYXJsZXQgc3RyYWlnaHQgYXQgYW55IG5ld3MuCiAgICBIaWUgeW91IHRvIGNodXJjaDsgSSBtdXN0IGFub3RoZXIgd2F5LAogICAgVG8gZmV0Y2ggYSBsYWRkZXIsIGJ5IHRoZSB3aGljaCB5b3VyIGxvdmUKICAgIE11c3QgY2xpbWIgYSBiaXJkJ3MgbmVzdCBzb29uIHdoZW4gaXQgaXMgZGFyazoKICAgIEkgYW0gdGhlIGRydWRnZSBhbmQgdG9pbCBpbiB5b3VyIGRlbGlnaHQsCiAgICBCdXQgeW91IHNoYWxsIGJlYXIgdGhlIGJ1cmRlbiBzb29uIGF0IG5pZ2h0LgogICAgR287IEknbGwgdG8gZGlubmVyOiBoaWUgeW91IHRvIHRoZSBjZWxsLgoKSlVMSUVUCgogICAgSGllIHRvIGhpZ2ggZm9ydHVuZSEgSG9uZXN0IG51cnNlLCBmYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIFZJLiBGcmlhciBMYXVyZW5jZSdzIGNlbGwuCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UgYW5kIFJPTUVPIAoKRlJJQVIgTEFVUkVOQ0UKCiAgICBTbyBzbWlsZSB0aGUgaGVhdmVucyB1cG9uIHRoaXMgaG9seSBhY3QsCiAgICBUaGF0IGFmdGVyIGhvdXJzIHdpdGggc29ycm93IGNoaWRlIHVzIG5vdCEKClJPTUVPCgogICAgQW1lbiwgYW1lbiEgYnV0IGNvbWUgd2hhdCBzb3Jyb3cgY2FuLAogICAgSXQgY2Fubm90IGNvdW50ZXJ2YWlsIHRoZSBleGNoYW5nZSBvZiBqb3kKICAgIFRoYXQgb25lIHNob3J0IG1pbnV0ZSBnaXZlcyBtZSBpbiBoZXIgc2lnaHQ6CiAgICBEbyB0aG91IGJ1dCBjbG9zZSBvdXIgaGFuZHMgd2l0aCBob2x5IHdvcmRzLAogICAgVGhlbiBsb3ZlLWRldm91cmluZyBkZWF0aCBkbyB3aGF0IGhlIGRhcmU7CiAgICBJdCBpcyBlbm91Z2ggSSBtYXkgYnV0IGNhbGwgaGVyIG1pbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFRoZXNlIHZpb2xlbnQgZGVsaWdodHMgaGF2ZSB2aW9sZW50IGVuZHMKICAgIEFuZCBpbiB0aGVpciB0cml1bXBoIGRpZSwgbGlrZSBmaXJlIGFuZCBwb3dkZXIsCiAgICBXaGljaCBhcyB0aGV5IGtpc3MgY29uc3VtZTogdGhlIHN3ZWV0ZXN0IGhvbmV5CiAgICBJcyBsb2F0aHNvbWUgaW4gaGlzIG93biBkZWxpY2lvdXNuZXNzCiAgICBBbmQgaW4gdGhlIHRhc3RlIGNvbmZvdW5kcyB0aGUgYXBwZXRpdGU6CiAgICBUaGVyZWZvcmUgbG92ZSBtb2RlcmF0ZWx5OyBsb25nIGxvdmUgZG90aCBzbzsKICAgIFRvbyBzd2lmdCBhcnJpdmVzIGFzIHRhcmR5IGFzIHRvbyBzbG93LgoKICAgIEVudGVyIEpVTElFVAogICAgSGVyZSBjb21lcyB0aGUgbGFkeTogTywgc28gbGlnaHQgYSBmb290CiAgICBXaWxsIG5lJ2VyIHdlYXIgb3V0IHRoZSBldmVybGFzdGluZyBmbGludDoKICAgIEEgbG92ZXIgbWF5IGJlc3RyaWRlIHRoZSBnb3NzYW1lcgogICAgVGhhdCBpZGxlcyBpbiB0aGUgd2FudG9uIHN1bW1lciBhaXIsCiAgICBBbmQgeWV0IG5vdCBmYWxsOyBzbyBsaWdodCBpcyB2YW5pdHkuCgpKVUxJRVQKCiAgICBHb29kIGV2ZW4gdG8gbXkgZ2hvc3RseSBjb25mZXNzb3IuCgpGUklBUiBMQVVSRU5DRQoKICAgIFJvbWVvIHNoYWxsIHRoYW5rIHRoZWUsIGRhdWdodGVyLCBmb3IgdXMgYm90aC4KCkpVTElFVAoKICAgIEFzIG11Y2ggdG8gaGltLCBlbHNlIGlzIGhpcyB0aGFua3MgdG9vIG11Y2guCgpST01FTwoKICAgIEFoLCBKdWxpZXQsIGlmIHRoZSBtZWFzdXJlIG9mIHRoeSBqb3kKICAgIEJlIGhlYXAnZCBsaWtlIG1pbmUgYW5kIHRoYXQgdGh5IHNraWxsIGJlIG1vcmUKICAgIFRvIGJsYXpvbiBpdCwgdGhlbiBzd2VldGVuIHdpdGggdGh5IGJyZWF0aAogICAgVGhpcyBuZWlnaGJvdXIgYWlyLCBhbmQgbGV0IHJpY2ggbXVzaWMncyB0b25ndWUKICAgIFVuZm9sZCB0aGUgaW1hZ2luZWQgaGFwcGluZXNzIHRoYXQgYm90aAogICAgUmVjZWl2ZSBpbiBlaXRoZXIgYnkgdGhpcyBkZWFyIGVuY291bnRlci4KCkpVTElFVAoKICAgIENvbmNlaXQsIG1vcmUgcmljaCBpbiBtYXR0ZXIgdGhhbiBpbiB3b3JkcywKICAgIEJyYWdzIG9mIGhpcyBzdWJzdGFuY2UsIG5vdCBvZiBvcm5hbWVudDoKICAgIFRoZXkgYXJlIGJ1dCBiZWdnYXJzIHRoYXQgY2FuIGNvdW50IHRoZWlyIHdvcnRoOwogICAgQnV0IG15IHRydWUgbG92ZSBpcyBncm93biB0byBzdWNoIGV4Y2VzcwogICAgSSBjYW5ub3Qgc3VtIHVwIHN1bSBvZiBoYWxmIG15IHdlYWx0aC4KCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgY29tZSB3aXRoIG1lLCBhbmQgd2Ugd2lsbCBtYWtlIHNob3J0IHdvcms7CiAgICBGb3IsIGJ5IHlvdXIgbGVhdmVzLCB5b3Ugc2hhbGwgbm90IHN0YXkgYWxvbmUKICAgIFRpbGwgaG9seSBjaHVyY2ggaW5jb3Jwb3JhdGUgdHdvIGluIG9uZS4KCiAgICBFeGV1bnQKCkFDVCBJSUkKU0NFTkUgSS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgTUVSQ1VUSU8sIEJFTlZPTElPLCBQYWdlLCBhbmQgU2VydmFudHMgCgpCRU5WT0xJTwoKICAgIEkgcHJheSB0aGVlLCBnb29kIE1lcmN1dGlvLCBsZXQncyByZXRpcmU6CiAgICBUaGUgZGF5IGlzIGhvdCwgdGhlIENhcHVsZXRzIGFicm9hZCwKICAgIEFuZCwgaWYgd2UgbWVldCwgd2Ugc2hhbGwgbm90IHNjYXBlIGEgYnJhd2w7CiAgICBGb3Igbm93LCB0aGVzZSBob3QgZGF5cywgaXMgdGhlIG1hZCBibG9vZCBzdGlycmluZy4KCk1FUkNVVElPCgogICAgVGhvdSBhcnQgbGlrZSBvbmUgb2YgdGhvc2UgZmVsbG93cyB0aGF0IHdoZW4gaGUKICAgIGVudGVycyB0aGUgY29uZmluZXMgb2YgYSB0YXZlcm4gY2xhcHMgbWUgaGlzIHN3b3JkCiAgICB1cG9uIHRoZSB0YWJsZSBhbmQgc2F5cyAnR29kIHNlbmQgbWUgbm8gbmVlZCBvZgogICAgdGhlZSEnIGFuZCBieSB0aGUgb3BlcmF0aW9uIG9mIHRoZSBzZWNvbmQgY3VwIGRyYXdzCiAgICBpdCBvbiB0aGUgZHJhd2VyLCB3aGVuIGluZGVlZCB0aGVyZSBpcyBubyBuZWVkLgoKQkVOVk9MSU8KCiAgICBBbSBJIGxpa2Ugc3VjaCBhIGZlbGxvdz8KCk1FUkNVVElPCgogICAgQ29tZSwgY29tZSwgdGhvdSBhcnQgYXMgaG90IGEgSmFjayBpbiB0aHkgbW9vZCBhcwogICAgYW55IGluIEl0YWx5LCBhbmQgYXMgc29vbiBtb3ZlZCB0byBiZSBtb29keSwgYW5kIGFzCiAgICBzb29uIG1vb2R5IHRvIGJlIG1vdmVkLgoKQkVOVk9MSU8KCiAgICBBbmQgd2hhdCB0bz8KCk1FUkNVVElPCgogICAgTmF5LCBhbiB0aGVyZSB3ZXJlIHR3byBzdWNoLCB3ZSBzaG91bGQgaGF2ZSBub25lCiAgICBzaG9ydGx5LCBmb3Igb25lIHdvdWxkIGtpbGwgdGhlIG90aGVyLiBUaG91ISB3aHksCiAgICB0aG91IHdpbHQgcXVhcnJlbCB3aXRoIGEgbWFuIHRoYXQgaGF0aCBhIGhhaXIgbW9yZSwKICAgIG9yIGEgaGFpciBsZXNzLCBpbiBoaXMgYmVhcmQsIHRoYW4gdGhvdSBoYXN0OiB0aG91CiAgICB3aWx0IHF1YXJyZWwgd2l0aCBhIG1hbiBmb3IgY3JhY2tpbmcgbnV0cywgaGF2aW5nIG5vCiAgICBvdGhlciByZWFzb24gYnV0IGJlY2F1c2UgdGhvdSBoYXN0IGhhemVsIGV5ZXM6IHdoYXQKICAgIGV5ZSBidXQgc3VjaCBhbiBleWUgd291bGQgc3B5IG91dCBzdWNoIGEgcXVhcnJlbD8KICAgIFRoeSBoZWFkIGlzIGFzIGZ1biBvZiBxdWFycmVscyBhcyBhbiBlZ2cgaXMgZnVsbCBvZgogICAgbWVhdCwgYW5kIHlldCB0aHkgaGVhZCBoYXRoIGJlZW4gYmVhdGVuIGFzIGFkZGxlIGFzCiAgICBhbiBlZ2cgZm9yIHF1YXJyZWxsaW5nOiB0aG91IGhhc3QgcXVhcnJlbGxlZCB3aXRoIGEKICAgIG1hbiBmb3IgY291Z2hpbmcgaW4gdGhlIHN0cmVldCwgYmVjYXVzZSBoZSBoYXRoCiAgICB3YWtlbmVkIHRoeSBkb2cgdGhhdCBoYXRoIGxhaW4gYXNsZWVwIGluIHRoZSBzdW46CiAgICBkaWRzdCB0aG91IG5vdCBmYWxsIG91dCB3aXRoIGEgdGFpbG9yIGZvciB3ZWFyaW5nCiAgICBoaXMgbmV3IGRvdWJsZXQgYmVmb3JlIEVhc3Rlcj8gd2l0aCBhbm90aGVyLCBmb3IKICAgIHR5aW5nIGhpcyBuZXcgc2hvZXMgd2l0aCBvbGQgcmliYW5kPyBhbmQgeWV0IHRob3UKICAgIHdpbHQgdHV0b3IgbWUgZnJvbSBxdWFycmVsbGluZyEKCkJFTlZPTElPCgogICAgQW4gSSB3ZXJlIHNvIGFwdCB0byBxdWFycmVsIGFzIHRob3UgYXJ0LCBhbnkgbWFuCiAgICBzaG91bGQgYnV5IHRoZSBmZWUtc2ltcGxlIG9mIG15IGxpZmUgZm9yIGFuIGhvdXIgYW5kIGEgcXVhcnRlci4KCk1FUkNVVElPCgogICAgVGhlIGZlZS1zaW1wbGUhIE8gc2ltcGxlIQoKQkVOVk9MSU8KCiAgICBCeSBteSBoZWFkLCBoZXJlIGNvbWUgdGhlIENhcHVsZXRzLgoKTUVSQ1VUSU8KCiAgICBCeSBteSBoZWVsLCBJIGNhcmUgbm90LgoKICAgIEVudGVyIFRZQkFMVCBhbmQgb3RoZXJzCgpUWUJBTFQKCiAgICBGb2xsb3cgbWUgY2xvc2UsIGZvciBJIHdpbGwgc3BlYWsgdG8gdGhlbS4KICAgIEdlbnRsZW1lbiwgZ29vZCBkZW46IGEgd29yZCB3aXRoIG9uZSBvZiB5b3UuCgpNRVJDVVRJTwoKICAgIEFuZCBidXQgb25lIHdvcmQgd2l0aCBvbmUgb2YgdXMIGNvdXBsZSBpdCB3aXRoCiAgICBzb21ldGhpbmc7IG1ha2UgaXQgYSB3b3JkIGFuZCBhIGJsb3cuCgpUWUJBTFQKCiAgICBZb3Ugc2hhbGwgZmluZCBtZSBhcHQgZW5vdWdoIHRvIHRoYXQsIHNpciwgYW4geW91CiAgICB3aWxsIGdpdmUgbWUgb2NjYXNpb24uCgpNRVJDVVRJTwoKICAgIENvdWxkIHlvdSBub3QgdGFrZSBzb21lIG9jY2FzaW9uIHdpdGhvdXQgZ2l2aW5nPwoKVFlCQUxUCgogICAgTWVyY3V0aW8sIHRob3UgY29uc29ydCdzdCB3aXRoIFJvbWVvLC0tCgpNRVJDVVRJTwoKICAgIENvbnNvcnQhIHdoYXQsIGRvc3QgdGhvdSBtYWtlIHVzIG1pbnN0cmVscz8gYW4KICAgIHRob3UgbWFrZSBtaW5zdHJlbHMgb2YgdXMsIGxvb2sgdG8gaGVhciBub3RoaW5nIGJ1dAogICAgZGlzY29yZHM6IGhlcmUncyBteSBmaWRkbGVzdGljazsgaGVyZSdzIHRoYXQgc2hhbGwKICAgIG1ha2UgeW91IGRhbmNlLiAnWm91bmRzLCBjb25zb3J0IQoKQkVOVk9MSU8KCiAgICBXZSB0YWxrIGhlcmUgaW4gdGhlIHB1YmxpYyBoYXVudCBvZiBtZW46CiAgICBFaXRoZXIgd2l0aGRyYXcgdW50byBzb21lIHByaXZhdGUgcGxhY2UsCiAgICBBbmQgcmVhc29uIGNvbGRseSBvZiB5b3VyIGdyaWV2YW5jZXMsCiAgICBPciBlbHNlIGRlcGFydDsgaGVyZSBhbGwgZXllcyBnYXplIG9uIHVzLgoKTUVSQ1VUSU8KCiAgICBNZW4ncyBleWVzIHdlcmUgbWFkZSB0byBsb29rLCBhbmQgbGV0IHRoZW0gZ2F6ZTsKICAgIEkgd2lsbCBub3QgYnVkZ2UgZm9yIG5vIG1hbidzIHBsZWFzdXJlLCBJLgoKICAgIEVudGVyIFJPTUVPCgpUWUJBTFQKCiAgICBXZWxsLCBwZWFjZSBiZSB3aXRoIHlvdSwgc2lyOiBoZXJlIGNvbWVzIG15IG1hbi4KCk1FUkNVVElPCgogICAgQnV0IEknbGwgYmUgaGFuZ2VkLCBzaXIsIGlmIGhlIHdlYXIgeW91ciBsaXZlcnk6CiAgICBNYXJyeSwgZ28gYmVmb3JlIHRvIGZpZWxkLCBoZSdsbCBiZSB5b3VyIGZvbGxvd2VyOwogICAgWW91ciB3b3JzaGlwIGluIHRoYXQgc2Vuc2UgbWF5IGNhbGwgaGltICdtYW4uJwoKVFlCQUxUCgogICAgUm9tZW8sIHRoZSBoYXRlIEkgYmVhciB0aGVlIGNhbiBhZmZvcmQKICAgIE5vIGJldHRlciB0ZXJtIHRoYW4gdGhpcywtLXRob3UgYXJ0IGEgdmlsbGFpbi4KClJPTUVPCgogICAgVHliYWx0LCB0aGUgcmVhc29uIHRoYXQgSSBoYXZlIHRvIGxvdmUgdGhlZQogICAgRG90aCBtdWNoIGV4Y3VzZSB0aGUgYXBwZXJ0YWluaW5nIHJhZ2UKICAgIFRvIHN1Y2ggYSBncmVldGluZzogdmlsbGFpbiBhbSBJIG5vbmU7CiAgICBUaGVyZWZvcmUgZmFyZXdlbGw7IEkgc2VlIHRob3Uga25vdydzdCBtZSBub3QuCgpUWUJBTFQKCiAgICBCb3ksIHRoaXMgc2hhbGwgbm90IGV4Y3VzZSB0aGUgaW5qdXJpZXMKICAgIFRoYXQgdGhvdSBoYXN0IGRvbmUgbWU7IHRoZXJlZm9yZSB0dXJuIGFuZCBkcmF3LgoKUk9NRU8KCiAgICBJIGRvIHByb3Rlc3QsIEkgbmV2ZXIgaW5qdXJlZCB0aGVlLAogICAgQnV0IGxvdmUgdGhlZSBiZXR0ZXIgdGhhbiB0aG91IGNhbnN0IGRldmlzZSwKICAgIFRpbGwgdGhvdSBzaGFsdCBrbm93IHRoZSByZWFzb24gb2YgbXkgbG92ZToKICAgIEFuZCBzbywgZ29vZCBDYXB1bGV0LC0td2hpY2ggbmFtZSBJIHRlbmRlcgogICAgQXMgZGVhcmx5IGFzIG15IG93biwtLWJlIHNhdGlzZmllZC4KCk1FUkNVVElPCgogICAgTyBjYWxtLCBkaXNob25vdXJhYmxlLCB2aWxlIHN1Ym1pc3Npb24hCiAgICBBbGxhIHN0b2NjYXRhIGNhcnJpZXMgaXQgYXdheS4KCiAgICBEcmF3cwogICAgVHliYWx0LCB5b3UgcmF0LWNhdGNoZXIsIHdpbGwgeW91IHdhbGsCgpUWUJBTFQKCiAgICBXaGF0IHdvdWxkc3QgdGhvdSBoYXZlIHdpdGggbWUCgpNRVJDVVRJTwoKICAgIEdvb2Qga2luZyBvZiBjYXRzLCBub3RoaW5nIGJ1dCBvbmUgb2YgeW91ciBuaW5lCiAgICBsaXZlczsgdGhhdCBJIG1lYW4gdG8gbWFrZSBib2xkIHdpdGhhbCwgYW5kIGFzIHlvdQogICAgc2hhbGwgdXNlIG1lIGhlcmVhZnRlciwgZHJ5YmVhdCB0aGUgcmVzdCBvZiB0aGUKICAgIGVpZ2h0LiBXaWxsIHlvdSBwbHVjayB5b3VyIHN3b3JkIG91dCBvZiBoaXMgcGl0Y2hlcgogICAgYnkgdGhlIGVhcnMIG1ha2UgaGFzdGUsIGxlc3QgbWluZSBiZSBhYm91dCB5b3VyCiAgICBlYXJzIGVyZSBpdCBiZSBvdXQuCgpUWUJBTFQKCiAgICBJIGFtIGZvciB5b3UuCgogICAgRHJhd2luZwoKUk9NRU8KCiAgICBHZW50bGUgTWVyY3V0aW8sIHB1dCB0aHkgcmFwaWVyIHVwLgoKTUVSQ1VUSU8KCiAgICBDb21lLCBzaXIsIHlvdXIgcGFzc2Fkby4KCiAgICBUaGV5IGZpZ2h0CgpST01FTwoKICAgIERyYXcsIEJlbnZvbGlvOyBiZWF0IGRvd24gdGhlaXIgd2VhcG9ucy4KICAgIEdlbnRsZW1lbiwgZm9yIHNoYW1lLCBmb3JiZWFyIHRoaXMgb3V0cmFnZSEKICAgIFR5YmFsdCwgTWVyY3V0aW8sIHRoZSBwcmluY2UgZXhwcmVzc2x5IGhhdGgKICAgIEZvcmJpZGRlbiBiYW5keWluZyBpbiBWZXJvbmEgc3RyZWV0czoKICAgIEhvbGQsIFR5YmFsdCEgZ29vZCBNZXJjdXRpbyEKCiAgICBUWUJBTFQgdW5kZXIgUk9NRU8ncyBhcm0gc3RhYnMgTUVSQ1VUSU8sIGFuZCBmbGllcyB3aXRoIGhpcyBmb2xsb3dlcnMKCk1FUkNVVElPCgogICAgSSBhbSBodXJ0LgogICAgQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEgSSBhbSBzcGVkLgogICAgSXMgaGUgZ29uZSwgYW5kIGhhdGggbm90aGluZz8KCkJFTlZPTElPCgogICAgV2hhdCwgYXJ0IHRob3UgaHVydD8KCk1FUkNVVElPCgogICAgQXksIGF5LCBhIHNjcmF0Y2gsIGEgc2NyYXRjaDsgbWFycnksICd0aXMgZW5vdWdoLgogICAgV2hlcmUgaXMgbXkgcGFnZT8gR28sIHZpbGxhaW4sIGZldGNoIGEgc3VyZ2Vvbi4KCiAgICBFeGl0IFBhZ2UKClJPTUVPCgogICAgQ291cmFnZSwgbWFuOyB0aGUgaHVydCBjYW5ub3QgYmUgbXVjaC4KCk1FUkNVVElPCgogICAgTm8sICd0aXMgbm90IHNvIGRlZXAgYXMgYSB3ZWxsLCBub3Igc28gd2lkZSBhcyBhCiAgICBjaHVyY2gtZG9vcjsgYnV0ICd0aXMgZW5vdWdoLCd0d2lsbCBzZXJ2ZTogYXNrIGZvcgogICAgbWUgdG8tbW9ycm93LCBhbmQgeW91IHNoYWxsIGZpbmQgbWUgYSBncmF2ZSBtYW4uIEkKICAgIGFtIHBlcHBlcmVkLCBJIHdhcnJhbnQsIGZvciB0aGlzIHdvcmxkLiBBIHBsYWd1ZSBvJwogICAgYm90aCB5b3VyIGhvdXNlcyEgJ1pvdW5kcywgYSBkb2csIGEgcmF0LCBhIG1vdXNlLCBhCiAgICBjYXQsIHRvIHNjcmF0Y2ggYSBtYW4gdG8gZGVhdGghIGEgYnJhZ2dhcnQsIGEKICAgIHJvZ3VlLCBhIHZpbGxhaW4sIHRoYXQgZmlnaHRzIGJ5IHRoZSBib29rIG9mCiAgICBhcml0aG1ldGljISBXaHkgdGhlIGRldmlsIGNhbWUgeW91IGJldHdlZW4gdXMIEkKICAgIHdhcyBodXJ0IHVuZGVyIHlvdXIgYXJtLgoKUk9NRU8KCiAgICBJIHRob3VnaHQgYWxsIGZvciB0aGUgYmVzdC4KCk1FUkNVVElPCgogICAgSGVscCBtZSBpbnRvIHNvbWUgaG91c2UsIEJlbnZvbGlvLAogICAgT3IgSSBzaGFsbCBmYWludC4gQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEKICAgIFRoZXkgaGF2ZSBtYWRlIHdvcm1zJyBtZWF0IG9mIG1lOiBJIGhhdmUgaXQsCiAgICBBbmQgc291bmRseSB0b286IHlvdXIgaG91c2VzIQoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KClJPTUVPCgogICAgVGhpcyBnZW50bGVtYW4sIHRoZSBwcmluY2UncyBuZWFyIGFsbHksCiAgICBNeSB2ZXJ5IGZyaWVuZCwgaGF0aCBnb3QgaGlzIG1vcnRhbCBodXJ0CiAgICBJbiBteSBiZWhhbGY7IG15IHJlcHV0YXRpb24gc3RhaW4nZAogICAgV2l0aCBUeWJhbHQncyBzbGFuZGVyLC0tVHliYWx0LCB0aGF0IGFuIGhvdXIKICAgIEhhdGggYmVlbiBteSBraW5zbWFuISBPIHN3ZWV0IEp1bGlldCwKICAgIFRoeSBiZWF1dHkgaGF0aCBtYWRlIG1lIGVmZmVtaW5hdGUKICAgIEFuZCBpbiBteSB0ZW1wZXIgc29mdGVuJ2QgdmFsb3VyJ3Mgc3RlZWwhCgogICAgUmUtZW50ZXIgQkVOVk9MSU8KCkJFTlZPTElPCgogICAgTyBSb21lbywgUm9tZW8sIGJyYXZlIE1lcmN1dGlvJ3MgZGVhZCEKICAgIFRoYXQgZ2FsbGFudCBzcGlyaXQgaGF0aCBhc3BpcmVkIHRoZSBjbG91ZHMsCiAgICBXaGljaCB0b28gdW50aW1lbHkgaGVyZSBkaWQgc2Nvcm4gdGhlIGVhcnRoLgoKUk9NRU8KCiAgICBUaGlzIGRheSdzIGJsYWNrIGZhdGUgb24gbW9yZSBkYXlzIGRvdGggZGVwZW5kOwogICAgVGhpcyBidXQgYmVnaW5zIHRoZSB3b2UsIG90aGVycyBtdXN0IGVuZC4KCkJFTlZPTElPCgogICAgSGVyZSBjb21lcyB0aGUgZnVyaW91cyBUeWJhbHQgYmFjayBhZ2Fpbi4KClJPTUVPCgogICAgQWxpdmUsIGluIHRyaXVtcGghIGFuZCBNZXJjdXRpbyBzbGFpbiEKICAgIEF3YXkgdG8gaGVhdmVuLCByZXNwZWN0aXZlIGxlbml0eSwKICAgIEFuZCBmaXJlLWV5ZWQgZnVyeSBiZSBteSBjb25kdWN0IG5vdyEKCiAgICBSZS1lbnRlciBUWUJBTFQKICAgIE5vdywgVHliYWx0LCB0YWtlIHRoZSB2aWxsYWluIGJhY2sgYWdhaW4sCiAgICBUaGF0IGxhdGUgdGhvdSBnYXZlc3QgbWU7IGZvciBNZXJjdXRpbydzIHNvdWwKICAgIElzIGJ1dCBhIGxpdHRsZSB3YXkgYWJvdmUgb3VyIGhlYWRzLAogICAgU3RheWluZyBmb3IgdGhpbmUgdG8ga2VlcCBoaW0gY29tcGFueToKICAgIEVpdGhlciB0aG91LCBvciBJLCBvciBib3RoLCBtdXN0IGdvIHdpdGggaGltLgoKVFlCQUxUCgogICAgVGhvdSwgd3JldGNoZWQgYm95LCB0aGF0IGRpZHN0IGNvbnNvcnQgaGltIGhlcmUsCiAgICBTaGFsdCB3aXRoIGhpbSBoZW5jZS4KClJPTUVPCgogICAgVGhpcyBzaGFsbCBkZXRlcm1pbmUgdGhhdC4KCiAgICBUaGV5IGZpZ2h0OyBUWUJBTFQgZmFsbHMKCkJFTlZPTElPCgogICAgUm9tZW8sIGF3YXksIGJlIGdvbmUhCiAgICBUaGUgY2l0aXplbnMgYXJlIHVwLCBhbmQgVHliYWx0IHNsYWluLgogICAgU3RhbmQgbm90IGFtYXplZDogdGhlIHByaW5jZSB3aWxsIGRvb20gdGhlZSBkZWF0aCwKICAgIElmIHRob3UgYXJ0IHRha2VuOiBoZW5jZSwgYmUgZ29uZSwgYXdheSEKClJPTUVPCgogICAgTywgSSBhbSBmb3J0dW5lJ3MgZm9vbCEKCkJFTlZPTElPCgogICAgV2h5IGRvc3QgdGhvdSBzdGF5PwoKICAgIEV4aXQgUk9NRU8KCiAgICBFbnRlciBDaXRpemVucywgJiBjCgpGaXJzdCBDaXRpemVuCgogICAgV2hpY2ggd2F5IHJhbiBoZSB0aGF0IGtpbGwnZCBNZXJjdXRpbz8KICAgIFR5YmFsdCwgdGhhdCBtdXJkZXJlciwgd2hpY2ggd2F5IHJhbiBoZT8KCkJFTlZPTElPCgogICAgVGhlcmUgbGllcyB0aGF0IFR5YmFsdC4KCkZpcnN0IENpdGl6ZW4KCiAgICBVcCwgc2lyLCBnbyB3aXRoIG1lOwogICAgSSBjaGFyZ2UgdGhlZSBpbiB0aGUgcHJpbmNlcyBuYW1lLCBvYmV5LgoKICAgIEVudGVyIFByaW5jZSwgYXR0ZW5kZWQ7IE1PTlRBR1VFLCBDQVBVTEVULCB0aGVpciBXaXZlcywgYW5kIG90aGVycwoKUFJJTkNFCgogICAgV2hlcmUgYXJlIHRoZSB2aWxlIGJlZ2lubmVycyBvZiB0aGlzIGZyYXkCgpCRU5WT0xJTwoKICAgIE8gbm9ibGUgcHJpbmNlLCBJIGNhbiBkaXNjb3ZlciBhbGwKICAgIFRoZSB1bmx1Y2t5IG1hbmFnZSBvZiB0aGlzIGZhdGFsIGJyYXdsOgogICAgVGhlcmUgbGllcyB0aGUgbWFuLCBzbGFpbiBieSB5b3VuZyBSb21lbywKICAgIFRoYXQgc2xldyB0aHkga2luc21hbiwgYnJhdmUgTWVyY3V0aW8uCgpMQURZIENBUFVMRVQKCiAgICBUeWJhbHQsIG15IGNvdXNpbiEgTyBteSBicm90aGVyJ3MgY2hpbGQhCiAgICBPIHByaW5jZSEgTyBjb3VzaW4hIGh1c2JhbmQhIE8sIHRoZSBibG9vZCBpcyBzcGlsdAogICAgTyBteSBkZWFyIGtpbnNtYW4hIFByaW5jZSwgYXMgdGhvdSBhcnQgdHJ1ZSwKICAgIEZvciBibG9vZCBvZiBvdXJzLCBzaGVkIGJsb29kIG9mIE1vbnRhZ3VlLgogICAgTyBjb3VzaW4sIGNvdXNpbiEKClBSSU5DRQoKICAgIEJlbnZvbGlvLCB3aG8gYmVnYW4gdGhpcyBibG9vZHkgZnJheT8KCkJFTlZPTElPCgogICAgVHliYWx0LCBoZXJlIHNsYWluLCB3aG9tIFJvbWVvJ3MgaGFuZCBkaWQgc2xheTsKICAgIFJvbWVvIHRoYXQgc3Bva2UgaGltIGZhaXIsIGJhZGUgaGltIGJldGhpbmsKICAgIEhvdyBuaWNlIHRoZSBxdWFycmVsIHdhcywgYW5kIHVyZ2VkIHdpdGhhbAogICAgWW91ciBoaWdoIGRpc3BsZWFzdXJlOiBhbGwgdGhpcyB1dHRlcmVkCiAgICBXaXRoIGdlbnRsZSBicmVhdGgsIGNhbG0gbG9vaywga25lZXMgaHVtYmx5IGJvdydkLAogICAgQ291bGQgbm90IHRha2UgdHJ1Y2Ugd2l0aCB0aGUgdW5ydWx5IHNwbGVlbgogICAgT2YgVHliYWx0IGRlYWYgdG8gcGVhY2UsIGJ1dCB0aGF0IGhlIHRpbHRzCiAgICBXaXRoIHBpZXJjaW5nIHN0ZWVsIGF0IGJvbGQgTWVyY3V0aW8ncyBicmVhc3QsCiAgICBXaG8gYWxsIGFzIGhvdCwgdHVybnMgZGVhZGx5IHBvaW50IHRvIHBvaW50LAogICAgQW5kLCB3aXRoIGEgbWFydGlhbCBzY29ybiwgd2l0aCBvbmUgaGFuZCBiZWF0cwogICAgQ29sZCBkZWF0aCBhc2lkZSwgYW5kIHdpdGggdGhlIG90aGVyIHNlbmRzCiAgICBJdCBiYWNrIHRvIFR5YmFsdCwgd2hvc2UgZGV4dGVyaXR5LAogICAgUmV0b3J0cyBpdDogUm9tZW8gaGUgY3JpZXMgYWxvdWQsCiAgICAnSG9sZCwgZnJpZW5kcyEgZnJpZW5kcywgcGFydCEnIGFuZCwgc3dpZnRlciB0aGFuCiAgICBoaXMgdG9uZ3VlLAogICAgSGlzIGFnaWxlIGFybSBiZWF0cyBkb3duIHRoZWlyIGZhdGFsIHBvaW50cywKICAgIEFuZCAndHdpeHQgdGhlbSBydXNoZXM7IHVuZGVybmVhdGggd2hvc2UgYXJtCiAgICBBbiBlbnZpb3VzIHRocnVzdCBmcm9tIFR5YmFsdCBoaXQgdGhlIGxpZmUKICAgIE9mIHN0b3V0IE1lcmN1dGlvLCBhbmQgdGhlbiBUeWJhbHQgZmxlZDsKICAgIEJ1dCBieSBhbmQgYnkgY29tZXMgYmFjayB0byBSb21lbywKICAgIFdobyBoYWQgYnV0IG5ld2x5IGVudGVydGFpbidkIHJldmVuZ2UsCiAgICBBbmQgdG8gJ3QgdGhleSBnbyBsaWtlIGxpZ2h0bmluZywgZm9yLCBlcmUgSQogICAgQ291bGQgZHJhdyB0byBwYXJ0IHRoZW0sIHdhcyBzdG91dCBUeWJhbHQgc2xhaW4uCiAgICBBbmQsIGFzIGhlIGZlbGwsIGRpZCBSb21lbyB0dXJuIGFuZCBmbHkuCiAgICBUaGlzIGlzIHRoZSB0cnV0aCwgb3IgbGV0IEJlbnZvbGlvIGRpZS4KCkxBRFkgQ0FQVUxFVAoKICAgIEhlIGlzIGEga2luc21hbiB0byB0aGUgTW9udGFndWU7CiAgICBBZmZlY3Rpb24gbWFrZXMgaGltIGZhbHNlOyBoZSBzcGVha3Mgbm90IHRydWU6CiAgICBTb21lIHR3ZW50eSBvZiB0aGVtIGZvdWdodCBpbiB0aGlzIGJsYWNrIHN0cmlmZSwKICAgIEFuZCBhbGwgdGhvc2UgdHdlbnR5IGNvdWxkIGJ1dCBraWxsIG9uZSBsaWZlLgogICAgSSBiZWcgZm9yIGp1c3RpY2UsIHdoaWNoIHRob3UsIHByaW5jZSwgbXVzdCBnaXZlOwogICAgUm9tZW8gc2xldyBUeWJhbHQsIFJvbWVvIG11c3Qgbm90IGxpdmUuCgpQUklOQ0UKCiAgICBSb21lbyBzbGV3IGhpbSwgaGUgc2xldyBNZXJjdXRpbzsKICAgIFdobyBub3cgdGhlIHByaWNlIG9mIGhpcyBkZWFyIGJsb29kIGRvdGggb3dlPwoKTU9OVEFHVUUKCiAgICBOb3QgUm9tZW8sIHByaW5jZSwgaGUgd2FzIE1lcmN1dGlvJ3MgZnJpZW5kOwogICAgSGlzIGZhdWx0IGNvbmNsdWRlcyBidXQgd2hhdCB0aGUgbGF3IHNob3VsZCBlbmQsCiAgICBUaGUgbGlmZSBvZiBUeWJhbHQuCgpQUklOQ0UKCiAgICBBbmQgZm9yIHRoYXQgb2ZmZW5jZQogICAgSW1tZWRpYXRlbHkgd2UgZG8gZXhpbGUgaGltIGhlbmNlOgogICAgSSBoYXZlIGFuIGludGVyZXN0IGluIHlvdXIgaGF0ZSdzIHByb2NlZWRpbmcsCiAgICBNeSBibG9vZCBmb3IgeW91ciBydWRlIGJyYXdscyBkb3RoIGxpZSBhLWJsZWVkaW5nOwogICAgQnV0IEknbGwgYW1lcmNlIHlvdSB3aXRoIHNvIHN0cm9uZyBhIGZpbmUKICAgIFRoYXQgeW91IHNoYWxsIGFsbCByZXBlbnQgdGhlIGxvc3Mgb2YgbWluZToKICAgIEkgd2lsbCBiZSBkZWFmIHRvIHBsZWFkaW5nIGFuZCBleGN1c2VzOwogICAgTm9yIHRlYXJzIG5vciBwcmF5ZXJzIHNoYWxsIHB1cmNoYXNlIG91dCBhYnVzZXM6CiAgICBUaGVyZWZvcmUgdXNlIG5vbmU6IGxldCBSb21lbyBoZW5jZSBpbiBoYXN0ZSwKICAgIEVsc2UsIHdoZW4gaGUncyBmb3VuZCwgdGhhdCBob3VyIGlzIGhpcyBsYXN0LgogICAgQmVhciBoZW5jZSB0aGlzIGJvZHkgYW5kIGF0dGVuZCBvdXIgd2lsbDoKICAgIE1lcmN5IGJ1dCBtdXJkZXJzLCBwYXJkb25pbmcgdGhvc2UgdGhhdCBraWxsLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIENhcHVsZXQncyBvcmNoYXJkLgoKICAgIEVudGVyIEpVTElFVCAKCkpVTElFVAoKICAgIEdhbGxvcCBhcGFjZSwgeW91IGZpZXJ5LWZvb3RlZCBzdGVlZHMsCiAgICBUb3dhcmRzIFBob2VidXMnIGxvZGdpbmc6IHN1Y2ggYSB3YWdvbmVyCiAgICBBcyBQaGFldGhvbiB3b3VsZCB3aGlwIHlvdSB0byB0aGUgd2VzdCwKICAgIEFuZCBicmluZyBpbiBjbG91ZHkgbmlnaHQgaW1tZWRpYXRlbHkuCiAgICBTcHJlYWQgdGh5IGNsb3NlIGN1cnRhaW4sIGxvdmUtcGVyZm9ybWluZyBuaWdodCwKICAgIFRoYXQgcnVuYXdheSdzIGV5ZXMgbWF5IHdpbmsgYW5kIFJvbWVvCiAgICBMZWFwIHRvIHRoZXNlIGFybXMsIHVudGFsaydkIG9mIGFuZCB1bnNlZW4uCiAgICBMb3ZlcnMgY2FuIHNlZSB0byBkbyB0aGVpciBhbW9yb3VzIHJpdGVzCiAgICBCeSB0aGVpciBvd24gYmVhdXRpZXM7IG9yLCBpZiBsb3ZlIGJlIGJsaW5kLAogICAgSXQgYmVzdCBhZ3JlZXMgd2l0aCBuaWdodC4gQ29tZSwgY2l2aWwgbmlnaHQsCiAgICBUaG91IHNvYmVyLXN1aXRlZCBtYXRyb24sIGFsbCBpbiBibGFjaywKICAgIEFuZCBsZWFybiBtZSBob3cgdG8gbG9zZSBhIHdpbm5pbmcgbWF0Y2gsCiAgICBQbGF5J2QgZm9yIGEgcGFpciBvZiBzdGFpbmxlc3MgbWFpZGVuaG9vZHM6CiAgICBIb29kIG15IHVubWFubidkIGJsb29kLCBiYXRpbmcgaW4gbXkgY2hlZWtzLAogICAgV2l0aCB0aHkgYmxhY2sgbWFudGxlOyB0aWxsIHN0cmFuZ2UgbG92ZSwgZ3Jvd24gYm9sZCwKICAgIFRoaW5rIHRydWUgbG92ZSBhY3RlZCBzaW1wbGUgbW9kZXN0eS4KICAgIENvbWUsIG5pZ2h0OyBjb21lLCBSb21lbzsgY29tZSwgdGhvdSBkYXkgaW4gbmlnaHQ7CiAgICBGb3IgdGhvdSB3aWx0IGxpZSB1cG9uIHRoZSB3aW5ncyBvZiBuaWdodAogICAgV2hpdGVyIHRoYW4gbmV3IHNub3cgb24gYSByYXZlbidzIGJhY2suCiAgICBDb21lLCBnZW50bGUgbmlnaHQsIGNvbWUsIGxvdmluZywgYmxhY2stYnJvdydkIG5pZ2h0LAogICAgR2l2ZSBtZSBteSBSb21lbzsgYW5kLCB3aGVuIGhlIHNoYWxsIGRpZSwKICAgIFRha2UgaGltIGFuZCBjdXQgaGltIG91dCBpbiBsaXR0bGUgc3RhcnMsCiAgICBBbmQgaGUgd2lsbCBtYWtlIHRoZSBmYWNlIG9mIGhlYXZlbiBzbyBmaW5lCiAgICBUaGF0IGFsbCB0aGUgd29ybGQgd2lsbCBiZSBpbiBsb3ZlIHdpdGggbmlnaHQKICAgIEFuZCBwYXkgbm8gd29yc2hpcCB0byB0aGUgZ2FyaXNoIHN1bi4KICAgIE8sIEkgaGF2ZSBib3VnaHQgdGhlIG1hbnNpb24gb2YgYSBsb3ZlLAogICAgQnV0IG5vdCBwb3NzZXNzJ2QgaXQsIGFuZCwgdGhvdWdoIEkgYW0gc29sZCwKICAgIE5vdCB5ZXQgZW5qb3knZDogc28gdGVkaW91cyBpcyB0aGlzIGRheQogICAgQXMgaXMgdGhlIG5pZ2h0IGJlZm9yZSBzb21lIGZlc3RpdmFsCiAgICBUbyBhbiBpbXBhdGllbnQgY2hpbGQgdGhhdCBoYXRoIG5ldyByb2JlcwogICAgQW5kIG1heSBub3Qgd2VhciB0aGVtLiBPLCBoZXJlIGNvbWVzIG15IG51cnNlLAogICAgQW5kIHNoZSBicmluZ3MgbmV3czsgYW5kIGV2ZXJ5IHRvbmd1ZSB0aGF0IHNwZWFrcwogICAgQnV0IFJvbWVvJ3MgbmFtZSBzcGVha3MgaGVhdmVubHkgZWxvcXVlbmNlLgoKICAgIEVudGVyIE51cnNlLCB3aXRoIGNvcmRzCiAgICBOb3csIG51cnNlLCB3aGF0IG5ld3MIFdoYXQgaGFzdCB0aG91IHRoZXJlPyB0aGUgY29yZHMKICAgIFRoYXQgUm9tZW8gYmlkIHRoZWUgZmV0Y2gCgpOdXJzZQoKICAgIEF5LCBheSwgdGhlIGNvcmRzLgoKICAgIFRocm93cyB0aGVtIGRvd24KCkpVTElFVAoKICAgIEF5IG1lISB3aGF0IG5ld3MIHdoeSBkb3N0IHRob3Ugd3JpbmcgdGh5IGhhbmRzPwoKTnVyc2UKCiAgICBBaCwgd2VsbC1hLWRheSEgaGUncyBkZWFkLCBoZSdzIGRlYWQsIGhlJ3MgZGVhZCEKICAgIFdlIGFyZSB1bmRvbmUsIGxhZHksIHdlIGFyZSB1bmRvbmUhCiAgICBBbGFjayB0aGUgZGF5ISBoZSdzIGdvbmUsIGhlJ3Mga2lsbCdkLCBoZSdzIGRlYWQhCgpKVUxJRVQKCiAgICBDYW4gaGVhdmVuIGJlIHNvIGVudmlvdXMCgpOdXJzZQoKICAgIFJvbWVvIGNhbiwKICAgIFRob3VnaCBoZWF2ZW4gY2Fubm90OiBPIFJvbWVvLCBSb21lbyEKICAgIFdobyBldmVyIHdvdWxkIGhhdmUgdGhvdWdodCBpdD8gUm9tZW8hCgpKVUxJRVQKCiAgICBXaGF0IGRldmlsIGFydCB0aG91LCB0aGF0IGRvc3QgdG9ybWVudCBtZSB0aHVzPwogICAgVGhpcyB0b3J0dXJlIHNob3VsZCBiZSByb2FyJ2QgaW4gZGlzbWFsIGhlbGwuCiAgICBIYXRoIFJvbWVvIHNsYWluIGhpbXNlbGYIHNheSB0aG91IGJ1dCAnSSwnCiAgICBBbmQgdGhhdCBiYXJlIHZvd2VsICdJJyBzaGFsbCBwb2lzb24gbW9yZQogICAgVGhhbiB0aGUgZGVhdGgtZGFydGluZyBleWUgb2YgY29ja2F0cmljZToKICAgIEkgYW0gbm90IEksIGlmIHRoZXJlIGJlIHN1Y2ggYW4gSTsKICAgIE9yIHRob3NlIGV5ZXMgc2h1dCwgdGhhdCBtYWtlIHRoZWUgYW5zd2VyICdJLicKICAgIElmIGhlIGJlIHNsYWluLCBzYXkgJ0knOyBvciBpZiBub3QsIG5vOgogICAgQnJpZWYgc291bmRzIGRldGVybWluZSBvZiBteSB3ZWFsIG9yIHdvZS4KCk51cnNlCgogICAgSSBzYXcgdGhlIHdvdW5kLCBJIHNhdyBpdCB3aXRoIG1pbmUgZXllcywtLQogICAgR29kIHNhdmUgdGhlIG1hcmshLS1oZXJlIG9uIGhpcyBtYW5seSBicmVhc3Q6CiAgICBBIHBpdGVvdXMgY29yc2UsIGEgYmxvb2R5IHBpdGVvdXMgY29yc2U7CiAgICBQYWxlLCBwYWxlIGFzIGFzaGVzLCBhbGwgYmVkYXViJ2QgaW4gYmxvb2QsCiAgICBBbGwgaW4gZ29yZS1ibG9vZDsgSSBzd291bmRlZCBhdCB0aGUgc2lnaHQuCgpKVUxJRVQKCiAgICBPLCBicmVhaywgbXkgaGVhcnQhIHBvb3IgYmFua3J1cHQsIGJyZWFrIGF0IG9uY2UhCiAgICBUbyBwcmlzb24sIGV5ZXMsIG5lJ2VyIGxvb2sgb24gbGliZXJ0eSEKICAgIFZpbGUgZWFydGgsIHRvIGVhcnRoIHJlc2lnbjsgZW5kIG1vdGlvbiBoZXJlOwogICAgQW5kIHRob3UgYW5kIFJvbWVvIHByZXNzIG9uZSBoZWF2eSBiaWVyIQoKTnVyc2UKCiAgICBPIFR5YmFsdCwgVHliYWx0LCB0aGUgYmVzdCBmcmllbmQgSSBoYWQhCiAgICBPIGNvdXJ0ZW91cyBUeWJhbHQhIGhvbmVzdCBnZW50bGVtYW4hCiAgICBUaGF0IGV2ZXIgSSBzaG91bGQgbGl2ZSB0byBzZWUgdGhlZSBkZWFkIQoKSlVMSUVUCgogICAgV2hhdCBzdG9ybSBpcyB0aGlzIHRoYXQgYmxvd3Mgc28gY29udHJhcnkCiAgICBJcyBSb21lbyBzbGF1Z2h0ZXInZCwgYW5kIGlzIFR5YmFsdCBkZWFkPwogICAgTXkgZGVhci1sb3ZlZCBjb3VzaW4sIGFuZCBteSBkZWFyZXIgbG9yZD8KICAgIFRoZW4sIGRyZWFkZnVsIHRydW1wZXQsIHNvdW5kIHRoZSBnZW5lcmFsIGRvb20hCiAgICBGb3Igd2hvIGlzIGxpdmluZywgaWYgdGhvc2UgdHdvIGFyZSBnb25lPwoKTnVyc2UKCiAgICBUeWJhbHQgaXMgZ29uZSwgYW5kIFJvbWVvIGJhbmlzaGVkOwogICAgUm9tZW8gdGhhdCBraWxsJ2QgaGltLCBoZSBpcyBiYW5pc2hlZC4KCkpVTElFVAoKICAgIE8gR29kISBkaWQgUm9tZW8ncyBoYW5kIHNoZWQgVHliYWx0J3MgYmxvb2QCgpOdXJzZQoKICAgIEl0IGRpZCwgaXQgZGlkOyBhbGFzIHRoZSBkYXksIGl0IGRpZCEKCkpVTElFVAoKICAgIE8gc2VycGVudCBoZWFydCwgaGlkIHdpdGggYSBmbG93ZXJpbmcgZmFjZSEKICAgIERpZCBldmVyIGRyYWdvbiBrZWVwIHNvIGZhaXIgYSBjYXZlPwogICAgQmVhdXRpZnVsIHR5cmFudCEgZmllbmQgYW5nZWxpY2FsIQogICAgRG92ZS1mZWF0aGVyJ2QgcmF2ZW4hIHdvbHZpc2gtcmF2ZW5pbmcgbGFtYiEKICAgIERlc3Bpc2VkIHN1YnN0YW5jZSBvZiBkaXZpbmVzdCBzaG93IQogICAgSnVzdCBvcHBvc2l0ZSB0byB3aGF0IHRob3UganVzdGx5IHNlZW0nc3QsCiAgICBBIGRhbW5lZCBzYWludCwgYW4gaG9ub3VyYWJsZSB2aWxsYWluIQogICAgTyBuYXR1cmUsIHdoYXQgaGFkc3QgdGhvdSB0byBkbyBpbiBoZWxsLAogICAgV2hlbiB0aG91IGRpZHN0IGJvd2VyIHRoZSBzcGlyaXQgb2YgYSBmaWVuZAogICAgSW4gbW9yYWwgcGFyYWRpc2Ugb2Ygc3VjaCBzd2VldCBmbGVzaD8KICAgIFdhcyBldmVyIGJvb2sgY29udGFpbmluZyBzdWNoIHZpbGUgbWF0dGVyCiAgICBTbyBmYWlybHkgYm91bmQIE8gdGhhdCBkZWNlaXQgc2hvdWxkIGR3ZWxsCiAgICBJbiBzdWNoIGEgZ29yZ2VvdXMgcGFsYWNlIQoKTnVyc2UKCiAgICBUaGVyZSdzIG5vIHRydXN0LAogICAgTm8gZmFpdGgsIG5vIGhvbmVzdHkgaW4gbWVuOyBhbGwgcGVyanVyZWQsCiAgICBBbGwgZm9yc3dvcm4sIGFsbCBuYXVnaHQsIGFsbCBkaXNzZW1ibGVycy4KICAgIEFoLCB3aGVyZSdzIG15IG1hbj8gZ2l2ZSBtZSBzb21lIGFxdWEgdml0YWU6CiAgICBUaGVzZSBncmllZnMsIHRoZXNlIHdvZXMsIHRoZXNlIHNvcnJvd3MgbWFrZSBtZSBvbGQuCiAgICBTaGFtZSBjb21lIHRvIFJvbWVvIQoKSlVMSUVUCgogICAgQmxpc3RlcidkIGJlIHRoeSB0b25ndWUKICAgIEZvciBzdWNoIGEgd2lzaCEgaGUgd2FzIG5vdCBib3JuIHRvIHNoYW1lOgogICAgVXBvbiBoaXMgYnJvdyBzaGFtZSBpcyBhc2hhbWVkIHRvIHNpdDsKICAgIEZvciAndGlzIGEgdGhyb25lIHdoZXJlIGhvbm91ciBtYXkgYmUgY3Jvd24nZAogICAgU29sZSBtb25hcmNoIG9mIHRoZSB1bml2ZXJzYWwgZWFydGguCiAgICBPLCB3aGF0IGEgYmVhc3Qgd2FzIEkgdG8gY2hpZGUgYXQgaGltIQoKTnVyc2UKCiAgICBXaWxsIHlvdSBzcGVhayB3ZWxsIG9mIGhpbSB0aGF0IGtpbGwnZCB5b3VyIGNvdXNpbj8KCkpVTElFVAoKICAgIFNoYWxsIEkgc3BlYWsgaWxsIG9mIGhpbSB0aGF0IGlzIG15IGh1c2JhbmQCiAgICBBaCwgcG9vciBteSBsb3JkLCB3aGF0IHRvbmd1ZSBzaGFsbCBzbW9vdGggdGh5IG5hbWUsCiAgICBXaGVuIEksIHRoeSB0aHJlZS1ob3VycyB3aWZlLCBoYXZlIG1hbmdsZWQgaXQCiAgICBCdXQsIHdoZXJlZm9yZSwgdmlsbGFpbiwgZGlkc3QgdGhvdSBraWxsIG15IGNvdXNpbj8KICAgIFRoYXQgdmlsbGFpbiBjb3VzaW4gd291bGQgaGF2ZSBraWxsJ2QgbXkgaHVzYmFuZDoKICAgIEJhY2ssIGZvb2xpc2ggdGVhcnMsIGJhY2sgdG8geW91ciBuYXRpdmUgc3ByaW5nOwogICAgWW91ciB0cmlidXRhcnkgZHJvcHMgYmVsb25nIHRvIHdvZSwKICAgIFdoaWNoIHlvdSwgbWlzdGFraW5nLCBvZmZlciB1cCB0byBqb3kuCiAgICBNeSBodXNiYW5kIGxpdmVzLCB0aGF0IFR5YmFsdCB3b3VsZCBoYXZlIHNsYWluOwogICAgQW5kIFR5YmFsdCdzIGRlYWQsIHRoYXQgd291bGQgaGF2ZSBzbGFpbiBteSBodXNiYW5kOgogICAgQWxsIHRoaXMgaXMgY29tZm9ydDsgd2hlcmVmb3JlIHdlZXAgSSB0aGVuPwogICAgU29tZSB3b3JkIHRoZXJlIHdhcywgd29yc2VyIHRoYW4gVHliYWx0J3MgZGVhdGgsCiAgICBUaGF0IG11cmRlcidkIG1lOiBJIHdvdWxkIGZvcmdldCBpdCBmYWluOwogICAgQnV0LCBPLCBpdCBwcmVzc2VzIHRvIG15IG1lbW9yeSwKICAgIExpa2UgZGFtbmVkIGd1aWx0eSBkZWVkcyB0byBzaW5uZXJzJyBtaW5kczoKICAgICdUeWJhbHQgaXMgZGVhZCwgYW5kIFJvbWVvLS1iYW5pc2hlZDsnCiAgICBUaGF0ICdiYW5pc2hlZCwnIHRoYXQgb25lIHdvcmQgJ2JhbmlzaGVkLCcKICAgIEhhdGggc2xhaW4gdGVuIHRob3VzYW5kIFR5YmFsdHMuIFR5YmFsdCdzIGRlYXRoCiAgICBXYXMgd29lIGVub3VnaCwgaWYgaXQgaGFkIGVuZGVkIHRoZXJlOgogICAgT3IsIGlmIHNvdXIgd29lIGRlbGlnaHRzIGluIGZlbGxvd3NoaXAKICAgIEFuZCBuZWVkbHkgd2lsbCBiZSByYW5rJ2Qgd2l0aCBvdGhlciBncmllZnMsCiAgICBXaHkgZm9sbG93J2Qgbm90LCB3aGVuIHNoZSBzYWlkICdUeWJhbHQncyBkZWFkLCcKICAgIFRoeSBmYXRoZXIsIG9yIHRoeSBtb3RoZXIsIG5heSwgb3IgYm90aCwKICAgIFdoaWNoIG1vZGVybiBsYW1lbnRhdGlvbnMgbWlnaHQgaGF2ZSBtb3ZlZD8KICAgIEJ1dCB3aXRoIGEgcmVhci13YXJkIGZvbGxvd2luZyBUeWJhbHQncyBkZWF0aCwKICAgICdSb21lbyBpcyBiYW5pc2hlZCwnIHRvIHNwZWFrIHRoYXQgd29yZCwKICAgIElzIGZhdGhlciwgbW90aGVyLCBUeWJhbHQsIFJvbWVvLCBKdWxpZXQsCiAgICBBbGwgc2xhaW4sIGFsbCBkZWFkLiAnUm9tZW8gaXMgYmFuaXNoZWQhJwogICAgVGhlcmUgaXMgbm8gZW5kLCBubyBsaW1pdCwgbWVhc3VyZSwgYm91bmQsCiAgICBJbiB0aGF0IHdvcmQncyBkZWF0aDsgbm8gd29yZHMgY2FuIHRoYXQgd29lIHNvdW5kLgogICAgV2hlcmUgaXMgbXkgZmF0aGVyLCBhbmQgbXkgbW90aGVyLCBudXJzZT8KCk51cnNlCgogICAgV2VlcGluZyBhbmQgd2FpbGluZyBvdmVyIFR5YmFsdCdzIGNvcnNlOgogICAgV2lsbCB5b3UgZ28gdG8gdGhlbT8gSSB3aWxsIGJyaW5nIHlvdSB0aGl0aGVyLgoKSlVMSUVUCgogICAgV2FzaCB0aGV5IGhpcyB3b3VuZHMgd2l0aCB0ZWFyczogbWluZSBzaGFsbCBiZSBzcGVudCwKICAgIFdoZW4gdGhlaXJzIGFyZSBkcnksIGZvciBSb21lbydzIGJhbmlzaG1lbnQuCiAgICBUYWtlIHVwIHRob3NlIGNvcmRzOiBwb29yIHJvcGVzLCB5b3UgYXJlIGJlZ3VpbGVkLAogICAgQm90aCB5b3UgYW5kIEk7IGZvciBSb21lbyBpcyBleGlsZWQ6CiAgICBIZSBtYWRlIHlvdSBmb3IgYSBoaWdod2F5IHRvIG15IGJlZDsKICAgIEJ1dCBJLCBhIG1haWQsIGRpZSBtYWlkZW4td2lkb3dlZC4KICAgIENvbWUsIGNvcmRzLCBjb21lLCBudXJzZTsgSSdsbCB0byBteSB3ZWRkaW5nLWJlZDsKICAgIEFuZCBkZWF0aCwgbm90IFJvbWVvLCB0YWtlIG15IG1haWRlbmhlYWQhCgpOdXJzZQoKICAgIEhpZSB0byB5b3VyIGNoYW1iZXI6IEknbGwgZmluZCBSb21lbwogICAgVG8gY29tZm9ydCB5b3U6IEkgd290IHdlbGwgd2hlcmUgaGUgaXMuCiAgICBIYXJrIHllLCB5b3VyIFJvbWVvIHdpbGwgYmUgaGVyZSBhdCBuaWdodDoKICAgIEknbGwgdG8gaGltOyBoZSBpcyBoaWQgYXQgTGF1cmVuY2UnIGNlbGwuCgpKVUxJRVQKCiAgICBPLCBmaW5kIGhpbSEgZ2l2ZSB0aGlzIHJpbmcgdG8gbXkgdHJ1ZSBrbmlnaHQsCiAgICBBbmQgYmlkIGhpbSBjb21lIHRvIHRha2UgaGlzIGxhc3QgZmFyZXdlbGwuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSAKCkZSSUFSIExBVVJFTkNFCgogICAgUm9tZW8sIGNvbWUgZm9ydGg7IGNvbWUgZm9ydGgsIHRob3UgZmVhcmZ1bCBtYW46CiAgICBBZmZsaWN0aW9uIGlzIGVuYW1vdXInZCBvZiB0aHkgcGFydHMsCiAgICBBbmQgdGhvdSBhcnQgd2VkZGVkIHRvIGNhbGFtaXR5LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEZhdGhlciwgd2hhdCBuZXdzPyB3aGF0IGlzIHRoZSBwcmluY2UncyBkb29tPwogICAgV2hhdCBzb3Jyb3cgY3JhdmVzIGFjcXVhaW50YW5jZSBhdCBteSBoYW5kLAogICAgVGhhdCBJIHlldCBrbm93IG5vdD8KCkZSSUFSIExBVVJFTkNFCgogICAgVG9vIGZhbWlsaWFyCiAgICBJcyBteSBkZWFyIHNvbiB3aXRoIHN1Y2ggc291ciBjb21wYW55OgogICAgSSBicmluZyB0aGVlIHRpZGluZ3Mgb2YgdGhlIHByaW5jZSdzIGRvb20uCgpST01FTwoKICAgIFdoYXQgbGVzcyB0aGFuIGRvb21zLWRheSBpcyB0aGUgcHJpbmNlJ3MgZG9vbT8KCkZSSUFSIExBVVJFTkNFCgogICAgQSBnZW50bGVyIGp1ZGdtZW50IHZhbmlzaCdkIGZyb20gaGlzIGxpcHMsCiAgICBOb3QgYm9keSdzIGRlYXRoLCBidXQgYm9keSdzIGJhbmlzaG1lbnQuCgpST01FTwoKICAgIEhhLCBiYW5pc2htZW50ISBiZSBtZXJjaWZ1bCwgc2F5ICdkZWF0aDsnCiAgICBGb3IgZXhpbGUgaGF0aCBtb3JlIHRlcnJvciBpbiBoaXMgbG9vaywKICAgIE11Y2ggbW9yZSB0aGFuIGRlYXRoOiBkbyBub3Qgc2F5ICdiYW5pc2htZW50LicKCkZSSUFSIExBVVJFTkNFCgogICAgSGVuY2UgZnJvbSBWZXJvbmEgYXJ0IHRob3UgYmFuaXNoZWQ6CiAgICBCZSBwYXRpZW50LCBmb3IgdGhlIHdvcmxkIGlzIGJyb2FkIGFuZCB3aWRlLgoKUk9NRU8KCiAgICBUaGVyZSBpcyBubyB3b3JsZCB3aXRob3V0IFZlcm9uYSB3YWxscywKICAgIEJ1dCBwdXJnYXRvcnksIHRvcnR1cmUsIGhlbGwgaXRzZWxmLgogICAgSGVuY2UtYmFuaXNoZWQgaXMgYmFuaXNoJ2QgZnJvbSB0aGUgd29ybGQsCiAgICBBbmQgd29ybGQncyBleGlsZSBpcyBkZWF0aDogdGhlbiBiYW5pc2hlZCwKICAgIElzIGRlYXRoIG1pcy10ZXJtJ2Q6IGNhbGxpbmcgZGVhdGggYmFuaXNobWVudCwKICAgIFRob3UgY3V0dCdzdCBteSBoZWFkIG9mZiB3aXRoIGEgZ29sZGVuIGF4ZSwKICAgIEFuZCBzbWlsZXN0IHVwb24gdGhlIHN0cm9rZSB0aGF0IG11cmRlcnMgbWUuCgpGUklBUiBMQVVSRU5DRQoKICAgIE8gZGVhZGx5IHNpbiEgTyBydWRlIHVudGhhbmtmdWxuZXNzIQogICAgVGh5IGZhdWx0IG91ciBsYXcgY2FsbHMgZGVhdGg7IGJ1dCB0aGUga2luZCBwcmluY2UsCiAgICBUYWtpbmcgdGh5IHBhcnQsIGhhdGggcnVzaCdkIGFzaWRlIHRoZSBsYXcsCiAgICBBbmQgdHVybidkIHRoYXQgYmxhY2sgd29yZCBkZWF0aCB0byBiYW5pc2htZW50OgogICAgVGhpcyBpcyBkZWFyIG1lcmN5LCBhbmQgdGhvdSBzZWVzdCBpdCBub3QuCgpST01FTwoKICAgICdUaXMgdG9ydHVyZSwgYW5kIG5vdCBtZXJjeTogaGVhdmVuIGlzIGhlcmUsCiAgICBXaGVyZSBKdWxpZXQgbGl2ZXM7IGFuZCBldmVyeSBjYXQgYW5kIGRvZwogICAgQW5kIGxpdHRsZSBtb3VzZSwgZXZlcnkgdW53b3J0aHkgdGhpbmcsCiAgICBMaXZlIGhlcmUgaW4gaGVhdmVuIGFuZCBtYXkgbG9vayBvbiBoZXI7CiAgICBCdXQgUm9tZW8gbWF5IG5vdDogbW9yZSB2YWxpZGl0eSwKICAgIE1vcmUgaG9ub3VyYWJsZSBzdGF0ZSwgbW9yZSBjb3VydHNoaXAgbGl2ZXMKICAgIEluIGNhcnJpb24tZmxpZXMgdGhhbiBSb21lbzogdGhleSBteSBzZWl6ZQogICAgT24gdGhlIHdoaXRlIHdvbmRlciBvZiBkZWFyIEp1bGlldCdzIGhhbmQKICAgIEFuZCBzdGVhbCBpbW1vcnRhbCBibGVzc2luZyBmcm9tIGhlciBsaXBzLAogICAgV2hvIGV2ZW4gaW4gcHVyZSBhbmQgdmVzdGFsIG1vZGVzdHksCiAgICBTdGlsbCBibHVzaCwgYXMgdGhpbmtpbmcgdGhlaXIgb3duIGtpc3NlcyBzaW47CiAgICBCdXQgUm9tZW8gbWF5IG5vdDsgaGUgaXMgYmFuaXNoZWQ6CiAgICBGbGllcyBtYXkgZG8gdGhpcywgYnV0IEkgZnJvbSB0aGlzIG11c3QgZmx5OgogICAgVGhleSBhcmUgZnJlZSBtZW4sIGJ1dCBJIGFtIGJhbmlzaGVkLgogICAgQW5kIHNheSdzdCB0aG91IHlldCB0aGF0IGV4aWxlIGlzIG5vdCBkZWF0aD8KICAgIEhhZHN0IHRob3Ugbm8gcG9pc29uIG1peCdkLCBubyBzaGFycC1ncm91bmQga25pZmUsCiAgICBObyBzdWRkZW4gbWVhbiBvZiBkZWF0aCwgdGhvdWdoIG5lJ2VyIHNvIG1lYW4sCiAgICBCdXQgJ2JhbmlzaGVkJyB0byBraWxsIG1lPy0tJ2JhbmlzaGVkJz8KICAgIE8gZnJpYXIsIHRoZSBkYW1uZWQgdXNlIHRoYXQgd29yZCBpbiBoZWxsOwogICAgSG93bGluZ3MgYXR0ZW5kIGl0OiBob3cgaGFzdCB0aG91IHRoZSBoZWFydCwKICAgIEJlaW5nIGEgZGl2aW5lLCBhIGdob3N0bHkgY29uZmVzc29yLAogICAgQSBzaW4tYWJzb2x2ZXIsIGFuZCBteSBmcmllbmQgcHJvZmVzcydkLAogICAgVG8gbWFuZ2xlIG1lIHdpdGggdGhhdCB3b3JkICdiYW5pc2hlZCcCgpGUklBUiBMQVVSRU5DRQoKICAgIFRob3UgZm9uZCBtYWQgbWFuLCBoZWFyIG1lIGJ1dCBzcGVhayBhIHdvcmQuCgpST01FTwoKICAgIE8sIHRob3Ugd2lsdCBzcGVhayBhZ2FpbiBvZiBiYW5pc2htZW50LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJJ2xsIGdpdmUgdGhlZSBhcm1vdXIgdG8ga2VlcCBvZmYgdGhhdCB3b3JkOgogICAgQWR2ZXJzaXR5J3Mgc3dlZXQgbWlsaywgcGhpbG9zb3BoeSwKICAgIFRvIGNvbWZvcnQgdGhlZSwgdGhvdWdoIHRob3UgYXJ0IGJhbmlzaGVkLgoKUk9NRU8KCiAgICBZZXQgJ2JhbmlzaGVkJz8gSGFuZyB1cCBwaGlsb3NvcGh5IQogICAgVW5sZXNzIHBoaWxvc29waHkgY2FuIG1ha2UgYSBKdWxpZXQsCiAgICBEaXNwbGFudCBhIHRvd24sIHJldmVyc2UgYSBwcmluY2UncyBkb29tLAogICAgSXQgaGVscHMgbm90LCBpdCBwcmV2YWlscyBub3Q6IHRhbGsgbm8gbW9yZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTywgdGhlbiBJIHNlZSB0aGF0IG1hZG1lbiBoYXZlIG5vIGVhcnMuCgpST01FTwoKICAgIEhvdyBzaG91bGQgdGhleSwgd2hlbiB0aGF0IHdpc2UgbWVuIGhhdmUgbm8gZXllcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTGV0IG1lIGRpc3B1dGUgd2l0aCB0aGVlIG9mIHRoeSBlc3RhdGUuCgpST01FTwoKICAgIFRob3UgY2Fuc3Qgbm90IHNwZWFrIG9mIHRoYXQgdGhvdSBkb3N0IG5vdCBmZWVsOgogICAgV2VydCB0aG91IGFzIHlvdW5nIGFzIEksIEp1bGlldCB0aHkgbG92ZSwKICAgIEFuIGhvdXIgYnV0IG1hcnJpZWQsIFR5YmFsdCBtdXJkZXJlZCwKICAgIERvdGluZyBsaWtlIG1lIGFuZCBsaWtlIG1lIGJhbmlzaGVkLAogICAgVGhlbiBtaWdodHN0IHRob3Ugc3BlYWssIHRoZW4gbWlnaHRzdCB0aG91IHRlYXIgdGh5IGhhaXIsCiAgICBBbmQgZmFsbCB1cG9uIHRoZSBncm91bmQsIGFzIEkgZG8gbm93LAogICAgVGFraW5nIHRoZSBtZWFzdXJlIG9mIGFuIHVubWFkZSBncmF2ZS4KCiAgICBLbm9ja2luZyB3aXRoaW4KCkZSSUFSIExBVVJFTkNFCgogICAgQXJpc2U7IG9uZSBrbm9ja3M7IGdvb2QgUm9tZW8sIGhpZGUgdGh5c2VsZi4KClJPTUVPCgogICAgTm90IEk7IHVubGVzcyB0aGUgYnJlYXRoIG9mIGhlYXJ0c2ljayBncm9hbnMsCiAgICBNaXN0LWxpa2UsIGluZm9sZCBtZSBmcm9tIHRoZSBzZWFyY2ggb2YgZXllcy4KCiAgICBLbm9ja2luZwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIYXJrLCBob3cgdGhleSBrbm9jayEgV2hvJ3MgdGhlcmUIFJvbWVvLCBhcmlzZTsKICAgIFRob3Ugd2lsdCBiZSB0YWtlbi4gU3RheSBhd2hpbGUhIFN0YW5kIHVwOwoKICAgIEtub2NraW5nCiAgICBSdW4gdG8gbXkgc3R1ZHkuIEJ5IGFuZCBieSEgR29kJ3Mgd2lsbCwKICAgIFdoYXQgc2ltcGxlbmVzcyBpcyB0aGlzISBJIGNvbWUsIEkgY29tZSEKCiAgICBLbm9ja2luZwogICAgV2hvIGtub2NrcyBzbyBoYXJkPyB3aGVuY2UgY29tZSB5b3UIHdoYXQncyB5b3VyIHdpbGwCgpOdXJzZQoKICAgIFtXaXRoaW5dIExldCBtZSBjb21lIGluLCBhbmQgeW91IHNoYWxsIGtub3cKICAgIG15IGVycmFuZDsKICAgIEkgY29tZSBmcm9tIExhZHkgSnVsaWV0LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXZWxjb21lLCB0aGVuLgoKICAgIEVudGVyIE51cnNlCgpOdXJzZQoKICAgIE8gaG9seSBmcmlhciwgTywgdGVsbCBtZSwgaG9seSBmcmlhciwKICAgIFdoZXJlIGlzIG15IGxhZHkncyBsb3JkLCB3aGVyZSdzIFJvbWVvPwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGVyZSBvbiB0aGUgZ3JvdW5kLCB3aXRoIGhpcyBvd24gdGVhcnMgbWFkZSBkcnVuay4KCk51cnNlCgogICAgTywgaGUgaXMgZXZlbiBpbiBteSBtaXN0cmVzcycgY2FzZSwKICAgIEp1c3QgaW4gaGVyIGNhc2UhIE8gd29mdWwgc3ltcGF0aHkhCiAgICBQaXRlb3VzIHByZWRpY2FtZW50ISBFdmVuIHNvIGxpZXMgc2hlLAogICAgQmx1YmJlcmluZyBhbmQgd2VlcGluZywgd2VlcGluZyBhbmQgYmx1YmJlcmluZy4KICAgIFN0YW5kIHVwLCBzdGFuZCB1cDsgc3RhbmQsIGFuZCB5b3UgYmUgYSBtYW46CiAgICBGb3IgSnVsaWV0J3Mgc2FrZSwgZm9yIGhlciBzYWtlLCByaXNlIGFuZCBzdGFuZDsKICAgIFdoeSBzaG91bGQgeW91IGZhbGwgaW50byBzbyBkZWVwIGFuIE8CgpST01FTwoKICAgIE51cnNlIQoKTnVyc2UKCiAgICBBaCBzaXIhIGFoIHNpciEgV2VsbCwgZGVhdGgncyB0aGUgZW5kIG9mIGFsbC4KClJPTUVPCgogICAgU3Bha2VzdCB0aG91IG9mIEp1bGlldD8gaG93IGlzIGl0IHdpdGggaGVyPwogICAgRG90aCBzaGUgbm90IHRoaW5rIG1lIGFuIG9sZCBtdXJkZXJlciwKICAgIE5vdyBJIGhhdmUgc3RhaW4nZCB0aGUgY2hpbGRob29kIG9mIG91ciBqb3kKICAgIFdpdGggYmxvb2QgcmVtb3ZlZCBidXQgbGl0dGxlIGZyb20gaGVyIG93bj8KICAgIFdoZXJlIGlzIHNoZT8gYW5kIGhvdyBkb3RoIHNoZT8gYW5kIHdoYXQgc2F5cwogICAgTXkgY29uY2VhbCdkIGxhZHkgdG8gb3VyIGNhbmNlbGwnZCBsb3ZlPwoKTnVyc2UKCiAgICBPLCBzaGUgc2F5cyBub3RoaW5nLCBzaXIsIGJ1dCB3ZWVwcyBhbmQgd2VlcHM7CiAgICBBbmQgbm93IGZhbGxzIG9uIGhlciBiZWQ7IGFuZCB0aGVuIHN0YXJ0cyB1cCwKICAgIEFuZCBUeWJhbHQgY2FsbHM7IGFuZCB0aGVuIG9uIFJvbWVvIGNyaWVzLAogICAgQW5kIHRoZW4gZG93biBmYWxscyBhZ2Fpbi4KClJPTUVPCgogICAgQXMgaWYgdGhhdCBuYW1lLAogICAgU2hvdCBmcm9tIHRoZSBkZWFkbHkgbGV2ZWwgb2YgYSBndW4sCiAgICBEaWQgbXVyZGVyIGhlcjsgYXMgdGhhdCBuYW1lJ3MgY3Vyc2VkIGhhbmQKICAgIE11cmRlcidkIGhlciBraW5zbWFuLiBPLCB0ZWxsIG1lLCBmcmlhciwgdGVsbCBtZSwKICAgIEluIHdoYXQgdmlsZSBwYXJ0IG9mIHRoaXMgYW5hdG9teQogICAgRG90aCBteSBuYW1lIGxvZGdlPyB0ZWxsIG1lLCB0aGF0IEkgbWF5IHNhY2sKICAgIFRoZSBoYXRlZnVsIG1hbnNpb24uCgogICAgRHJhd2luZyBoaXMgc3dvcmQKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZCB0aHkgZGVzcGVyYXRlIGhhbmQ6CiAgICBBcnQgdGhvdSBhIG1hbj8gdGh5IGZvcm0gY3JpZXMgb3V0IHRob3UgYXJ0OgogICAgVGh5IHRlYXJzIGFyZSB3b21hbmlzaDsgdGh5IHdpbGQgYWN0cyBkZW5vdGUKICAgIFRoZSB1bnJlYXNvbmFibGUgZnVyeSBvZiBhIGJlYXN0OgogICAgVW5zZWVtbHkgd29tYW4gaW4gYSBzZWVtaW5nIG1hbiEKICAgIE9yIGlsbC1iZXNlZW1pbmcgYmVhc3QgaW4gc2VlbWluZyBib3RoIQogICAgVGhvdSBoYXN0IGFtYXplZCBtZTogYnkgbXkgaG9seSBvcmRlciwKICAgIEkgdGhvdWdodCB0aHkgZGlzcG9zaXRpb24gYmV0dGVyIHRlbXBlcidkLgogICAgSGFzdCB0aG91IHNsYWluIFR5YmFsdD8gd2lsdCB0aG91IHNsYXkgdGh5c2VsZj8KICAgIEFuZCBzdGF5IHRoeSBsYWR5IHRvbyB0aGF0IGxpdmVzIGluIHRoZWUsCiAgICBCeSBkb2luZyBkYW1uZWQgaGF0ZSB1cG9uIHRoeXNlbGYCiAgICBXaHkgcmFpbCdzdCB0aG91IG9uIHRoeSBiaXJ0aCwgdGhlIGhlYXZlbiwgYW5kIGVhcnRoPwogICAgU2luY2UgYmlydGgsIGFuZCBoZWF2ZW4sIGFuZCBlYXJ0aCwgYWxsIHRocmVlIGRvIG1lZXQKICAgIEluIHRoZWUgYXQgb25jZTsgd2hpY2ggdGhvdSBhdCBvbmNlIHdvdWxkc3QgbG9zZS4KICAgIEZpZSwgZmllLCB0aG91IHNoYW1lc3QgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDsKICAgIFdoaWNoLCBsaWtlIGEgdXN1cmVyLCBhYm91bmQnc3QgaW4gYWxsLAogICAgQW5kIHVzZXN0IG5vbmUgaW4gdGhhdCB0cnVlIHVzZSBpbmRlZWQKICAgIFdoaWNoIHNob3VsZCBiZWRlY2sgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDoKICAgIFRoeSBub2JsZSBzaGFwZSBpcyBidXQgYSBmb3JtIG9mIHdheCwKICAgIERpZ3Jlc3NpbmcgZnJvbSB0aGUgdmFsb3VyIG9mIGEgbWFuOwogICAgVGh5IGRlYXIgbG92ZSBzd29ybiBidXQgaG9sbG93IHBlcmp1cnksCiAgICBLaWxsaW5nIHRoYXQgbG92ZSB3aGljaCB0aG91IGhhc3Qgdm93J2QgdG8gY2hlcmlzaDsKICAgIFRoeSB3aXQsIHRoYXQgb3JuYW1lbnQgdG8gc2hhcGUgYW5kIGxvdmUsCiAgICBNaXNzaGFwZW4gaW4gdGhlIGNvbmR1Y3Qgb2YgdGhlbSBib3RoLAogICAgTGlrZSBwb3dkZXIgaW4gYSBza2l0bGVzcyBzb2xkaWVyJ3MgZmxhc2ssCiAgICBJcyBzZXQgYWZpcmUgYnkgdGhpbmUgb3duIGlnbm9yYW5jZSwKICAgIEFuZCB0aG91IGRpc21lbWJlcidkIHdpdGggdGhpbmUgb3duIGRlZmVuY2UuCiAgICBXaGF0LCByb3VzZSB0aGVlLCBtYW4hIHRoeSBKdWxpZXQgaXMgYWxpdmUsCiAgICBGb3Igd2hvc2UgZGVhciBzYWtlIHRob3Ugd2FzdCBidXQgbGF0ZWx5IGRlYWQ7CiAgICBUaGVyZSBhcnQgdGhvdSBoYXBweTogVHliYWx0IHdvdWxkIGtpbGwgdGhlZSwKICAgIEJ1dCB0aG91IHNsZXcnc3QgVHliYWx0OyB0aGVyZSBhcmUgdGhvdSBoYXBweSB0b286CiAgICBUaGUgbGF3IHRoYXQgdGhyZWF0ZW4nZCBkZWF0aCBiZWNvbWVzIHRoeSBmcmllbmQKICAgIEFuZCB0dXJucyBpdCB0byBleGlsZTsgdGhlcmUgYXJ0IHRob3UgaGFwcHk6CiAgICBBIHBhY2sgb2YgYmxlc3NpbmdzIGxpZ2h0cyB1cCB1cG9uIHRoeSBiYWNrOwogICAgSGFwcGluZXNzIGNvdXJ0cyB0aGVlIGluIGhlciBiZXN0IGFycmF5OwogICAgQnV0LCBsaWtlIGEgbWlzYmVoYXZlZCBhbmQgc3VsbGVuIHdlbmNoLAogICAgVGhvdSBwb3V0J3N0IHVwb24gdGh5IGZvcnR1bmUgYW5kIHRoeSBsb3ZlOgogICAgVGFrZSBoZWVkLCB0YWtlIGhlZWQsIGZvciBzdWNoIGRpZSBtaXNlcmFibGUuCiAgICBHbywgZ2V0IHRoZWUgdG8gdGh5IGxvdmUsIGFzIHdhcyBkZWNyZWVkLAogICAgQXNjZW5kIGhlciBjaGFtYmVyLCBoZW5jZSBhbmQgY29tZm9ydCBoZXI6CiAgICBCdXQgbG9vayB0aG91IHN0YXkgbm90IHRpbGwgdGhlIHdhdGNoIGJlIHNldCwKICAgIEZvciB0aGVuIHRob3UgY2Fuc3Qgbm90IHBhc3MgdG8gTWFudHVhOwogICAgV2hlcmUgdGhvdSBzaGFsdCBsaXZlLCB0aWxsIHdlIGNhbiBmaW5kIGEgdGltZQogICAgVG8gYmxhemUgeW91ciBtYXJyaWFnZSwgcmVjb25jaWxlIHlvdXIgZnJpZW5kcywKICAgIEJlZyBwYXJkb24gb2YgdGhlIHByaW5jZSwgYW5kIGNhbGwgdGhlZSBiYWNrCiAgICBXaXRoIHR3ZW50eSBodW5kcmVkIHRob3VzYW5kIHRpbWVzIG1vcmUgam95CiAgICBUaGFuIHRob3Ugd2VudCdzdCBmb3J0aCBpbiBsYW1lbnRhdGlvbi4KICAgIEdvIGJlZm9yZSwgbnVyc2U6IGNvbW1lbmQgbWUgdG8gdGh5IGxhZHk7CiAgICBBbmQgYmlkIGhlciBoYXN0ZW4gYWxsIHRoZSBob3VzZSB0byBiZWQsCiAgICBXaGljaCBoZWF2eSBzb3Jyb3cgbWFrZXMgdGhlbSBhcHQgdW50bzoKICAgIFJvbWVvIGlzIGNvbWluZy4KCk51cnNlCgogICAgTyBMb3JkLCBJIGNvdWxkIGhhdmUgc3RheSdkIGhlcmUgYWxsIHRoZSBuaWdodAogICAgVG8gaGVhciBnb29kIGNvdW5zZWw6IE8sIHdoYXQgbGVhcm5pbmcgaXMhCiAgICBNeSBsb3JkLCBJJ2xsIHRlbGwgbXkgbGFkeSB5b3Ugd2lsbCBjb21lLgoKUk9NRU8KCiAgICBEbyBzbywgYW5kIGJpZCBteSBzd2VldCBwcmVwYXJlIHRvIGNoaWRlLgoKTnVyc2UKCiAgICBIZXJlLCBzaXIsIGEgcmluZyBzaGUgYmlkIG1lIGdpdmUgeW91LCBzaXI6CiAgICBIaWUgeW91LCBtYWtlIGhhc3RlLCBmb3IgaXQgZ3Jvd3MgdmVyeSBsYXRlLgoKICAgIEV4aXQKClJPTUVPCgogICAgSG93IHdlbGwgbXkgY29tZm9ydCBpcyByZXZpdmVkIGJ5IHRoaXMhCgpGUklBUiBMQVVSRU5DRQoKICAgIEdvIGhlbmNlOyBnb29kIG5pZ2h0OyBhbmQgaGVyZSBzdGFuZHMgYWxsIHlvdXIgc3RhdGU6CiAgICBFaXRoZXIgYmUgZ29uZSBiZWZvcmUgdGhlIHdhdGNoIGJlIHNldCwKICAgIE9yIGJ5IHRoZSBicmVhayBvZiBkYXkgZGlzZ3Vpc2VkIGZyb20gaGVuY2U6CiAgICBTb2pvdXJuIGluIE1hbnR1YTsgSSdsbCBmaW5kIG91dCB5b3VyIG1hbiwKICAgIEFuZCBoZSBzaGFsbCBzaWduaWZ5IGZyb20gdGltZSB0byB0aW1lCiAgICBFdmVyeSBnb29kIGhhcCB0byB5b3UgdGhhdCBjaGFuY2VzIGhlcmU6CiAgICBHaXZlIG1lIHRoeSBoYW5kOyAndGlzIGxhdGU6IGZhcmV3ZWxsOyBnb29kIG5pZ2h0LgoKUk9NRU8KCiAgICBCdXQgdGhhdCBhIGpveSBwYXN0IGpveSBjYWxscyBvdXQgb24gbWUsCiAgICBJdCB3ZXJlIGEgZ3JpZWYsIHNvIGJyaWVmIHRvIHBhcnQgd2l0aCB0aGVlOiBGYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHJvb20gaW4gQ2FwdWxldCdzIGhvdXNlLgoKICAgIEVudGVyIENBUFVMRVQsIExBRFkgQ0FQVUxFVCwgYW5kIFBBUklTIAoKQ0FQVUxFVAoKICAgIFRoaW5ncyBoYXZlIGZhbGwnbiBvdXQsIHNpciwgc28gdW5sdWNraWx5LAogICAgVGhhdCB3ZSBoYXZlIGhhZCBubyB0aW1lIHRvIG1vdmUgb3VyIGRhdWdodGVyOgogICAgTG9vayB5b3UsIHNoZSBsb3ZlZCBoZXIga2luc21hbiBUeWJhbHQgZGVhcmx5LAogICAgQW5kIHNvIGRpZCBJOi0tV2VsbCwgd2Ugd2VyZSBib3JuIHRvIGRpZS4KICAgICdUaXMgdmVyeSBsYXRlLCBzaGUnbGwgbm90IGNvbWUgZG93biB0by1uaWdodDoKICAgIEkgcHJvbWlzZSB5b3UsIGJ1dCBmb3IgeW91ciBjb21wYW55LAogICAgSSB3b3VsZCBoYXZlIGJlZW4gYS1iZWQgYW4gaG91ciBhZ28uCgpQQVJJUwoKICAgIFRoZXNlIHRpbWVzIG9mIHdvZSBhZmZvcmQgbm8gdGltZSB0byB3b28uCiAgICBNYWRhbSwgZ29vZCBuaWdodDogY29tbWVuZCBtZSB0byB5b3VyIGRhdWdodGVyLgoKTEFEWSBDQVBVTEVUCgogICAgSSB3aWxsLCBhbmQga25vdyBoZXIgbWluZCBlYXJseSB0by1tb3Jyb3c7CiAgICBUby1uaWdodCBzaGUgaXMgbWV3J2QgdXAgdG8gaGVyIGhlYXZpbmVzcy4KCkNBUFVMRVQKCiAgICBTaXIgUGFyaXMsIEkgd2lsbCBtYWtlIGEgZGVzcGVyYXRlIHRlbmRlcgogICAgT2YgbXkgY2hpbGQncyBsb3ZlOiBJIHRoaW5rIHNoZSB3aWxsIGJlIHJ1bGVkCiAgICBJbiBhbGwgcmVzcGVjdHMgYnkgbWU7IG5heSwgbW9yZSwgSSBkb3VidCBpdCBub3QuCiAgICBXaWZlLCBnbyB5b3UgdG8gaGVyIGVyZSB5b3UgZ28gdG8gYmVkOwogICAgQWNxdWFpbnQgaGVyIGhlcmUgb2YgbXkgc29uIFBhcmlzJyBsb3ZlOwogICAgQW5kIGJpZCBoZXIsIG1hcmsgeW91IG1lLCBvbiBXZWRuZXNkYXkgbmV4dC0tCiAgICBCdXQsIHNvZnQhIHdoYXQgZGF5IGlzIHRoaXMCgpQQVJJUwoKICAgIE1vbmRheSwgbXkgbG9yZCwKCkNBUFVMRVQKCiAgICBNb25kYXkhIGhhLCBoYSEgV2VsbCwgV2VkbmVzZGF5IGlzIHRvbyBzb29uLAogICAgTycgVGh1cnNkYXkgbGV0IGl0IGJlOiBvJyBUaHVyc2RheSwgdGVsbCBoZXIsCiAgICBTaGUgc2hhbGwgYmUgbWFycmllZCB0byB0aGlzIG5vYmxlIGVhcmwuCiAgICBXaWxsIHlvdSBiZSByZWFkeT8gZG8geW91IGxpa2UgdGhpcyBoYXN0ZT8KICAgIFdlJ2xsIGtlZXAgbm8gZ3JlYXQgYWRvLC0tYSBmcmllbmQgb3IgdHdvOwogICAgRm9yLCBoYXJrIHlvdSwgVHliYWx0IGJlaW5nIHNsYWluIHNvIGxhdGUsCiAgICBJdCBtYXkgYmUgdGhvdWdodCB3ZSBoZWxkIGhpbSBjYXJlbGVzc2x5LAogICAgQmVpbmcgb3VyIGtpbnNtYW4sIGlmIHdlIHJldmVsIG11Y2g6CiAgICBUaGVyZWZvcmUgd2UnbGwgaGF2ZSBzb21lIGhhbGYgYSBkb3plbiBmcmllbmRzLAogICAgQW5kIHRoZXJlIGFuIGVuZC4gQnV0IHdoYXQgc2F5IHlvdSB0byBUaHVyc2RheT8KClBBUklTCgogICAgTXkgbG9yZCwgSSB3b3VsZCB0aGF0IFRodXJzZGF5IHdlcmUgdG8tbW9ycm93LgoKQ0FQVUxFVAoKICAgIFdlbGwgZ2V0IHlvdSBnb25lOiBvJyBUaHVyc2RheSBiZSBpdCwgdGhlbi4KICAgIEdvIHlvdSB0byBKdWxpZXQgZXJlIHlvdSBnbyB0byBiZWQsCiAgICBQcmVwYXJlIGhlciwgd2lmZSwgYWdhaW5zdCB0aGlzIHdlZGRpbmctZGF5LgogICAgRmFyZXdlbGwsIG15IGxvcmQuIExpZ2h0IHRvIG15IGNoYW1iZXIsIGhvIQogICAgQWZvcmUgbWUhIGl0IGlzIHNvIHZlcnkgdmVyeSBsYXRlLAogICAgVGhhdCB3ZSBtYXkgY2FsbCBpdCBlYXJseSBieSBhbmQgYnkuCiAgICBHb29kIG5pZ2h0LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gYW5kIEpVTElFVCBhYm92ZSwgYXQgdGhlIHdpbmRvdyAKCkpVTElFVAoKICAgIFdpbHQgdGhvdSBiZSBnb25lPyBpdCBpcyBub3QgeWV0IG5lYXIgZGF5OgogICAgSXQgd2FzIHRoZSBuaWdodGluZ2FsZSwgYW5kIG5vdCB0aGUgbGFyaywKICAgIFRoYXQgcGllcmNlZCB0aGUgZmVhcmZ1bCBob2xsb3cgb2YgdGhpbmUgZWFyOwogICAgTmlnaHRseSBzaGUgc2luZ3Mgb24geW9uIHBvbWVncmFuYXRlLXRyZWU6CiAgICBCZWxpZXZlIG1lLCBsb3ZlLCBpdCB3YXMgdGhlIG5pZ2h0aW5nYWxlLgoKUk9NRU8KCiAgICBJdCB3YXMgdGhlIGxhcmssIHRoZSBoZXJhbGQgb2YgdGhlIG1vcm4sCiAgICBObyBuaWdodGluZ2FsZTogbG9vaywgbG92ZSwgd2hhdCBlbnZpb3VzIHN0cmVha3MKICAgIERvIGxhY2UgdGhlIHNldmVyaW5nIGNsb3VkcyBpbiB5b25kZXIgZWFzdDoKICAgIE5pZ2h0J3MgY2FuZGxlcyBhcmUgYnVybnQgb3V0LCBhbmQgam9jdW5kIGRheQogICAgU3RhbmRzIHRpcHRvZSBvbiB0aGUgbWlzdHkgbW91bnRhaW4gdG9wcy4KICAgIEkgbXVzdCBiZSBnb25lIGFuZCBsaXZlLCBvciBzdGF5IGFuZCBkaWUuCgpKVUxJRVQKCiAgICBZb24gbGlnaHQgaXMgbm90IGRheS1saWdodCwgSSBrbm93IGl0LCBJOgogICAgSXQgaXMgc29tZSBtZXRlb3IgdGhhdCB0aGUgc3VuIGV4aGFsZXMsCiAgICBUbyBiZSB0byB0aGVlIHRoaXMgbmlnaHQgYSB0b3JjaC1iZWFyZXIsCiAgICBBbmQgbGlnaHQgdGhlZSBvbiB0aHkgd2F5IHRvIE1hbnR1YToKICAgIFRoZXJlZm9yZSBzdGF5IHlldDsgdGhvdSBuZWVkJ3N0IG5vdCB0byBiZSBnb25lLgoKUk9NRU8KCiAgICBMZXQgbWUgYmUgdGEnZW4sIGxldCBtZSBiZSBwdXQgdG8gZGVhdGg7CiAgICBJIGFtIGNvbnRlbnQsIHNvIHRob3Ugd2lsdCBoYXZlIGl0IHNvLgogICAgSSdsbCBzYXkgeW9uIGdyZXkgaXMgbm90IHRoZSBtb3JuaW5nJ3MgZXllLAogICAgJ1RpcyBidXQgdGhlIHBhbGUgcmVmbGV4IG9mIEN5bnRoaWEncyBicm93OwogICAgTm9yIHRoYXQgaXMgbm90IHRoZSBsYXJrLCB3aG9zZSBub3RlcyBkbyBiZWF0CiAgICBUaGUgdmF1bHR5IGhlYXZlbiBzbyBoaWdoIGFib3ZlIG91ciBoZWFkczoKICAgIEkgaGF2ZSBtb3JlIGNhcmUgdG8gc3RheSB0aGFuIHdpbGwgdG8gZ286CiAgICBDb21lLCBkZWF0aCwgYW5kIHdlbGNvbWUhIEp1bGlldCB3aWxscyBpdCBzby4KICAgIEhvdyBpcyd0LCBteSBzb3VsPyBsZXQncyB0YWxrOyBpdCBpcyBub3QgZGF5LgoKSlVMSUVUCgogICAgSXQgaXMsIGl0IGlzOiBoaWUgaGVuY2UsIGJlIGdvbmUsIGF3YXkhCiAgICBJdCBpcyB0aGUgbGFyayB0aGF0IHNpbmdzIHNvIG91dCBvZiB0dW5lLAogICAgU3RyYWluaW5nIGhhcnNoIGRpc2NvcmRzIGFuZCB1bnBsZWFzaW5nIHNoYXJwcy4KICAgIFNvbWUgc2F5IHRoZSBsYXJrIG1ha2VzIHN3ZWV0IGRpdmlzaW9uOwogICAgVGhpcyBkb3RoIG5vdCBzbywgZm9yIHNoZSBkaXZpZGV0aCB1czoKICAgIFNvbWUgc2F5IHRoZSBsYXJrIGFuZCBsb2F0aGVkIHRvYWQgY2hhbmdlIGV5ZXMsCiAgICBPLCBub3cgSSB3b3VsZCB0aGV5IGhhZCBjaGFuZ2VkIHZvaWNlcyB0b28hCiAgICBTaW5jZSBhcm0gZnJvbSBhcm0gdGhhdCB2b2ljZSBkb3RoIHVzIGFmZnJheSwKICAgIEh1bnRpbmcgdGhlZSBoZW5jZSB3aXRoIGh1bnQnc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cmUgd2VlcGluZyBmb3IgeW91ciBjb3VzaW4ncyBkZWF0aD8KICAgIFdoYXQsIHdpbHQgdGhvdSB3YXNoIGhpbSBmcm9tIGhpcyBncmF2ZSB3aXRoIHRlYXJzPwogICAgQW4gaWYgdGhvdSBjb3VsZHN0LCB0aG91IGNvdWxkc3Qgbm90IG1ha2UgaGltIGxpdmU7CiAgICBUaGVyZWZvcmUsIGhhdmUgZG9uZTogc29tZSBncmllZiBzaG93cyBtdWNoIG9mIGxvdmU7CiAgICBCdXQgbXVjaCBvZiBncmllZiBzaG93cyBzdGlsbCBzb21lIHdhbnQgb2Ygd2l0LgoKSlVMSUVUCgogICAgWWV0IGxldCBtZSB3ZWVwIGZvciBzdWNoIGEgZmVlbGluZyBsb3NzLgoKTEFEWSBDQVBVTEVUCgogICAgU28gc2hhbGwgeW91IGZlZWwgdGhlIGxvc3MsIGJ1dCBub3QgdGhlIGZyaWVuZAogICAgV2hpY2ggeW91IHdlZXAgZm9yLgoKSlVMSUVUCgogICAgRmVlbGluZyBzbyB0aGUgbG9zcywKICAgIENhbm5vdCBjaG9vc2UgYnV0IGV2ZXIgd2VlcCB0aGUgZnJpZW5kLgoKTEFEWSBDQVBVTEVUCgogICAgV2VsbCwgZ2lybCwgdGhvdSB3ZWVwJ3N0IG5vdCBzbyBtdWNoIGZvciBoaXMgZGVhdGgsCiAgICBBcyB0aGF0IHRoZSB2aWxsYWluIGxpdmVzIHdoaWNoIHNsYXVnaHRlcidkIGhpbS4KCkpVTElFVAoKICAgIFdoYXQgdmlsbGFpbiBtYWRhbT8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoYXQgc2FtZSB2aWxsYWluLCBSb21lby4KCkpVTElFVAoKICAgIFtBc2lkZV0gVmlsbGFpbiBhbmQgaGUgYmUgbWFueSBtaWxlcyBhc3VuZGVyLi0tCiAgICBHb2QgUGFyZG9uIGhpbSEgSSBkbywgd2l0aCBhbGwgbXkgaGVhcnQ7CiAgICBBbmQgeWV0IG5vIG1hbiBsaWtlIGhlIGRvdGggZ3JpZXZlIG15IGhlYXJ0LgoKTEFEWSBDQVBVTEVUCgogICAgVGhhdCBpcywgYmVjYXVzZSB0aGUgdHJhaXRvciBtdXJkZXJlciBsaXZlcy4KCkpVTElFVAoKICAgIEF5LCBtYWRhbSwgZnJvbSB0aGUgcmVhY2ggb2YgdGhlc2UgbXkgaGFuZHM6CiAgICBXb3VsZCBub25lIGJ1dCBJIG1pZ2h0IHZlbmdlIG15IGNvdXNpbidzIGRlYXRoIQoKTEFEWSBDQVBVTEVUCgogICAgV2Ugd2lsbCBoYXZlIHZlbmdlYW5jZSBmb3IgaXQsIGZlYXIgdGhvdSBub3Q6CiAgICBUaGVuIHdlZXAgbm8gbW9yZS4gSSdsbCBzZW5kIHRvIG9uZSBpbiBNYW50dWEsCiAgICBXaGVyZSB0aGF0IHNhbWUgYmFuaXNoJ2QgcnVuYWdhdGUgZG90aCBsaXZlLAogICAgU2hhbGwgZ2l2ZSBoaW0gc3VjaCBhbiB1bmFjY3VzdG9tJ2QgZHJhbSwKICAgIFRoYXQgaGUgc2hhbGwgc29vbiBrZWVwIFR5YmFsdCBjb21wYW55OgogICAgQW5kIHRoZW4sIEkgaG9wZSwgdGhvdSB3aWx0IGJlIHNhdGlzZmllZC4KCkpVTElFVAoKICAgIEluZGVlZCwgSSBuZXZlciBzaGFsbCBiZSBzYXRpc2ZpZWQKICAgIFdpdGggUm9tZW8sIHRpbGwgSSBiZWhvbGQgaGltLS1kZWFkLS0KICAgIElzIG15IHBvb3IgaGVhcnQgZm9yIGEga2luc21hbiB2ZXgnZC4KICAgIE1hZGFtLCBpZiB5b3UgY291bGQgZmluZCBvdXQgYnV0IGEgbWFuCiAgICBUbyBiZWFyIGEgcG9pc29uLCBJIHdvdWxkIHRlbXBlciBpdDsKICAgIFRoYXQgUm9tZW8gc2hvdWxkLCB1cG9uIHJlY2VpcHQgdGhlcmVvZiwKICAgIFNvb24gc2xlZXAgaW4gcXVpZXQuIE8sIGhvdyBteSBoZWFydCBhYmhvcnMKICAgIFRvIGhlYXIgaGltIG5hbWVkLCBhbmQgY2Fubm90IGNvbWUgdG8gaGltLgogICAgVG8gd3JlYWsgdGhlIGxvdmUgSSBib3JlIG15IGNvdXNpbgogICAgVXBvbiBoaXMgYm9keSB0aGF0IHNsYXVnaHRlcidkIGhpbSEKCkxBRFkgQ0FQVUxFVAoKICAgIEZpbmQgdGhvdSB0aGUgbWVhbnMsIGFuZCBJJ2xsIGZpbmQgc3VjaCBhIG1hbi4KICAgIEJ1dCBub3cgSSdsbCB0ZWxsIHRoZWUgam95ZnVsIHRpZGluZ3MsIGdpcmwuCgpKVUxJRVQKCiAgICBBbmQgam95IGNvbWVzIHdlbGwgaW4gc3VjaCBhIG5lZWR5IHRpbWU6CiAgICBXaGF0IGFyZSB0aGV5LCBJIGJlc2VlY2ggeW91ciBsYWR5c2hpcD8KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHdlbGwsIHRob3UgaGFzdCBhIGNhcmVmdWwgZmF0aGVyLCBjaGlsZDsKICAgIE9uZSB3aG8sIHRvIHB1dCB0aGVlIGZyb20gdGh5IGhlYXZpbmVzcywKICAgIEhhdGggc29ydGVkIG91dCBhIHN1ZGRlbiBkYXkgb2Ygam95LAogICAgVGhhdCB0aG91IGV4cGVjdCdzdCBub3Qgbm9yIEkgbG9vaydkIG5vdCBmb3IuCgpKVUxJRVQKCiAgICBNYWRhbSwgaW4gaGFwcHkgdGltZSwgd2hhdCBkYXkgaXMgdGhhdD8KCkxBRFkgQ0FQVUxFVAoKICAgIE1hcnJ5LCBteSBjaGlsZCwgZWFybHkgbmV4dCBUaHVyc2RheSBtb3JuLAogICAgVGhlIGdhbGxhbnQsIHlvdW5nIGFuZCBub2JsZSBnZW50bGVtYW4sCiAgICBUaGUgQ291bnR5IFBhcmlzLCBhdCBTYWludCBQZXRlcidzIENodXJjaCwKICAgIFNoYWxsIGhhcHBpbHkgbWFrZSB0aGVlIHRoZXJlIGEgam95ZnVsIGJyaWRlLgoKSlVMSUVUCgogICAgTm93LCBieSBTYWludCBQZXRlcidzIENodXJjaCBhbmQgUGV0ZXIgdG9vLAogICAgSGUgc2hhbGwgbm90IG1ha2UgbWUgdGhlcmUgYSBqb3lmdWwgYnJpZGUuCiAgICBJIHdvbmRlciBhdCB0aGlzIGhhc3RlOyB0aGF0IEkgbXVzdCB3ZWQKICAgIEVyZSBoZSwgdGhhdCBzaG91bGQgYmUgaHVzYmFuZCwgY29tZXMgdG8gd29vLgogICAgSSBwcmF5IHlvdSwgdGVsbCBteSBsb3JkIGFuZCBmYXRoZXIsIG1hZGFtLAogICAgSSB3aWxsIG5vdCBtYXJyeSB5ZXQ7IGFuZCwgd2hlbiBJIGRvLCBJIHN3ZWFyLAogICAgSXQgc2hhbGwgYmUgUm9tZW8sIHdob20geW91IGtub3cgSSBoYXRlLAogICAgUmF0aGVyIHRoYW4gUGFyaXMuIFRoZXNlIGFyZSBuZXdzIGluZGVlZCEKCkxBRFkgQ0FQVUxFVAoKICAgIEhlcmUgY29tZXMgeW91ciBmYXRoZXI7IHRlbGwgaGltIHNvIHlvdXJzZWxmLAogICAgQW5kIHNlZSBob3cgaGUgd2lsbCB0YWtlIGl0IGF0IHlvdXIgaGFuZHMuCgogICAgRW50ZXIgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBXaGVuIHRoZSBzdW4gc2V0cywgdGhlIGFpciBkb3RoIGRyaXp6bGUgZGV3OwogICAgQnV0IGZvciB0aGUgc3Vuc2V0IG9mIG15IGJyb3RoZXIncyBzb24KICAgIEl0IHJhaW5zIGRvd25yaWdodC4KICAgIEhvdyBub3chIGEgY29uZHVpdCwgZ2lybD8gd2hhdCwgc3RpbGwgaW4gdGVhcnMCiAgICBFdmVybW9yZSBzaG93ZXJpbmcIEluIG9uZSBsaXR0bGUgYm9keQogICAgVGhvdSBjb3VudGVyZmVpdCdzdCBhIGJhcmssIGEgc2VhLCBhIHdpbmQ7CiAgICBGb3Igc3RpbGwgdGh5IGV5ZXMsIHdoaWNoIEkgbWF5IGNhbGwgdGhlIHNlYSwKICAgIERvIGViYiBhbmQgZmxvdyB3aXRoIHRlYXJzOyB0aGUgYmFyayB0aHkgYm9keSBpcywKICAgIFNhaWxpbmcgaW4gdGhpcyBzYWx0IGZsb29kOyB0aGUgd2luZHMsIHRoeSBzaWdoczsKICAgIFdobywgcmFnaW5nIHdpdGggdGh5IHRlYXJzLCBhbmQgdGhleSB3aXRoIHRoZW0sCiAgICBXaXRob3V0IGEgc3VkZGVuIGNhbG0sIHdpbGwgb3ZlcnNldAogICAgVGh5IHRlbXBlc3QtdG9zc2VkIGJvZHkuIEhvdyBub3csIHdpZmUhCiAgICBIYXZlIHlvdSBkZWxpdmVyJ2QgdG8gaGVyIG91ciBkZWNyZWUCgpMQURZIENBUFVMRVQKCiAgICBBeSwgc2lyOyBidXQgc2hlIHdpbGwgbm9uZSwgc2hlIGdpdmVzIHlvdSB0aGFua3MuCiAgICBJIHdvdWxkIHRoZSBmb29sIHdlcmUgbWFycmllZCB0byBoZXIgZ3JhdmUhCgpDQVBVTEVUCgogICAgU29mdCEgdGFrZSBtZSB3aXRoIHlvdSwgdGFrZSBtZSB3aXRoIHlvdSwgd2lmZS4KICAgIEhvdyEgd2lsbCBzaGUgbm9uZT8gZG90aCBzaGUgbm90IGdpdmUgdXMgdGhhbmtzPwogICAgSXMgc2hlIG5vdCBwcm91ZD8gZG90aCBzaGUgbm90IGNvdW50IGhlciBibGVzdCwKICAgIFVud29ydGh5IGFzIHNoZSBpcywgdGhhdCB3ZSBoYXZlIHdyb3VnaHQKICAgIFNvIHdvcnRoeSBhIGdlbnRsZW1hbiB0byBiZSBoZXIgYnJpZGVncm9vbT8KCkpVTElFVAoKICAgIE5vdCBwcm91ZCwgeW91IGhhdmU7IGJ1dCB0aGFua2Z1bCwgdGhhdCB5b3UgaGF2ZToKICAgIFByb3VkIGNhbiBJIG5ldmVyIGJlIG9mIHdoYXQgSSBoYXRlOwogICAgQnV0IHRoYW5rZnVsIGV2ZW4gZm9yIGhhdGUsIHRoYXQgaXMgbWVhbnQgbG92ZS4KCkNBUFVMRVQKCiAgICBIb3cgbm93LCBob3cgbm93LCBjaG9wLWxvZ2ljISBXaGF0IGlzIHRoaXMCiAgICAnUHJvdWQsJyBhbmQgJ0kgdGhhbmsgeW91LCcgYW5kICdJIHRoYW5rIHlvdSBub3Q7JwogICAgQW5kIHlldCAnbm90IHByb3VkLCcgbWlzdHJlc3MgbWluaW9uLCB5b3UsCiAgICBUaGFuayBtZSBubyB0aGFua2luZ3MsIG5vciwgcHJvdWQgbWUgbm8gcHJvdWRzLAogICAgQnV0IGZldHRsZSB5b3VyIGZpbmUgam9pbnRzICdnYWluc3QgVGh1cnNkYXkgbmV4dCwKICAgIFRvIGdvIHdpdGggUGFyaXMgdG8gU2FpbnQgUGV0ZXIncyBDaHVyY2gsCiAgICBPciBJIHdpbGwgZHJhZyB0aGVlIG9uIGEgaHVyZGxlIHRoaXRoZXIuCiAgICBPdXQsIHlvdSBncmVlbi1zaWNrbmVzcyBjYXJyaW9uISBvdXQsIHlvdSBiYWdnYWdlIQogICAgWW91IHRhbGxvdy1mYWNlIQoKTEFEWSBDQVBVTEVUCgogICAgRmllLCBmaWUhIHdoYXQsIGFyZSB5b3UgbWFkPwoKSlVMSUVUCgogICAgR29vZCBmYXRoZXIsIEkgYmVzZWVjaCB5b3Ugb24gbXkga25lZXMsCiAgICBIZWFyIG1lIHdpdGggcGF0aWVuY2UgYnV0IHRvIHNwZWFrIGEgd29yZC4KCkNBUFVMRVQKCiAgICBIYW5nIHRoZWUsIHlvdW5nIGJhZ2dhZ2UhIGRpc29iZWRpZW50IHdyZXRjaCEKICAgIEkgdGVsbCB0aGVlIHdoYXQ6IGdldCB0aGVlIHRvIGNodXJjaCBvJyBUaHVyc2RheSwKICAgIE9yIG5ldmVyIGFmdGVyIGxvb2sgbWUgaW4gdGhlIGZhY2U6CiAgICBTcGVhayBub3QsIHJlcGx5IG5vdCwgZG8gbm90IGFuc3dlciBtZTsKICAgIE15IGZpbmdlcnMgaXRjaC4gV2lmZSwgd2Ugc2NhcmNlIHRob3VnaHQgdXMgYmxlc3QKICAgIFRoYXQgR29kIGhhZCBsZW50IHVzIGJ1dCB0aGlzIG9ubHkgY2hpbGQ7CiAgICBCdXQgbm93IEkgc2VlIHRoaXMgb25lIGlzIG9uZSB0b28gbXVjaCwKICAgIEFuZCB0aGF0IHdlIGhhdmUgYSBjdXJzZSBpbiBoYXZpbmcgaGVyOgogICAgT3V0IG9uIGhlciwgaGlsZGluZyEKCk51cnNlCgogICAgR29kIGluIGhlYXZlbiBibGVzcyBoZXIhCiAgICBZb3UgYXJlIHRvIGJsYW1lLCBteSBsb3JkLCB0byByYXRlIGhlciBzby4KCkNBUFVMRVQKCiAgICBBbmQgd2h5LCBteSBsYWR5IHdpc2RvbT8gaG9sZCB5b3VyIHRvbmd1ZSwKICAgIEdvb2QgcHJ1ZGVuY2U7IHNtYXR0ZXIgd2l0aCB5b3VyIGdvc3NpcHMsIGdvLgoKTnVyc2UKCiAgICBJIHNwZWFrIG5vIHRyZWFzb24uCgpDQVBVTEVUCgogICAgTywgR29kIHllIGdvZC1kZW4uCgpOdXJzZQoKICAgIE1heSBub3Qgb25lIHNwZWFrPwoKQ0FQVUxFVAoKICAgIFBlYWNlLCB5b3UgbXVtYmxpbmcgZm9vbCEKICAgIFV0dGVyIHlvdXIgZ3Jhdml0eSBvJ2VyIGEgZ29zc2lwJ3MgYm93bDsKICAgIEZvciBoZXJlIHdlIG5lZWQgaXQgbm90LgoKTEFEWSBDQVBVTEVUCgogICAgWW91IGFyZSB0b28gaG90LgoKQ0FQVUxFVAoKICAgIEdvZCdzIGJyZWFkISBpdCBtYWtlcyBtZSBtYWQ6CiAgICBEYXksIG5pZ2h0LCBob3VyLCB0aWRlLCB0aW1lLCB3b3JrLCBwbGF5LAogICAgQWxvbmUsIGluIGNvbXBhbnksIHN0aWxsIG15IGNhcmUgaGF0aCBiZWVuCiAgICBUbyBoYXZlIGhlciBtYXRjaCdkOiBhbmQgaGF2aW5nIG5vdyBwcm92aWRlZAogICAgQSBnZW50bGVtYW4gb2Ygbm9ibGUgcGFyZW50YWdlLAogICAgT2YgZmFpciBkZW1lc25lcywgeW91dGhmdWwsIGFuZCBub2JseSB0cmFpbidkLAogICAgU3R1ZmYnZCwgYXMgdGhleSBzYXksIHdpdGggaG9ub3VyYWJsZSBwYXJ0cywKICAgIFByb3BvcnRpb24nZCBhcyBvbmUncyB0aG91Z2h0IHdvdWxkIHdpc2ggYSBtYW47CiAgICBBbmQgdGhlbiB0byBoYXZlIGEgd3JldGNoZWQgcHVsaW5nIGZvb2wsCiAgICBBIHdoaW5pbmcgbWFtbWV0LCBpbiBoZXIgZm9ydHVuZSdzIHRlbmRlciwKICAgIFRvIGFuc3dlciAnSSdsbCBub3Qgd2VkOyBJIGNhbm5vdCBsb3ZlLAogICAgSSBhbSB0b28geW91bmc7IEkgcHJheSB5b3UsIHBhcmRvbiBtZS4nCiAgICBCdXQsIGFzIHlvdSB3aWxsIG5vdCB3ZWQsIEknbGwgcGFyZG9uIHlvdToKICAgIEdyYXplIHdoZXJlIHlvdSB3aWxsIHlvdSBzaGFsbCBub3QgaG91c2Ugd2l0aCBtZToKICAgIExvb2sgdG8ndCwgdGhpbmsgb24ndCwgSSBkbyBub3QgdXNlIHRvIGplc3QuCiAgICBUaHVyc2RheSBpcyBuZWFyOyBsYXkgaGFuZCBvbiBoZWFydCwgYWR2aXNlOgogICAgQW4geW91IGJlIG1pbmUsIEknbGwgZ2l2ZSB5b3UgdG8gbXkgZnJpZW5kOwogICAgQW5kIHlvdSBiZSBub3QsIGhhbmcsIGJlZywgc3RhcnZlLCBkaWUgaW4KICAgIHRoZSBzdHJlZXRzLAogICAgRm9yLCBieSBteSBzb3VsLCBJJ2xsIG5lJ2VyIGFja25vd2xlZGdlIHRoZWUsCiAgICBOb3Igd2hhdCBpcyBtaW5lIHNoYWxsIG5ldmVyIGRvIHRoZWUgZ29vZDoKICAgIFRydXN0IHRvJ3QsIGJldGhpbmsgeW91OyBJJ2xsIG5vdCBiZSBmb3Jzd29ybi4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBJcyB0aGVyZSBubyBwaXR5IHNpdHRpbmcgaW4gdGhlIGNsb3VkcywKICAgIFRoYXQgc2VlcyBpbnRvIHRoZSBib3R0b20gb2YgbXkgZ3JpZWYCiAgICBPLCBzd2VldCBteSBtb3RoZXIsIGNhc3QgbWUgbm90IGF3YXkhCiAgICBEZWxheSB0aGlzIG1hcnJpYWdlIGZvciBhIG1vbnRoLCBhIHdlZWs7CiAgICBPciwgaWYgeW91IGRvIG5vdCwgbWFrZSB0aGUgYnJpZGFsIGJlZAogICAgSW4gdGhhdCBkaW0gbW9udW1lbnQgd2hlcmUgVHliYWx0IGxpZXMuCgpMQURZIENBUFVMRVQKCiAgICBUYWxrIG5vdCB0byBtZSwgZm9yIEknbGwgbm90IHNwZWFrIGEgd29yZDoKICAgIERvIGFzIHRob3Ugd2lsdCwgZm9yIEkgaGF2ZSBkb25lIHdpdGggdGhlZS4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIEdvZCEtLU8gbnVyc2UsIGhvdyBzaGFsbCB0aGlzIGJlIHByZXZlbnRlZD8KICAgIE15IGh1c2JhbmQgaXMgb24gZWFydGgsIG15IGZhaXRoIGluIGhlYXZlbjsKICAgIEhvdyBzaGFsbCB0aGF0IGZhaXRoIHJldHVybiBhZ2FpbiB0byBlYXJ0aCwKICAgIFVubGVzcyB0aGF0IGh1c2JhbmQgc2VuZCBpdCBtZSBmcm9tIGhlYXZlbgogICAgQnkgbGVhdmluZyBlYXJ0aD8gY29tZm9ydCBtZSwgY291bnNlbCBtZS4KICAgIEFsYWNrLCBhbGFjaywgdGhhdCBoZWF2ZW4gc2hvdWxkIHByYWN0aXNlIHN0cmF0YWdlbXMKICAgIFVwb24gc28gc29mdCBhIHN1YmplY3QgYXMgbXlzZWxmIQogICAgV2hhdCBzYXknc3QgdGhvdT8gaGFzdCB0aG91IG5vdCBhIHdvcmQgb2Ygam95PwogICAgU29tZSBjb21mb3J0LCBudXJzZS4KCk51cnNlCgogICAgRmFpdGgsIGhlcmUgaXQgaXMuCiAgICBSb21lbyBpcyBiYW5pc2gnZDsgYW5kIGFsbCB0aGUgd29ybGQgdG8gbm90aGluZywKICAgIFRoYXQgaGUgZGFyZXMgbmUnZXIgY29tZSBiYWNrIHRvIGNoYWxsZW5nZSB5b3U7CiAgICBPciwgaWYgaGUgZG8sIGl0IG5lZWRzIG11c3QgYmUgYnkgc3RlYWx0aC4KICAgIFRoZW4sIHNpbmNlIHRoZSBjYXNlIHNvIHN0YW5kcyBhcyBub3cgaXQgZG90aCwKICAgIEkgdGhpbmsgaXQgYmVzdCB5b3UgbWFycmllZCB3aXRoIHRoZSBjb3VudHkuCiAgICBPLCBoZSdzIGEgbG92ZWx5IGdlbnRsZW1hbiEKICAgIFJvbWVvJ3MgYSBkaXNoY2xvdXQgdG8gaGltOiBhbiBlYWdsZSwgbWFkYW0sCiAgICBIYXRoIG5vdCBzbyBncmVlbiwgc28gcXVpY2ssIHNvIGZhaXIgYW4gZXllCiAgICBBcyBQYXJpcyBoYXRoLiBCZXNocmV3IG15IHZlcnkgaGVhcnQsCiAgICBJIHRoaW5rIHlvdSBhcmUgaGFwcHkgaW4gdGhpcyBzZWNvbmQgbWF0Y2gsCiAgICBGb3IgaXQgZXhjZWxzIHlvdXIgZmlyc3Q6IG9yIGlmIGl0IGRpZCBub3QsCiAgICBZb3VyIGZpcnN0IGlzIGRlYWQ7IG9yICd0d2VyZSBhcyBnb29kIGhlIHdlcmUsCiAgICBBcyBsaXZpbmcgaGVyZSBhbmQgeW91IG5vIHVzZSBvZiBoaW0uCgpKVUxJRVQKCiAgICBTcGVha2VzdCB0aG91IGZyb20gdGh5IGhlYXJ0PwoKTnVyc2UKCiAgICBBbmQgZnJvbSBteSBzb3VsIHRvbzsKICAgIE9yIGVsc2UgYmVzaHJldyB0aGVtIGJvdGguCgpKVUxJRVQKCiAgICBBbWVuIQoKTnVyc2UKCiAgICBXaGF0PwoKSlVMSUVUCgogICAgV2VsbCwgdGhvdSBoYXN0IGNvbWZvcnRlZCBtZSBtYXJ2ZWxsb3VzIG11Y2guCiAgICBHbyBpbjogYW5kIHRlbGwgbXkgbGFkeSBJIGFtIGdvbmUsCiAgICBIYXZpbmcgZGlzcGxlYXNlZCBteSBmYXRoZXIsIHRvIExhdXJlbmNlJyBjZWxsLAogICAgVG8gbWFrZSBjb25mZXNzaW9uIGFuZCB0byBiZSBhYnNvbHZlZC4KCk51cnNlCgogICAgTWFycnksIEkgd2lsbDsgYW5kIHRoaXMgaXMgd2lzZWx5IGRvbmUuCgogICAgRXhpdAoKSlVMSUVUCgogICAgQW5jaWVudCBkYW1uYXRpb24hIE8gbW9zdCB3aWNrZWQgZmllbmQhCiAgICBJcyBpdCBtb3JlIHNpbiB0byB3aXNoIG1lIHRodXMgZm9yc3dvcm4sCiAgICBPciB0byBkaXNwcmFpc2UgbXkgbG9yZCB3aXRoIHRoYXQgc2FtZSB0b25ndWUKICAgIFdoaWNoIHNoZSBoYXRoIHByYWlzZWQgaGltIHdpdGggYWJvdmUgY29tcGFyZQogICAgU28gbWFueSB0aG91c2FuZCB0aW1lcz8gR28sIGNvdW5zZWxsb3I7CiAgICBUaG91IGFuZCBteSBib3NvbSBoZW5jZWZvcnRoIHNoYWxsIGJlIHR3YWluLgogICAgSSdsbCB0byB0aGUgZnJpYXIsIHRvIGtub3cgaGlzIHJlbWVkeToKICAgIElmIGFsbCBlbHNlIGZhaWwsIG15c2VsZiBoYXZlIHBvd2VyIHRvIGRpZS4KCiAgICBFeGl0CgpBQ1QgSVYKU0NFTkUgSS4gRnJpYXIgTGF1cmVuY2UncyBjZWxsLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUyAKCkZSSUFSIExBVVJFTkNFCgogICAgT24gVGh1cnNkYXksIHNpcj8gdGhlIHRpbWUgaXMgdmVyeSBzaG9ydC4KClBBUklTCgogICAgTXkgZmF0aGVyIENhcHVsZXQgd2lsbCBoYXZlIGl0IHNvOwogICAgQW5kIEkgYW0gbm90aGluZyBzbG93IHRvIHNsYWNrIGhpcyBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgWW91IHNheSB5b3UgZG8gbm90IGtub3cgdGhlIGxhZHkncyBtaW5kOgogICAgVW5ldmVuIGlzIHRoZSBjb3Vyc2UsIEkgbGlrZSBpdCBub3QuCgpQQVJJUwoKICAgIEltbW9kZXJhdGVseSBzaGUgd2VlcHMgZm9yIFR5YmFsdCdzIGRlYXRoLAogICAgQW5kIHRoZXJlZm9yZSBoYXZlIEkgbGl0dGxlIHRhbGsnZCBvZiBsb3ZlOwogICAgRm9yIFZlbnVzIHNtaWxlcyBub3QgaW4gYSBob3VzZSBvZiB0ZWFycy4KICAgIE5vdywgc2lyLCBoZXIgZmF0aGVyIGNvdW50cyBpdCBkYW5nZXJvdXMKICAgIFRoYXQgc2hlIGRvdGggZ2l2ZSBoZXIgc29ycm93IHNvIG11Y2ggc3dheSwKICAgIEFuZCBpbiBoaXMgd2lzZG9tIGhhc3RlcyBvdXIgbWFycmlhZ2UsCiAgICBUbyBzdG9wIHRoZSBpbnVuZGF0aW9uIG9mIGhlciB0ZWFyczsKICAgIFdoaWNoLCB0b28gbXVjaCBtaW5kZWQgYnkgaGVyc2VsZiBhbG9uZSwKICAgIE1heSBiZSBwdXQgZnJvbSBoZXIgYnkgc29jaWV0eToKICAgIE5vdyBkbyB5b3Uga25vdyB0aGUgcmVhc29uIG9mIHRoaXMgaGFzdGUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFtBc2lkZV0gSSB3b3VsZCBJIGtuZXcgbm90IHdoeSBpdCBzaG91bGQgYmUgc2xvdydkLgogICAgTG9vaywgc2lyLCBoZXJlIGNvbWVzIHRoZSBsYWR5IHRvd2FyZHMgbXkgY2VsbC4KCiAgICBFbnRlciBKVUxJRVQKClBBUklTCgogICAgSGFwcGlseSBtZXQsIG15IGxhZHkgYW5kIG15IHdpZmUhCgpKVUxJRVQKCiAgICBUaGF0IG1heSBiZSwgc2lyLCB3aGVuIEkgbWF5IGJlIGEgd2lmZS4KClBBUklTCgogICAgVGhhdCBtYXkgYmUgbXVzdCBiZSwgbG92ZSwgb24gVGh1cnNkYXkgbmV4dC4KCkpVTElFVAoKICAgIFdoYXQgbXVzdCBiZSBzaGFsbCBiZS4KCkZSSUFSIExBVVJFTkNFCgogICAgVGhhdCdzIGEgY2VydGFpbiB0ZXh0LgoKUEFSSVMKCiAgICBDb21lIHlvdSB0byBtYWtlIGNvbmZlc3Npb24gdG8gdGhpcyBmYXRoZXICgpKVUxJRVQKCiAgICBUbyBhbnN3ZXIgdGhhdCwgSSBzaG91bGQgY29uZmVzcyB0byB5b3UuCgpQQVJJUwoKICAgIERvIG5vdCBkZW55IHRvIGhpbSB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSSB3aWxsIGNvbmZlc3MgdG8geW91IHRoYXQgSSBsb3ZlIGhpbS4KClBBUklTCgogICAgU28gd2lsbCB5ZSwgSSBhbSBzdXJlLCB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSWYgSSBkbyBzbywgaXQgd2lsbCBiZSBvZiBtb3JlIHByaWNlLAogICAgQmVpbmcgc3Bva2UgYmVoaW5kIHlvdXIgYmFjaywgdGhhbiB0byB5b3VyIGZhY2UuCgpQQVJJUwoKICAgIFBvb3Igc291bCwgdGh5IGZhY2UgaXMgbXVjaCBhYnVzZWQgd2l0aCB0ZWFycy4KCkpVTElFVAoKICAgIFRoZSB0ZWFycyBoYXZlIGdvdCBzbWFsbCB2aWN0b3J5IGJ5IHRoYXQ7CiAgICBGb3IgaXQgd2FzIGJhZCBlbm91Z2ggYmVmb3JlIHRoZWlyIHNwaXRlLgoKUEFSSVMKCiAgICBUaG91IHdyb25nJ3N0IGl0LCBtb3JlIHRoYW4gdGVhcnMsIHdpdGggdGhhdCByZXBvcnQuCgpKVUxJRVQKCiAgICBUaGF0IGlzIG5vIHNsYW5kZXIsIHNpciwgd2hpY2ggaXMgYSB0cnV0aDsKICAgIEFuZCB3aGF0IEkgc3Bha2UsIEkgc3Bha2UgaXQgdG8gbXkgZmFjZS4KClBBUklTCgogICAgVGh5IGZhY2UgaXMgbWluZSwgYW5kIHRob3UgaGFzdCBzbGFuZGVyJ2QgaXQuCgpKVUxJRVQKCiAgICBJdCBtYXkgYmUgc28sIGZvciBpdCBpcyBub3QgbWluZSBvd24uCiAgICBBcmUgeW91IGF0IGxlaXN1cmUsIGhvbHkgZmF0aGVyLCBub3c7CiAgICBPciBzaGFsbCBJIGNvbWUgdG8geW91IGF0IGV2ZW5pbmcgbWFzcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTXkgbGVpc3VyZSBzZXJ2ZXMgbWUsIHBlbnNpdmUgZGF1Z2h0ZXIsIG5vdy4KICAgIE15IGxvcmQsIHdlIG11c3QgZW50cmVhdCB0aGUgdGltZSBhbG9uZS4KClBBUklTCgogICAgR29kIHNoaWVsZCBJIHNob3VsZCBkaXN0dXJiIGRldm90aW9uIQogICAgSnVsaWV0LCBvbiBUaHVyc2RheSBlYXJseSB3aWxsIEkgcm91c2UgeWU6CiAgICBUaWxsIHRoZW4sIGFkaWV1OyBhbmQga2VlcCB0aGlzIGhvbHkga2lzcy4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIHNodXQgdGhlIGRvb3IhIGFuZCB3aGVuIHRob3UgaGFzdCBkb25lIHNvLAogICAgQ29tZSB3ZWVwIHdpdGggbWU7IHBhc3QgaG9wZSwgcGFzdCBjdXJlLCBwYXN0IGhlbHAhCgpGUklBUiBMQVVSRU5DRQoKICAgIEFoLCBKdWxpZXQsIEkgYWxyZWFkeSBrbm93IHRoeSBncmllZjsKICAgIEl0IHN0cmFpbnMgbWUgcGFzdCB0aGUgY29tcGFzcyBvZiBteSB3aXRzOgogICAgSSBoZWFyIHRob3UgbXVzdCwgYW5kIG5vdGhpbmcgbWF5IHByb3JvZ3VlIGl0LAogICAgT24gVGh1cnNkYXkgbmV4dCBiZSBtYXJyaWVkIHRvIHRoaXMgY291bnR5LgoKSlVMSUVUCgogICAgVGVsbCBtZSBub3QsIGZyaWFyLCB0aGF0IHRob3UgaGVhcidzdCBvZiB0aGlzLAogICAgVW5sZXNzIHRob3UgdGVsbCBtZSBob3cgSSBtYXkgcHJldmVudCBpdDoKICAgIElmLCBpbiB0aHkgd2lzZG9tLCB0aG91IGNhbnN0IGdpdmUgbm8gaGVscCwKICAgIERvIHRob3UgYnV0IGNhbGwgbXkgcmVzb2x1dGlvbiB3aXNlLAogICAgQW5kIHdpdGggdGhpcyBrbmlmZSBJJ2xsIGhlbHAgaXQgcHJlc2VudGx5LgogICAgR29kIGpvaW4nZCBteSBoZWFydCBhbmQgUm9tZW8ncywgdGhvdSBvdXIgaGFuZHM7CiAgICBBbmQgZXJlIHRoaXMgaGFuZCwgYnkgdGhlZSB0byBSb21lbyBzZWFsJ2QsCiAgICBTaGFsbCBiZSB0aGUgbGFiZWwgdG8gYW5vdGhlciBkZWVkLAogICAgT3IgbXkgdHJ1ZSBoZWFydCB3aXRoIHRyZWFjaGVyb3VzIHJldm9sdAogICAgVHVybiB0byBhbm90aGVyLCB0aGlzIHNoYWxsIHNsYXkgdGhlbSBib3RoOgogICAgVGhlcmVmb3JlLCBvdXQgb2YgdGh5IGxvbmctZXhwZXJpZW5jZWQgdGltZSwKICAgIEdpdmUgbWUgc29tZSBwcmVzZW50IGNvdW5zZWwsIG9yLCBiZWhvbGQsCiAgICAnVHdpeHQgbXkgZXh0cmVtZXMgYW5kIG1lIHRoaXMgYmxvb2R5IGtuaWZlCiAgICBTaGFsbCBwbGF5IHRoZSB1bXBpcmUsIGFyYml0cmF0aW5nIHRoYXQKICAgIFdoaWNoIHRoZSBjb21taXNzaW9uIG9mIHRoeSB5ZWFycyBhbmQgYXJ0CiAgICBDb3VsZCB0byBubyBpc3N1ZSBvZiB0cnVlIGhvbm91ciBicmluZy4KICAgIEJlIG5vdCBzbyBsb25nIHRvIHNwZWFrOyBJIGxvbmcgdG8gZGllLAogICAgSWYgd2hhdCB0aG91IHNwZWFrJ3N0IHNwZWFrIG5vdCBvZiByZW1lZHkuCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvbGQsIGRhdWdodGVyOiBJIGRvIHNweSBhIGtpbmQgb2YgaG9wZSwKICAgIFdoaWNoIGNyYXZlcyBhcyBkZXNwZXJhdGUgYW4gZXhlY3V0aW9uLgogICAgQXMgdGhhdCBpcyBkZXNwZXJhdGUgd2hpY2ggd2Ugd291bGQgcHJldmVudC4KICAgIElmLCByYXRoZXIgdGhhbiB0byBtYXJyeSBDb3VudHkgUGFyaXMsCiAgICBUaG91IGhhc3QgdGhlIHN0cmVuZ3RoIG9mIHdpbGwgdG8gc2xheSB0aHlzZWxmLAogICAgVGhlbiBpcyBpdCBsaWtlbHkgdGhvdSB3aWx0IHVuZGVydGFrZQogICAgQSB0aGluZyBsaWtlIGRlYXRoIHRvIGNoaWRlIGF3YXkgdGhpcyBzaGFtZSwKICAgIFRoYXQgY29wZXN0IHdpdGggZGVhdGggaGltc2VsZiB0byBzY2FwZSBmcm9tIGl0OgogICAgQW5kLCBpZiB0aG91IGRhcmVzdCwgSSdsbCBnaXZlIHRoZWUgcmVtZWR5LgoKSlVMSUVUCgogICAgTywgYmlkIG1lIGxlYXAsIHJhdGhlciB0aGFuIG1hcnJ5IFBhcmlzLAogICAgRnJvbSBvZmYgdGhlIGJhdHRsZW1lbnRzIG9mIHlvbmRlciB0b3dlcjsKICAgIE9yIHdhbGsgaW4gdGhpZXZpc2ggd2F5czsgb3IgYmlkIG1lIGx1cmsKICAgIFdoZXJlIHNlcnBlbnRzIGFyZTsgY2hhaW4gbWUgd2l0aCByb2FyaW5nIGJlYXJzOwogICAgT3Igc2h1dCBtZSBuaWdodGx5IGluIGEgY2hhcm5lbC1ob3VzZSwKICAgIE8nZXItY292ZXInZCBxdWl0ZSB3aXRoIGRlYWQgbWVuJ3MgcmF0dGxpbmcgYm9uZXMsCiAgICBXaXRoIHJlZWt5IHNoYW5rcyBhbmQgeWVsbG93IGNoYXBsZXNzIHNrdWxsczsKICAgIE9yIGJpZCBtZSBnbyBpbnRvIGEgbmV3LW1hZGUgZ3JhdmUKICAgIEFuZCBoaWRlIG1lIHdpdGggYSBkZWFkIG1hbiBpbiBoaXMgc2hyb3VkOwogICAgVGhpbmdzIHRoYXQsIHRvIGhlYXIgdGhlbSB0b2xkLCBoYXZlIG1hZGUgbWUgdHJlbWJsZTsKICAgIEFuZCBJIHdpbGwgZG8gaXQgd2l0aG91dCBmZWFyIG9yIGRvdWJ0LAogICAgVG8gbGl2ZSBhbiB1bnN0YWluJ2Qgd2lmZSB0byBteSBzd2VldCBsb3ZlLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIb2xkLCB0aGVuOyBnbyBob21lLCBiZSBtZXJyeSwgZ2l2ZSBjb25zZW50CiAgICBUbyBtYXJyeSBQYXJpczogV2VkbmVzZGF5IGlzIHRvLW1vcnJvdzoKICAgIFRvLW1vcnJvdyBuaWdodCBsb29rIHRoYXQgdGhvdSBsaWUgYWxvbmU7CiAgICBMZXQgbm90IHRoeSBudXJzZSBsaWUgd2l0aCB0aGVlIGluIHRoeSBjaGFtYmVyOgogICAgVGFrZSB0aG91IHRoaXMgdmlhbCwgYmVpbmcgdGhlbiBpbiBiZWQsCiAgICBBbmQgdGhpcyBkaXN0aWxsZWQgbGlxdW9yIGRyaW5rIHRob3Ugb2ZmOwogICAgV2hlbiBwcmVzZW50bHkgdGhyb3VnaCBhbGwgdGh5IHZlaW5zIHNoYWxsIHJ1bgogICAgQSBjb2xkIGFuZCBkcm93c3kgaHVtb3VyLCBmb3Igbm8gcHVsc2UKICAgIFNoYWxsIGtlZXAgaGlzIG5hdGl2ZSBwcm9ncmVzcywgYnV0IHN1cmNlYXNlOgogICAgTm8gd2FybXRoLCBubyBicmVhdGgsIHNoYWxsIHRlc3RpZnkgdGhvdSBsaXZlc3Q7CiAgICBUaGUgcm9zZXMgaW4gdGh5IGxpcHMgYW5kIGNoZWVrcyBzaGFsbCBmYWRlCiAgICBUbyBwYWx5IGFzaGVzLCB0aHkgZXllcycgd2luZG93cyBmYWxsLAogICAgTGlrZSBkZWF0aCwgd2hlbiBoZSBzaHV0cyB1cCB0aGUgZGF5IG9mIGxpZmU7CiAgICBFYWNoIHBhcnQsIGRlcHJpdmVkIG9mIHN1cHBsZSBnb3Zlcm5tZW50LAogICAgU2hhbGwsIHN0aWZmIGFuZCBzdGFyayBhbmQgY29sZCwgYXBwZWFyIGxpa2UgZGVhdGg6CiAgICBBbmQgaW4gdGhpcyBib3Jyb3cnZCBsaWtlbmVzcyBvZiBzaHJ1bmsgZGVhdGgKICAgIFRob3Ugc2hhbHQgY29udGludWUgdHdvIGFuZCBmb3J0eSBob3VycywKICAgIEFuZCB0aGVuIGF3YWtlIGFzIGZyb20gYSBwbGVhc2FudCBzbGVlcC4KICAgIE5vdywgd2hlbiB0aGUgYnJpZGVncm9vbSBpbiB0aGUgbW9ybmluZyBjb21lcwogICAgVG8gcm91c2UgdGhlZSBmcm9tIHRoeSBiZWQsIHRoZXJlIGFydCB0aG91IGRlYWQ6CiAgICBUaGVuLCBhcyB0aGUgbWFubmVyIG9mIG91ciBjb3VudHJ5IGlzLAogICAgSW4gdGh5IGJlc3Qgcm9iZXMgdW5jb3ZlcidkIG9uIHRoZSBiaWVyCiAgICBUaG91IHNoYWx0IGJlIGJvcm5lIHRvIHRoYXQgc2FtZSBhbmNpZW50IHZhdWx0CiAgICBXaGVyZSBhbGwgdGhlIGtpbmRyZWQgb2YgdGhlIENhcHVsZXRzIGxpZS4KICAgIEluIHRoZSBtZWFuIHRpbWUsIGFnYWluc3QgdGhvdSBzaGFsdCBhd2FrZSwKICAgIFNoYWxsIFJvbWVvIGJ5IG15IGxldHRlcnMga25vdyBvdXIgZHJpZnQsCiAgICBBbmQgaGl0aGVyIHNoYWxsIGhlIGNvbWU6IGFuZCBoZSBhbmQgSQogICAgV2lsbCB3YXRjaCB0aHkgd2FraW5nLCBhbmQgdGhhdCB2ZXJ5IG5pZ2h0CiAgICBTaGFsbCBSb21lbyBiZWFyIHRoZWUgaGVuY2UgdG8gTWFudHVhLgogICAgQW5kIHRoaXMgc2hhbGwgZnJlZSB0aGVlIGZyb20gdGhpcyBwcmVzZW50IHNoYW1lOwogICAgSWYgbm8gaW5jb25zdGFudCB0b3ksIG5vciB3b21hbmlzaCBmZWFyLAogICAgQWJhdGUgdGh5IHZhbG91ciBpbiB0aGUgYWN0aW5nIGl0LgoKSlVMSUVUCgogICAgR2l2ZSBtZSwgZ2l2ZSBtZSEgTywgdGVsbCBub3QgbWUgb2YgZmVhciEKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZDsgZ2V0IHlvdSBnb25lLCBiZSBzdHJvbmcgYW5kIHByb3NwZXJvdXMKICAgIEluIHRoaXMgcmVzb2x2ZTogSSdsbCBzZW5kIGEgZnJpYXIgd2l0aCBzcGVlZAogICAgVG8gTWFudHVhLCB3aXRoIG15IGxldHRlcnMgdG8gdGh5IGxvcmQuCgpKVUxJRVQKCiAgICBMb3ZlIGdpdmUgbWUgc3RyZW5ndGghIGFuZCBzdHJlbmd0aCBzaGFsbCBoZWxwIGFmZm9yZC4KICAgIEZhcmV3ZWxsLCBkZWFyIGZhdGhlciEKCiAgICBFeGV1bnQKClNDRU5FIElJLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIE51cnNlLCBhbmQgdHdvIFNlcnZpbmdtZW4gCgpDQVBVTEVUCgogICAgU28gbWFueSBndWVzdHMgaW52aXRlIGFzIGhlcmUgYXJlIHdyaXQuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGdvIGhpcmUgbWUgdHdlbnR5IGN1bm5pbmcgY29va3MuCgpTZWNvbmQgU2VydmFudAoKICAgIFlvdSBzaGFsbCBoYXZlIG5vbmUgaWxsLCBzaXI7IGZvciBJJ2xsIHRyeSBpZiB0aGV5CiAgICBjYW4gbGljayB0aGVpciBmaW5nZXJzLgoKQ0FQVUxFVAoKICAgIEhvdyBjYW5zdCB0aG91IHRyeSB0aGVtIHNvPwoKU2Vjb25kIFNlcnZhbnQKCiAgICBNYXJyeSwgc2lyLCAndGlzIGFuIGlsbCBjb29rIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBvd24gZmluZ2VyczogdGhlcmVmb3JlIGhlIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBmaW5nZXJzIGdvZXMgbm90IHdpdGggbWUuCgpDQVBVTEVUCgogICAgR28sIGJlIGdvbmUuCgogICAgRXhpdCBTZWNvbmQgU2VydmFudAogICAgV2Ugc2hhbGwgYmUgbXVjaCB1bmZ1cm5pc2hlZCBmb3IgdGhpcyB0aW1lLgogICAgV2hhdCwgaXMgbXkgZGF1Z2h0ZXIgZ29uZSB0byBGcmlhciBMYXVyZW5jZT8KCk51cnNlCgogICAgQXksIGZvcnNvb3RoLgoKQ0FQVUxFVAoKICAgIFdlbGwsIGhlIG1heSBjaGFuY2UgdG8gZG8gc29tZSBnb29kIG9uIGhlcjoKICAgIEEgcGVldmlzaCBzZWxmLXdpbGwnZCBoYXJsb3RyeSBpdCBpcy4KCk51cnNlCgogICAgU2VlIHdoZXJlIHNoZSBjb21lcyBmcm9tIHNocmlmdCB3aXRoIG1lcnJ5IGxvb2suCgogICAgRW50ZXIgSlVMSUVUCgpDQVBVTEVUCgogICAgSG93IG5vdywgbXkgaGVhZHN0cm9uZyEgd2hlcmUgaGF2ZSB5b3UgYmVlbiBnYWRkaW5nPwoKSlVMSUVUCgogICAgV2hlcmUgSSBoYXZlIGxlYXJuJ2QgbWUgdG8gcmVwZW50IHRoZSBzaW4KICAgIE9mIGRpc29iZWRpZW50IG9wcG9zaXRpb24KICAgIFRvIHlvdSBhbmQgeW91ciBiZWhlc3RzLCBhbmQgYW0gZW5qb2luJ2QKICAgIEJ5IGhvbHkgTGF1cmVuY2UgdG8gZmFsbCBwcm9zdHJhdGUgaGVyZSwKICAgIEFuZCBiZWcgeW91ciBwYXJkb246IHBhcmRvbiwgSSBiZXNlZWNoIHlvdSEKICAgIEhlbmNlZm9yd2FyZCBJIGFtIGV2ZXIgcnVsZWQgYnkgeW91LgoKQ0FQVUxFVAoKICAgIFNlbmQgZm9yIHRoZSBjb3VudHk7IGdvIHRlbGwgaGltIG9mIHRoaXM6CiAgICBJJ2xsIGhhdmUgdGhpcyBrbm90IGtuaXQgdXAgdG8tbW9ycm93IG1vcm5pbmcuCgpKVUxJRVQKCiAgICBJIG1ldCB0aGUgeW91dGhmdWwgbG9yZCBhdCBMYXVyZW5jZScgY2VsbDsKICAgIEFuZCBnYXZlIGhpbSB3aGF0IGJlY29tZWQgbG92ZSBJIG1pZ2h0LAogICAgTm90IHN0ZXAgbydlciB0aGUgYm91bmRzIG9mIG1vZGVzdHkuCgpDQVBVTEVUCgogICAgV2h5LCBJIGFtIGdsYWQgb24ndDsgdGhpcyBpcyB3ZWxsOiBzdGFuZCB1cDoKICAgIFRoaXMgaXMgYXMndCBzaG91bGQgYmUuIExldCBtZSBzZWUgdGhlIGNvdW50eTsKICAgIEF5LCBtYXJyeSwgZ28sIEkgc2F5LCBhbmQgZmV0Y2ggaGltIGhpdGhlci4KICAgIE5vdywgYWZvcmUgR29kISB0aGlzIHJldmVyZW5kIGhvbHkgZnJpYXIsCiAgICBPdXIgd2hvbGUgY2l0eSBpcyBtdWNoIGJvdW5kIHRvIGhpbS4KCkpVTElFVAoKICAgIE51cnNlLCB3aWxsIHlvdSBnbyB3aXRoIG1lIGludG8gbXkgY2xvc2V0LAogICAgVG8gaGVscCBtZSBzb3J0IHN1Y2ggbmVlZGZ1bCBvcm5hbWVudHMKICAgIEFzIHlvdSB0aGluayBmaXQgdG8gZnVybmlzaCBtZSB0by1tb3Jyb3cCgpMQURZIENBUFVMRVQKCiAgICBObywgbm90IHRpbGwgVGh1cnNkYXk7IHRoZXJlIGlzIHRpbWUgZW5vdWdoLgoKQ0FQVUxFVAoKICAgIEdvLCBudXJzZSwgZ28gd2l0aCBoZXI6IHdlJ2xsIHRvIGNodXJjaCB0by1tb3Jyb3cuCgogICAgRXhldW50IEpVTElFVCBhbmQgTnVyc2UKCkxBRFkgQ0FQVUxFVAoKICAgIFdlIHNoYWxsIGJlIHNob3J0IGluIG91ciBwcm92aXNpb246CiAgICAnVGlzIG5vdyBuZWFyIG5pZ2h0LgoKQ0FQVUxFVAoKICAgIFR1c2gsIEkgd2lsbCBzdGlyIGFib3V0LAogICAgQW5kIGFsbCB0aGluZ3Mgc2hhbGwgYmUgd2VsbCwgSSB3YXJyYW50IHRoZWUsIHdpZmU6CiAgICBHbyB0aG91IHRvIEp1bGlldCwgaGVscCB0byBkZWNrIHVwIGhlcjsKICAgIEknbGwgbm90IHRvIGJlZCB0by1uaWdodDsgbGV0IG1lIGFsb25lOwogICAgSSdsbCBwbGF5IHRoZSBob3VzZXdpZmUgZm9yIHRoaXMgb25jZS4gV2hhdCwgaG8hCiAgICBUaGV5IGFyZSBhbGwgZm9ydGguIFdlbGwsIEkgd2lsbCB3YWxrIG15c2VsZgogICAgVG8gQ291bnR5IFBhcmlzLCB0byBwcmVwYXJlIGhpbSB1cAogICAgQWdhaW5zdCB0by1tb3Jyb3c6IG15IGhlYXJ0IGlzIHdvbmRyb3VzIGxpZ2h0LAogICAgU2luY2UgdGhpcyBzYW1lIHdheXdhcmQgZ2lybCBpcyBzbyByZWNsYWltJ2QuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEp1bGlldCdzIGNoYW1iZXIuCgogICAgRW50ZXIgSlVMSUVUIGFuZCBOdXJzZSAKCkpVTElFVAoKICAgIEF5LCB0aG9zZSBhdHRpcmVzIGFyZSBiZXN0OiBidXQsIGdlbnRsZSBudXJzZSwKICAgIEkgcHJheSB0aGVlLCBsZWF2ZSBtZSB0byBteSBzZWxmIHRvLW5pZ2h0LAogICAgRm9yIEkgaGF2ZSBuZWVkIG9mIG1hbnkgb3Jpc29ucwogICAgVG8gbW92ZSB0aGUgaGVhdmVucyB0byBzbWlsZSB1cG9uIG15IHN0YXRlLAogICAgV2hpY2gsIHdlbGwgdGhvdSBrbm93J3N0LCBpcyBjcm9zcywgYW5kIGZ1bGwgb2Ygc2luLgoKICAgIEVudGVyIExBRFkgQ0FQVUxFVAoKTEFEWSBDQVBVTEVUCgogICAgV2hhdCwgYXJlIHlvdSBidXN5LCBobz8gbmVlZCB5b3UgbXkgaGVscD8KCkpVTElFVAoKICAgIE5vLCBtYWRhbTsgd2UgaGF2ZSBjdWxsJ2Qgc3VjaCBuZWNlc3NhcmllcwogICAgQXMgYXJlIGJlaG92ZWZ1bCBmb3Igb3VyIHN0YXRlIHRvLW1vcnJvdzoKICAgIFNvIHBsZWFzZSB5b3UsIGxldCBtZSBub3cgYmUgbGVmdCBhbG9uZSwKICAgIEFuZCBsZXQgdGhlIG51cnNlIHRoaXMgbmlnaHQgc2l0IHVwIHdpdGggeW91OwogICAgRm9yLCBJIGFtIHN1cmUsIHlvdSBoYXZlIHlvdXIgaGFuZHMgZnVsbCBhbGwsCiAgICBJbiB0aGlzIHNvIHN1ZGRlbiBidXNpbmVzcy4KCkxBRFkgQ0FQVUxFVAoKICAgIEdvb2QgbmlnaHQ6CiAgICBHZXQgdGhlZSB0byBiZWQsIGFuZCByZXN0OyBmb3IgdGhvdSBoYXN0IG5lZWQuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkpVTElFVAoKICAgIEZhcmV3ZWxsISBHb2Qga25vd3Mgd2hlbiB3ZSBzaGFsbCBtZWV0IGFnYWluLgogICAgSSBoYXZlIGEgZmFpbnQgY29sZCBmZWFyIHRocmlsbHMgdGhyb3VnaCBteSB2ZWlucywKICAgIFRoYXQgYWxtb3N0IGZyZWV6ZXMgdXAgdGhlIGhlYXQgb2YgbGlmZToKICAgIEknbGwgY2FsbCB0aGVtIGJhY2sgYWdhaW4gdG8gY29tZm9ydCBtZToKICAgIE51cnNlISBXaGF0IHNob3VsZCBzaGUgZG8gaGVyZT8KICAgIE15IGRpc21hbCBzY2VuZSBJIG5lZWRzIG11c3QgYWN0IGFsb25lLgogICAgQ29tZSwgdmlhbC4KICAgIFdoYXQgaWYgdGhpcyBtaXh0dXJlIGRvIG5vdCB3b3JrIGF0IGFsbD8KICAgIFNoYWxsIEkgYmUgbWFycmllZCB0aGVuIHRvLW1vcnJvdyBtb3JuaW5nPwogICAgTm8sIG5vOiB0aGlzIHNoYWxsIGZvcmJpZCBpdDogbGllIHRob3UgdGhlcmUuCgogICAgTGF5aW5nIGRvd24gaGVyIGRhZ2dlcgogICAgV2hhdCBpZiBpdCBiZSBhIHBvaXNvbiwgd2hpY2ggdGhlIGZyaWFyCiAgICBTdWJ0bHkgaGF0aCBtaW5pc3RlcidkIHRvIGhhdmUgbWUgZGVhZCwKICAgIExlc3QgaW4gdGhpcyBtYXJyaWFnZSBoZSBzaG91bGQgYmUgZGlzaG9ub3VyJ2QsCiAgICBCZWNhdXNlIGhlIG1hcnJpZWQgbWUgYmVmb3JlIHRvIFJvbWVvPwogICAgSSBmZWFyIGl0IGlzOiBhbmQgeWV0LCBtZXRoaW5rcywgaXQgc2hvdWxkIG5vdCwKICAgIEZvciBoZSBoYXRoIHN0aWxsIGJlZW4gdHJpZWQgYSBob2x5IG1hbi4KICAgIEhvdyBpZiwgd2hlbiBJIGFtIGxhaWQgaW50byB0aGUgdG9tYiwKICAgIEkgd2FrZSBiZWZvcmUgdGhlIHRpbWUgdGhhdCBSb21lbwogICAgQ29tZSB0byByZWRlZW0gbWUIHRoZXJlJ3MgYSBmZWFyZnVsIHBvaW50IQogICAgU2hhbGwgSSBub3QsIHRoZW4sIGJlIHN0aWZsZWQgaW4gdGhlIHZhdWx0LAogICAgVG8gd2hvc2UgZm91bCBtb3V0aCBubyBoZWFsdGhzb21lIGFpciBicmVhdGhlcyBpbiwKICAgIEFuZCB0aGVyZSBkaWUgc3RyYW5nbGVkIGVyZSBteSBSb21lbyBjb21lcz8KICAgIE9yLCBpZiBJIGxpdmUsIGlzIGl0IG5vdCB2ZXJ5IGxpa2UsCiAgICBUaGUgaG9ycmlibGUgY29uY2VpdCBvZiBkZWF0aCBhbmQgbmlnaHQsCiAgICBUb2dldGhlciB3aXRoIHRoZSB0ZXJyb3Igb2YgdGhlIHBsYWNlLC0tCiAgICBBcyBpbiBhIHZhdWx0LCBhbiBhbmNpZW50IHJlY2VwdGFjbGUsCiAgICBXaGVyZSwgZm9yIHRoZXNlIG1hbnkgaHVuZHJlZCB5ZWFycywgdGhlIGJvbmVzCiAgICBPZiBhbGwgbXkgYnVyaWVkIGFuY2VzdG9ycyBhcmUgcGFja2VkOgogICAgV2hlcmUgYmxvb2R5IFR5YmFsdCwgeWV0IGJ1dCBncmVlbiBpbiBlYXJ0aCwKICAgIExpZXMgZmVzdGVyaW5nIGluIGhpcyBzaHJvdWQ7IHdoZXJlLCBhcyB0aGV5IHNheSwKICAgIEF0IHNvbWUgaG91cnMgaW4gdGhlIG5pZ2h0IHNwaXJpdHMgcmVzb3J0Oy0tCiAgICBBbGFjaywgYWxhY2ssIGlzIGl0IG5vdCBsaWtlIHRoYXQgSSwKICAgIFNvIGVhcmx5IHdha2luZywgd2hhdCB3aXRoIGxvYXRoc29tZSBzbWVsbHMsCiAgICBBbmQgc2hyaWVrcyBsaWtlIG1hbmRyYWtlcycgdG9ybiBvdXQgb2YgdGhlIGVhcnRoLAogICAgVGhhdCBsaXZpbmcgbW9ydGFscywgaGVhcmluZyB0aGVtLCBydW4gbWFkOi0tCiAgICBPLCBpZiBJIHdha2UsIHNoYWxsIEkgbm90IGJlIGRpc3RyYXVnaHQsCiAgICBFbnZpcm9uZWQgd2l0aCBhbGwgdGhlc2UgaGlkZW91cyBmZWFycz8KICAgIEFuZCBtYWRseSBwbGF5IHdpdGggbXkgZm9yZWZhdGhlcidzIGpvaW50cz8KICAgIEFuZCBwbHVjayB0aGUgbWFuZ2xlZCBUeWJhbHQgZnJvbSBoaXMgc2hyb3VkPwogICAgQW5kLCBpbiB0aGlzIHJhZ2UsIHdpdGggc29tZSBncmVhdCBraW5zbWFuJ3MgYm9uZSwKICAgIEFzIHdpdGggYSBjbHViLCBkYXNoIG91dCBteSBkZXNwZXJhdGUgYnJhaW5zPwogICAgTywgbG9vayEgbWV0aGlua3MgSSBzZWUgbXkgY291c2luJ3MgZ2hvc3QKICAgIFNlZWtpbmcgb3V0IFJvbWVvLCB0aGF0IGRpZCBzcGl0IGhpcyBib2R5CiAgICBVcG9uIGEgcmFwaWVyJ3MgcG9pbnQ6IHN0YXksIFR5YmFsdCwgc3RheSEKICAgIFJvbWVvLCBJIGNvbWUhIHRoaXMgZG8gSSBkcmluayB0byB0aGVlLgoKICAgIFNoZSBmYWxscyB1cG9uIGhlciBiZWQsIHdpdGhpbiB0aGUgY3VydGFpbnMKClNDRU5FIElWLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgSG9sZCwgdGFrZSB0aGVzZSBrZXlzLCBhbmQgZmV0Y2ggbW9yZSBzcGljZXMsIG51cnNlLgoKTnVyc2UKCiAgICBUaGV5IGNhbGwgZm9yIGRhdGVzIGFuZCBxdWluY2VzIGluIHRoZSBwYXN0cnkuCgogICAgRW50ZXIgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIENvbWUsIHN0aXIsIHN0aXIsIHN0aXIhIHRoZSBzZWNvbmQgY29jayBoYXRoIGNyb3cnZCwKICAgIFRoZSBjdXJmZXctYmVsbCBoYXRoIHJ1bmcsICd0aXMgdGhyZWUgbydjbG9jazoKICAgIExvb2sgdG8gdGhlIGJha2VkIG1lYXRzLCBnb29kIEFuZ2VsaWNhOgogICAgU3BhcmUgbm90IGZvciB0aGUgY29zdC4KCk51cnNlCgogICAgR28sIHlvdSBjb3QtcXVlYW4sIGdvLAogICAgR2V0IHlvdSB0byBiZWQ7IGZhaXRoLCBZb3UnbGwgYmUgc2ljayB0by1tb3Jyb3cKICAgIEZvciB0aGlzIG5pZ2h0J3Mgd2F0Y2hpbmcuCgpDQVBVTEVUCgogICAgTm8sIG5vdCBhIHdoaXQ6IHdoYXQhIEkgaGF2ZSB3YXRjaCdkIGVyZSBub3cKICAgIEFsbCBuaWdodCBmb3IgbGVzc2VyIGNhdXNlLCBhbmQgbmUnZXIgYmVlbiBzaWNrLgoKTEFEWSBDQVBVTEVUCgogICAgQXksIHlvdSBoYXZlIGJlZW4gYSBtb3VzZS1odW50IGluIHlvdXIgdGltZTsKICAgIEJ1dCBJIHdpbGwgd2F0Y2ggeW91IGZyb20gc3VjaCB3YXRjaGluZyBub3cuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBBIGplYWxvdXMgaG9vZCwgYSBqZWFsb3VzIGhvb2QhCgogICAgRW50ZXIgdGhyZWUgb3IgZm91ciBTZXJ2aW5nbWVuLCB3aXRoIHNwaXRzLCBsb2dzLCBhbmQgYmFza2V0cwogICAgTm93LCBmZWxsb3csCiAgICBXaGF0J3MgdGhlcmUCgpGaXJzdCBTZXJ2YW50CgogICAgVGhpbmdzIGZvciB0aGUgY29vaywgc2lyOyBidXQgSSBrbm93IG5vdCB3aGF0LgoKQ0FQVUxFVAoKICAgIE1ha2UgaGFzdGUsIG1ha2UgaGFzdGUuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGZldGNoIGRyaWVyIGxvZ3M6CiAgICBDYWxsIFBldGVyLCBoZSB3aWxsIHNob3cgdGhlZSB3aGVyZSB0aGV5IGFyZS4KClNlY29uZCBTZXJ2YW50CgogICAgSSBoYXZlIGEgaGVhZCwgc2lyLCB0aGF0IHdpbGwgZmluZCBvdXQgbG9ncywKICAgIEFuZCBuZXZlciB0cm91YmxlIFBldGVyIGZvciB0aGUgbWF0dGVyLgoKICAgIEV4aXQKCkNBUFVMRVQKCiAgICBNYXNzLCBhbmQgd2VsbCBzYWlkOyBhIG1lcnJ5IHdob3Jlc29uLCBoYSEKICAgIFRob3Ugc2hhbHQgYmUgbG9nZ2VyLWhlYWQuIEdvb2QgZmFpdGgsICd0aXMgZGF5OgogICAgVGhlIGNvdW50eSB3aWxsIGJlIGhlcmUgd2l0aCBtdXNpYyBzdHJhaWdodCwKICAgIEZvciBzbyBoZSBzYWlkIGhlIHdvdWxkOiBJIGhlYXIgaGltIG5lYXIuCgogICAgTXVzaWMgd2l0aGluCiAgICBOdXJzZSEgV2lmZSEgV2hhdCwgaG8hIFdoYXQsIG51cnNlLCBJIHNheSEKCiAgICBSZS1lbnRlciBOdXJzZQogICAgR28gd2FrZW4gSnVsaWV0LCBnbyBhbmQgdHJpbSBoZXIgdXA7CiAgICBJJ2xsIGdvIGFuZCBjaGF0IHdpdGggUGFyaXM6IGhpZSwgbWFrZSBoYXN0ZSwKICAgIE1ha2UgaGFzdGU7IHRoZSBicmlkZWdyb29tIGhlIGlzIGNvbWUgYWxyZWFkeToKICAgIE1ha2UgaGFzdGUsIEkgc2F5LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gSnVsaWV0J3MgY2hhbWJlci4KCiAgICBFbnRlciBOdXJzZSAKCk51cnNlCgogICAgTWlzdHJlc3MhIHdoYXQsIG1pc3RyZXNzISBKdWxpZXQhIGZhc3QsIEkgd2FycmFudCBoZXIsIHNoZToKICAgIFdoeSwgbGFtYiEgd2h5LCBsYWR5ISBmaWUsIHlvdSBzbHVnLWEtYmVkIQogICAgV2h5LCBsb3ZlLCBJIHNheSEgbWFkYW0hIHN3ZWV0LWhlYXJ0ISB3aHksIGJyaWRlIQogICAgV2hhdCwgbm90IGEgd29yZD8geW91IHRha2UgeW91ciBwZW5ueXdvcnRocyBub3c7CiAgICBTbGVlcCBmb3IgYSB3ZWVrOyBmb3IgdGhlIG5leHQgbmlnaHQsIEkgd2FycmFudCwKICAgIFRoZSBDb3VudHkgUGFyaXMgaGF0aCBzZXQgdXAgaGlzIHJlc3QsCiAgICBUaGF0IHlvdSBzaGFsbCByZXN0IGJ1dCBsaXR0bGUuIEdvZCBmb3JnaXZlIG1lLAogICAgTWFycnksIGFuZCBhbWVuLCBob3cgc291bmQgaXMgc2hlIGFzbGVlcCEKICAgIEkgbXVzdCBuZWVkcyB3YWtlIGhlci4gTWFkYW0sIG1hZGFtLCBtYWRhbSEKICAgIEF5LCBsZXQgdGhlIGNvdW50eSB0YWtlIHlvdSBpbiB5b3VyIGJlZDsKICAgIEhlJ2xsIGZyaWdodCB5b3UgdXAsIGknIGZhaXRoLiBXaWxsIGl0IG5vdCBiZT8KCiAgICBVbmRyYXdzIHRoZSBjdXJ0YWlucwogICAgV2hhdCwgZHJlc3MnZCEgYW5kIGluIHlvdXIgY2xvdGhlcyEgYW5kIGRvd24gYWdhaW4hCiAgICBJIG11c3QgbmVlZHMgd2FrZSB5b3U7IExhZHkhIGxhZHkhIGxhZHkhCiAgICBBbGFzLCBhbGFzISBIZWxwLCBoZWxwISBteSBsYWR5J3MgZGVhZCEKICAgIE8sIHdlbGwtYS1kYXksIHRoYXQgZXZlciBJIHdhcyBib3JuIQogICAgU29tZSBhcXVhIHZpdGFlLCBobyEgTXkgbG9yZCEgbXkgbGFkeSEKCiAgICBFbnRlciBMQURZIENBUFVMRVQKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgaGVyZT8KCk51cnNlCgogICAgTyBsYW1lbnRhYmxlIGRheSEKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgaXMgdGhlIG1hdHRlcj8KCk51cnNlCgogICAgTG9vaywgbG9vayEgTyBoZWF2eSBkYXkhCgpMQURZIENBUFVMRVQKCiAgICBPIG1lLCBPIG1lISBNeSBjaGlsZCwgbXkgb25seSBsaWZlLAogICAgUmV2aXZlLCBsb29rIHVwLCBvciBJIHdpbGwgZGllIHdpdGggdGhlZSEKICAgIEhlbHAsIGhlbHAhIENhbGwgaGVscC4KCiAgICBFbnRlciBDQVBVTEVUCgpDQVBVTEVUCgogICAgRm9yIHNoYW1lLCBicmluZyBKdWxpZXQgZm9ydGg7IGhlciBsb3JkIGlzIGNvbWUuCgpOdXJzZQoKICAgIFNoZSdzIGRlYWQsIGRlY2Vhc2VkLCBzaGUncyBkZWFkOyBhbGFjayB0aGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgQWxhY2sgdGhlIGRheSwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCEKCkNBUFVMRVQKCiAgICBIYSEgbGV0IG1lIHNlZSBoZXI6IG91dCwgYWxhcyEgc2hlJ3MgY29sZDoKICAgIEhlciBibG9vZCBpcyBzZXR0bGVkLCBhbmQgaGVyIGpvaW50cyBhcmUgc3RpZmY7CiAgICBMaWZlIGFuZCB0aGVzZSBsaXBzIGhhdmUgbG9uZyBiZWVuIHNlcGFyYXRlZDoKICAgIERlYXRoIGxpZXMgb24gaGVyIGxpa2UgYW4gdW50aW1lbHkgZnJvc3QKICAgIFVwb24gdGhlIHN3ZWV0ZXN0IGZsb3dlciBvZiBhbGwgdGhlIGZpZWxkLgoKTnVyc2UKCiAgICBPIGxhbWVudGFibGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgTyB3b2Z1bCB0aW1lIQoKQ0FQVUxFVAoKICAgIERlYXRoLCB0aGF0IGhhdGggdGEnZW4gaGVyIGhlbmNlIHRvIG1ha2UgbWUgd2FpbCwKICAgIFRpZXMgdXAgbXkgdG9uZ3VlLCBhbmQgd2lsbCBub3QgbGV0IG1lIHNwZWFrLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUywgd2l0aCBNdXNpY2lhbnMKCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgaXMgdGhlIGJyaWRlIHJlYWR5IHRvIGdvIHRvIGNodXJjaD8KCkNBUFVMRVQKCiAgICBSZWFkeSB0byBnbywgYnV0IG5ldmVyIHRvIHJldHVybi4KICAgIE8gc29uISB0aGUgbmlnaHQgYmVmb3JlIHRoeSB3ZWRkaW5nLWRheQogICAgSGF0aCBEZWF0aCBsYWluIHdpdGggdGh5IHdpZmUuIFRoZXJlIHNoZSBsaWVzLAogICAgRmxvd2VyIGFzIHNoZSB3YXMsIGRlZmxvd2VyZWQgYnkgaGltLgogICAgRGVhdGggaXMgbXkgc29uLWluLWxhdywgRGVhdGggaXMgbXkgaGVpcjsKICAgIE15IGRhdWdodGVyIGhlIGhhdGggd2VkZGVkOiBJIHdpbGwgZGllLAogICAgQW5kIGxlYXZlIGhpbSBhbGw7IGxpZmUsIGxpdmluZywgYWxsIGlzIERlYXRoJ3MuCgpQQVJJUwoKICAgIEhhdmUgSSB0aG91Z2h0IGxvbmcgdG8gc2VlIHRoaXMgbW9ybmluZydzIGZhY2UsCiAgICBBbmQgZG90aCBpdCBnaXZlIG1lIHN1Y2ggYSBzaWdodCBhcyB0aGlzPwoKTEFEWSBDQVBVTEVUCgogICAgQWNjdXJzZWQsIHVuaGFwcHksIHdyZXRjaGVkLCBoYXRlZnVsIGRheSEKICAgIE1vc3QgbWlzZXJhYmxlIGhvdXIgdGhhdCBlJ2VyIHRpbWUgc2F3CiAgICBJbiBsYXN0aW5nIGxhYm91ciBvZiBoaXMgcGlsZ3JpbWFnZSEKICAgIEJ1dCBvbmUsIHBvb3Igb25lLCBvbmUgcG9vciBhbmQgbG92aW5nIGNoaWxkLAogICAgQnV0IG9uZSB0aGluZyB0byByZWpvaWNlIGFuZCBzb2xhY2UgaW4sCiAgICBBbmQgY3J1ZWwgZGVhdGggaGF0aCBjYXRjaCdkIGl0IGZyb20gbXkgc2lnaHQhCgpOdXJzZQoKICAgIE8gd29lISBPIHdvZnVsLCB3b2Z1bCwgd29mdWwgZGF5IQogICAgTW9zdCBsYW1lbnRhYmxlIGRheSwgbW9zdCB3b2Z1bCBkYXksCiAgICBUaGF0IGV2ZXIsIGV2ZXIsIEkgZGlkIHlldCBiZWhvbGQhCiAgICBPIGRheSEgTyBkYXkhIE8gZGF5ISBPIGhhdGVmdWwgZGF5IQogICAgTmV2ZXIgd2FzIHNlZW4gc28gYmxhY2sgYSBkYXkgYXMgdGhpczoKICAgIE8gd29mdWwgZGF5LCBPIHdvZnVsIGRheSEKClBBUklTCgogICAgQmVndWlsZWQsIGRpdm9yY2VkLCB3cm9uZ2VkLCBzcGl0ZWQsIHNsYWluIQogICAgTW9zdCBkZXRlc3RhYmxlIGRlYXRoLCBieSB0aGVlIGJlZ3VpbCdkLAogICAgQnkgY3J1ZWwgY3J1ZWwgdGhlZSBxdWl0ZSBvdmVydGhyb3duIQogICAgTyBsb3ZlISBPIGxpZmUhIG5vdCBsaWZlLCBidXQgbG92ZSBpbiBkZWF0aCEKCkNBUFVMRVQKCiAgICBEZXNwaXNlZCwgZGlzdHJlc3NlZCwgaGF0ZWQsIG1hcnR5cidkLCBraWxsJ2QhCiAgICBVbmNvbWZvcnRhYmxlIHRpbWUsIHdoeSBjYW1lc3QgdGhvdSBub3cKICAgIFRvIG11cmRlciwgbXVyZGVyIG91ciBzb2xlbW5pdHkCiAgICBPIGNoaWxkISBPIGNoaWxkISBteSBzb3VsLCBhbmQgbm90IG15IGNoaWxkIQogICAgRGVhZCBhcnQgdGhvdSEgQWxhY2shIG15IGNoaWxkIGlzIGRlYWQ7CiAgICBBbmQgd2l0aCBteSBjaGlsZCBteSBqb3lzIGFyZSBidXJpZWQuCgpGUklBUiBMQVVSRU5DRQoKICAgIFBlYWNlLCBobywgZm9yIHNoYW1lISBjb25mdXNpb24ncyBjdXJlIGxpdmVzIG5vdAogICAgSW4gdGhlc2UgY29uZnVzaW9ucy4gSGVhdmVuIGFuZCB5b3Vyc2VsZgogICAgSGFkIHBhcnQgaW4gdGhpcyBmYWlyIG1haWQ7IG5vdyBoZWF2ZW4gaGF0aCBhbGwsCiAgICBBbmQgYWxsIHRoZSBiZXR0ZXIgaXMgaXQgZm9yIHRoZSBtYWlkOgogICAgWW91ciBwYXJ0IGluIGhlciB5b3UgY291bGQgbm90IGtlZXAgZnJvbSBkZWF0aCwKICAgIEJ1dCBoZWF2ZW4ga2VlcHMgaGlzIHBhcnQgaW4gZXRlcm5hbCBsaWZlLgogICAgVGhlIG1vc3QgeW91IHNvdWdodCB3YXMgaGVyIHByb21vdGlvbjsKICAgIEZvciAndHdhcyB5b3VyIGhlYXZlbiBzaGUgc2hvdWxkIGJlIGFkdmFuY2VkOgogICAgQW5kIHdlZXAgeWUgbm93LCBzZWVpbmcgc2hlIGlzIGFkdmFuY2VkCiAgICBBYm92ZSB0aGUgY2xvdWRzLCBhcyBoaWdoIGFzIGhlYXZlbiBpdHNlbGYCiAgICBPLCBpbiB0aGlzIGxvdmUsIHlvdSBsb3ZlIHlvdXIgY2hpbGQgc28gaWxsLAogICAgVGhhdCB5b3UgcnVuIG1hZCwgc2VlaW5nIHRoYXQgc2hlIGlzIHdlbGw6CiAgICBTaGUncyBub3Qgd2VsbCBtYXJyaWVkIHRoYXQgbGl2ZXMgbWFycmllZCBsb25nOwogICAgQnV0IHNoZSdzIGJlc3QgbWFycmllZCB0aGF0IGRpZXMgbWFycmllZCB5b3VuZy4KICAgIERyeSB1cCB5b3VyIHRlYXJzLCBhbmQgc3RpY2sgeW91ciByb3NlbWFyeQogICAgT24gdGhpcyBmYWlyIGNvcnNlOyBhbmQsIGFzIHRoZSBjdXN0b20gaXMsCiAgICBJbiBhbGwgaGVyIGJlc3QgYXJyYXkgYmVhciBoZXIgdG8gY2h1cmNoOgogICAgRm9yIHRob3VnaCBmb25kIG5hdHVyZSBiaWRzIHVzIGFuIGxhbWVudCwKICAgIFlldCBuYXR1cmUncyB0ZWFycyBhcmUgcmVhc29uJ3MgbWVycmltZW50LgoKQ0FQVUxFVAoKICAgIEFsbCB0aGluZ3MgdGhhdCB3ZSBvcmRhaW5lZCBmZXN0aXZhbCwKICAgIFR1cm4gZnJvbSB0aGVpciBvZmZpY2UgdG8gYmxhY2sgZnVuZXJhbDsKICAgIE91ciBpbnN0cnVtZW50cyB0byBtZWxhbmNob2x5IGJlbGxzLAogICAgT3VyIHdlZGRpbmcgY2hlZXIgdG8gYSBzYWQgYnVyaWFsIGZlYXN0LAogICAgT3VyIHNvbGVtbiBoeW1ucyB0byBzdWxsZW4gZGlyZ2VzIGNoYW5nZSwKICAgIE91ciBicmlkYWwgZmxvd2VycyBzZXJ2ZSBmb3IgYSBidXJpZWQgY29yc2UsCiAgICBBbmQgYWxsIHRoaW5ncyBjaGFuZ2UgdGhlbSB0byB0aGUgY29udHJhcnkuCgpGUklBUiBMQVVSRU5DRQoKICAgIFNpciwgZ28geW91IGluOyBhbmQsIG1hZGFtLCBnbyB3aXRoIGhpbTsKICAgIEFuZCBnbywgU2lyIFBhcmlzOyBldmVyeSBvbmUgcHJlcGFyZQogICAgVG8gZm9sbG93IHRoaXMgZmFpciBjb3JzZSB1bnRvIGhlciBncmF2ZToKICAgIFRoZSBoZWF2ZW5zIGRvIGxvdXIgdXBvbiB5b3UgZm9yIHNvbWUgaWxsOwogICAgTW92ZSB0aGVtIG5vIG1vcmUgYnkgY3Jvc3NpbmcgdGhlaXIgaGlnaCB3aWxsLgoKICAgIEV4ZXVudCBDQVBVTEVULCBMQURZIENBUFVMRVQsIFBBUklTLCBhbmQgRlJJQVIgTEFVUkVOQ0UKCkZpcnN0IE11c2ljaWFuCgogICAgRmFpdGgsIHdlIG1heSBwdXQgdXAgb3VyIHBpcGVzLCBhbmQgYmUgZ29uZS4KCk51cnNlCgogICAgSG9uZXN0IGdvb2RmZWxsb3dzLCBhaCwgcHV0IHVwLCBwdXQgdXA7CiAgICBGb3IsIHdlbGwgeW91IGtub3csIHRoaXMgaXMgYSBwaXRpZnVsIGNhc2UuCgogICAgRXhpdAoKRmlyc3QgTXVzaWNpYW4KCiAgICBBeSwgYnkgbXkgdHJvdGgsIHRoZSBjYXNlIG1heSBiZSBhbWVuZGVkLgoKICAgIEVudGVyIFBFVEVSCgpQRVRFUgoKICAgIE11c2ljaWFucywgTywgbXVzaWNpYW5zLCAnSGVhcnQncyBlYXNlLCBIZWFydCdzCiAgICBlYXNlOicgTywgYW4geW91IHdpbGwgaGF2ZSBtZSBsaXZlLCBwbGF5ICdIZWFydCdzIGVhc2UuJwoKRmlyc3QgTXVzaWNpYW4KCiAgICBXaHkgJ0hlYXJ0J3MgZWFzZT8nCgpQRVRFUgoKICAgIE8sIG11c2ljaWFucywgYmVjYXVzZSBteSBoZWFydCBpdHNlbGYgcGxheXMgJ015CiAgICBoZWFydCBpcyBmdWxsIG9mIHdvZTonIE8sIHBsYXkgbWUgc29tZSBtZXJyeSBkdW1wLAogICAgdG8gY29tZm9ydCBtZS4KCkZpcnN0IE11c2ljaWFuCgogICAgTm90IGEgZHVtcCB3ZTsgJ3RpcyBubyB0aW1lIHRvIHBsYXkgbm93LgoKUEVURVIKCiAgICBZb3Ugd2lsbCBub3QsIHRoZW4CgpGaXJzdCBNdXNp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Rocm9uZTsKICAgIEFuZCBhbGwgdGhpcyBkYXkgYW4gdW5hY2N1c3RvbSdkIHNwaXJpdAogICAgTGlmdHMgbWUgYWJvdmUgdGhlIGdyb3VuZCB3aXRoIGNoZWVyZnVsIHRob3VnaHRzLgogICAgSSBkcmVhbXQgbXkgbGFkeSBjYW1lIGFuZCBmb3VuZCBtZSBkZWFkLS0KICAgIFN0cmFuZ2UgZHJlYW0sIHRoYXQgZ2l2ZXMgYSBkZWFkIG1hbiBsZWF2ZQogICAgdG8gdGhpbmshLS0KICAgIEFuZCBicmVhdGhlZCBzdWNoIGxpZmUgd2l0aCBraXNzZXMgaW4gbXkgbGlwcywKICAgIFRoYXQgSSByZXZpdmVkLCBhbmQgd2FzIGFuIGVtcGVyb3IuCiAgICBBaCBtZSEgaG93IHN3ZWV0IGlzIGxvdmUgaXRzZWxmIHBvc3Nlc3MnZCwKICAgIFdoZW4gYnV0IGxvdmUncyBzaGFkb3dzIGFyZSBzbyByaWNoIGluIGpveSEKCiAgICBFbnRlciBCQUxUSEFTQVIsIGJvb3RlZAogICAgTmV3cyBmcm9tIFZlcm9uYSEtLUhvdyBub3csIEJhbHRoYXNhciEKICAgIERvc3QgdGhvdSBub3QgYnJpbmcgbWUgbGV0dGVycyBmcm9tIHRoZSBmcmlhcj8KICAgIEhvdyBkb3RoIG15IGxhZHkIElzIG15IGZhdGhlciB3ZWxsPwogICAgSG93IGZhcmVzIG15IEp1bGlldD8gdGhhdCBJIGFzayBhZ2FpbjsKICAgIEZvciBub3RoaW5nIGNhbiBiZSBpbGwsIGlmIHNoZSBiZSB3ZWxsLgoKQkFMVEhBU0FSCgogICAgVGhlbiBzaGUgaXMgd2VsbCwgYW5kIG5vdGhpbmcgY2FuIGJlIGlsbDoKICAgIEhlciBib2R5IHNsZWVwcyBpbiBDYXBlbCdzIG1vbnVtZW50LAogICAgQW5kIGhlciBpbW1vcnRhbCBwYXJ0IHdpdGggYW5nZWxzIGxpdmVzLgogICAgSSBzYXcgaGVyIGxhaWQgbG93IGluIGhlciBraW5kcmVkJ3MgdmF1bHQsCiAgICBBbmQgcHJlc2VudGx5IHRvb2sgcG9zdCB0byB0ZWxsIGl0IHlvdToKICAgIE8sIHBhcmRvbiBtZSBmb3IgYnJpbmdpbmcgdGhlc2UgaWxsIG5ld3MsCiAgICBTaW5jZSB5b3UgZGlkIGxlYXZlIGl0IGZvciBteSBvZmZpY2UsIHNpci4KClJPTUVPCgogICAgSXMgaXQgZXZlbiBzbz8gdGhlbiBJIGRlZnkgeW91LCBzdGFycyEKICAgIFRob3Uga25vdydzdCBteSBsb2RnaW5nOiBnZXQgbWUgaW5rIGFuZCBwYXBlciwKICAgIEFuZCBoaXJlIHBvc3QtaG9yc2VzOyBJIHdpbGwgaGVuY2UgdG8tbmlnaHQuCgpCQUxUSEFTQVIKCiAgICBJIGRvIGJlc2VlY2ggeW91LCBzaXIsIGhhdmUgcGF0aWVuY2U6CiAgICBZb3VyIGxvb2tzIGFyZSBwYWxlIGFuZCB3aWxkLCBhbmQgZG8gaW1wb3J0CiAgICBTb21lIG1pc2FkdmVudHVyZS4KClJPTUVPCgogICAgVHVzaCwgdGhvdSBhcnQgZGVjZWl2ZWQ6CiAgICBMZWF2ZSBtZSwgYW5kIGRvIHRoZSB0aGluZyBJIGJpZCB0aGVlIGRvLgogICAgSGFzdCB0aG91IG5vIGxldHRlcnMgdG8gbWUgZnJvbSB0aGUgZnJpYXICgpCQUxUSEFTQVIKCiAgICBObywgbXkgZ29vZCBsb3JkLgoKUk9NRU8KCiAgICBObyBtYXR0ZXI6IGdldCB0aGVlIGdvbmUsCiAgICBBbmQgaGlyZSB0aG9zZSBob3JzZXM7IEknbGwgYmUgd2l0aCB0aGVlIHN0cmFpZ2h0LgoKICAgIEV4aXQgQkFMVEhBU0FSCiAgICBXZWxsLCBKdWxpZXQsIEkgd2lsbCBsaWUgd2l0aCB0aGVlIHRvLW5pZ2h0LgogICAgTGV0J3Mgc2VlIGZvciBtZWFuczogTyBtaXNjaGllZiwgdGhvdSBhcnQgc3dpZnQKICAgIFRvIGVudGVyIGluIHRoZSB0aG91Z2h0cyBvZiBkZXNwZXJhdGUgbWVuIQogICAgSSBkbyByZW1lbWJlciBhbiBhcG90aGVjYXJ5LC0tCiAgICBBbmQgaGVyZWFib3V0cyBoZSBkd2VsbHMsLS13aGljaCBsYXRlIEkgbm90ZWQKICAgIEluIHRhdHRlcidkIHdlZWRzLCB3aXRoIG92ZXJ3aGVsbWluZyBicm93cywKICAgIEN1bGxpbmcgb2Ygc2ltcGxlczsgbWVhZ3JlIHdlcmUgaGlzIGxvb2tzLAogICAgU2hhcnAgbWlzZXJ5IGhhZCB3b3JuIGhpbSB0byB0aGUgYm9uZXM6CiAgICBBbmQgaW4gaGlzIG5lZWR5IHNob3AgYSB0b3J0b2lzZSBodW5nLAogICAgQW4gYWxsaWdhdG9yIHN0dWZmJ2QsIGFuZCBvdGhlciBza2lucwogICAgT2YgaWxsLXNoYXBlZCBmaXNoZXM7IGFuZCBhYm91dCBoaXMgc2hlbHZlcwogICAgQSBiZWdnYXJseSBhY2NvdW50IG9mIGVtcHR5IGJveGVzLAogICAgR3JlZW4gZWFydGhlbiBwb3RzLCBibGFkZGVycyBhbmQgbXVzdHkgc2VlZHMsCiAgICBSZW1uYW50cyBvZiBwYWNrdGhyZWFkIGFuZCBvbGQgY2FrZXMgb2Ygcm9zZXMsCiAgICBXZXJlIHRoaW5seSBzY2F0dGVyJ2QsIHRvIG1ha2UgdXAgYSBzaG93LgogICAgTm90aW5nIHRoaXMgcGVudXJ5LCB0byBteXNlbGYgSSBzYWlkCiAgICAnQW4gaWYgYSBtYW4gZGlkIG5lZWQgYSBwb2lzb24gbm93LAogICAgV2hvc2Ugc2FsZSBpcyBwcmVzZW50IGRlYXRoIGluIE1hbnR1YSwKICAgIEhlcmUgbGl2ZXMgYSBjYWl0aWZmIHdyZXRjaCB3b3VsZCBzZWxsIGl0IGhpbS4nCiAgICBPLCB0aGlzIHNhbWUgdGhvdWdodCBkaWQgYnV0IGZvcmVydW4gbXkgbmVlZDsKICAgIEFuZCB0aGlzIHNhbWUgbmVlZHkgbWFuIG11c3Qgc2VsbCBpdCBtZS4KICAgIEFzIEkgcmVtZW1iZXIsIHRoaXMgc2hvdWxkIGJlIHRoZSBob3VzZS4KICAgIEJlaW5nIGhvbGlkYXksIHRoZSBiZWdnYXIncyBzaG9wIGlzIHNodXQuCiAgICBXaGF0LCBobyEgYXBvdGhlY2FyeSEKCiAgICBFbnRlciBBcG90aGVjYXJ5CgpBcG90aGVjYXJ5CgogICAgV2hvIGNhbGxzIHNvIGxvdWQCgpST01FTwoKICAgIENvbWUgaGl0aGVyLCBtYW4uIEkgc2VlIHRoYXQgdGhvdSBhcnQgcG9vcjoKICAgIEhvbGQsIHRoZXJlIGlzIGZvcnR5IGR1Y2F0czogbGV0IG1lIGhhdmUKICAgIEEgZHJhbSBvZiBwb2lzb24sIHN1Y2ggc29vbi1zcGVlZGluZyBnZWFyCiAgICBBcyB3aWxsIGRpc3BlcnNlIGl0c2VsZiB0aHJvdWdoIGFsbCB0aGUgdmVpbnMKICAgIFRoYXQgdGhlIGxpZmUtd2VhcnkgdGFrZXIgbWF5IGZhbGwgZGVhZAogICAgQW5kIHRoYXQgdGhlIHRydW5rIG1heSBiZSBkaXNjaGFyZ2VkIG9mIGJyZWF0aAogICAgQXMgdmlvbGVudGx5IGFzIGhhc3R5IHBvd2RlciBmaXJlZAogICAgRG90aCBodXJyeSBmcm9tIHRoZSBmYXRhbCBjYW5ub24ncyB3b21iLgoKQXBvdGhlY2FyeQoKICAgIFN1Y2ggbW9ydGFsIGRydWdzIEkgaGF2ZTsgYnV0IE1hbnR1YSdzIGxhdwogICAgSXMgZGVhdGggdG8gYW55IGhlIHRoYXQgdXR0ZXJzIHRoZW0uCgpST01FTwoKICAgIEFydCB0aG91IHNvIGJhcmUgYW5kIGZ1bGwgb2Ygd3JldGNoZWRuZXNzLAogICAgQW5kIGZlYXInc3QgdG8gZGllPyBmYW1pbmUgaXMgaW4gdGh5IGNoZWVrcywKICAgIE5lZWQgYW5kIG9wcHJlc3Npb24gc3RhcnZldGggaW4gdGhpbmUgZXllcywKICAgIENvbnRlbXB0IGFuZCBiZWdnYXJ5IGhhbmdzIHVwb24gdGh5IGJhY2s7CiAgICBUaGUgd29ybGQgaXMgbm90IHRoeSBmcmllbmQgbm9yIHRoZSB3b3JsZCdzIGxhdzsKICAgIFRoZSB3b3JsZCBhZmZvcmRzIG5vIGxhdyB0byBtYWtlIHRoZWUgcmljaDsKICAgIFRoZW4gYmUgbm90IHBvb3IsIGJ1dCBicmVhayBpdCwgYW5kIHRha2UgdGhpcy4KCkFwb3RoZWNhcnkKCiAgICBNeSBwb3ZlcnR5LCBidXQgbm90IG15IHdpbGwsIGNvbnNlbnRzLgoKUk9NRU8KCiAgICBJIHBheSB0aHkgcG92ZXJ0eSwgYW5kIG5vdCB0aHkgd2lsbC4KCkFwb3RoZWNhcnkKCiAgICBQdXQgdGhpcyBpbiBhbnkgbGlxdWlkIHRoaW5nIHlvdSB3aWxsLAogICAgQW5kIGRyaW5rIGl0IG9mZjsgYW5kLCBpZiB5b3UgaGFkIHRoZSBzdHJlbmd0aAogICAgT2YgdHdlbnR5IG1lbiwgaXQgd291bGQgZGlzcGF0Y2ggeW91IHN0cmFpZ2h0LgoKUk9NRU8KCiAgICBUaGVyZSBpcyB0aHkgZ29sZCwgd29yc2UgcG9pc29uIHRvIG1lbidzIHNvdWxzLAogICAgRG9pbmcgbW9yZSBtdXJkZXJzIGluIHRoaXMgbG9hdGhzb21lIHdvcmxkLAogICAgVGhhbiB0aGVzZSBwb29yIGNvbXBvdW5kcyB0aGF0IHRob3UgbWF5c3Qgbm90IHNlbGwuCiAgICBJIHNlbGwgdGhlZSBwb2lzb247IHRob3UgaGFzdCBzb2xkIG1lIG5vbmUuCiAgICBGYXJld2VsbDogYnV5IGZvb2QsIGFuZCBnZXQgdGh5c2VsZiBpbiBmbGVzaC4KICAgIENvbWUsIGNvcmRpYWwgYW5kIG5vdCBwb2lzb24sIGdvIHdpdGggbWUKICAgIFRvIEp1bGlldCdzIGdyYXZlOyBmb3IgdGhlcmUgbXVzdCBJIHVzZSB0aGVlLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBKT0hOIAoKRlJJQVIgSk9ITgoKICAgIEhvbHkgRnJhbmNpc2NhbiBmcmlhciEgYnJvdGhlciwgaG8hCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UKCkZSSUFSIExBVVJFTkNFCgogICAgVGhpcyBzYW1lIHNob3VsZCBiZSB0aGUgdm9pY2Ugb2YgRnJpYXIgSm9obi4KICAgIFdlbGNvbWUgZnJvbSBNYW50dWE6IHdoYXQgc2F5cyBSb21lbz8KICAgIE9yLCBpZiBoaXMgbWluZCBiZSB3cml0LCBnaXZlIG1lIGhpcyBsZXR0ZXIuCgpGUklBUiBKT0hOCgogICAgR29pbmcgdG8gZmluZCBhIGJhcmUtZm9vdCBicm90aGVyIG91dAogICAgT25lIG9mIG91ciBvcmRlciwgdG8gYXNzb2NpYXRlIG1lLAogICAgSGVyZSBpbiB0aGlzIGNpdHkgdmlzaXRpbmcgdGhlIHNpY2ssCiAgICBBbmQgZmluZGluZyBoaW0sIHRoZSBzZWFyY2hlcnMgb2YgdGhlIHRvd24sCiAgICBTdXNwZWN0aW5nIHRoYXQgd2UgYm90aCB3ZXJlIGluIGEgaG91c2UKICAgIFdoZXJlIHRoZSBpbmZlY3Rpb3VzIHBlc3RpbGVuY2UgZGlkIHJlaWduLAogICAgU2VhbCdkIHVwIHRoZSBkb29ycywgYW5kIHdvdWxkIG5vdCBsZXQgdXMgZm9ydGg7CiAgICBTbyB0aGF0IG15IHNwZWVkIHRvIE1hbnR1YSB0aGVyZSB3YXMgc3RheSdkLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXaG8gYmFyZSBteSBsZXR0ZXIsIHRoZW4sIHRvIFJvbWVvPwoKRlJJQVIgSk9ITgoKICAgIEkgY291bGQgbm90IHNlbmQgaXQsLS1oZXJlIGl0IGlzIGFnYWluLC0tCiAgICBOb3IgZ2V0IGEgbWVzc2VuZ2VyIHRvIGJyaW5nIGl0IHRoZWUsCiAgICBTbyBmZWFyZnVsIHdlcmUgdGhleSBvZiBpbmZlY3Rpb24uCgpGUklBUiBMQVVSRU5DRQoKICAgIFVuaGFwcHkgZm9ydHVuZSEgYnkgbXkgYnJvdGhlcmhvb2QsCiAgICBUaGUgbGV0dGVyIHdhcyBub3QgbmljZSBidXQgZnVsbCBvZiBjaGFyZ2UKICAgIE9mIGRlYXIgaW1wb3J0LCBhbmQgdGhlIG5lZ2xlY3RpbmcgaXQKICAgIE1heSBkbyBtdWNoIGRhbmdlci4gRnJpYXIgSm9obiwgZ28gaGVuY2U7CiAgICBHZXQgbWUgYW4gaXJvbiBjcm93LCBhbmQgYnJpbmcgaXQgc3RyYWlnaHQKICAgIFVudG8gbXkgY2VsbC4KCkZSSUFSIEpPSE4KCiAgICBCcm90aGVyLCBJJ2xsIGdvIGFuZCBicmluZyBpdCB0aGVlLgoKICAgIEV4aXQKCkZSSUFSIExBVVJFTkNFCgogICAgTm93IG11c3QgSSB0byB0aGUgbW9udW1lbnQgYWxvbmU7CiAgICBXaXRoaW4gdGhyZWUgaG91cnMgd2lsbCBmYWlyIEp1bGlldCB3YWtlOgogICAgU2hlIHdpbGwgYmVzaHJldyBtZSBtdWNoIHRoYXQgUm9tZW8KICAgIEhhdGggaGFkIG5vIG5vdGljZSBvZiB0aGVzZSBhY2NpZGVudHM7CiAgICBCdXQgSSB3aWxsIHdyaXRlIGFnYWluIHRvIE1hbnR1YSwKICAgIEFuZCBrZWVwIGhlciBhdCBteSBjZWxsIHRpbGwgUm9tZW8gY29tZTsKICAgIFBvb3IgbGl2aW5nIGNvcnNlLCBjbG9zZWQgaW4gYSBkZWFkIG1hbidzIHRvbWIhCgogICAgRXhpdAoKU0NFTkUgSUlJLiBBIGNodXJjaHlhcmQ7IGluIGl0IGEgdG9tYiBiZWxvbmdpbmcgdG8gdGhlIENhcHVsZXRzLgoKICAgIEVudGVyIFBBUklTLCBhbmQgaGlzIFBhZ2UgYmVhcmluZyBmbG93ZXJzIGFuZCBhIHRvcmNoIAoKUEFSSVMKCiAgICBHaXZlIG1lIHRoeSB0b3JjaCwgYm95OiBoZW5jZSwgYW5kIHN0YW5kIGFsb29mOgogICAgWWV0IHB1dCBpdCBvdXQsIGZvciBJIHdvdWxkIG5vdCBiZSBzZWVuLgogICAgVW5kZXIgeW9uZCB5ZXctdHJlZXMgbGF5IHRoZWUgYWxsIGFsb25nLAogICAgSG9sZGluZyB0aGluZSBlYXIgY2xvc2UgdG8gdGhlIGhvbGxvdyBncm91bmQ7CiAgICBTbyBzaGFsbCBubyBmb290IHVwb24gdGhlIGNodXJjaHlhcmQgdHJlYWQsCiAgICBCZWluZyBsb29zZSwgdW5maXJtLCB3aXRoIGRpZ2dpbmcgdXAgb2YgZ3JhdmVzLAogICAgQnV0IHRob3Ugc2hhbHQgaGVhciBpdDogd2hpc3RsZSB0aGVuIHRvIG1lLAogICAgQXMgc2lnbmFsIHRoYXQgdGhvdSBoZWFyJ3N0IHNvbWV0aGluZyBhcHByb2FjaC4KICAgIEdpdmUgbWUgdGhvc2UgZmxvd2Vycy4gRG8gYXMgSSBiaWQgdGhlZSwgZ28uCgpQQUdFCgogICAgW0FzaWRlXSBJIGFtIGFsbW9zdCBhZnJhaWQgdG8gc3RhbmQgYWxvbmUKICAgIEhlcmUgaW4gdGhlIGNodXJjaHlhcmQ7IHlldCBJIHdpbGwgYWR2ZW50dXJlLgoKICAgIFJldGlyZXMKClBBUklTCgogICAgU3dlZXQgZmxvd2VyLCB3aXRoIGZsb3dlcnMgdGh5IGJyaWRhbCBiZWQgSSBzdHJldywtLQogICAgTyB3b2UhIHRoeSBjYW5vcHkgaXMgZHVzdCBhbmQgc3RvbmVzOy0tCiAgICBXaGljaCB3aXRoIHN3ZWV0IHdhdGVyIG5pZ2h0bHkgSSB3aWxsIGRldywKICAgIE9yLCB3YW50aW5nIHRoYXQsIHdpdGggdGVhcnMgZGlzdGlsbCdkIGJ5IG1vYW5zOgogICAgVGhlIG9ic2VxdWllcyB0aGF0IEkgZm9yIHRoZWUgd2lsbCBrZWVwCiAgICBOaWdodGx5IHNoYWxsIGJlIHRvIHN0cmV3IHRoeSBncmF2ZSBhbmQgd2VlcC4KCiAgICBUaGUgUGFnZSB3aGlzdGxlcwogICAgVGhlIGJveSBnaXZlcyB3YXJuaW5nIHNvbWV0aGluZyBkb3RoIGFwcHJvYWNoLgogICAgV2hhdCBjdXJzZWQgZm9vdCB3YW5kZXJzIHRoaXMgd2F5IHRvLW5pZ2h0LAogICAgVG8gY3Jvc3MgbXkgb2JzZXF1aWVzIGFuZCB0cnVlIGxvdmUncyByaXRlPwogICAgV2hhdCB3aXRoIGEgdG9yY2ghIG11ZmZsZSBtZSwgbmlnaHQsIGF3aGlsZS4KCiAgICBSZXRpcmVzCgogICAgRW50ZXIgUk9NRU8gYW5kIEJBTFRIQVNBUiwgd2l0aCBhIHRvcmNoLCBtYXR0b2NrLCAmIGMKClJPTUVPCgogICAgR2l2ZSBtZSB0aGF0IG1hdHRvY2sgYW5kIHRoZSB3cmVuY2hpbmcgaXJvbi4KICAgIEhvbGQsIHRha2UgdGhpcyBsZXR0ZXI7IGVhcmx5IGluIHRoZSBtb3JuaW5nCiAgICBTZWUgdGhvdSBkZWxpdmVyIGl0IHRvIG15IGxvcmQgYW5kIGZhdGhlci4KICAgIEdpdmUgbWUgdGhlIGxpZ2h0OiB1cG9uIHRoeSBsaWZlLCBJIGNoYXJnZSB0aGVlLAogICAgV2hhdGUnZXIgdGhvdSBoZWFyJ3N0IG9yIHNlZXN0LCBzdGFuZCBhbGwgYWxvb2YsCiAgICBBbmQgZG8gbm90IGludGVycnVwdCBtZSBpbiBteSBjb3Vyc2UuCiAgICBXaHkgSSBkZXNjZW5kIGludG8gdGhpcyBiZWQgb2YgZGVhdGgsCiAgICBJcyBwYXJ0bHkgdG8gYmVob2xkIG15IGxhZHkncyBmYWNlOwogICAgQnV0IGNoaWVmbHkgdG8gdGFrZSB0aGVuY2UgZnJvbSBoZXIgZGVhZCBmaW5nZXIKICAgIEEgcHJlY2lvdXMgcmluZywgYSByaW5nIHRoYXQgSSBtdXN0IHVzZQogICAgSW4gZGVhciBlbXBsb3ltZW50OiB0aGVyZWZvcmUgaGVuY2UsIGJlIGdvbmU6CiAgICBCdXQgaWYgdGhvdSwgamVhbG91cywgZG9zdCByZXR1cm4gdG8gcHJ5CiAgICBJbiB3aGF0IEkgZnVydGhlciBzaGFsbCBpbnRlbmQgdG8gZG8sCiAgICBCeSBoZWF2ZW4sIEkgd2lsbCB0ZWFyIHRoZWUgam9pbnQgYnkgam9pbnQKICAgIEFuZCBzdHJldyB0aGlzIGh1bmdyeSBjaHVyY2h5YXJkIHdpdGggdGh5IGxpbWJzOgogICAgVGhlIHRpbWUgYW5kIG15IGludGVudHMgYXJlIHNhdmFnZS13aWxkLAogICAgTW9yZSBmaWVyY2UgYW5kIG1vcmUgaW5leG9yYWJsZSBmYXIKICAgIFRoYW4gZW1wdHkgdGlnZXJzIG9yIHRoZSByb2FyaW5nIHNlYS4KCkJBTFRIQVNBUgoKICAgIEkgd2lsbCBiZSBnb25lLCBzaXIsIGFuZCBub3QgdHJvdWJsZSB5b3UuCgpST01FTwoKICAgIFNvIHNoYWx0IHRob3Ugc2hvdyBtZSBmcmllbmRzaGlwLiBUYWtlIHRob3UgdGhhdDoKICAgIExpdmUsIGFuZCBiZSBwcm9zcGVyb3VzOiBhbmQgZmFyZXdlbGwsIGdvb2QgZmVsbG93LgoKQkFMVEhBU0FSCgogICAgW0FzaWRlXSBGb3IgYWxsIHRoaXMgc2FtZSwgSSdsbCBoaWRlIG1lIGhlcmVhYm91dDoKICAgIEhpcyBsb29rcyBJIGZlYXIsIGFuZCBoaXMgaW50ZW50cyBJIGRvdWJ0LgoKICAgIFJldGlyZXMKClJPTUVPCgogICAgVGhvdSBkZXRlc3RhYmxlIG1hdywgdGhvdSB3b21iIG9mIGRlYXRoLAogICAgR29yZ2VkIHdpdGggdGhlIGRlYXJlc3QgbW9yc2VsIG9mIHRoZSBlYXJ0aCwKICAgIFRodXMgSSBlbmZvcmNlIHRoeSByb3R0ZW4gamF3cyB0byBvcGVuLAogICAgQW5kLCBpbiBkZXNwaXRlLCBJJ2xsIGNyYW0gdGhlZSB3aXRoIG1vcmUgZm9vZCEKCiAgICBPcGVucyB0aGUgdG9tYgoKUEFSSVMKCiAgICBUaGlzIGlzIHRoYXQgYmFuaXNoJ2QgaGF1Z2h0eSBNb250YWd1ZSwKICAgIFRoYXQgbXVyZGVyJ2QgbXkgbG92ZSdzIGNvdXNpbiwgd2l0aCB3aGljaCBncmllZiwKICAgIEl0IGlzIHN1cHBvc2VkLCB0aGUgZmFpciBjcmVhdHVyZSBkaWVkOwogICAgQW5kIGhlcmUgaXMgY29tZSB0byBkbyBzb21lIHZpbGxhbm91cyBzaGFtZQogICAgVG8gdGhlIGRlYWQgYm9kaWVzOiBJIHdpbGwgYXBwcmVoZW5kIGhpbS4KCiAgICBDb21lcyBmb3J3YXJkCiAgICBTdG9wIHRoeSB1bmhhbGxvdydkIHRvaWwsIHZpbGUgTW9udGFndWUhCiAgICBDYW4gdmVuZ2VhbmNlIGJlIHB1cnN1ZWQgZnVydGhlciB0aGFuIGRlYXRoPwogICAgQ29uZGVtbmVkIHZpbGxhaW4sIEkgZG8gYXBwcmVoZW5kIHRoZWU6CiAgICBPYmV5LCBhbmQgZ28gd2l0aCBtZTsgZm9yIHRob3UgbXVzdCBkaWUuCgpST01FTwoKICAgIEkgbXVzdCBpbmRlZWQ7IGFuZCB0aGVyZWZvcmUgY2FtZSBJIGhpdGhlci4KICAgIEdvb2QgZ2VudGxlIHlvdXRoLCB0ZW1wdCBub3QgYSBkZXNwZXJhdGUgbWFuOwogICAgRmx5IGhlbmNlLCBhbmQgbGVhdmUgbWU6IHRoaW5rIHVwb24gdGhlc2UgZ29uZTsKICAgIExldCB0aGVtIGFmZnJpZ2h0IHRoZWUuIEkgYmVzZWVjaCB0aGVlLCB5b3V0aCwKICAgIFB1dCBub3QgYW5vdGhlciBzaW4gdXBvbiBteSBoZWFkLAogICAgQnkgdXJnaW5nIG1lIHRvIGZ1cnk6IE8sIGJlIGdvbmUhCiAgICBCeSBoZWF2ZW4sIEkgbG92ZSB0aGVlIGJldHRlciB0aGFuIG15c2VsZjsKICAgIEZvciBJIGNvbWUgaGl0aGVyIGFybSdkIGFnYWluc3QgbXlzZWxmOgogICAgU3RheSBub3QsIGJlIGdvbmU7IGxpdmUsIGFuZCBoZXJlYWZ0ZXIgc2F5LAogICAgQSBtYWRtYW4ncyBtZXJjeSBiYWRlIHRoZWUgcnVuIGF3YXkuCgpQQVJJUwoKICAgIEkgZG8gZGVmeSB0aHkgY29uanVyYXRpb25zLAogICAgQW5kIGFwcHJlaGVuZCB0aGVlIGZvciBhIGZlbG9uIGhlcmUuCgpST01FTwoKICAgIFdpbHQgdGhvdSBwcm92b2tlIG1lPyB0aGVuIGhhdmUgYXQgdGhlZSwgYm95IQoKICAgIFRoZXkgZmlnaHQKClBBR0UKCiAgICBPIExvcmQsIHRoZXkgZmlnaHQhIEkgd2lsbCBnbyBjYWxsIHRoZSB3YXRjaC4KCiAgICBFeGl0CgpQQVJJUwoKICAgIE8sIEkgYW0gc2xhaW4hCgogICAgRmFsbHMKICAgIElmIHRob3UgYmUgbWVyY2lmdWwsCiAgICBPcGVuIHRoZSB0b21iLCBsYXkgbWUgd2l0aCBKdWxpZXQuCgogICAgRGllcwoKUk9NRU8KCiAgICBJbiBmYWl0aCwgSSB3aWxsLiBMZXQgbWUgcGVydXNlIHRoaXMgZmFjZS4KICAgIE1lcmN1dGlvJ3Mga2luc21hbiwgbm9ibGUgQ291bnR5IFBhcmlzIQogICAgV2hhdCBzYWlkIG15IG1hbiwgd2hlbiBteSBiZXRvc3NlZCBzb3VsCiAgICBEaWQgbm90IGF0dGVuZCBoaW0gYXMgd2Ugcm9kZT8gSSB0aGluawogICAgSGUgdG9sZCBtZSBQYXJpcyBzaG91bGQgaGF2ZSBtYXJyaWVkIEp1bGlldDoKICAgIFNhaWQgaGUgbm90IHNvPyBvciBkaWQgSSBkcmVhbSBpdCBzbz8KICAgIE9yIGFtIEkgbWFkLCBoZWFyaW5nIGhpbSB0YWxrIG9mIEp1bGlldCwKICAgIFRvIHRoaW5rIGl0IHdhcyBzbz8gTywgZ2l2ZSBtZSB0aHkgaGFuZCwKICAgIE9uZSB3cml0IHdpdGggbWUgaW4gc291ciBtaXNmb3J0dW5lJ3MgYm9vayEKICAgIEknbGwgYnVyeSB0aGVlIGluIGEgdHJpdW1waGFudCBncmF2ZTsKICAgIEEgZ3JhdmUIE8gbm8hIGEgbGFudGVybiwgc2xhdWdodGVyJ2QgeW91dGgsCiAgICBGb3IgaGVyZSBsaWVzIEp1bGlldCwgYW5kIGhlciBiZWF1dHkgbWFrZXMKICAgIFRoaXMgdmF1bHQgYSBmZWFzdGluZyBwcmVzZW5jZSBmdWxsIG9mIGxpZ2h0LgogICAgRGVhdGgsIGxpZSB0aG91IHRoZXJlLCBieSBhIGRlYWQgbWFuIGludGVycidkLgoKICAgIExheWluZyBQQVJJUyBpbiB0aGUgdG9tYgogICAgSG93IG9mdCB3aGVuIG1lbiBhcmUgYXQgdGhlIHBvaW50IG9mIGRlYXRoCiAgICBIYXZlIHRoZXkgYmVlbiBtZXJyeSEgd2hpY2ggdGhlaXIga2VlcGVycyBjYWxsCiAgICBBIGxpZ2h0bmluZyBiZWZvcmUgZGVhdGg6IE8sIGhvdyBtYXkgSQogICAgQ2FsbCB0aGlzIGEgbGlnaHRuaW5nPyBPIG15IGxvdmUhIG15IHdpZmUhCiAgICBEZWF0aCwgdGhhdCBoYXRoIHN1Y2snZCB0aGUgaG9uZXkgb2YgdGh5IGJyZWF0aCwKICAgIEhhdGggaGFkIG5vIHBvd2VyIHlldCB1cG9uIHRoeSBiZWF1dHk6CiAgICBUaG91IGFydCBub3QgY29ucXVlcidkOyBiZWF1dHkncyBlbnNpZ24geWV0CiAgICBJcyBjcmltc29uIGluIHRoeSBsaXBzIGFuZCBpbiB0aHkgY2hlZWtzLAogICAgQW5kIGRlYXRoJ3MgcGFsZSBmbGFnIGlzIG5vdCBhZHZhbmNlZCB0aGVyZS4KICAgIFR5YmFsdCwgbGllc3QgdGhvdSB0aGVyZSBpbiB0aHkgYmxvb2R5IHNoZWV0PwogICAgTywgd2hhdCBtb3JlIGZhdm91ciBjYW4gSSBkbyB0byB0aGVlLAogICAgVGhhbiB3aXRoIHRoYXQgaGFuZCB0aGF0IGN1dCB0aHkgeW91dGggaW4gdHdhaW4KICAgIFRvIHN1bmRlciBoaXMgdGhhdCB3YXMgdGhpbmUgZW5lbXkCiAgICBGb3JnaXZlIG1lLCBjb3VzaW4hIEFoLCBkZWFyIEp1bGlldCwKICAgIFdoeSBhcnQgdGhvdSB5ZXQgc28gZmFpcj8gc2hhbGwgSSBiZWxpZXZlCiAgICBUaGF0IHVuc3Vic3RhbnRpYWwgZGVhdGggaXMgYW1vcm91cywKICAgIEFuZCB0aGF0IHRoZSBsZWFuIGFiaG9ycmVkIG1vbnN0ZXIga2VlcHMKICAgIFRoZWUgaGVyZSBpbiBkYXJrIHRvIGJlIGhpcyBwYXJhbW91cj8KICAgIEZvciBmZWFyIG9mIHRoYXQsIEkgc3RpbGwgd2lsbCBzdGF5IHdpdGggdGhlZTsKICAgIEFuZCBuZXZlciBmcm9tIHRoaXMgcGFsYWNlIG9mIGRpbSBuaWdodAogICAgRGVwYXJ0IGFnYWluOiBoZXJlLCBoZXJlIHdpbGwgSSByZW1haW4KICAgIFdpdGggd29ybXMgdGhhdCBhcmUgdGh5IGNoYW1iZXItbWFpZHM7IE8sIGhlcmUKICAgIFdpbGwgSSBzZXQgdXAgbXkgZXZlcmxhc3RpbmcgcmVzdCwKICAgIEFuZCBzaGFrZSB0aGUgeW9rZSBvZiBpbmF1c3BpY2lvdXMgc3RhcnMKICAgIEZyb20gdGhpcyB3b3JsZC13ZWFyaWVkIGZsZXNoLiBFeWVzLCBsb29rIHlvdXIgbGFzdCEKICAgIEFybXMsIHRha2UgeW91ciBsYXN0IGVtYnJhY2UhIGFuZCwgbGlwcywgTyB5b3UKICAgIFRoZSBkb29ycyBvZiBicmVhdGgsIHNlYWwgd2l0aCBhIHJpZ2h0ZW91cyBraXNzCiAgICBBIGRhdGVsZXNzIGJhcmdhaW4gdG8gZW5ncm9zc2luZyBkZWF0aCEKICAgIENvbWUsIGJpdHRlciBjb25kdWN0LCBjb21lLCB1bnNhdm91cnkgZ3VpZGUhCiAgICBUaG91IGRlc3BlcmF0ZSBwaWxvdCwgbm93IGF0IG9uY2UgcnVuIG9uCiAgICBUaGUgZGFzaGluZyByb2NrcyB0aHkgc2VhLXNpY2sgd2VhcnkgYmFyayEKICAgIEhlcmUncyB0byBteSBsb3ZlIQoKICAgIERyaW5rcwogICAgTyB0cnVlIGFwb3RoZWNhcnkhCiAgICBUaHkgZHJ1Z3MgYXJlIHF1aWNrLiBUaHVzIHdpdGggYSBraXNzIEkgZGllLgoKICAgIERpZXMKCiAgICBFbnRlciwgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgY2h1cmNoeWFyZCwgRlJJQVIgTEFVUkVOQ0UsIHdpdGggYSBsYW50ZXJuLCBjcm93LCBhbmQgc3BhZGUKCkZSSUFSIExBVVJFTkNFCgogICAgU2FpbnQgRnJhbmNpcyBiZSBteSBzcGVlZCEgaG93IG9mdCB0by1uaWdodAogICAgSGF2ZSBteSBvbGQgZmVldCBzdHVtYmxlZCBhdCBncmF2ZXMhIFdobydzIHRoZXJlPwoKQkFMVEhBU0FSCgogICAgSGVyZSdzIG9uZSwgYSBmcmllbmQsIGFuZCBvbmUgdGhhdCBrbm93cyB5b3Ugd2VsbC4KCkZSSUFSIExBVVJFTkNFCgogICAgQmxpc3MgYmUgdXBvbiB5b3UhIFRlbGwgbWUsIGdvb2QgbXkgZnJpZW5kLAogICAgV2hhdCB0b3JjaCBpcyB5b25kLCB0aGF0IHZhaW5seSBsZW5kcyBoaXMgbGlnaHQKICAgIFRvIGdydWJzIGFuZCBleWVsZXNzIHNrdWxscz8gYXMgSSBkaXNjZXJuLAogICAgSXQgYnVybmV0aCBpbiB0aGUgQ2FwZWwncyBtb251bWVudC4KCkJBTFRIQVNBUgoKICAgIEl0IGRvdGggc28sIGhvbHkgc2lyOyBhbmQgdGhlcmUncyBteSBtYXN0ZXIsCiAgICBPbmUgdGhhdCB5b3UgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2hvIGlzIGl0PwoKQkFMVEhBU0FSCgogICAgUm9tZW8uCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvdyBsb25nIGhhdGggaGUgYmVlbiB0aGVyZT8KCkJBTFRIQVNBUgoKICAgIEZ1bGwgaGFsZiBhbiBob3VyLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHbyB3aXRoIG1lIHRvIHRoZSB2YXVsdC4KCkJBTFRIQVNBUgoKICAgIEkgZGFyZSBub3QsIHNpcgogICAgTXkgbWFzdGVyIGtub3dzIG5vdCBidXQgSSBhbSB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CwgYm95OiB3aGljaCB3YXkCgpKVUxJRVQKCiAgICBZZWEsIG5vaXNlPyB0aGVuIEknbGwgYmUgYnJpZWYuIE8gaGFwcHkgZGFnZ2VyIQoKICAgIFNuYXRjaGluZyBST01FTydzIGRhZ2dlcgogICAgVGhpcyBpcyB0aHkgc2hlYXRoOwoKICAgIFN0YWJzIGhlcnNlbGYKICAgIHRoZXJlIHJ1c3QsIGFuZCBsZXQgbWUgZGllLgoKICAgIEZhbGxzIG9uIFJPTUVPJ3MgYm9keSwgYW5kIGRpZXMKCiAgICBFbnRlciBXYXRjaCwgd2l0aCB0aGUgUGFnZSBvZiBQQVJJUwoKUEFHRQoKICAgIFRoaXMgaXMgdGhlIHBsYWNlOyB0aGVyZSwgd2hlcmUgdGhlIHRvcmNoIGRvdGggYnVybi4KCkZpcnN0IFdhdGNobWFuCgogICAgVGhlIGdyb3VuZCBpcyBibG9vZHk7IHNlYXJjaCBhYm91dCB0aGUgY2h1cmNoeWFyZDoKICAgIEdvLCBzb21lIG9mIHlvdSwgd2hvZSdlciB5b3UgZmluZCBhdHRhY2guCiAgICBQaXRpZnVsIHNpZ2h0ISBoZXJlIGxpZXMgdGhlIGNvdW50eSBzbGFpbiwKICAgIEFuZCBKdWxpZXQgYmxlZWRpbmcsIHdhcm0sIGFuZCBuZXdseSBkZWFkLAogICAgV2hvIGhlcmUgaGF0aCBsYWluIHRoZXNlIHR3byBkYXlzIGJ1cmllZC4KICAgIEdvLCB0ZWxsIHRoZSBwcmluY2U6IHJ1biB0byB0aGUgQ2FwdWxldHM6CiAgICBSYWlzZSB1cCB0aGUgTW9udGFndWVzOiBzb21lIG90aGVycyBzZWFyY2g6CiAgICBXZSBzZWUgdGhlIGdyb3VuZCB3aGVyZW9uIHRoZXNlIHdvZXMgZG8gbGllOwogICAgQnV0IHRoZSB0cnVlIGdyb3VuZCBvZiBhbGwgdGhlc2UgcGl0ZW91cyB3b2VzCiAgICBXZSBjYW5ub3Qgd2l0aG91dCBjaXJjdW1zdGFuY2UgZGVzY3J5LgoKICAgIFJlLWVudGVyIHNvbWUgb2YgdGhlIFdhdGNoLCB3aXRoIEJBTFRIQVNBUgoKU2Vjb25kIFdhdGNobWFuCgogICAgSGVyZSdzIFJvbWVvJ3MgbWFuOyB3ZSBmb3VuZCBoaW0gaW4gdGhlIGNodXJjaHlhcmQuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhvbGQgaGltIGluIHNhZmV0eSwgdGlsbCB0aGUgcHJpbmNlIGNvbWUgaGl0aGVyLgoKICAgIFJlLWVudGVyIG90aGVycyBvZiB0aGUgV2F0Y2gsIHdpdGggRlJJQVIgTEFVUkVOQ0UKClRoaXJkIFdhdGNobWFuCgogICAgSGVyZSBpcyBhIGZyaWFyLCB0aGF0IHRyZW1ibGVzLCBzaWdocyBhbmQgd2VlcHM6CiAgICBXZSB0b29rIHRoaXMgbWF0dG9jayBhbmQgdGhpcyBzcGFkZSBmcm9tIGhpbSwKICAgIEFzIGhlIHdhcyBjb21pbmcgZnJvbSB0aGlzIGNodXJjaHlhcmQgc2lkZS4KCkZpcnN0IFdhdGNobWFuCgogICAgQSBncmVhdCBzdXNwaWNpb246IHN0YXkgdGhlIGZyaWFyIHRvby4KCiAgICBFbnRlciB0aGUgUFJJTkNFIGFuZCBBdHRlbmRhbnRzCgpQUklOQ0UKCiAgICBXaGF0IG1pc2FkdmVudHVyZSBpcyBzbyBlYXJseSB1cCwKICAgIFRoYXQgY2FsbHMgb3VyIHBlcnNvbiBmcm9tIG91ciBtb3JuaW5nJ3MgcmVzdD8KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIGFuZCBvdGhlcnMKCkNBUFVMRVQKCiAgICBXaGF0IHNob3VsZCBpdCBiZSwgdGhhdCB0aGV5IHNvIHNocmllayBhYnJvYWQCgpMQURZIENBUFVMRVQKCiAgICBUaGUgcGVvcGxlIGluIHRoZSBzdHJlZXQgY3J5IFJvbWVvLAogICAgU29tZSBKdWxpZXQsIGFuZCBzb21lIFBhcmlzOyBhbmQgYWxsIHJ1biwKICAgIFdpdGggb3BlbiBvdXRjcnkgdG93YXJkIG91ciBtb251bWVudC4KClBSSU5DRQoKICAgIFdoYXQgZmVhciBpcyB0aGlzIHdoaWNoIHN0YXJ0bGVzIGluIG91ciBlYXJzPwoKRmlyc3QgV2F0Y2htYW4KCiAgICBTb3ZlcmVpZ24sIGhlcmUgbGllcyB0aGUgQ291bnR5IFBhcmlzIHNsYWluOwogICAgQW5kIFJvbWVvIGRlYWQ7IGFuZCBKdWxpZXQsIGRlYWQgYmVmb3JlLAogICAgV2FybSBhbmQgbmV3IGtpbGwnZC4KClBSSU5DRQoKICAgIFNlYXJjaCwgc2VlaywgYW5kIGtub3cgaG93IHRoaXMgZm91bCBtdXJkZXIgY29tZXMuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhlcmUgaXMgYSBmcmlhciwgYW5kIHNsYXVnaHRlcidkIFJvbWVvJ3MgbWFuOwogICAgV2l0aCBpbnN0cnVtZW50cyB1cG9uIHRoZW0sIGZpdCB0byBvcGVuCiAgICBUaGVzZSBkZWFkIG1lbidzIHRvbWJzLgoKQ0FQVUxFVAoKICAgIE8gaGVhdmVucyEgTyB3aWZlLCBsb29rIGhvdyBvdXIgZGF1Z2h0ZXIgYmxlZWRzIQogICAgVGhpcyBkYWdnZXIgaGF0aCBtaXN0YSdlbi0tZm9yLCBsbywgaGlzIGhvdXNlCiAgICBJcyBlbXB0eSBvbiB0aGUgYmFjayBvZiBNb250YWd1ZSwtLQogICAgQW5kIGl0IG1pcy1zaGVhdGhlZCBpbiBteSBkYXVnaHRlcidzIGJvc29tIQoKTEFEWSBDQVBVTEVUCgogICAgTyBtZSEgdGhpcyBzaWdodCBvZiBkZWF0aCBpcyBhcyBhIGJlbGwsCiAgICBUaGF0IHdhcm5zIG15IG9sZCBhZ2UgdG8gYSBzZXB1bGNocmUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIG90aGVycwoKUFJJTkNFCgogICAgQ29tZSwgTW9udGFndWU7IGZvciB0aG91IGFydCBlYXJseSB1cCwKICAgIFRvIHNlZSB0aHkgc29uIGFuZCBoZWlyIG1vcmUgZWFybHkgZG93bi4KCk1PTlRBR1VFCgogICAgQWxhcywgbXkgbGllZ2UsIG15IHdpZmUgaXMgZGVhZCB0by1uaWdodDsKICAgIEdyaWVmIG9mIG15IHNvbidzIGV4aWxlIGhhdGggc3RvcHAnZCBoZXIgYnJlYXRoOgogICAgV2hhdCBmdXJ0aGVyIHdvZSBjb25zcGlyZXMgYWdhaW5zdCBtaW5lIGFnZT8KClBSSU5DRQoKICAgIExvb2ssIGFuZCB0aG91IHNoYWx0IHNlZS4KCk1PTlRBR1VFCgogICAgTyB0aG91IHVudGF1Z2h0ISB3aGF0IG1hbm5lcnMgaXMgaW4gdGhpcz8KICAgIFRvIHByZXNzIGJlZm9yZSB0aHkgZmF0aGVyIHRvIGEgZ3JhdmUCgpQUklOQ0UKCiAgICBTZWFsIHVwIHRoZSBtb3V0aCBvZiBvdXRyYWdlIGZvciBhIHdoaWxlLAogICAgVGlsbCB3ZSBjYW4gY2xlYXIgdGhlc2UgYW1iaWd1aXRpZXMsCiAgICBBbmQga25vdyB0aGVpciBzcHJpbmcsIHRoZWlyIGhlYWQsIHRoZWlyCiAgICB0cnVlIGRlc2NlbnQ7CiAgICBBbmQgdGhlbiB3aWxsIEkgYmUgZ2VuZXJhbCBvZiB5b3VyIHdvZXMsCiAgICBBbmQgbGVhZCB5b3UgZXZlbiB0byBkZWF0aDogbWVhbnRpbWUgZm9yYmVhciwKICAgIEFuZCBsZXQgbWlzY2hhbmNlIGJlIHNsYXZlIHRvIHBhdGllbmNlLgogICAgQnJpbmcgZm9ydGggdGhlIHBhcnRpZXMgb2Ygc3VzcGljaW9uLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJIGFtIHRoZSBncmVhdGVzdCwgYWJsZSB0byBkbyBsZWFzdCwKICAgIFlldCBtb3N0IHN1c3BlY3RlZCwgYXMgdGhlIHRpbWUgYW5kIHBsYWNlCiAgICBEb3RoIG1ha2UgYWdhaW5zdCBtZSBvZiB0aGlzIGRpcmVmdWwgbXVyZGVyOwogICAgQW5kIGhlcmUgSSBzdGFuZCwgYm90aCB0byBpbXBlYWNoIGFuZCBwdXJnZQogICAgTXlzZWxmIGNvbmRlbW5lZCBhbmQgbXlzZWxmIGV4Y3VzZWQuCgpQUklOQ0UKCiAgICBUaGVuIHNheSBhdCBvbmNlIHdoYXQgdGhvdSBkb3N0IGtub3cgaW4gdGhpcy4KCkZSSUFSIExBVVJFTkNFCgogICAgSSB3aWxsIGJlIGJyaWVmLCBmb3IgbXkgc2hvcnQgZGF0ZSBvZiBicmVhdGgKICAgIElzIG5vdCBzbyBsb25nIGFzIGlzIGEgdGVkaW91cyB0YWxlLgogICAgUm9tZW8sIHRoZXJlIGRlYWQsIHdhcyBodXNiYW5kIHRvIHRoYXQgSnVsaWV0OwogICAgQW5kIHNoZSwgdGhlcmUgZGVhZCwgdGhhdCBSb21lbydzIGZhaXRoZnVsIHdpZmU6CiAgICBJIG1hcnJpZWQgdGhlbTsgYW5kIHRoZWlyIHN0b2wnbiBtYXJyaWFnZS1kYXkKICAgIFdhcyBUeWJhbHQncyBkb29tcy1kYXksIHdob3NlIHVudGltZWx5IGRlYXRoCiAgICBCYW5pc2gnZCB0aGUgbmV3LW1hZGUgYnJpZGVncm9vbSBmcm9tIHRoZSBjaXR5LAogICAgRm9yIHdob20sIGFuZCBub3QgZm9yIFR5YmFsdCwgSnVsaWV0IHBpbmVkLgogICAgWW91LCB0byByZW1vdmUgdGhhdCBzaWVnZSBvZiBncmllZiBmcm9tIGhlciwKICAgIEJldHJvdGgnZCBhbmQgd291bGQgaGF2ZSBtYXJyaWVkIGhlciBwZXJmb3JjZQogICAgVG8gQ291bnR5IFBhcmlzOiB0aGVuIGNvbWVzIHNoZSB0byBtZSwKICAgIEFuZCwgd2l0aCB3aWxkIGxvb2tzLCBiaWQgbWUgZGV2aXNlIHNvbWUgbWVhbgogICAgVG8gcmlkIGhlciBmcm9tIHRoaXMgc2Vjb25kIG1hcnJpYWdlLAogICAgT3IgaW4gbXkgY2VsbCB0aGVyZSB3b3VsZCBzaGUga2lsbCBoZXJzZWxmLgogICAgVGhlbiBnYXZlIEkgaGVyLCBzbyB0dXRvcidkIGJ5IG15IGFydCwKICAgIEEgc2xlZXBpbmcgcG90aW9uOyB3aGljaCBzbyB0b29rIGVmZmVjdAogICAgQXMgSSBpbnRlbmRlZCwgZm9yIGl0IHdyb3VnaHQgb24gaGVyCiAgICBUaGUgZm9ybSBvZiBkZWF0aDogbWVhbnRpbWUgSSB3cml0IHRvIFJvbWVvLAogICAgVGhhdCBoZSBzaG91bGQgaGl0aGVyIGNvbWUgYXMgdGhpcyBkaXJlIG5pZ2h0LAogICAgVG8gaGVscCB0byB0YWtlIGhlciBmcm9tIGhlciBib3Jyb3cnZCBncmF2ZSwKICAgIEJlaW5nIHRoZSB0aW1lIHRoZSBwb3Rpb24ncyBmb3JjZSBzaG91bGQgY2Vhc2UuCiAgICBCdXQgaGUgd2hpY2ggYm9yZSBteSBsZXR0ZXIsIEZyaWFyIEpvaG4sCiAgICBXYXMgc3RheSdkIGJ5IGFjY2lkZW50LCBhbmQgeWVzdGVybmlnaHQKICAgIFJldHVybidkIG15IGxldHRlciBiYWNrLiBUaGVuIGFsbCBhbG9uZQogICAgQXQgdGhlIHByZWZpeGVkIGhvdXIgb2YgaGVyIHdha2luZywKICAgIENhbWUgSSB0byB0YWtlIGhlciBmcm9tIGhlciBraW5kcmVkJ3MgdmF1bHQ7CiAgICBNZWFuaW5nIHRvIGtlZXAgaGVyIGNsb3NlbHkgYXQgbXkgY2VsbCwKICAgIFRpbGwgSSBjb252ZW5pZW50bHkgY291bGQgc2VuZCB0byBSb21lbzoKICAgIEJ1dCB3aGVuIEkgY2FtZSwgc29tZSBtaW51dGUgZXJlIHRoZSB0aW1lCiAgICBPZiBoZXIgYXdha2luZywgaGVyZSB1bnRpbWVseSBsYXkKICAgIFRoZSBub2JsZSBQYXJpcyBhbmQgdHJ1ZSBSb21lbyBkZWFkLgogICAgU2hlIHdha2VzOyBhbmQgSSBlbnRyZWF0ZWQgaGVyIGNvbWUgZm9ydGgsCiAgICBBbmQgYmVhciB0aGlzIHdvcmsgb2YgaGVhdmVuIHdpdGggcGF0aWVuY2U6CiAgICBCdXQgdGhlbiBhIG5vaXNlIGRpZCBzY2FyZSBtZSBmcm9tIHRoZSB0b21iOwogICAgQW5kIHNoZSwgdG9vIGRlc3BlcmF0ZSwgd291bGQgbm90IGdvIHdpdGggbWUsCiAgICBCdXQsIGFzIGl0IHNlZW1zLCBkaWQgdmlvbGVuY2Ugb24gaGVyc2VsZi4KICAgIEFsbCB0aGlzIEkga25vdzsgYW5kIHRvIHRoZSBtYXJyaWFnZQogICAgSGVyIG51cnNlIGlzIHByaXZ5OiBhbmQsIGlmIGF1Z2h0IGluIHRoaXMKICAgIE1pc2NhcnJpZWQgYnkgbXkgZmF1bHQsIGxldCBteSBvbGQgbGlmZQogICAgQmUgc2FjcmlmaWNlZCwgc29tZSBob3VyIGJlZm9yZSBoaXMgdGltZSwKICAgIFVudG8gdGhlIHJpZ291ciBvZiBzZXZlcmVzdCBsYXcuCgpQUklOQ0UKCiAgICBXZSBzdGlsbCBoYXZlIGtub3duIHRoZWUgZm9yIGEgaG9seSBtYW4uCiAgICBXaGVyZSdzIFJvbWVvJ3MgbWFuPyB3aGF0IGNhbiBoZSBzYXkgaW4gdGhpcz8KCkJBTFRIQVNBUgoKICAgIEkgYnJvdWdodCBteSBtYXN0ZXIgbmV3cyBvZiBKdWxpZXQncyBkZWF0aDsKICAgIEFuZCB0aGVuIGluIHBvc3QgaGUgY2FtZSBmcm9tIE1hbnR1YQogICAgVG8gdGhpcyBzYW1lIHBsYWNlLCB0byB0aGlzIHNhbWUgbW9udW1lbnQuCiAgICBUaGlzIGxldHRlciBoZSBlYXJseSBiaWQgbWUgZ2l2ZSBoaXMgZmF0aGVyLAogICAgQW5kIHRocmVhdGVuZWQgbWUgd2l0aCBkZWF0aCwgZ29pbmcgaW4gdGhlIHZhdWx0LAogICAgSSBkZXBhcnRlZCBub3QgYW5kIGxlZnQgaGltIHRoZXJlLgoKUFJJTkNFCgogICAgR2l2ZSBtZSB0aGUgbGV0dGVyOyBJIHdpbGwgbG9vayBvbiBpdC4KICAgIFdoZXJlIGlzIHRoZSBjb3VudHkncyBwYWdlLCB0aGF0IHJhaXNlZCB0aGUgd2F0Y2gCiAgICBTaXJyYWgsIHdoYXQgbWFkZSB5b3VyIG1hc3RlciBpbiB0aGlzIHBsYWNlPwoKUEFHRQoKICAgIEhlIGNhbWUgd2l0aCBmbG93ZXJzIHRvIHN0cmV3IGhpcyBsYWR5J3MgZ3JhdmU7CiAgICBBbmQgYmlkIG1lIHN0YW5kIGFsb29mLCBhbmQgc28gSSBkaWQ6CiAgICBBbm9uIGNvbWVzIG9uZSB3aXRoIGxpZ2h0IHRvIG9wZSB0aGUgdG9tYjsKICAgIEFuZCBieSBhbmQgYnkgbXkgbWFzdGVyIGRyZXcgb24gaGltOwogICAgQW5kIHRoZW4gSSByYW4gYXdheSB0byBjYWxsIHRoZSB3YXRjaC4KClBSSU5DRQoKICAgIFRoaXMgbGV0dGVyIGRvdGggbWFrZSBnb29kIHRoZSBmcmlhcidzIHdvcmRzLAogICAgVGhlaXIgY291cnNlIG9mIGxvdmUsIHRoZSB0aWRpbmdzIG9mIGhlciBkZWF0aDoKICAgIEFuZCBoZXJlIGhlIHdyaXRlcyB0aGF0IGhlIGRpZCBidXkgYSBwb2lzb24KICAgIE9mIGEgcG9vciAncG90aGVjYXJ5LCBhbmQgdGhlcmV3aXRoYWwKICAgIENhbWUgdG8gdGhpcyB2YXVsdCB0byBkaWUsIGFuZCBsaWUgd2l0aCBKdWxpZXQuCiAgICBXaGVyZSBiZSB0aGVzZSBlbmVtaWVzPyBDYXB1bGV0ISBNb250YWd1ZSEKICAgIFNlZSwgd2hhdCBhIHNjb3VyZ2UgaXMgbGFpZCB1cG9uIHlvdXIgaGF0ZSwKICAgIFRoYXQgaGVhdmVuIGZpbmRzIG1lYW5zIHRvIGtpbGwgeW91ciBqb3lzIHdpdGggbG92ZS4KICAgIEFuZCBJIGZvciB3aW5raW5nIGF0IHlvdXIgZGlzY29yZHMgdG9vCiAgICBIYXZlIGxvc3QgYSBicmFjZSBvZiBraW5zbWVuOiBhbGwgYXJlIHB1bmlzaCdkLgoKQ0FQVUxFVAoKICAgIE8gYnJvdGhlciBNb250YWd1ZSwgZ2l2ZSBtZSB0aHkgaGFuZDoKICAgIFRoaXMgaXMgbXkgZGF1Z2h0ZXIncyBqb2ludHVyZSwgZm9yIG5vIG1vcmUKICAgIENhbiBJIGRlbWFuZC4KCk1PTlRBR1VFCgogICAgQnV0IEkgY2FuIGdpdmUgdGhlZSBtb3JlOgogICAgRm9yIEkgd2lsbCByYWlzZSBoZXIgc3RhdHVlIGluIHB1cmUgZ29sZDsKICAgIFRoYXQgd2hpbGUgVmVyb25hIGJ5IHRoYXQgbmFtZSBpcyBrbm93biwKICAgIFRoZXJlIHNoYWxsIG5vIGZpZ3VyZSBhdCBzdWNoIHJhdGUgYmUgc2V0CiAgICBBcyB0aGF0IG9mIHRydWUgYW5kIGZhaXRoZnVsIEp1bGlldC4KCkNBUFVMRVQKCiAgICBBcyByaWNoIHNoYWxsIFJvbWVvJ3MgYnkgaGlzIGxhZHkncyBsaWU7CiAgICBQb29yIHNhY3JpZmljZXMgb2Ygb3VyIGVubWl0eSEKClBSSU5DRQoKICAgIEEgZ2xvb21pbmcgcGVhY2UgdGhpcyBtb3JuaW5nIHdpdGggaXQgYnJpbmdzOwogICAgVGhlIHN1biwgZm9yIHNvcnJvdywgd2lsbCBub3Qgc2hvdyBoaXMgaGVhZDoKICAgIEdvIGhlbmNlLCB0byBoYXZlIG1vcmUgdGFsayBvZiB0aGVzZSBzYWQgdGhpbmdzOwogICAgU29tZSBzaGFsbCBiZSBwYXJkb24nZCwgYW5kIHNvbWUgcHVuaXNoZWQ6CiAgICBGb3IgbmV2ZXIgd2FzIGEgc3Rvcnkgb2YgbW9yZSB3b2UKICAgIFRoYW4gdGhpcyBvZiBKdWxpZXQgYW5kIGhlciBSb21lby4KCiAgICBFeGV1bnQK

Chuck Cartledge
Chuck Cartledge
Chuck Cartledge

httpantonio-ferraroeupnword-clouds-in-r-packages-wordcloud2-and-tmrm(list=ls())library(wordcloud2)library(NLP)library(tm)library(RCurl) Necessary steps 1 Use imagesgooglecom to find an outline of the shape to fill (tmpusapng) 2 Use gimp to fill the outline with black 3 Use a command like wordcloud2(TDMasDF size = 20 figPath=tmpusapng backgroundColor = white fontFamily=Loma) to populate shape 4 Result is a web page with javascript embedded to create image and allow mouse overs Clean corpuscleanCorpus lt- function(corpus) corpustmp lt- tm_map(corpus removePunctuation) corpustmp lt- tm_map(corpustmpstripWhitespace) corpustmp lt- tm_map(corpustmptolower) corpustmp lt- tm_map(corpustmp PlainTextDocument) corpustmp lt- tm_map(corpustmpremoveWords stopwords(english)) return(corpustmp) Build TDMgenerateTDM lt- function(path) sdir lt-path scor lt-Corpus(DirSource(directory = sdir encoding= UTF-8)) scorcl lt- cleanCorpus(scor) stdm lt- TermDocumentMatrix(scorcl) stdminitData lt- function(path) if (direxists(path) == FALSE) If the directory does not exist create and populate with dummy data dummyDataFile lt- romeoAndJulietbase64 fileName lt- sprintf(sdummyDatatxt path) print(sprintf(Creating and populating the file s with dummy data fileName)) dircreate(path recursive = TRUE) write(base64( paste( readLines(dummyDataFile) collapse=) encode=FALSE) file=fileName) main lt- function() options(stringsAsFactors = FALSE) The working directory pathName lt- Text initData(pathName) Get the Term Document Matrix TDM lt- generateTDM(pathName) Do I need a matrix or a DF We will see TDMasMatrix lt- asmatrix(TDM) TDMasDFlt-dataframe(TDMasMatrix) TDMasDF$words lt-rownames(TDMasDF) Column headers colnames(TDMasDF) lt- c(freq word) TDMasDFlt-TDMasDF[ c(word freq)] TDMasDF lt- TDMasDF[order(TDMasDF$freqdecreasing=TRUE)] The results a lt- wordcloud2(TDMasDF size = 03 shape=star backgroundColor = black fontFamily=Loma) print(a) a lt- letterCloud(TDMasDF word=USA size = 03 fontFamily=Loma backgroundColor = black) print(a) a lt- wordcloud2(TDMasDF size = 13 figPath=heartpng backgroundColor = white fontFamily=Loma color=red) print(a) TDMasDF$freq lt- log(TDMasDF$freq) a lt- wordcloud2(TDMasDF size = 12 figPath=usapng backgroundColor = white shuffle=FALSE minRotation = 0 maxRotation = 2pi) print(a) print(The program has ended)main()

Chuck Cartledge
Page 8: Creating Shaped Wordclouds Using R - clc-ent.comThe wordcloud2 function behaves slightly di erently than most of the other R plot func-tions that I’ve used. The result from both

image and there is no practical way to ldquoget backrdquo to an image that was goodIn the Files section (see Section A on page 9) is an R script and support files to work

with The R script was used to create various images (see Figure 6 on the following page)

3 Conclusion

The wordcloud2 library enables you to create word clouds of arbitrary shape inside an HTMLusing JavaScript to position and orient each word Each HTML page and its associatedlibrary files are placed in individual directories that are removed when the creating R processterminates Pages and files can be moved or copied for safe keeping if desired Because thepages use the Mathrandom() JavaScript function each time the page is loaded words willbe positioned differently in the cloud If the desired shape has an internal hole then it ispossible that some words may not be placed in the cloud

wordcloud2 allows you to create word clouds to support your data visualization needs

7

(a) A heart

(b) The letters ldquoUSArdquo

(c) A star

(d) The USA

Figure 6 A collection of sample word clouds These images were created with the attachedR script

8

A Misc files

The files used to create all these figures are attached to this report They are

1 romeoAndJulietbase64 ndash default text used to demonstrate the software

2 heartpng ndash a heart shape with a hole

3 usapng ndash an outline of the continental United States

4 wordCloudR ndash an R script to demonstrate making word clouds

9

ClJvbWVvIGFuZCBKdWxpZXQKU2hha2VzcGVhcmUgaG9tZXBhZ2UgfCBSb21lbyBhbmQgSnVsaWV0IHwgRW50aXJlIHBsYXkKQUNUIEkKUFJPTE9HVUUKCiAgICBUd28gaG91c2Vob2xkcywgYm90aCBhbGlrZSBpbiBkaWduaXR5LAogICAgSW4gZmFpciBWZXJvbmEsIHdoZXJlIHdlIGxheSBvdXIgc2NlbmUsCiAgICBGcm9tIGFuY2llbnQgZ3J1ZGdlIGJyZWFrIHRvIG5ldyBtdXRpbnksCiAgICBXaGVyZSBjaXZpbCBibG9vZCBtYWtlcyBjaXZpbCBoYW5kcyB1bmNsZWFuLgogICAgRnJvbSBmb3J0aCB0aGUgZmF0YWwgbG9pbnMgb2YgdGhlc2UgdHdvIGZvZXMKICAgIEEgcGFpciBvZiBzdGFyLWNyb3NzJ2QgbG92ZXJzIHRha2UgdGhlaXIgbGlmZTsKICAgIFdob3NlIG1pc2FkdmVudHVyZWQgcGl0ZW91cyBvdmVydGhyb3dzCiAgICBEbyB3aXRoIHRoZWlyIGRlYXRoIGJ1cnkgdGhlaXIgcGFyZW50cycgc3RyaWZlLgogICAgVGhlIGZlYXJmdWwgcGFzc2FnZSBvZiB0aGVpciBkZWF0aC1tYXJrJ2QgbG92ZSwKICAgIEFuZCB0aGUgY29udGludWFuY2Ugb2YgdGhlaXIgcGFyZW50cycgcmFnZSwKICAgIFdoaWNoLCBidXQgdGhlaXIgY2hpbGRyZW4ncyBlbmQsIG5vdWdodCBjb3VsZCByZW1vdmUsCiAgICBJcyBub3cgdGhlIHR3byBob3VycycgdHJhZmZpYyBvZiBvdXIgc3RhZ2U7CiAgICBUaGUgd2hpY2ggaWYgeW91IHdpdGggcGF0aWVudCBlYXJzIGF0dGVuZCwKICAgIFdoYXQgaGVyZSBzaGFsbCBtaXNzLCBvdXIgdG9pbCBzaGFsbCBzdHJpdmUgdG8gbWVuZC4KClNDRU5FIEkuIFZlcm9uYS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgU0FNUFNPTiBhbmQgR1JFR09SWSwgb2YgdGhlIGhvdXNlIG9mIENhcHVsZXQsIGFybWVkIHdpdGggc3dvcmRzIGFuZCBidWNrbGVycyAKClNBTVBTT04KCiAgICBHcmVnb3J5LCBvJyBteSB3b3JkLCB3ZSdsbCBub3QgY2FycnkgY29hbHMuCgpHUkVHT1JZCgogICAgTm8sIGZvciB0aGVuIHdlIHNob3VsZCBiZSBjb2xsaWVycy4KClNBTVBTT04KCiAgICBJIG1lYW4sIGFuIHdlIGJlIGluIGNob2xlciwgd2UnbGwgZHJhdy4KCkdSRUdPUlkKCiAgICBBeSwgd2hpbGUgeW91IGxpdmUsIGRyYXcgeW91ciBuZWNrIG91dCBvJyB0aGUgY29sbGFyLgoKU0FNUFNPTgoKICAgIEkgc3RyaWtlIHF1aWNrbHksIGJlaW5nIG1vdmVkLgoKR1JFR09SWQoKICAgIEJ1dCB0aG91IGFydCBub3QgcXVpY2tseSBtb3ZlZCB0byBzdHJpa2UuCgpTQU1QU09OCgogICAgQSBkb2cgb2YgdGhlIGhvdXNlIG9mIE1vbnRhZ3VlIG1vdmVzIG1lLgoKR1JFR09SWQoKICAgIFRvIG1vdmUgaXMgdG8gc3RpcjsgYW5kIHRvIGJlIHZhbGlhbnQgaXMgdG8gc3RhbmQ6CiAgICB0aGVyZWZvcmUsIGlmIHRob3UgYXJ0IG1vdmVkLCB0aG91IHJ1bm4nc3QgYXdheS4KClNBTVBTT04KCiAgICBBIGRvZyBvZiB0aGF0IGhvdXNlIHNoYWxsIG1vdmUgbWUgdG8gc3RhbmQ6IEkgd2lsbAogICAgdGFrZSB0aGUgd2FsbCBvZiBhbnkgbWFuIG9yIG1haWQgb2YgTW9udGFndWUncy4KCkdSRUdPUlkKCiAgICBUaGF0IHNob3dzIHRoZWUgYSB3ZWFrIHNsYXZlOyBmb3IgdGhlIHdlYWtlc3QgZ29lcwogICAgdG8gdGhlIHdhbGwuCgpTQU1QU09OCgogICAgVHJ1ZTsgYW5kIHRoZXJlZm9yZSB3b21lbiwgYmVpbmcgdGhlIHdlYWtlciB2ZXNzZWxzLAogICAgYXJlIGV2ZXIgdGhydXN0IHRvIHRoZSB3YWxsOiB0aGVyZWZvcmUgSSB3aWxsIHB1c2gKICAgIE1vbnRhZ3VlJ3MgbWVuIGZyb20gdGhlIHdhbGwsIGFuZCB0aHJ1c3QgaGlzIG1haWRzCiAgICB0byB0aGUgd2FsbC4KCkdSRUdPUlkKCiAgICBUaGUgcXVhcnJlbCBpcyBiZXR3ZWVuIG91ciBtYXN0ZXJzIGFuZCB1cyB0aGVpciBtZW4uCgpTQU1QU09OCgogICAgJ1RpcyBhbGwgb25lLCBJIHdpbGwgc2hvdyBteXNlbGYgYSB0eXJhbnQ6IHdoZW4gSQogICAgaGF2ZSBmb3VnaHQgd2l0aCB0aGUgbWVuLCBJIHdpbGwgYmUgY3J1ZWwgd2l0aCB0aGUKICAgIG1haWRzLCBhbmQgY3V0IG9mZiB0aGVpciBoZWFkcy4KCkdSRUdPUlkKCiAgICBUaGUgaGVhZHMgb2YgdGhlIG1haWRzPwoKU0FNUFNPTgoKICAgIEF5LCB0aGUgaGVhZHMgb2YgdGhlIG1haWRzLCBvciB0aGVpciBtYWlkZW5oZWFkczsKICAgIHRha2UgaXQgaW4gd2hhdCBzZW5zZSB0aG91IHdpbHQuCgpHUkVHT1JZCgogICAgVGhleSBtdXN0IHRha2UgaXQgaW4gc2Vuc2UgdGhhdCBmZWVsIGl0LgoKU0FNUFNPTgoKICAgIE1lIHRoZXkgc2hhbGwgZmVlbCB3aGlsZSBJIGFtIGFibGUgdG8gc3RhbmQ6IGFuZAogICAgJ3RpcyBrbm93biBJIGFtIGEgcHJldHR5IHBpZWNlIG9mIGZsZXNoLgoKR1JFR09SWQoKICAgICdUaXMgd2VsbCB0aG91IGFydCBub3QgZmlzaDsgaWYgdGhvdSBoYWRzdCwgdGhvdQogICAgaGFkc3QgYmVlbiBwb29yIEpvaG4uIERyYXcgdGh5IHRvb2whIGhlcmUgY29tZXMKICAgIHR3byBvZiB0aGUgaG91c2Ugb2YgdGhlIE1vbnRhZ3Vlcy4KClNBTVBTT04KCiAgICBNeSBuYWtlZCB3ZWFwb24gaXMgb3V0OiBxdWFycmVsLCBJIHdpbGwgYmFjayB0aGVlLgoKR1JFR09SWQoKICAgIEhvdyEgdHVybiB0aHkgYmFjayBhbmQgcnVuPwoKU0FNUFNPTgoKICAgIEZlYXIgbWUgbm90LgoKR1JFR09SWQoKICAgIE5vLCBtYXJyeTsgSSBmZWFyIHRoZWUhCgpTQU1QU09OCgogICAgTGV0IHVzIHRha2UgdGhlIGxhdyBvZiBvdXIgc2lkZXM7IGxldCB0aGVtIGJlZ2luLgoKR1JFR09SWQoKICAgIEkgd2lsbCBmcm93biBhcyBJIHBhc3MgYnksIGFuZCBsZXQgdGhlbSB0YWtlIGl0IGFzCiAgICB0aGV5IGxpc3QuCgpTQU1QU09OCgogICAgTmF5LCBhcyB0aGV5IGRhcmUuIEkgd2lsbCBiaXRlIG15IHRodW1iIGF0IHRoZW07CiAgICB3aGljaCBpcyBhIGRpc2dyYWNlIHRvIHRoZW0sIGlmIHRoZXkgYmVhciBpdC4KCiAgICBFbnRlciBBQlJBSEFNIGFuZCBCQUxUSEFTQVIKCkFCUkFIQU0KCiAgICBEbyB5b3UgYml0ZSB5b3VyIHRodW1iIGF0IHVzLCBzaXICgpTQU1QU09OCgogICAgSSBkbyBiaXRlIG15IHRodW1iLCBzaXIuCgpBQlJBSEFNCgogICAgRG8geW91IGJpdGUgeW91ciB0aHVtYiBhdCB1cywgc2lyPwoKU0FNUFNPTgoKICAgIFtBc2lkZSB0byBHUkVHT1JZXSBJcyB0aGUgbGF3IG9mIG91ciBzaWRlLCBpZiBJIHNheQogICAgYXkCgpHUkVHT1JZCgogICAgTm8uCgpTQU1QU09OCgogICAgTm8sIHNpciwgSSBkbyBub3QgYml0ZSBteSB0aHVtYiBhdCB5b3UsIHNpciwgYnV0IEkKICAgIGJpdGUgbXkgdGh1bWIsIHNpci4KCkdSRUdPUlkKCiAgICBEbyB5b3UgcXVhcnJlbCwgc2lyPwoKQUJSQUhBTQoKICAgIFF1YXJyZWwgc2lyISBubywgc2lyLgoKU0FNUFNPTgoKICAgIElmIHlvdSBkbywgc2lyLCBJIGFtIGZvciB5b3U6IEkgc2VydmUgYXMgZ29vZCBhIG1hbiBhcyB5b3UuCgpBQlJBSEFNCgogICAgTm8gYmV0dGVyLgoKU0FNUFNPTgoKICAgIFdlbGwsIHNpci4KCkdSRUdPUlkKCiAgICBTYXkgJ2JldHRlcjonIGhlcmUgY29tZXMgb25lIG9mIG15IG1hc3RlcidzIGtpbnNtZW4uCgpTQU1QU09OCgogICAgWWVzLCBiZXR0ZXIsIHNpci4KCkFCUkFIQU0KCiAgICBZb3UgbGllLgoKU0FNUFNPTgoKICAgIERyYXcsIGlmIHlvdSBiZSBtZW4uIEdyZWdvcnksIHJlbWVtYmVyIHRoeSBzd2FzaGluZyBibG93LgoKICAgIFRoZXkgZmlnaHQKCiAgICBFbnRlciBCRU5WT0xJTwoKQkVOVk9MSU8KCiAgICBQYXJ0LCBmb29scyEKICAgIFB1dCB1cCB5b3VyIHN3b3JkczsgeW91IGtub3cgbm90IHdoYXQgeW91IGRvLgoKICAgIEJlYXRzIGRvd24gdGhlaXIgc3dvcmRzCgogICAgRW50ZXIgVFlCQUxUCgpUWUJBTFQKCiAgICBXaGF0LCBhcnQgdGhvdSBkcmF3biBhbW9uZyB0aGVzZSBoZWFydGxlc3MgaGluZHMCiAgICBUdXJuIHRoZWUsIEJlbnZvbGlvLCBsb29rIHVwb24gdGh5IGRlYXRoLgoKQkVOVk9MSU8KCiAgICBJIGRvIGJ1dCBrZWVwIHRoZSBwZWFjZTogcHV0IHVwIHRoeSBzd29yZCwKICAgIE9yIG1hbmFnZSBpdCB0byBwYXJ0IHRoZXNlIG1lbiB3aXRoIG1lLgoKVFlCQUxUCgogICAgV2hhdCwgZHJhd24sIGFuZCB0YWxrIG9mIHBlYWNlISBJIGhhdGUgdGhlIHdvcmQsCiAgICBBcyBJIGhhdGUgaGVsbCwgYWxsIE1vbnRhZ3VlcywgYW5kIHRoZWU6CiAgICBIYXZlIGF0IHRoZWUsIGNvd2FyZCEKCiAgICBUaGV5IGZpZ2h0CgogICAgRW50ZXIsIHNldmVyYWwgb2YgYm90aCBob3VzZXMsIHdobyBqb2luIHRoZSBmcmF5OyB0aGVuIGVudGVyIENpdGl6ZW5zLCB3aXRoIGNsdWJzCgpGaXJzdCBDaXRpemVuCgogICAgQ2x1YnMsIGJpbGxzLCBhbmQgcGFydGlzYW5zISBzdHJpa2UhIGJlYXQgdGhlbSBkb3duIQogICAgRG93biB3aXRoIHRoZSBDYXB1bGV0cyEgZG93biB3aXRoIHRoZSBNb250YWd1ZXMhCgogICAgRW50ZXIgQ0FQVUxFVCBpbiBoaXMgZ293biwgYW5kIExBRFkgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgdGhpcz8gR2l2ZSBtZSBteSBsb25nIHN3b3JkLCBobyEKCkxBRFkgQ0FQVUxFVAoKICAgIEEgY3J1dGNoLCBhIGNydXRjaCEgd2h5IGNhbGwgeW91IGZvciBhIHN3b3JkPwoKQ0FQVUxFVAoKICAgIE15IHN3b3JkLCBJIHNheSEgT2xkIE1vbnRhZ3VlIGlzIGNvbWUsCiAgICBBbmQgZmxvdXJpc2hlcyBoaXMgYmxhZGUgaW4gc3BpdGUgb2YgbWUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIExBRFkgTU9OVEFHVUUKCk1PTlRBR1VFCgogICAgVGhvdSB2aWxsYWluIENhcHVsZXQsLS1Ib2xkIG1lIG5vdCwgbGV0IG1lIGdvLgoKTEFEWSBNT05UQUdVRQoKICAgIFRob3Ugc2hhbHQgbm90IHN0aXIgYSBmb290IHRvIHNlZWsgYSBmb2UuCgogICAgRW50ZXIgUFJJTkNFLCB3aXRoIEF0dGVuZGFudHMKClBSSU5DRQoKICAgIFJlYmVsbGlvdXMgc3ViamVjdHMsIGVuZW1pZXMgdG8gcGVhY2UsCiAgICBQcm9mYW5lcnMgb2YgdGhpcyBuZWlnaGJvdXItc3RhaW5lZCBzdGVlbCwtLQogICAgV2lsbCB0aGV5IG5vdCBoZWFyPyBXaGF0LCBobyEgeW91IG1lbiwgeW91IGJlYXN0cywKICAgIFRoYXQgcXVlbmNoIHRoZSBmaXJlIG9mIHlvdXIgcGVybmljaW91cyByYWdlCiAgICBXaXRoIHB1cnBsZSBmb3VudGFpbnMgaXNzdWluZyBmcm9tIHlvdXIgdmVpbnMsCiAgICBPbiBwYWluIG9mIHRvcnR1cmUsIGZyb20gdGhvc2UgYmxvb2R5IGhhbmRzCiAgICBUaHJvdyB5b3VyIG1pc3RlbXBlcidkIHdlYXBvbnMgdG8gdGhlIGdyb3VuZCwKICAgIEFuZCBoZWFyIHRoZSBzZW50ZW5jZSBvZiB5b3VyIG1vdmVkIHByaW5jZS4KICAgIFRocmVlIGNpdmlsIGJyYXdscywgYnJlZCBvZiBhbiBhaXJ5IHdvcmQsCiAgICBCeSB0aGVlLCBvbGQgQ2FwdWxldCwgYW5kIE1vbnRhZ3VlLAogICAgSGF2ZSB0aHJpY2UgZGlzdHVyYidkIHRoZSBxdWlldCBvZiBvdXIgc3RyZWV0cywKICAgIEFuZCBtYWRlIFZlcm9uYSdzIGFuY2llbnQgY2l0aXplbnMKICAgIENhc3QgYnkgdGhlaXIgZ3JhdmUgYmVzZWVtaW5nIG9ybmFtZW50cywKICAgIFRvIHdpZWxkIG9sZCBwYXJ0aXNhbnMsIGluIGhhbmRzIGFzIG9sZCwKICAgIENhbmtlcidkIHdpdGggcGVhY2UsIHRvIHBhcnQgeW91ciBjYW5rZXInZCBoYXRlOgogICAgSWYgZXZlciB5b3UgZGlzdHVyYiBvdXIgc3RyZWV0cyBhZ2FpbiwKICAgIFlvdXIgbGl2ZXMgc2hhbGwgcGF5IHRoZSBmb3JmZWl0IG9mIHRoZSBwZWFjZS4KICAgIEZvciB0aGlzIHRpbWUsIGFsbCB0aGUgcmVzdCBkZXBhcnQgYXdheToKICAgIFlvdSBDYXB1bGV0OyBzaGFsbCBnbyBhbG9uZyB3aXRoIG1lOgogICAgQW5kLCBNb250YWd1ZSwgY29tZSB5b3UgdGhpcyBhZnRlcm5vb24sCiAgICBUbyBrbm93IG91ciBmdXJ0aGVyIHBsZWFzdXJlIGluIHRoaXMgY2FzZSwKICAgIFRvIG9sZCBGcmVlLXRvd24sIG91ciBjb21tb24ganVkZ21lbnQtcGxhY2UuCiAgICBPbmNlIG1vcmUsIG9uIHBhaW4gb2YgZGVhdGgsIGFsbCBtZW4gZGVwYXJ0LgoKICAgIEV4ZXVudCBhbGwgYnV0IE1PTlRBR1VFLCBMQURZIE1PTlRBR1VFLCBhbmQgQkVOVk9MSU8KCk1PTlRBR1VFCgogICAgV2hvIHNldCB0aGlzIGFuY2llbnQgcXVhcnJlbCBuZXcgYWJyb2FjaD8KICAgIFNwZWFrLCBuZXBoZXcsIHdlcmUgeW91IGJ5IHdoZW4gaXQgYmVnYW4CgpCRU5WT0xJTwoKICAgIEhlcmUgd2VyZSB0aGUgc2VydmFudHMgb2YgeW91ciBhZHZlcnNhcnksCiAgICBBbmQgeW91cnMsIGNsb3NlIGZpZ2h0aW5nIGVyZSBJIGRpZCBhcHByb2FjaDoKICAgIEkgZHJldyB0byBwYXJ0IHRoZW06IGluIHRoZSBpbnN0YW50IGNhbWUKICAgIFRoZSBmaWVyeSBUeWJhbHQsIHdpdGggaGlzIHN3b3JkIHByZXBhcmVkLAogICAgV2hpY2gsIGFzIGhlIGJyZWF0aGVkIGRlZmlhbmNlIHRvIG15IGVhcnMsCiAgICBIZSBzd3VuZyBhYm91dCBoaXMgaGVhZCBhbmQgY3V0IHRoZSB3aW5kcywKICAgIFdobyBub3RoaW5nIGh1cnQgd2l0aGFsIGhpc3MnZCBoaW0gaW4gc2Nvcm46CiAgICBXaGlsZSB3ZSB3ZXJlIGludGVyY2hhbmdpbmcgdGhydXN0cyBhbmQgYmxvd3MsCiAgICBDYW1lIG1vcmUgYW5kIG1vcmUgYW5kIGZvdWdodCBvbiBwYXJ0IGFuZCBwYXJ0LAogICAgVGlsbCB0aGUgcHJpbmNlIGNhbWUsIHdobyBwYXJ0ZWQgZWl0aGVyIHBhcnQuCgpMQURZIE1PTlRBR1VFCgogICAgTywgd2hlcmUgaXMgUm9tZW8IHNhdyB5b3UgaGltIHRvLWRheT8KICAgIFJpZ2h0IGdsYWQgSSBhbSBoZSB3YXMgbm90IGF0IHRoaXMgZnJheS4KCkJFTlZPTElPCgogICAgTWFkYW0sIGFuIGhvdXIgYmVmb3JlIHRoZSB3b3JzaGlwcCdkIHN1bgogICAgUGVlcidkIGZvcnRoIHRoZSBnb2xkZW4gd2luZG93IG9mIHRoZSBlYXN0LAogICAgQSB0cm91YmxlZCBtaW5kIGRyYXZlIG1lIHRvIHdhbGsgYWJyb2FkOwogICAgV2hlcmUsIHVuZGVybmVhdGggdGhlIGdyb3ZlIG9mIHN5Y2Ftb3JlCiAgICBUaGF0IHdlc3R3YXJkIHJvb3RldGggZnJvbSB0aGUgY2l0eSdzIHNpZGUsCiAgICBTbyBlYXJseSB3YWxraW5nIGRpZCBJIHNlZSB5b3VyIHNvbjoKICAgIFRvd2FyZHMgaGltIEkgbWFkZSwgYnV0IGhlIHdhcyB3YXJlIG9mIG1lCiAgICBBbmQgc3RvbGUgaW50byB0aGUgY292ZXJ0IG9mIHRoZSB3b29kOgogICAgSSwgbWVhc3VyaW5nIGhpcyBhZmZlY3Rpb25zIGJ5IG15IG93biwKICAgIFRoYXQgbW9zdCBhcmUgYnVzaWVkIHdoZW4gdGhleSdyZSBtb3N0IGFsb25lLAogICAgUHVyc3VlZCBteSBodW1vdXIgbm90IHB1cnN1aW5nIGhpcywKICAgIEFuZCBnbGFkbHkgc2h1bm4nZCB3aG8gZ2xhZGx5IGZsZWQgZnJvbSBtZS4KCk1PTlRBR1VFCgogICAgTWFueSBhIG1vcm5pbmcgaGF0aCBoZSB0aGVyZSBiZWVuIHNlZW4sCiAgICBXaXRoIHRlYXJzIGF1Z21lbnRpbmcgdGhlIGZyZXNoIG1vcm5pbmcgZGV3LgogICAgQWRkaW5nIHRvIGNsb3VkcyBtb3JlIGNsb3VkcyB3aXRoIGhpcyBkZWVwIHNpZ2hzOwogICAgQnV0IGFsbCBzbyBzb29uIGFzIHRoZSBhbGwtY2hlZXJpbmcgc3VuCiAgICBTaG91bGQgaW4gdGhlIGZ1cnRoZXN0IGVhc3QgYmVnaW4gdG8gZHJhdwogICAgVGhlIHNoYWR5IGN1cnRhaW5zIGZyb20gQXVyb3JhJ3MgYmVkLAogICAgQXdheSBmcm9tIHRoZSBsaWdodCBzdGVhbHMgaG9tZSBteSBoZWF2eSBzb24sCiAgICBBbmQgcHJpdmF0ZSBpbiBoaXMgY2hhbWJlciBwZW5zIGhpbXNlbGYsCiAgICBTaHV0cyB1cCBoaXMgd2luZG93cywgbG9ja3MgZmFyIGRheWxpZ2h0IG91dAogICAgQW5kIG1ha2VzIGhpbXNlbGYgYW4gYXJ0aWZpY2lhbCBuaWdodDoKICAgIEJsYWNrIGFuZCBwb3J0ZW50b3VzIG11c3QgdGhpcyBodW1vdXIgcHJvdmUsCiAgICBVbmxlc3MgZ29vZCBjb3Vuc2VsIG1heSB0aGUgY2F1c2UgcmVtb3ZlLgoKQkVOVk9MSU8KCiAgICBNeSBub2JsZSB1bmNsZSwgZG8geW91IGtub3cgdGhlIGNhdXNlPwoKTU9OVEFHVUUKCiAgICBJIG5laXRoZXIga25vdyBpdCBub3IgY2FuIGxlYXJuIG9mIGhpbS4KCkJFTlZPTElPCgogICAgSGF2ZSB5b3UgaW1wb3J0dW5lZCBoaW0gYnkgYW55IG1lYW5zPwoKTU9OVEFHVUUKCiAgICBCb3RoIGJ5IG15c2VsZiBhbmQgbWFueSBvdGhlciBmcmllbmRzOgogICAgQnV0IGhlLCBoaXMgb3duIGFmZmVjdGlvbnMnIGNvdW5zZWxsb3IsCiAgICBJcyB0byBoaW1zZWxmLS1JIHdpb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UVPCgogICAgR29vZCBoZWFydCwgYXQgd2hhdD8KCkJFTlZPTElPCgogICAgQXQgdGh5IGdvb2QgaGVhcnQncyBvcHByZXNzaW9uLgoKUk9NRU8KCiAgICBXaHksIHN1Y2ggaXMgbG92ZSdzIHRyYW5zZ3Jlc3Npb24uCiAgICBHcmllZnMgb2YgbWluZSBvd24gbGllIGhlYXZ5IGluIG15IGJyZWFzdCwKICAgIFdoaWNoIHRob3Ugd2lsdCBwcm9wYWdhdGUsIHRvIGhhdmUgaXQgcHJlc3QKICAgIFdpdGggbW9yZSBvZiB0aGluZTogdGhpcyBsb3ZlIHRoYXQgdGhvdSBoYXN0IHNob3duCiAgICBEb3RoIGFkZCBtb3JlIGdyaWVmIHRvIHRvbyBtdWNoIG9mIG1pbmUgb3duLgogICAgTG92ZSBpcyBhIHNtb2tlIHJhaXNlZCB3aXRoIHRoZSBmdW1lIG9mIHNpZ2hzOwogICAgQmVpbmcgcHVyZ2VkLCBhIGZpcmUgc3BhcmtsaW5nIGluIGxvdmVycycgZXllczsKICAgIEJlaW5nIHZleCdkIGEgc2VhIG5vdXJpc2gnZCB3aXRoIGxvdmVycycgdGVhcnM6CiAgICBXaGF0IGlzIGl0IGVsc2UIGEgbWFkbmVzcyBtb3N0IGRpc2NyZWV0LAogICAgQSBjaG9raW5nIGdhbGwgYW5kIGEgcHJlc2VydmluZyBzd2VldC4KICAgIEZhcmV3ZWxsLCBteSBjb3ouCgpCRU5WT0xJTwoKICAgIFNvZnQhIEkgd2lsbCBnbyBhbG9uZzsKICAgIEFuIGlmIHlvdSBsZWF2ZSBtZSBzbywgeW91IGRvIG1lIHdyb25nLgoKUk9NRU8KCiAgICBUdXQsIEkgaGF2ZSBsb3N0IG15c2VsZjsgSSBhbSBub3QgaGVyZTsKICAgIFRoaXMgaXMgbm90IFJvbWVvLCBoZSdzIHNvbWUgb3RoZXIgd2hlcmUuCgpCRU5WT0xJTwoKICAgIFRlbGwgbWUgaW4gc2FkbmVzcywgd2hvIGlzIHRoYXQgeW91IGxvdmUuCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIEkgZ3JvYW4gYW5kIHRlbGwgdGhlZT8KCkJFTlZPTElPCgogICAgR3JvYW4hIHdoeSwgbm8uCiAgICBCdXQgc2FkbHkgdGVsbCBtZSB3aG8uCgpST01FTwoKICAgIEJpZCBhIHNpY2sgbWFuIGluIHNhZG5lc3MgbWFrZSBoaXMgd2lsbDoKICAgIEFoLCB3b3JkIGlsbCB1cmdlZCB0byBvbmUgdGhhdCBpcyBzbyBpbGwhCiAgICBJbiBzYWRuZXNzLCBjb3VzaW4sIEkgZG8gbG92ZSBhIHdvbWFuLgoKQkVOVk9MSU8KCiAgICBJIGFpbSdkIHNvIG5lYXIsIHdoZW4gSSBzdXBwb3NlZCB5b3UgbG92ZWQuCgpST01FTwoKICAgIEEgcmlnaHQgZ29vZCBtYXJrLW1hbiEgQW5kIHNoZSdzIGZhaXIgSSBsb3ZlLgoKQkVOVk9MSU8KCiAgICBBIHJpZ2h0IGZhaXIgbWFyaywgZmFpciBjb3osIGlzIHNvb25lc3QgaGl0LgoKUk9NRU8KCiAgICBXZWxsLCBpbiB0aGF0IGhpdCB5b3UgbWlzczogc2hlJ2xsIG5vdCBiZSBoaXQKICAgIFdpdGggQ3VwaWQncyBhcnJvdzsgc2hlIGhhdGggRGlhbidzIHdpdDsKICAgIEFuZCwgaW4gc3Ryb25nIHByb29mIG9mIGNoYXN0aXR5IHdlbGwgYXJtJ2QsCiAgICBGcm9tIGxvdmUncyB3ZWFrIGNoaWxkaXNoIGJvdyBzaGUgbGl2ZXMgdW5oYXJtJ2QuCiAgICBTaGUgd2lsbCBub3Qgc3RheSB0aGUgc2llZ2Ugb2YgbG92aW5nIHRlcm1zLAogICAgTm9yIGJpZGUgdGhlIGVuY291bnRlciBvZiBhc3NhaWxpbmcgZXllcywKICAgIE5vciBvcGUgaGVyIGxhcCB0byBzYWludC1zZWR1Y2luZyBnb2xkOgogICAgTywgc2hlIGlzIHJpY2ggaW4gYmVhdXR5LCBvbmx5IHBvb3IsCiAgICBUaGF0IHdoZW4gc2hlIGRpZXMgd2l0aCBiZWF1dHkgZGllcyBoZXIgc3RvcmUuCgpCRU5WT0xJTwoKICAgIFRoZW4gc2hlIGhhdGggc3dvcm4gdGhhdCBzaGUgd2lsbCBzdGlsbCBsaXZlIGNoYXN0ZT8KClJPTUVPCgogICAgU2hlIGhhdGgsIGFuZCBpbiB0aGF0IHNwYXJpbmcgbWFrZXMgaHVnZSB3YXN0ZSwKICAgIEZvciBiZWF1dHkgc3RhcnZlZCB3aXRoIGhlciBzZXZlcml0eQogICAgQ3V0cyBiZWF1dHkgb2ZmIGZyb20gYWxsIHBvc3Rlcml0eS4KICAgIFNoZSBpcyB0b28gZmFpciwgdG9vIHdpc2UsIHdpc2VseSB0b28gZmFpciwKICAgIFRvIG1lcml0IGJsaXNzIGJ5IG1ha2luZyBtZSBkZXNwYWlyOgogICAgU2hlIGhhdGggZm9yc3dvcm4gdG8gbG92ZSwgYW5kIGluIHRoYXQgdm93CiAgICBEbyBJIGxpdmUgZGVhZCB0aGF0IGxpdmUgdG8gdGVsbCBpdCBub3cuCgpCRU5WT0xJTwoKICAgIEJlIHJ1bGVkIGJ5IG1lLCBmb3JnZXQgdG8gdGhpbmsgb2YgaGVyLgoKUk9NRU8KCiAgICBPLCB0ZWFjaCBtZSBob3cgSSBzaG91bGQgZm9yZ2V0IHRvIHRoaW5rLgoKQkVOVk9MSU8KCiAgICBCeSBnaXZpbmcgbGliZXJ0eSB1bnRvIHRoaW5lIGV5ZXM7CiAgICBFeGFtaW5lIG90aGVyIGJlYXV0aWVzLgoKUk9NRU8KCiAgICAnVGlzIHRoZSB3YXkKICAgIFRvIGNhbGwgaGVycyBleHF1aXNpdGUsIGluIHF1ZXN0aW9uIG1vcmU6CiAgICBUaGVzZSBoYXBweSBtYXNrcyB0aGF0IGtpc3MgZmFpciBsYWRpZXMnIGJyb3dzCiAgICBCZWluZyBibGFjayBwdXQgdXMgaW4gbWluZCB0aGV5IGhpZGUgdGhlIGZhaXI7CiAgICBIZSB0aGF0IGlzIHN0cnVja2VuIGJsaW5kIGNhbm5vdCBmb3JnZXQKICAgIFRoZSBwcmVjaW91cyB0cmVhc3VyZSBvZiBoaXMgZXllc2lnaHQgbG9zdDoKICAgIFNob3cgbWUgYSBtaXN0cmVzcyB0aGF0IGlzIHBhc3NpbmcgZmFpciwKICAgIFdoYXQgZG90aCBoZXIgYmVhdXR5IHNlcnZlLCBidXQgYXMgYSBub3RlCiAgICBXaGVyZSBJIG1heSByZWFkIHdobyBwYXNzJ2QgdGhhdCBwYXNzaW5nIGZhaXICiAgICBGYXJld2VsbDogdGhvdSBjYW5zdCBub3QgdGVhY2ggbWUgdG8gZm9yZ2V0LgoKQkVOVk9MSU8KCiAgICBJJ2xsIHBheSB0aGF0IGRvY3RyaW5lLCBvciBlbHNlIGRpZSBpbiBkZWJ0LgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEEgc3RyZWV0LgoKICAgIEVudGVyIENBUFVMRVQsIFBBUklTLCBhbmQgU2VydmFudCAKCkNBUFVMRVQKCiAgICBCdXQgTW9udGFndWUgaXMgYm91bmQgYXMgd2VsbCBhcyBJLAogICAgSW4gcGVuYWx0eSBhbGlrZTsgYW5kICd0aXMgbm90IGhhcmQsIEkgdGhpbmssCiAgICBGb3IgbWVuIHNvIG9sZCBhcyB3ZSB0byBrZWVwIHRoZSBwZWFjZS4KClBBUklTCgogICAgT2YgaG9ub3VyYWJsZSByZWNrb25pbmcgYXJlIHlvdSBib3RoOwogICAgQW5kIHBpdHkgJ3RpcyB5b3UgbGl2ZWQgYXQgb2RkcyBzbyBsb25nLgogICAgQnV0IG5vdywgbXkgbG9yZCwgd2hhdCBzYXkgeW91IHRvIG15IHN1aXQCgpDQVBVTEVUCgogICAgQnV0IHNheWluZyBvJ2VyIHdoYXQgSSBoYXZlIHNhaWQgYmVmb3JlOgogICAgTXkgY2hpbGQgaXMgeWV0IGEgc3RyYW5nZXIgaW4gdGhlIHdvcmxkOwogICAgU2hlIGhhdGggbm90IHNlZW4gdGhlIGNoYW5nZSBvZiBmb3VydGVlbiB5ZWFycywKICAgIExldCB0d28gbW9yZSBzdW1tZXJzIHdpdGhlciBpbiB0aGVpciBwcmlkZSwKICAgIEVyZSB3ZSBtYXkgdGhpbmsgaGVyIHJpcGUgdG8gYmUgYSBicmlkZS4KClBBUklTCgogICAgWW91bmdlciB0aGFuIHNoZSBhcmUgaGFwcHkgbW90aGVycyBtYWRlLgoKQ0FQVUxFVAoKICAgIEFuZCB0b28gc29vbiBtYXJyJ2QgYXJlIHRob3NlIHNvIGVhcmx5IG1hZGUuCiAgICBUaGUgZWFydGggaGF0aCBzd2FsbG93J2QgYWxsIG15IGhvcGVzIGJ1dCBzaGUsCiAgICBTaGUgaXMgdGhlIGhvcGVmdWwgbGFkeSBvZiBteSBlYXJ0aDoKICAgIEJ1dCB3b28gaGVyLCBnZW50bGUgUGFyaXMsIGdldCBoZXIgaGVhcnQsCiAgICBNeSB3aWxsIHRvIGhlciBjb25zZW50IGlzIGJ1dCBhIHBhcnQ7CiAgICBBbiBzaGUgYWdyZWUsIHdpdGhpbiBoZXIgc2NvcGUgb2YgY2hvaWNlCiAgICBMaWVzIG15IGNvbnNlbnQgYW5kIGZhaXIgYWNjb3JkaW5nIHZvaWNlLgogICAgVGhpcyBuaWdodCBJIGhvbGQgYW4gb2xkIGFjY3VzdG9tJ2QgZmVhc3QsCiAgICBXaGVyZXRvIEkgaGF2ZSBpbnZpdGVkIG1hbnkgYSBndWVzdCwKICAgIFN1Y2ggYXMgSSBsb3ZlOyBhbmQgeW91LCBhbW9uZyB0aGUgc3RvcmUsCiAgICBPbmUgbW9yZSwgbW9zdCB3ZWxjb21lLCBtYWtlcyBteSBudW1iZXIgbW9yZS4KICAgIEF0IG15IHBvb3IgaG91c2UgbG9vayB0byBiZWhvbGQgdGhpcyBuaWdodAogICAgRWFydGgtdHJlYWRpbmcgc3RhcnMgdGhhdCBtYWtlIGRhcmsgaGVhdmVuIGxpZ2h0OgogICAgU3VjaCBjb21mb3J0IGFzIGRvIGx1c3R5IHlvdW5nIG1lbiBmZWVsCiAgICBXaGVuIHdlbGwtYXBwYXJlbGwnZCBBcHJpbCBvbiB0aGUgaGVlbAogICAgT2YgbGltcGluZyB3aW50ZXIgdHJlYWRzLCBldmVuIHN1Y2ggZGVsaWdodAogICAgQW1vbmcgZnJlc2ggZmVtYWxlIGJ1ZHMgc2hhbGwgeW91IHRoaXMgbmlnaHQKICAgIEluaGVyaXQgYXQgbXkgaG91c2U7IGhlYXIgYWxsLCBhbGwgc2VlLAogICAgQW5kIGxpa2UgaGVyIG1vc3Qgd2hvc2UgbWVyaXQgbW9zdCBzaGFsbCBiZToKICAgIFdoaWNoIG9uIG1vcmUgdmlldywgb2YgbWFueSBtaW5lIGJlaW5nIG9uZQogICAgTWF5IHN0YW5kIGluIG51bWJlciwgdGhvdWdoIGluIHJlY2tvbmluZyBub25lLAogICAgQ29tZSwgZ28gd2l0aCBtZS4KCiAgICBUbyBTZXJ2YW50LCBnaXZpbmcgYSBwYXBlcgogICAgR28sIHNpcnJhaCwgdHJ1ZGdlIGFib3V0CiAgICBUaHJvdWdoIGZhaXIgVmVyb25hOyBmaW5kIHRob3NlIHBlcnNvbnMgb3V0CiAgICBXaG9zZSBuYW1lcyBhcmUgd3JpdHRlbiB0aGVyZSwgYW5kIHRvIHRoZW0gc2F5LAogICAgTXkgaG91c2UgYW5kIHdlbGNvbWUgb24gdGhlaXIgcGxlYXN1cmUgc3RheS4KCiAgICBFeGV1bnQgQ0FQVUxFVCBhbmQgUEFSSVMKClNlcnZhbnQKCiAgICBGaW5kIHRoZW0gb3V0IHdob3NlIG5hbWVzIGFyZSB3cml0dGVuIGhlcmUhIEl0IGlzCiAgICB3cml0dGVuLCB0aGF0IHRoZSBzaG9lbWFrZXIgc2hvdWxkIG1lZGRsZSB3aXRoIGhpcwogICAgeWFyZCwgYW5kIHRoZSB0YWlsb3Igd2l0aCBoaXMgbGFzdCwgdGhlIGZpc2hlciB3aXRoCiAgICBoaXMgcGVuY2lsLCBhbmQgdGhlIHBhaW50ZXIgd2l0aCBoaXMgbmV0czsgYnV0IEkgYW0KICAgIHNlbnQgdG8gZmluZCB0aG9zZSBwZXJzb25zIHdob3NlIG5hbWVzIGFyZSBoZXJlCiAgICB3cml0LCBhbmQgY2FuIG5ldmVyIGZpbmQgd2hhdCBuYW1lcyB0aGUgd3JpdGluZwogICAgcGVyc29uIGhhdGggaGVyZSB3cml0LiBJIG11c3QgdG8gdGhlIGxlYXJuZWQuLS1JbiBnb29kIHRpbWUuCgogICAgRW50ZXIgQkVOVk9MSU8gYW5kIFJPTUVPCgpCRU5WT0xJTwoKICAgIFR1dCwgbWFuLCBvbmUgZmlyZSBidXJucyBvdXQgYW5vdGhlcidzIGJ1cm5pbmcsCiAgICBPbmUgcGFpbiBpcyBsZXNzZW4nZCBieSBhbm90aGVyJ3MgYW5ndWlzaDsKICAgIFR1cm4gZ2lkZHksIGFuZCBiZSBob2xwIGJ5IGJhY2t3YXJkIHR1cm5pbmc7CiAgICBPbmUgZGVzcGVyYXRlIGdyaWVmIGN1cmVzIHdpdGggYW5vdGhlcidzIGxhbmd1aXNoOgogICAgVGFrZSB0aG91IHNvbWUgbmV3IGluZmVjdGlvbiB0byB0aHkgZXllLAogICAgQW5kIHRoZSByYW5rIHBvaXNvbiBvZiB0aGUgb2xkIHdpbGwgZGllLgoKUk9NRU8KCiAgICBZb3VyIHBsYWludGFpbi1sZWFmIGlzIGV4Y2VsbGVudCBmb3IgdGhhdC4KCkJFTlZPTElPCgogICAgRm9yIHdoYXQsIEkgcHJheSB0aGVlPwoKUk9NRU8KCiAgICBGb3IgeW91ciBicm9rZW4gc2hpbi4KCkJFTlZPTElPCgogICAgV2h5LCBSb21lbywgYXJ0IHRob3UgbWFkPwoKUk9NRU8KCiAgICBOb3QgbWFkLCBidXQgYm91bmQgbW9yZSB0aGFuIGEgbWFkLW1hbiBpczsKICAgIFNodXQgdXAgaW4gcHJpc29uLCBrZXB0IHdpdGhvdXQgbXkgZm9vZCwKICAgIFdoaXBwJ2QgYW5kIHRvcm1lbnRlZCBhbmQtLUdvZC1kZW4sIGdvb2QgZmVsbG93LgoKU2VydmFudAoKICAgIEdvZCBnaScgZ29kLWRlbi4gSSBwcmF5LCBzaXIsIGNhbiB5b3UgcmVhZD8KClJPTUVPCgogICAgQXksIG1pbmUgb3duIGZvcnR1bmUgaW4gbXkgbWlzZXJ5LgoKU2VydmFudAoKICAgIFBlcmhhcHMgeW91IGhhdmUgbGVhcm5lZCBpdCB3aXRob3V0IGJvb2s6IGJ1dCwgSQogICAgcHJheSwgY2FuIHlvdSByZWFkIGFueSB0aGluZyB5b3Ugc2VlPwoKUk9NRU8KCiAgICBBeSwgaWYgSSBrbm93IHRoZSBsZXR0ZXJzIGFuZCB0aGUgbGFuZ3VhZ2UuCgpTZXJ2YW50CgogICAgWWUgc2F5IGhvbmVzdGx5OiByZXN0IHlvdSBtZXJyeSEKClJPTUVPCgogICAgU3RheSwgZmVsbG93OyBJIGNhbiByZWFkLgoKICAgIFJlYWRzCiAgICAnU2lnbmlvciBNYXJ0aW5vIGFuZCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOwogICAgQ291bnR5IEFuc2VsbWUgYW5kIGhpcyBiZWF1dGVvdXMgc2lzdGVyczsgdGhlIGxhZHkKICAgIHdpZG93IG9mIFZpdHJhdmlvOyBTaWduaW9yIFBsYWNlbnRpbyBhbmQgaGlzIGxvdmVseQogICAgbmllY2VzOyBNZXJjdXRpbyBhbmQgaGlzIGJyb3RoZXIgVmFsZW50aW5lOyBtaW5lCiAgICB1bmNsZSBDYXB1bGV0LCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOyBteSBmYWlyIG5pZWNlCiAgICBSb3NhbGluZTsgTGl2aWE7IFNpZ25pb3IgVmFsZW50aW8gYW5kIGhpcyBjb3VzaW4KICAgIFR5YmFsdCwgTHVjaW8gYW5kIHRoZSBsaXZlbHkgSGVsZW5hLicgQSBmYWlyCiAgICBhc3NlbWJseTogd2hpdGhlciBzaG91bGQgdGhleSBjb21lPwoKU2VydmFudAoKICAgIFVwLgoKUk9NRU8KCiAgICBXaGl0aGVyPwoKU2VydmFudAoKICAgIFRvIHN1cHBlcjsgdG8gb3VyIGhvdXNlLgoKUk9NRU8KCiAgICBXaG9zZSBob3VzZT8KClNlcnZhbnQKCiAgICBNeSBtYXN0ZXIncy4KClJPTUVPCgogICAgSW5kZWVkLCBJIHNob3VsZCBoYXZlIGFzaydkIHlvdSB0aGF0IGJlZm9yZS4KClNlcnZhbnQKCiAgICBOb3cgSSdsbCB0ZWxsIHlvdSB3aXRob3V0IGFza2luZzogbXkgbWFzdGVyIGlzIHRoZQogICAgZ3JlYXQgcmljaCBDYXB1bGV0OyBhbmQgaWYgeW91IGJlIG5vdCBvZiB0aGUgaG91c2UKICAgIG9mIE1vbnRhZ3VlcywgSSBwcmF5LCBjb21lIGFuZCBjcnVzaCBhIGN1cCBvZiB3aW5lLgogICAgUmVzdCB5b3UgbWVycnkhCgogICAgRXhpdAoKQkVOVk9MSU8KCiAgICBBdCB0aGlzIHNhbWUgYW5jaWVudCBmZWFzdCBvZiBDYXB1bGV0J3MKICAgIFN1cHMgdGhlIGZhaXIgUm9zYWxpbmUgd2hvbSB0aG91IHNvIGxvdmVzdCwKICAgIFdpdGggYWxsIHRoZSBhZG1pcmVkIGJlYXV0aWVzIG9mIFZlcm9uYToKICAgIEdvIHRoaXRoZXI7IGFuZCwgd2l0aCB1bmF0dGFpbnRlZCBleWUsCiAgICBDb21wYXJlIGhlciBmYWNlIHdpdGggc29tZSB0aGF0IEkgc2hhbGwgc2hvdywKICAgIEFuZCBJIHdpbGwgbWFrZSB0aGVlIHRoaW5rIHRoeSBzd2FuIGEgY3Jvdy4KClJPTUVPCgogICAgV2hlbiB0aGUgZGV2b3V0IHJlbGlnaW9uIG9mIG1pbmUgZXllCiAgICBNYWludGFpbnMgc3VjaCBmYWxzZWhvb2QsIHRoZW4gdHVybiB0ZWFycyB0byBmaXJlczsKICAgIEFuZCB0aGVzZSwgd2hvIG9mdGVuIGRyb3duJ2QgY291bGQgbmV2ZXIgZGllLAogICAgVHJhbnNwYXJlbnQgaGVyZXRpY3MsIGJlIGJ1cm50IGZvciBsaWFycyEKICAgIE9uZSBmYWlyZXIgdGhhbiBteSBsb3ZlISB0aGUgYWxsLXNlZWluZyBzdW4KICAgIE5lJ2VyIHNhdyBoZXIgbWF0Y2ggc2luY2UgZmlyc3QgdGhlIHdvcmxkIGJlZ3VuLgoKQkVOVk9MSU8KCiAgICBUdXQsIHlvdSBzYXcgaGVyIGZhaXIsIG5vbmUgZWxzZSBiZWluZyBieSwKICAgIEhlcnNlbGYgcG9pc2VkIHdpdGggaGVyc2VsZiBpbiBlaXRoZXIgZXllOgogICAgQnV0IGluIHRoYXQgY3J5c3RhbCBzY2FsZXMgbGV0IHRoZXJlIGJlIHdlaWdoJ2QKICAgIFlvdXIgbGFkeSdzIGxvdmUgYWdhaW5zdCBzb21lIG90aGVyIG1haWQKICAgIFRoYXQgSSB3aWxsIHNob3cgeW91IHNoaW5pbmcgYXQgdGhpcyBmZWFzdCwKICAgIEFuZCBzaGUgc2hhbGwgc2NhbnQgc2hvdyB3ZWxsIHRoYXQgbm93IHNob3dzIGJlc3QuCgpST01FTwoKICAgIEknbGwgZ28gYWxvbmcsIG5vIHN1Y2ggc2lnaHQgdG8gYmUgc2hvd24sCiAgICBCdXQgdG8gcmVqb2ljZSBpbiBzcGxlbmRvciBvZiBtaW5lIG93bi4KCiAgICBFeGV1bnQKClNDRU5FIElJSS4gQSByb29tIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgTnVyc2UsIHdoZXJlJ3MgbXkgZGF1Z2h0ZXIIGNhbGwgaGVyIGZvcnRoIHRvIG1lLgoKTnVyc2UKCiAgICBOb3csIGJ5IG15IG1haWRlbmhlYWQsIGF0IHR3ZWx2ZSB5ZWFyIG9sZCwKICAgIEkgYmFkZSBoZXIgY29tZS4gV2hhdCwgbGFtYiEgd2hhdCwgbGFkeWJpcmQhCiAgICBHb2QgZm9yYmlkISBXaGVyZSdzIHRoaXMgZ2lybD8gV2hhdCwgSnVsaWV0IQoKICAgIEVudGVyIEpVTElFVAoKSlVMSUVUCgogICAgSG93IG5vdyEgd2hvIGNhbGxzPwoKTnVyc2UKCiAgICBZb3VyIG1vdGhlci4KCkpVTElFVAoKICAgIE1hZGFtLCBJIGFtIGhlcmUuCiAgICBXaGF0IGlzIHlvdXIgd2lsbD8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoaXMgaXMgdGhlIG1hdHRlcjotLU51cnNlLCBnaXZlIGxlYXZlIGF3aGlsZSwKICAgIFdlIG11c3QgdGFsayBpbiBzZWNyZXQ6LS1udXJzZSwgY29tZSBiYWNrIGFnYWluOwogICAgSSBoYXZlIHJlbWVtYmVyJ2QgbWUsIHRob3UncyBoZWFyIG91ciBjb3Vuc2VsLgogICAgVGhvdSBrbm93J3N0IG15IGRhdWdodGVyJ3Mgb2YgYSBwcmV0dHkgYWdlLgoKTnVyc2UKCiAgICBGYWl0aCwgSSBjYW4gdGVsbCBoZXIgYWdlIHVudG8gYW4gaG91ci4KCkxBRFkgQ0FQVUxFVAoKICAgIFNoZSdzIG5vdCBmb3VydGVlbi4KCk51cnNlCgogICAgSSdsbCBsYXkgZm91cnRlZW4gb2YgbXkgdGVldGgsLS0KICAgIEFuZCB5ZXQsIHRvIG15IHRlZXRoIGJlIGl0IHNwb2tlbiwgSSBoYXZlIGJ1dCBmb3VyLS0KICAgIFNoZSBpcyBub3QgZm91cnRlZW4uIEhvdyBsb25nIGlzIGl0IG5vdwogICAgVG8gTGFtbWFzLXRpZGUCgpMQURZIENBUFVMRVQKCiAgICBBIGZvcnRuaWdodCBhbmQgb2RkIGRheXMuCgpOdXJzZQoKICAgIEV2ZW4gb3Igb2RkLCBvZiBhbGwgZGF5cyBpbiB0aGUgeWVhciwKICAgIENvbWUgTGFtbWFzLWV2ZSBhdCBuaWdodCBzaGFsbCBzaGUgYmUgZm91cnRlZW4uCiAgICBTdXNhbiBhbmQgc2hlLS1Hb2QgcmVzdCBhbGwgQ2hyaXN0aWFuIHNvdWxzIS0tCiAgICBXZXJlIG9mIGFuIGFnZTogd2VsbCwgU3VzYW4gaXMgd2l0aCBHb2Q7CiAgICBTaGUgd2FzIHRvbyBnb29kIGZvciBtZTogYnV0LCBhcyBJIHNhaWQsCiAgICBPbiBMYW1tYXMtZXZlIGF0IG5pZ2h0IHNoYWxsIHNoZSBiZSBmb3VydGVlbjsKICAgIFRoYXQgc2hhbGwgc2hlLCBtYXJyeTsgSSByZW1lbWJlciBpdCB3ZWxsLgogICAgJ1RpcyBzaW5jZSB0aGUgZWFydGhxdWFrZSBub3cgZWxldmVuIHllYXJzOwogICAgQW5kIHNoZSB3YXMgd2VhbidkLC0tSSBuZXZlciBzaGFsbCBmb3JnZXQgaXQsLS0KICAgIE9mIGFsbCB0aGUgZGF5cyBvZiB0aGUgeWVhciwgdXBvbiB0aGF0IGRheToKICAgIEZvciBJIGhhZCB0aGVuIGxhaWQgd29ybXdvb2QgdG8gbXkgZHVnLAogICAgU2l0dGluZyBpbiB0aGUgc3VuIHVuZGVyIHRoZSBkb3ZlLWhvdXNlIHdhbGw7CiAgICBNeSBsb3JkIGFuZCB5b3Ugd2VyZSB0aGVuIGF0IE1hbnR1YTotLQogICAgTmF5LCBJIGRvIGJlYXIgYSBicmFpbjotLWJ1dCwgYXMgSSBzYWlkLAogICAgV2hlbiBpdCBkaWQgdGFzdGUgdGhlIHdvcm13b29kIG9uIHRoZSBuaXBwbGUKICAgIE9mIG15IGR1ZyBhbmQgZmVsdCBpdCBiaXR0ZXIsIHByZXR0eSBmb29sLAogICAgVG8gc2VlIGl0IHRldGNoeSBhbmQgZmFsbCBvdXQgd2l0aCB0aGUgZHVnIQogICAgU2hha2UgcXVvdGggdGhlIGRvdmUtaG91c2U6ICd0d2FzIG5vIG5lZWQsIEkgdHJvdywKICAgIFRvIGJpZCBtZSB0cnVkZ2U6CiAgICBBbmQgc2luY2UgdGhhdCB0aW1lIGl0IGlzIGVsZXZlbiB5ZWFyczsKICAgIEZvciB0aGVuIHNoZSBjb3VsZCBzdGFuZCBhbG9uZTsgbmF5LCBieSB0aGUgcm9vZCwKICAgIFNoZSBjb3VsZCBoYXZlIHJ1biBhbmQgd2FkZGxlZCBhbGwgYWJvdXQ7CiAgICBGb3IgZXZlbiB0aGUgZGF5IGJlZm9yZSwgc2hlIGJyb2tlIGhlciBicm93OgogICAgQW5kIHRoZW4gbXkgaHVzYmFuZC0tR29kIGJlIHdpdGggaGlzIHNvdWwhCiAgICBBJyB3YXMgYSBtZXJyeSBtYW4tLXRvb2sgdXAgdGhlIGNoaWxkOgogICAgJ1llYSwnIHF1b3RoIGhlLCAnZG9zdCB0aG91IGZhbGwgdXBvbiB0aHkgZmFjZT8KICAgIFRob3Ugd2lsdCBmYWxsIGJhY2t3YXJkIHdoZW4gdGhvdSBoYXN0IG1vcmUgd2l0OwogICAgV2lsdCB0aG91IG5vdCwgSnVsZT8nIGFuZCwgYnkgbXkgaG9saWRhbWUsCiAgICBUaGUgcHJldHR5IHdyZXRjaCBsZWZ0IGNyeWluZyBhbmQgc2FpZCAnQXkuJwogICAgVG8gc2VlLCBub3csIGhvdyBhIGplc3Qgc2hhbGwgY29tZSBhYm91dCEKICAgIEkgd2FycmFudCwgYW4gSSBzaG91bGQgbGl2ZSBhIHRob3VzYW5kIHllYXJzLAogICAgSSBuZXZlciBzaG91bGQgZm9yZ2V0IGl0OiAnV2lsdCB0aG91IG5vdCwgSnVsZT8nIHF1b3RoIGhlOwogICAgQW5kLCBwcmV0dHkgZm9vbCwgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKTEFEWSBDQVBVTEVUCgogICAgRW5vdWdoIG9mIHRoaXM7IEkgcHJheSB0aGVlLCBob2xkIHRoeSBwZWFjZS4KCk51cnNlCgogICAgWWVzLCBtYWRhbTogeWV0IEkgY2Fubm90IGNob29zZSBidXQgbGF1Z2gsCiAgICBUbyB0aGluayBpdCBzaG91bGQgbGVhdmUgY3J5aW5nIGFuZCBzYXkgJ0F5LicKICAgIEFuZCB5ZXQsIEkgd2FycmFudCwgaXQgaGFkIHVwb24gaXRzIGJyb3cKICAgIEEgYnVtcCBhcyBiaWcgYXMgYSB5b3VuZyBjb2NrZXJlbCdzIHN0b25lOwogICAgQSBwYXJsb3VzIGtub2NrOyBhbmQgaXQgY3JpZWQgYml0dGVybHk6CiAgICAnWWVhLCcgcXVvdGggbXkgaHVzYmFuZCwnZmFsbCdzdCB1cG9uIHRoeSBmYWNlPwogICAgVGhvdSB3aWx0IGZhbGwgYmFja3dhcmQgd2hlbiB0aG91IGNvbWVzdCB0byBhZ2U7CiAgICBXaWx0IHRob3Ugbm90LCBKdWxlPycgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKSlVMSUVUCgogICAgQW5kIHN0aW50IHRob3UgdG9vLCBJIHByYXkgdGhlZSwgbnVyc2UsIHNheSBJLgoKTnVyc2UKCiAgICBQZWFjZSwgSSBoYXZlIGRvbmUuIEdvZCBtYXJrIHRoZWUgdG8gaGlzIGdyYWNlIQogICAgVGhvdSB3YXN0IHRoZSBwcmV0dGllc3QgYmFiZSB0aGF0IGUnZXIgSSBudXJzZWQ6CiAgICBBbiBJIG1pZ2h0IGxpdmUgdG8gc2VlIHRoZWUgbWFycmllZCBvbmNlLAogICAgSSBoYXZlIG15IHdpc2guCgpMQURZIENBUFVMRVQKCiAgICBNYXJyeSwgdGhhdCAnbWFycnknIGlzIHRoZSB2ZXJ5IHRoZW1lCiAgICBJIGNhbWUgdG8gdGFsayBvZi4gVGVsbCBtZSwgZGF1Z2h0ZXIgSnVsaWV0LAogICAgSG93IHN0YW5kcyB5b3VyIGRpc3Bvc2l0aW9uIHRvIGJlIG1hcnJpZWQCgpKVUxJRVQKCiAgICBJdCBpcyBhbiBob25vdXIgdGhhdCBJIGRyZWFtIG5vdCBvZi4KCk51cnNlCgogICAgQW4gaG9ub3VyISB3ZXJlIG5vdCBJIHRoaW5lIG9ubHkgbnVyc2UsCiAgICBJIHdvdWxkIHNheSB0aG91IGhhZHN0IHN1Y2snZCB3aXNkb20gZnJvbSB0aHkgdGVhdC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHRoaW5rIG9mIG1hcnJpYWdlIG5vdzsgeW91bmdlciB0aGFuIHlvdSwKICAgIEhlcmUgaW4gVmVyb25hLCBsYWRpZXMgb2YgZXN0ZWVtLAogICAgQXJlIG1hZGUgYWxyZWFkeSBtb3RoZXJzOiBieSBteSBjb3VudCwKICAgIEkgd2FzIHlvdXIgbW90aGVyIG11Y2ggdXBvbiB0aGVzZSB5ZWFycwogICAgVGhhdCB5b3UgYXJlIG5vdyBhIG1haWQuIFRodXMgdGhlbiBpbiBicmllZjoKICAgIFRoZSB2YWxpYW50IFBhcmlzIHNlZWtzIHlvdSBmb3IgaGlzIGxvdmUuCgpOdXJzZQoKICAgIEEgbWFuLCB5b3VuZyBsYWR5ISBsYWR5LCBzdWNoIGEgbWFuCiAgICBBcyBhbGwgdGhlIHdvcmxkLS13aHksIGhlJ3MgYSBtYW4gb2Ygd2F4LgoKTEFEWSBDQVBVTEVUCgogICAgVmVyb25hJ3Mgc3VtbWVyIGhhdGggbm90IHN1Y2ggYSBmbG93ZXIuCgpOdXJzZQoKICAgIE5heSwgaGUncyBhIGZsb3dlcjsgaW4gZmFpdGgsIGEgdmVyeSBmbG93ZXIuCgpMQURZIENBUFVMRVQKCiAgICBXaGF0IHNheSB5b3UIGNhbiB5b3UgbG92ZSB0aGUgZ2VudGxlbWFuPwogICAgVGhpcyBuaWdodCB5b3Ugc2hhbGwgYmVob2xkIGhpbSBhdCBvdXIgZmVhc3Q7CiAgICBSZWFkIG8nZXIgdGhlIHZvbHVtZSBvZiB5b3VuZyBQYXJpcycgZmFjZSwKICAgIEFuZCBmaW5kIGRlbGlnaHQgd3JpdCB0aGVyZSB3aXRoIGJlYXV0eSdzIHBlbjsKICAgIEV4YW1pbmUgZXZlcnkgbWFycmllZCBsaW5lYW1lbnQsCiAgICBBbmQgc2VlIGhvdyBvbmUgYW5vdGhlciBsZW5kcyBjb250ZW50CiAgICBBbmQgd2hhdCBvYnNjdXJlZCBpbiB0aGlzIGZhaXIgdm9sdW1lIGxpZXMKICAgIEZpbmQgd3JpdHRlbiBpbiB0aGUgbWFyZ2VudCBvZiBoaXMgZXllcy4KICAgIFRoaXMgcHJlY2lvdXMgYm9vayBvZiBsb3ZlLCB0aGlzIHVuYm91bmQgbG92ZXIsCiAgICBUbyBiZWF1dGlmeSBoaW0sIG9ubHkgbGFja3MgYSBjb3ZlcjoKICAgIFRoZSBmaXNoIGxpdmVzIGluIHRoZSBzZWEsIGFuZCAndGlzIG11Y2ggcHJpZGUKICAgIEZvciBmYWlyIHdpdGhvdXQgdGhlIGZhaXIgd2l0aGluIHRvIGhpZGU6CiAgICBUaGF0IGJvb2sgaW4gbWFueSdzIGV5ZXMgZG90aCBzaGFyZSB0aGUgZ2xvcnksCiAgICBUaGF0IGluIGdvbGQgY2xhc3BzIGxvY2tzIGluIHRoZSBnb2xkZW4gc3Rvcnk7CiAgICBTbyBzaGFsbCB5b3Ugc2hhcmUgYWxsIHRoYXQgaGUgZG90aCBwb3NzZXNzLAogICAgQnkgaGF2aW5nIGhpbSwgbWFraW5nIHlvdXJzZWxmIG5vIGxlc3MuCgpOdXJzZQoKICAgIE5vIGxlc3MhIG5heSwgYmlnZ2VyOyB3b21lbiBncm93IGJ5IG1lbi4KCkxBRFkgQ0FQVUxFVAoKICAgIFNwZWFrIGJyaWVmbHksIGNhbiB5b3UgbGlrZSBvZiBQYXJpcycgbG92ZT8KCkpVTElFVAoKICAgIEknbGwgbG9vayB0byBsaWtlLCBpZiBsb29raW5nIGxpa2luZyBtb3ZlOgogICAgQnV0IG5vIG1vcmUgZGVlcCB3aWxsIEkgZW5kYXJ0IG1pbmUgZXllCiAgICBUaGFuIHlvdXIgY29uc2VudCBnaXZlcyBzdHJlbmd0aCB0byBtYWtlIGl0IGZseS4KCiAgICBFbnRlciBhIFNlcnZhbnQKClNlcnZhbnQKCiAgICBNYWRhbSwgdGhlIGd1ZXN0cyBhcmUgY29tZSwgc3VwcGVyIHNlcnZlZCB1cCwgeW91CiAgICBjYWxsZWQsIG15IHlvdW5nIGxhZHkgYXNrZWQgZm9yLCB0aGUgbnVyc2UgY3Vyc2VkIGluCiAgICB0aGUgcGFudHJ5LCBhbmQgZXZlcnkgdGhpbmcgaW4gZXh0cmVtaXR5LiBJIG11c3QKICAgIGhlbmNlIHRvIHdhaXQ7IEkgYmVzZWVjaCB5b3UsIGZvbGxvdyBzdHJhaWdodC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlIGZvbGxvdyB0aGVlLgoKICAgIEV4aXQgU2VydmFudAogICAgSnVsaWV0LCB0aGUgY291bnR5IHN0YXlzLgoKTnVyc2UKCiAgICBHbywgZ2lybCwgc2VlayBoYXBweSBuaWdodHMgdG8gaGFwcHkgZGF5cy4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBST01FTywgTUVSQ1VUSU8sIEJFTlZPTElPLCB3aXRoIGZpdmUgb3Igc2l4IE1hc2tlcnMsIFRvcmNoLWJlYXJlcnMsIGFuZCBvdGhlcnMgCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIHRoaXMgc3BlZWNoIGJlIHNwb2tlIGZvciBvdXIgZXhjdXNlPwogICAgT3Igc2hhbGwgd2Ugb24gd2l0aG91dCBhIGFwb2xvZ3kCgpCRU5WT0xJTwoKICAgIFRoZSBkYXRlIGlzIG91dCBvZiBzdWNoIHByb2xpeGl0eToKICAgIFdlJ2xsIGhhdmUgbm8gQ3VwaWQgaG9vZHdpbmsnZCB3aXRoIGEgc2NhcmYsCiAgICBCZWFyaW5nIGEgVGFydGFyJ3MgcGFpbnRlZCBib3cgb2YgbGF0aCwKICAgIFNjYXJpbmcgdGhlIGxhZGllcyBsaWtlIGEgY3Jvdy1rZWVwZXI7CiAgICBOb3Igbm8gd2l0aG91dC1ib29rIHByb2xvZ3VlLCBmYWludGx5IHNwb2tlCiAgICBBZnRlciB0aGUgcHJvbXB0ZXIsIGZvciBvdXIgZW50cmFuY2U6CiAgICBCdXQgbGV0IHRoZW0gbWVhc3VyZSB1cyBieSB3aGF0IHRoZXkgd2lsbDsKICAgIFdlJ2xsIG1lYXN1cmUgdGhlbSBhIG1lYXN1cmUsIGFuZCBiZSBnb25lLgoKUk9NRU8KCiAgICBHaXZlIG1lIGEgdG9yY2g6IEkgYW0gbm90IGZvciB0aGlzIGFtYmxpbmc7CiAgICBCZWluZyBidXQgaGVhdnksIEkgd2lsbCBiZWFyIHRoZSBsaWdodC4KCk1FUkNVVElPCgogICAgTmF5LCBnZW50bGUgUm9tZW8sIHdlIG11c3QgaGF2ZSB5b3UgZGFuY2UuCgpST01FTwoKICAgIE5vdCBJLCBiZWxpZXZlIG1lOiB5b3UgaGF2ZSBkYW5jaW5nIHNob2VzCiAgICBXaXRoIG5pbWJsZSBzb2xlczogSSBoYXZlIGEgc291bCBvZiBsZWFkCiAgICBTbyBzdGFrZXMgbWUgdG8gdGhlIGdyb3VuZCBJIGNhbm5vdCBtb3ZlLgoKTUVSQ1VUSU8KCiAgICBZb3UgYXJlIGEgbG92ZXI7IGJvcnJvdyBDdXBpZCdzIHdpbmdzLAogICAgQW5kIHNvYXIgd2l0aCB0aGVtIGFib3ZlIGEgY29tbW9uIGJvdW5kLgoKUk9NRU8KCiAgICBJIGFtIHRvbyBzb3JlIGVucGllcmNlZCB3aXRoIGhpcyBzaGFmdAogICAgVG8gc29hciB3aXRoIGhpcyBsaWdodCBmZWF0aGVycywgYW5kIHNvIGJvdW5kLAogICAgSSBjYW5ub3QgYm91bmQgYSBwaXRjaCBhYm92ZSBkdWxsIHdvZToKICAgIFVuZGVyIGxvdmUncyBoZWF2eSBidXJkZW4gZG8gSSBzaW5rLgoKTUVSQ1VUSU8KCiAgICBBbmQsIHRvIHNpbmsgaW4gaXQsIHNob3VsZCB5b3UgYnVyZGVuIGxvdmU7CiAgICBUb28gZ3JlYXQgb3BwcmVzc2lvbiBmb3IgYSB0ZW5kZXIgdGhpbmcuCgpST01FTwoKICAgIElzIGxvdmUgYSB0ZW5kZXIgdGhpbmcIGl0IGlzIHRvbyByb3VnaCwKICAgIFRvbyBydWRlLCB0b28gYm9pc3Rlcm91cywgYW5kIGl0IHByaWNrcyBsaWtlIHRob3JuLgoKTUVSQ1VUSU8KCiAgICBJZiBsb3ZlIGJlIHJvdWdoIHdpdGggeW91LCBiZSByb3VnaCB3aXRoIGxvdmU7CiAgICBQcmljayBsb3ZlIGZvciBwcmlja2luZywgYW5kIHlvdSBiZWF0IGxvdmUgZG93bi4KICAgIEdpdmUgbWUgYSBjYXNlIHRvIHB1dCBteSB2aXNhZ2UgaW46CiAgICBBIHZpc29yIGZvciBhIHZpc29yISB3aGF0IGNhcmUgSQogICAgV2hhdCBjdXJpb3VzIGV5ZSBkb3RoIHF1b3RlIGRlZm9ybWl0aWVzPwogICAgSGVyZSBhcmUgdGhlIGJlZXRsZSBicm93cyBzaGFsbCBibHVzaCBmb3IgbWUuCgpCRU5WT0xJTwoKICAgIENvbWUsIGtub2NrIGFuZCBlbnRlcjsgYW5kIG5vIHNvb25lciBpbiwKICAgIEJ1dCBldmVyeSBtYW4gYmV0YWtlIGhpbSB0byBoaXMgbGVncy4KClJPTUVPCgogICAgQSB0b3JjaCBmb3IgbWU6IGxldCB3YW50b25zIGxpZ2h0IG9mIGhlYXJ0CiAgICBUaWNrbGUgdGhlIHNlbnNlbGVzcyBydXNoZXMgd2l0aCB0aGVpciBoZWVscywKICAgIEZvciBJIGFtIHByb3ZlcmInZCB3aXRoIGEgZ3JhbmRzaXJlIHBocmFzZTsKICAgIEknbGwgYmUgYSBjYW5kbGUtaG9sZGVyLCBhbmQgbG9vayBvbi4KICAgIFRoZSBnYW1lIHdhcyBuZSdlciBzbyBmYWlyLCBhbmQgSSBhbSBkb25lLgoKTUVSQ1VUSU8KCiAgICBUdXQsIGR1bidzIHRoZSBtb3VzZSwgdGhlIGNvbnN0YWJsZSdzIG93biB3b3JkOgogICAgSWYgdGhvdSBhcnQgZHVuLCB3ZSdsbCBkcmF3IHRoZWUgZnJvbSB0aGUgbWlyZQogICAgT2YgdGhpcyBzaXItcmV2ZXJlbmNlIGxvdmUsIHdoZXJlaW4gdGhvdSBzdGljaydzdAogICAgVXAgdG8gdGhlIGVhcnMuIENvbWUsIHdlIGJ1cm4gZGF5bGlnaHQsIGhvIQoKUk9NRU8KCiAgICBOYXksIHRoYXQncyBub3Qgc28uCgpNRVJDVVRJTwoKICAgIEkgbWVhbiwgc2lyLCBpbiBkZWxheQogICAgV2Ugd2FzdGUgb3VyIGxpZ2h0cyBpbiB2YWluLCBsaWtlIGxhbXBzIGJ5IGRheS4KICAgIFRha2Ugb3VyIGdvb2QgbWVhbmluZywgZm9yIG91ciBqdWRnbWVudCBzaXRzCiAgICBGaXZlIHRpbWVzIGluIHRoYXQgZXJlIG9uY2UgaW4gb3VyIGZpdmUgd2l0cy4KClJPTUVPCgogICAgQW5kIHdlIG1lYW4gd2VsbCBpbiBnb2luZyB0byB0aGlzIG1hc2s7CiAgICBCdXQgJ3RpcyBubyB3aXQgdG8gZ28uCgpNRVJDVVRJTwoKICAgIFdoeSwgbWF5IG9uZSBhc2sCgpST01FTwoKICAgIEkgZHJlYW0nZCBhIGRyZWFtIHRvLW5pZ2h0LgoKTUVSQ1VUSU8KCiAgICBBbmQgc28gZGlkIEkuCgpST01FTwoKICAgIFdlbGwsIHdoYXQgd2FzIHlvdXJzPwoKTUVSQ1VUSU8KCiAgICBUaGF0IGRyZWFtZXJzIG9mdGVuIGxpZS4KClJPTUVPCgogICAgSW4gYmVkIGFzbGVlcCwgd2hpbGUgdGhleSBkbyBkcmVhbSB0aGluZ3MgdHJ1ZS4KCk1FUkNVVElPCgogICAgTywgdGhlbiwgSSBzZWUgUXVlZW4gTWFiIGhhdGggYmVlbiB3aXRoIHlvdS4KICAgIFNoZSBpcyB0aGUgZmFpcmllcycgbWlkd2lmZSwgYW5kIHNoZSBjb21lcwogICAgSW4gc2hhcGUgbm8gYmlnZ2VyIHRoYW4gYW4gYWdhdGUtc3RvbmUKICAgIE9uIHRoZSBmb3JlLWZpbmdlciBvZiBhbiBhbGRlcm1hbiwKICAgIERyYXduIHdpdGggYSB0ZWFtIG9mIGxpdHRsZSBhdG9taWVzCiAgICBBdGh3YXJ0IG1lbidzIG5vc2VzIGFzIHRoZXkgbGllIGFzbGVlcDsKICAgIEhlciB3YWdvbi1zcG9rZXMgbWFkZSBvZiBsb25nIHNwaWRlcnMnIGxlZ3MsCiAgICBUaGUgY292ZXIgb2YgdGhlIHdpbmdzIG9mIGdyYXNzaG9wcGVycywKICAgIFRoZSB0cmFjZXMgb2YgdGhlIHNtYWxsZXN0IHNwaWRlcidzIHdlYiwKICAgIFRoZSBjb2xsYXJzIG9mIHRoZSBtb29uc2hpbmUncyB3YXRlcnkgYmVhbXMsCiAgICBIZXIgd2hpcCBvZiBjcmlja2V0J3MgYm9uZSwgdGhlIGxhc2ggb2YgZmlsbSwKICAgIEhlciB3YWdvbmVyIGEgc21hbGwgZ3JleS1jb2F0ZWQgZ25hdCwKICAgIE5vdCBzbyBiaWcgYXMgYSByb3VuZCBsaXR0bGUgd29ybQogICAgUHJpY2snZCBmcm9tIHRoZSBsYXp5IGZpbmdlciBvZiBhIG1haWQ7CiAgICBIZXIgY2hhcmlvdCBpcyBhbiBlbXB0eSBoYXplbC1udXQKICAgIE1hZGUgYnkgdGhlIGpvaW5lciBzcXVpcnJlbCBvciBvbGQgZ3J1YiwKICAgIFRpbWUgb3V0IG8nIG1pbmQgdGhlIGZhaXJpZXMnIGNvYWNobWFrZXJzLgogICAgQW5kIGluIHRoaXMgc3RhdGUgc2hlIGdhbGxvcHMgbmlnaHQgYnkgbmlnaHQKICAgIFRocm91Z2ggbG92ZXJzJyBicmFpbnMsIGFuZCB0aGVuIHRoZXkgZHJlYW0gb2YgbG92ZTsKICAgIE8nZXIgY291cnRpZXJzJyBrbmVlcywgdGhhdCBkcmVhbSBvbiBjb3VydCdzaWVzIHN0cmFpZ2h0LAogICAgTydlciBsYXd5ZXJzJyBmaW5nZXJzLCB3aG8gc3RyYWlnaHQgZHJlYW0gb24gZmVlcywKICAgIE8nZXIgbGFkaWVzICcgbGlwcywgd2hvIHN0cmFpZ2h0IG9uIGtpc3NlcyBkcmVhbSwKICAgIFdoaWNoIG9mdCB0aGUgYW5ncnkgTWFiIHdpdGggYmxpc3RlcnMgcGxhZ3VlcywKICAgIEJlY2F1c2UgdGhlaXIgYnJlYXRocyB3aXRoIHN3ZWV0bWVhdHMgdGFpbnRlZCBhcmU6CiAgICBTb21ldGltZSBzaGUgZ2FsbG9wcyBvJ2VyIGEgY291cnRpZXIncyBub3NlLAogICAgQW5kIHRoZW4gZHJlYW1zIGhlIG9mIHNtZWxsaW5nIG91dCBhIHN1aXQ7CiAgICBBbmQgc29tZXRpbWUgY29tZXMgc2hlIHdpdGggYSB0aXRoZS1waWcncyB0YWlsCiAgICBUaWNrbGluZyBhIHBhcnNvbidzIG5vc2UgYXMgYScgbGllcyBhc2xlZXAsCiAgICBUaGVuIGRyZWFtcywgaGUgb2YgYW5vdGhlciBiZW5lZmljZToKICAgIFNvbWV0aW1lIHNoZSBkcml2ZXRoIG8nZXIgYSBzb2xkaWVyJ3MgbmVjaywKICAgIEFuZCB0aGVuIGRyZWFtcyBoZSBvZiBjdXR0aW5nIGZvcmVpZ24gdGhyb2F0cywKICAgIE9mIGJyZWFjaGVzLCBhbWJ1c2NhZG9lcywgU3BhbmlzaCBibGFkZXMsCiAgICBPZiBoZWFsdGhzIGZpdmUtZmF0aG9tIGRlZXA7IGFuZCB0aGVuIGFub24KICAgIERydW1zIGluIGhpcyBlYXIsIGF0IHdoaWNoIGhlIHN0YXJ0cyBhbmQgd2FrZXMsCiAgICBBbmQgYmVpbmcgdGh1cyBmcmlnaHRlZCBzd2VhcnMgYSBwcmF5ZXIgb3IgdHdvCiAgICBBbmQgc2xlZXBzIGFnYWluLiBUaGlzIGlzIHRoYXQgdmVyeSBNYWIKICAgIFRoYXQgcGxhdHMgdGhlIG1hbmVzIG9mIGhvcnNlcyBpbiB0aGUgbmlnaHQsCiAgICBBbmQgYmFrZXMgdGhlIGVsZmxvY2tzIGluIGZvdWwgc2x1dHRpc2ggaGFpcnMsCiAgICBXaGljaCBvbmNlIHVudGFuZ2xlZCwgbXVjaCBtaXNmb3J0dW5lIGJvZGVzOgogICAgVGhpcyBpcyB0aGUgaGFnLCB3aGVuIG1haWRzIGxpZSBvbiB0aGVpciBiYWNrcywKICAgIFRoYXQgcHJlc3NlcyB0aGVtIGFuZCBsZWFybnMgdGhlbSBmaXJzdCB0byBiZWFyLAogICAgTWFraW5nIHRoZW0gd29tZW4gb2YgZ29vZCBjYXJyaWFnZToKICAgIFRoaXMgaXMgc2hlLS0KClJPTUVPCgogICAgUGVhY2UsIHBlYWNlLCBNZXJjdXRpbywgcGVhY2UhCiAgICBUaG91IHRhbGsnc3Qgb2Ygbm90aGluZy4KCk1FUkNVVElPCgogICAgVHJ1ZSwgSSB0YWxrIG9mIGRyZWFtcywKICAgIFdoaWNoIGFyZSB0aGUgY2hpbGRyZW4gb2YgYW4gaWRsZSBicmFpbiwKICAgIEJlZ290IG9mIG5vdGhpbmcgYnV0IHZhaW4gZmFudGFzeSwKICAgIFdoaWNoIGlzIGFzIHRoaW4gb2Ygc3Vic3RhbmNlIGFzIHRoZSBhaXIKICAgIEFuZCBtb3JlIGluY29uc3RhbnQgdGhhbiB0aGUgd2luZCwgd2hvIHdvb2VzCiAgICBFdmVuIG5vdyB0aGUgZnJvemVuIGJvc29tIG9mIHRoZSBub3J0aCwKICAgIEFuZCwgYmVpbmcgYW5nZXInZCwgcHVmZnMgYXdheSBmcm9tIHRoZW5jZSwKICAgIFR1cm5pbmcgaGlzIGZhY2UgdG8gdGhlIGRldy1kcm9wcGluZyBzb3V0aC4KCkJFTlZPTElPCgogICAgVGhpcyB3aW5kLCB5b3UgdGFsayBvZiwgYmxvd3MgdXMgZnJvbSBvdXJzZWx2ZXM7CiAgICBTdXBwZXIgaXMgZG9uZSwgYW5kIHdlIHNoYWxsIGNvbWUgdG9vIGxhdGUuCgpST01FTwoKICAgIEkgZmVhciwgdG9vIGVhcmx5OiBmb3IgbXkgbWluZCBtaXNnaXZlcwogICAgU29tZSBjb25zZXF1ZW5jZSB5ZXQgaGFuZ2luZyBpbiB0aGUgc3RhcnMKICAgIFNoYWxsIGJpdHRlcmx5IGJlZ2luIGhpcyBmZWFyZnVsIGRhdGUKICAgIFdpdGggdGhpcyBuaWdodCdzIHJldmVscyBhbmQgZXhwaXJlIHRoZSB0ZXJtCiAgICBPZiBhIGRlc3Bpc2VkIGxpZmUgY2xvc2VkIGluIG15IGJyZWFzdAogICAgQnkgc29tZSB2aWxlIGZvcmZlaXQgb2YgdW50aW1lbHkgZGVhdGguCiAgICBCdXQgSGUsIHRoYXQgaGF0aCB0aGUgc3RlZXJhZ2Ugb2YgbXkgY291cnNlLAogICAgRGlyZWN0IG15IHNhaWwhIE9uLCBsdXN0eSBnZW50bGVtZW4uCgpCRU5WT0xJTwoKICAgIFN0cmlrZSwgZHJ1bS4KCiAgICBFeGV1bnQKClNDRU5FIFYuIEEgaGFsbCBpbiBDYXB1bGV0J3MgaG91c2UuCgogICAgTXVzaWNpYW5zIHdhaXRpbmcuIEVudGVyIFNlcnZpbmdtZW4gd2l0aCBuYXBraW5zIAoKRmlyc3QgU2VydmFudAoKICAgIFdoZXJlJ3MgUG90cGFuLCB0aGF0IGhlIGhlbHBzIG5vdCB0byB0YWtlIGF3YXkIEhlCiAgICBzaGlmdCBhIHRyZW5jaGVyPyBoZSBzY3JhcGUgYSB0cmVuY2hlciEKClNlY29uZCBTZXJ2YW50CgogICAgV2hlbiBnb29kIG1hbm5lcnMgc2hhbGwgbGllIGFsbCBpbiBvbmUgb3IgdHdvIG1lbidzCiAgICBoYW5kcyBhbmQgdGhleSB1bndhc2hlZCB0b28sICd0aXMgYSBmb3VsIHRoaW5nLgoKRmlyc3QgU2VydmFudAoKICAgIEF3YXkgd2l0aCB0aGUgam9pbnQtc3Rvb2xzLCByZW1vdmUgdGhlCiAgICBjb3VydC1jdXBib2FyZCwgbG9vayB0byB0aGUgcGxhdGUuIEdvb2QgdGhvdSwgc2F2ZQogICAgbWUgYSBwaWVjZSBvZiBtYXJjaHBhbmU7IGFuZCwgYXMgdGhvdSBsb3Zlc3QgbWUsIGxldAogICAgdGhlIHBvcnRlciBsZXQgaW4gU3VzYW4gR3JpbmRzdG9uZSBhbmQgTmVsbC4KICAgIEFudG9ueSwgYW5kIFBvdHBhbiEKClNlY29uZCBTZXJ2YW50CgogICAgQXksIGJveSwgcmVhZHkuCgpGaXJzdCBTZXJ2YW50CgogICAgWW91IGFyZSBsb29rZWQgZm9yIGFuZCBjYWxsZWQgZm9yLCBhc2tlZCBmb3IgYW5kCiAgICBzb3VnaHQgZm9yLCBpbiB0aGUgZ3JlYXQgY2hhbWJlci4KClNlY29uZCBTZXJ2YW50CgogICAgV2UgY2Fubm90IGJlIGhlcmUgYW5kIHRoZXJlIHRvby4gQ2hlZXJseSwgYm95czsgYmUKICAgIGJyaXNrIGF3aGlsZSwgYW5kIHRoZSBsb25nZXIgbGl2ZXIgdGFrZSBhbGwuCgogICAgRW50ZXIgQ0FQVUxFVCwgd2l0aCBKVUxJRVQgYW5kIG90aGVycyBvZiBoaXMgaG91c2UsIG1lZXRpbmcgdGhlIEd1ZXN0cyBhbmQgTWFza2VycwoKQ0FQVUxFVAoKICAgIFdlbGNvbWUsIGdlbnRsZW1lbiEgbGFkaWVzIHRoYXQgaGF2ZSB0aGVpciB0b2VzCiAgICBVbnBsYWd1ZWQgd2l0aCBjb3JucyB3aWxsIGhhdmUgYSBib3V0IHdpdGggeW91LgogICAgQWggaGEsIG15IG1pc3RyZXNzZXMhIHdoaWNoIG9mIHlvdSBhbGwKICAgIFdpbGwgbm93IGRlbnkgdG8gZGFuY2UIHNoZSB0aGF0IG1ha2VzIGRhaW50eSwKICAgIFNoZSwgSSdsbCBzd2VhciwgaGF0aCBjb3JuczsgYW0gSSBjb21lIG5lYXIgeWUgbm93PwogICAgV2VsY29tZSwgZ2VudGxlbWVuISBJIGhhdmUgc2VlbiB0aGUgZGF5CiAgICBUaGF0IEkgaGF2ZSB3b3JuIGEgdmlzb3IgYW5kIGNvdWxkIHRlbGwKICAgIEEgd2hpc3BlcmluZyB0YWxlIGluIGEgZmFpciBsYWR5J3MgZWFyLAogICAgU3VjaCBhcyB3b3VsZCBwbGVhc2U6ICd0aXMgZ29uZSwgJ3RpcyBnb25lLCAndGlzIGdvbmU6CiAgICBZb3UgYXJlIHdlbGNvbWUsIGdlbnRsZW1lbiEgY29tZSwgbXVzaWNpYW5zLCBwbGF5LgogICAgQSBoYWxsLCBhIGhhbGwhIGdpdmUgcm9vbSEgYW5kIGZvb3QgaXQsIGdpcmxzLgoKICAgIE11c2ljIHBsYXlzLCBhbmQgdGhleSBkYW5jZQogICAgTW9yZSBsaWdodCwgeW91IGtuYXZlczsgYW5kIHR1cm4gdGhlIHRhYmxlcyB1cCwKICAgIEFuZCBxdWVuY2ggdGhlIGZpcmUsIHRoZSByb29tIGlzIGdyb3duIHRvbyBob3QuCiAgICBBaCwgc2lycmFoLCB0aGlzIHVubG9vaydkLWZvciBzcG9ydCBjb21lcyB3ZWxsLgogICAgTmF5LCBzaXQsIG5heSwgc2l0LCBnb29kIGNvdXNpbiBDYXB1bGV0OwogICAgRm9yIHlvdSBhbmQgSSBhcmUgcGFzdCBvdXIgZGFuY2luZyBkYXlzOgogICAgSG93IGxvbmcgaXMndCBub3cgc2luY2UgbGFzdCB5b3Vyc2VsZiBhbmQgSQogICAgV2VyZSBpbiBhIG1hc2sCgpTZWNvbmQgQ2FwdWxldAoKICAgIEJ5J3IgbGFkeSwgdGhpcnR5IHllYXJzLgoKQ0FQVUxFVAoKICAgIFdoYXQsIG1hbiEgJ3RpcyBub3Qgc28gbXVjaCwgJ3RpcyBub3Qgc28gbXVjaDoKICAgICdUaXMgc2luY2UgdGhlIG51cHRpYWxzIG9mIEx1Y2VudGlvLAogICAgQ29tZSBwZW50ZWNvc3QgYXMgcXVpY2tseSBhcyBpdCB3aWxsLAogICAgU29tZSBmaXZlIGFuZCB0d2VudHkgeWVhcnM7IGFuZCB0aGVuIHdlIG1hc2snZC4KClNlY29uZCBDYXB1bGV0CgogICAgJ1RpcyBtb3JlLCAndGlzIG1vcmUsIGhpcyBzb24gaXMgZWxkZXIsIHNpcjsKICAgIEhpcyBzb24gaXMgdGhpcnR5LgoKQ0FQVUxFVAoKICAgIFdpbGwgeW91IHRlbGwgbWUgdGhhdD8KICAgIEhpcyBzb24gd2FzIGJ1dCBhIHdhcmQgdHdvIHllYXJzIGFnby4KClJPTUVPCgogICAgW1RvIGEgU2VydmluZ21hbl0gV2hhdCBsYWR5IGlzIHRoYXQsIHdoaWNoIGRvdGgKICAgIGVucmljaCB0aGUgaGFuZAogICAgT2YgeW9uZGVyIGtuaWdodD8KClNlcnZhbnQKCiAgICBJIGtub3cgbm90LCBzaXIuCgpST01FTwoKICAgIE8sIHNoZSBkb3RoIHRlYWNoIHRoZSB0b3JjaGVzIHRvIGJ1cm4gYnJpZ2h0IQogICAgSXQgc2VlbXMgc2hlIGhhbmdzIHVwb24gdGhlIGNoZWVrIG9mIG5pZ2h0CiAgICBMaWtlIGEgcmljaCBqZXdlbCBpbiBhbiBFdGhpb3BlJ3MgZWFyOwogICAgQmVhdXR5IHRvbyByaWNoIGZvciB1c2UsIGZvciBlYXJ0aCB0b28gZGVhciEKICAgIFNvIHNob3dzIGEgc25vd3kgZG92ZSB0cm9vcGluZyB3aXRoIGNyb3dzLAogICAgQXMgeW9uZGVyIGxhZHkgbydlciBoZXIgZmVsbG93cyBzaG93cy4KICAgIFRoZSBtZWFzdXJlIGRvbmUsIEknbGwgd2F0Y2ggaGVyIHBsYWNlIG9mIHN0YW5kLAogICAgQW5kLCB0b3VjaGluZyBoZXJzLCBtYWtlIGJsZXNzZWQgbXkgcnVkZSBoYW5kLgogICAgRGlkIG15IGhlYXJ0IGxvdmUgdGlsbCBub3cIGZvcnN3ZWFyIGl0LCBzaWdodCEKICAgIEZvciBJIG5lJ2VyIHNhdyB0cnVlIGJlYXV0eSB0aWxsIHRoaXMgbmlnaHQuCgpUWUJBTFQKCiAgICBUaGlzLCBieSBoaXMgdm9pY2UsIHNob3VsZCBiZSBhIE1vbnRhZ3VlLgogICAgRmV0Y2ggbWUgbXkgcmFwaWVyLCBib3kuIFdoYXQgZGFyZXMgdGhlIHNsYXZlCiAgICBDb21lIGhpdGhlciwgY292ZXInZCB3aXRoIGFuIGFudGljIGZhY2UsCiAgICBUbyBmbGVlciBhbmQgc2Nvcm4gYXQgb3VyIHNvbGVtbml0eT8KICAgIE5vdywgYnkgdGhlIHN0b2NrIGFuZCBob25vdXIgb2YgbXkga2luLAogICAgVG8gc3RyaWtlIGhpbSBkZWFkLCBJIGhvbGQgaXQgbm90IGEgc2luLgoKQ0FQVUxFVAoKICAgIFdoeSwgaG93IG5vdywga2luc21hbiEgd2hlcmVmb3JlIHN0b3JtIHlvdSBzbz8KClRZQkFMVAoKICAgIFVuY2xlLCB0aGlzIGlzIGEgTW9udGFndWUsIG91ciBmb2UsCiAgICBBIHZpbGxhaW4gdGhhdCBpcyBoaXRoZXIgY29tZSBpbiBzcGl0ZSwKICAgIFRvIHNjb3JuIGF0IG91ciBzb2xlbW5pdHkgdGhpcyBuaWdodC4KCkNBUFVMRVQKCiAgICBZb3VuZyBSb21lbyBpcyBpdD8KClRZQkFMVAoKICAgICdUaXMgaGUsIHRoYXQgdmlsbGFpbiBSb21lby4KCkNBUFVMRVQKCiAgICBDb250ZW50IHRoZWUsIGdlbnRsZSBjb3osIGxldCBoaW0gYWxvbmU7CiAgICBIZSBiZWFycyBoaW0gbGlrZSBhIHBvcnRseSBnZW50bGVtYW47CiAgICBBbmQsIHRvIHNheSB0cnV0aCwgVmVyb25hIGJyYWdzIG9mIGhpbQogICAgVG8gYmUgYSB2aXJ0dW91cyBhbmQgd2VsbC1nb3Zlcm4nZCB5b3V0aDoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd2VhbHRoIG9mIGFsbCB0aGUgdG93bgogICAgSGVyZSBpbiBteSBob3VzZSBkbyBoaW0gZGlzcGFyYWdlbWVudDoKICAgIFRoZXJlZm9yZSBiZSBwYXRpZW50LCB0YWtlIG5vIG5vdGUgb2YgaGltOgogICAgSXQgaXMgbXkgd2lsbCwgdGhlIHdoaWNoIGlmIHRob3UgcmVzcGVjdCwKICAgIFNob3cgYSBmYWlyIHByZXNlbmNlIGFuZCBwdXQgb2ZmIHRoZXNlIGZyb3ducywKICAgIEFuZCBpbGwtYmVzZWVtaW5nIHNlbWJsYW5jZSBmb3IgYSBmZWFzdC4KClRZQkFMVAoKICAgIEl0IGZpdHMsIHdoZW4gc3VjaCBhIHZpbGxhaW4gaXMgYSBndWVzdDoKICAgIEknbGwgbm90IGVuZHVyZSBoaW0uCgpDQVBVTEVUCgogICAgSGUgc2hhbGwgYmUgZW5kdXJlZDoKICAgIFdoYXQsIGdvb2RtYW4gYm95ISBJIHNheSwgaGUgc2hhbGw6IGdvIHRvOwogICAgQW0gSSB0aGUgbWFzdGVyIGhlcmUsIG9yIHlvdT8gZ28gdG8uCiAgICBZb3UnbGwgbm90IGVuZHVyZSBoaW0hIEdvZCBzaGFsbCBtZW5kIG15IHNvdWwhCiAgICBZb3UnbGwgbWFrZSBhIG11dGlueSBhbW9uZyBteSBndWVzdHMhCiAgICBZb3Ugd2lsbCBzZXQgY29jay1hLWhvb3AhIHlvdSdsbCBiZSB0aGUgbWFuIQoKVFlCQUxUCgogICAgV2h5LCB1bmNsZSwgJ3RpcyBhIHNoYW1lLgoKQ0FQVUxFVAoKICAgIEdvIHRvLCBnbyB0bzsKICAgIFlvdSBhcmUgYSBzYXVjeSBib3k6IGlzJ3Qgc28sIGluZGVlZD8KICAgIFRoaXMgdHJpY2sgbWF5IGNoYW5jZSB0byBzY2F0aGUgeW91LCBJIGtub3cgd2hhdDoKICAgIFlvdSBtdXN0IGNvbnRyYXJ5IG1lISBtYXJyeSwgJ3RpcyB0aW1lLgogICAgV2VsbCBzYWlkLCBteSBoZWFydHMhIFlvdSBhcmUgYSBwcmluY294OyBnbzoKICAgIEJlIHF1aWV0LCBvci0tTW9yZSBsaWdodCwgbW9yZSBsaWdodCEgRm9yIHNoYW1lIQogICAgSSdsbCBtYWtlIHlvdSBxdWlldC4gV2hhdCwgY2hlZXJseSwgbXkgaGVhcnRzIQoKVFlCQUxUCgogICAgUGF0aWVuY2UgcGVyZm9yY2Ugd2l0aCB3aWxmdWwgY2hvbGVyIG1lZXRpbmcKICAgIE1ha2VzIG15IGZsZXNoIHRyZW1ibGUgaW4gdGhlaXIgZGlmZmVyZW50IGdyZWV0aW5nLgogICAgSSB3aWxsIHdpdGhkcmF3OiBidXQgdGhpcyBpbnRydXNpb24gc2hhbGwKICAgIE5vdyBzZWVtaW5nIHN3ZWV0IGNvbnZlcnQgdG8gYml0dGVyIGdhbGwuCgogICAgRXhpdAoKUk9NRU8KCiAgICBbVG8gSlVMSUVUXSBJZiBJIHByb2ZhbmUgd2l0aCBteSB1bndvcnRoaWVzdCBoYW5kCiAgICBUaGlzIGhvbHkgc2hyaW5lLCB0aGUgZ2VudGxlIGZpbmUgaXMgdGhpczoKICAgIE15IGxpcHMsIHR3byBibHVzaGluZyBwaWxncmltcywgcmVhZHkgc3RhbmQKICAgIFRvIHNtb290aCB0aGF0IHJvdWdoIHRvdWNoIHdpdGggYSB0ZW5kZXIga2lzcy4KCkpVTElFVAoKICAgIEdvb2QgcGlsZ3JpbSwgeW91IGRvIHdyb25nIHlvdXIgaGFuZCB0b28gbXVjaCwKICAgIFdoaWNoIG1hbm5lcmx5IGRldm90aW9uIHNob3dzIGluIHRoaXM7CiAgICBGb3Igc2FpbnRzIGhhdmUgaGFuZHMgdGhhdCBwaWxncmltcycgaGFuZHMgZG8gdG91Y2gsCiAgICBBbmQgcGF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lIGJlIG1hcnJpZWQuCiAgICBNeSBncmF2ZSBpcyBsaWtlIHRvIGJlIG15IHdlZGRpbmcgYmVkLgoKTnVyc2UKCiAgICBIaXMgbmFtZSBpcyBSb21lbywgYW5kIGEgTW9udGFndWU7CiAgICBUaGUgb25seSBzb24gb2YgeW91ciBncmVhdCBlbmVteS4KCkpVTElFVAoKICAgIE15IG9ubHkgbG92ZSBzcHJ1bmcgZnJvbSBteSBvbmx5IGhhdGUhCiAgICBUb28gZWFybHkgc2VlbiB1bmtub3duLCBhbmQga25vd24gdG9vIGxhdGUhCiAgICBQcm9kaWdpb3VzIGJpcnRoIG9mIGxvdmUgaXQgaXMgdG8gbWUsCiAgICBUaGF0IEkgbXVzdCBsb3ZlIGEgbG9hdGhlZCBlbmVteS4KCk51cnNlCgogICAgV2hhdCdzIHRoaXMIHdoYXQncyB0aGlzPwoKSlVMSUVUCgogICAgQSByaHltZSBJIGxlYXJuJ2QgZXZlbiBub3cKICAgIE9mIG9uZSBJIGRhbmNlZCB3aXRoYWwuCgogICAgT25lIGNhbGxzIHdpdGhpbiAnSnVsaWV0LicKCk51cnNlCgogICAgQW5vbiwgYW5vbiEKICAgIENvbWUsIGxldCdzIGF3YXk7IHRoZSBzdHJhbmdlcnMgYWxsIGFyZSBnb25lLgoKICAgIEV4ZXVudAoKQUNUIElJClBST0xPR1VFCgogICAgRW50ZXIgQ2hvcnVzIAoKQ2hvcnVzCgogICAgTm93IG9sZCBkZXNpcmUgZG90aCBpbiBoaXMgZGVhdGgtYmVkIGxpZSwKICAgIEFuZCB5b3VuZyBhZmZlY3Rpb24gZ2FwZXMgdG8gYmUgaGlzIGhlaXI7CiAgICBUaGF0IGZhaXIgZm9yIHdoaWNoIGxvdmUgZ3JvYW4nZCBmb3IgYW5kIHdvdWxkIGRpZSwKICAgIFdpdGggdGVuZGVyIEp1bGlldCBtYXRjaCdkLCBpcyBub3cgbm90IGZhaXIuCiAgICBOb3cgUm9tZW8gaXMgYmVsb3ZlZCBhbmQgbG92ZXMgYWdhaW4sCiAgICBBbGlrZSBiZXR3aXRjaGVkIGJ5IHRoZSBjaGFybSBvZiBsb29rcywKICAgIEJ1dCB0byBoaXMgZm9lIHN1cHBvc2VkIGhlIG11c3QgY29tcGxhaW4sCiAgICBBbmQgc2hlIHN0ZWFsIGxvdmUncyBzd2VldCBiYWl0IGZyb20gZmVhcmZ1bCBob29rczoKICAgIEJlaW5nIGhlbGQgYSBmb2UsIGhlIG1heSBub3QgaGF2ZSBhY2Nlc3MKICAgIFRvIGJyZWF0aGUgc3VjaCB2b3dzIGFzIGxvdmVycyB1c2UgdG8gc3dlYXI7CiAgICBBbmQgc2hlIGFzIG11Y2ggaW4gbG92ZSwgaGVyIG1lYW5zIG11Y2ggbGVzcwogICAgVG8gbWVldCBoZXIgbmV3LWJlbG92ZWQgYW55IHdoZXJlOgogICAgQnV0IHBhc3Npb24gbGVuZHMgdGhlbSBwb3dlciwgdGltZSBtZWFucywgdG8gbWVldAogICAgVGVtcGVyaW5nIGV4dHJlbWl0aWVzIHdpdGggZXh0cmVtZSBzd2VldC4KCiAgICBFeGl0CgpTQ0VORSBJLiBBIGxhbmUgYnkgdGhlIHdhbGwgb2YgQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gCgpST01FTwoKICAgIENhbiBJIGdvIGZvcndhcmQgd2hlbiBteSBoZWFydCBpcyBoZXJlPwogICAgVHVybiBiYWNrLCBkdWxsIGVhcnRoLCBhbmQgZmluZCB0aHkgY2VudHJlIG91dC4KCiAgICBIZSBjbGltYnMgdGhlIHdhbGwsIGFuZCBsZWFwcyBkb3duIHdpdGhpbiBpdAoKICAgIEVudGVyIEJFTlZPTElPIGFuZCBNRVJDVVRJTwoKQkVOVk9MSU8KCiAgICBSb21lbyEgbXkgY291c2luIFJvbWVvIQoKTUVSQ1VUSU8KCiAgICBIZSBpcyB3aXNlOwogICAgQW5kLCBvbiBteSBsaWUsIGhhdGggc3RvbCduIGhpbSBob21lIHRvIGJlZC4KCkJFTlZPTElPCgogICAgSGUgcmFuIHRoaXMgd2F5LCBhbmQgbGVhcCdkIHRoaXMgb3JjaGFyZCB3YWxsOgogICAgQ2FsbCwgZ29vZCBNZXJjdXRpby4KCk1FUkNVVElPCgogICAgTmF5LCBJJ2xsIGNvbmp1cmUgdG9vLgogICAgUm9tZW8hIGh1bW91cnMhIG1hZG1hbiEgcGFzc2lvbiEgbG92ZXIhCiAgICBBcHBlYXIgdGhvdSBpbiB0aGUgbGlrZW5lc3Mgb2YgYSBzaWdoOgogICAgU3BlYWsgYnV0IG9uZSByaHltZSwgYW5kIEkgYW0gc2F0aXNmaWVkOwogICAgQ3J5IGJ1dCAnQXkgbWUhJyBwcm9ub3VuY2UgYnV0ICdsb3ZlJyBhbmQgJ2RvdmU7JwogICAgU3BlYWsgdG8gbXkgZ29zc2lwIFZlbnVzIG9uZSBmYWlyIHdvcmQsCiAgICBPbmUgbmljay1uYW1lIGZvciBoZXIgcHVyYmxpbmQgc29uIGFuZCBoZWlyLAogICAgWW91bmcgQWRhbSBDdXBpZCwgaGUgdGhhdCBzaG90IHNvIHRyaW0sCiAgICBXaGVuIEtpbmcgQ29waGV0dWEgbG92ZWQgdGhlIGJlZ2dhci1tYWlkIQogICAgSGUgaGVhcmV0aCBub3QsIGhlIHN0aXJyZXRoIG5vdCwgaGUgbW92ZXRoIG5vdDsKICAgIFRoZSBhcGUgaXMgZGVhZCwgYW5kIEkgbXVzdCBjb25qdXJlIGhpbS4KICAgIEkgY29uanVyZSB0aGVlIGJ5IFJvc2FsaW5lJ3MgYnJpZ2h0IGV5ZXMsCiAgICBCeSBoZXIgaGlnaCBmb3JlaGVhZCBhbmQgaGVyIHNjYXJsZXQgbGlwLAogICAgQnkgaGVyIGZpbmUgZm9vdCwgc3RyYWlnaHQgbGVnIGFuZCBxdWl2ZXJpbmcgdGhpZ2gKICAgIEFuZCB0aGUgZGVtZXNuZXMgdGhhdCB0aGVyZSBhZGphY2VudCBsaWUsCiAgICBUaGF0IGluIHRoeSBsaWtlbmVzcyB0aG91IGFwcGVhciB0byB1cyEKCkJFTlZPTElPCgogICAgQW5kIGlmIGhlIGhlYXIgdGhlZSwgdGhvdSB3aWx0IGFuZ2VyIGhpbS4KCk1FUkNVVElPCgogICAgVGhpcyBjYW5ub3QgYW5nZXIgaGltOiAndHdvdWxkIGFuZ2VyIGhpbQogICAgVG8gcmFpc2UgYSBzcGlyaXQgaW4gaGlzIG1pc3RyZXNzJyBjaXJjbGUKICAgIE9mIHNvbWUgc3RyYW5nZSBuYXR1cmUsIGxldHRpbmcgaXQgdGhlcmUgc3RhbmQKICAgIFRpbGwgc2hlIGhhZCBsYWlkIGl0IGFuZCBjb25qdXJlZCBpdCBkb3duOwogICAgVGhhdCB3ZXJlIHNvbWUgc3BpdGU6IG15IGludm9jYXRpb24KICAgIElzIGZhaXIgYW5kIGhvbmVzdCwgYW5kIGluIGhpcyBtaXN0cmVzIHMnIG5hbWUKICAgIEkgY29uanVyZSBvbmx5IGJ1dCB0byByYWlzZSB1cCBoaW0uCgpCRU5WT0xJTwoKICAgIENvbWUsIGhlIGhhdGggaGlkIGhpbXNlbGYgYW1vbmcgdGhlc2UgdHJlZXMsCiAgICBUbyBiZSBjb25zb3J0ZWQgd2l0aCB0aGUgaHVtb3JvdXMgbmlnaHQ6CiAgICBCbGluZCBpcyBoaXMgbG92ZSBhbmQgYmVzdCBiZWZpdHMgdGhlIGRhcmsuCgpNRVJDVVRJTwoKICAgIElmIGxvdmUgYmUgYmxpbmQsIGxvdmUgY2Fubm90IGhpdCB0aGUgbWFyay4KICAgIE5vdyB3aWxsIGhlIHNpdCB1bmRlciBhIG1lZGxhciB0cmVlLAogICAgQW5kIHdpc2ggaGlzIG1pc3RyZXNzIHdlcmUgdGhhdCBraW5kIG9mIGZydWl0CiAgICBBcyBtYWlkcyBjYWxsIG1lZGxhcnMsIHdoZW4gdGhleSBsYXVnaCBhbG9uZS4KICAgIFJvbWVvLCB0aGF0IHNoZSB3ZXJlLCBPLCB0aGF0IHNoZSB3ZXJlCiAgICBBbiBvcGVuIGV0IGNhZXRlcmEsIHRob3UgYSBwb3BlcmluIHBlYXIhCiAgICBSb21lbywgZ29vZCBuaWdodDogSSdsbCB0byBteSB0cnVja2xlLWJlZDsKICAgIFRoaXMgZmllbGQtYmVkIGlzIHRvbyBjb2xkIGZvciBtZSB0byBzbGVlcDoKICAgIENvbWUsIHNoYWxsIHdlIGdvPwoKQkVOVk9MSU8KCiAgICBHbywgdGhlbjsgZm9yICd0aXMgaW4gdmFpbgogICAgVG8gc2VlayBoaW0gaGVyZSB0aGF0IG1lYW5zIG5vdCB0byBiZSBmb3VuZC4KCiAgICBFeGV1bnQKClNDRU5FIElJLiBDYXB1bGV0J3Mgb3JjaGFyZC4KCiAgICBFbnRlciBST01FTyAKClJPTUVPCgogICAgSGUgamVzdHMgYXQgc2NhcnMgdGhhdCBuZXZlciBmZWx0IGEgd291bmQuCgogICAgSlVMSUVUIGFwcGVhcnMgYWJvdmUgYXQgYSB3aW5kb3cKICAgIEJ1dCwgc29mdCEgd2hhdCBsaWdodCB0aHJvdWdoIHlvbmRlciB3aW5kb3cgYnJlYWtzPwogICAgSXQgaXMgdGhlIGVhc3QsIGFuZCBKdWxpZXQgaXMgdGhlIHN1bi4KICAgIEFyaXNlLCBmYWlyIHN1biwgYW5kIGtpbGwgdGhlIGVudmlvdXMgbW9vbiwKICAgIFdobyBpcyBhbHJlYWR5IHNpY2sgYW5kIHBhbGUgd2l0aCBncmllZiwKICAgIFRoYXQgdGhvdSBoZXIgbWFpZCBhcnQgZmFyIG1vcmUgZmFpciB0aGFuIHNoZToKICAgIEJlIG5vdCBoZXIgbWFpZCwgc2luY2Ugc2hlIGlzIGVudmlvdXM7CiAgICBIZXIgdmVzdGFsIGxpdmVyeSBpcyBidXQgc2ljayBhbmQgZ3JlZW4KICAgIEFuZCBub25lIGJ1dCBmb29scyBkbyB3ZWFyIGl0OyBjYXN0IGl0IG9mZi4KICAgIEl0IGlzIG15IGxhZHksIE8sIGl0IGlzIG15IGxvdmUhCiAgICBPLCB0aGF0IHNoZSBrbmV3IHNoZSB3ZXJlIQogICAgU2hlIHNwZWFrcyB5ZXQgc2hlIHNheXMgbm90aGluZzogd2hhdCBvZiB0aGF0PwogICAgSGVyIGV5ZSBkaXNjb3Vyc2VzOyBJIHdpbGwgYW5zd2VyIGl0LgogICAgSSBhbSB0b28gYm9sZCwgJ3RpcyBub3QgdG8gbWUgc2hlIHNwZWFrczoKICAgIFR3byBvZiB0aGUgZmFpcmVzdCBzdGFycyBpbiBhbGwgdGhlIGhlYXZlbiwKICAgIEhhdmluZyBzb21lIGJ1c2luZXNzLCBkbyBlbnRyZWF0IGhlciBleWVzCiAgICBUbyB0d2lua2xlIGluIHRoZWlyIHNwaGVyZXMgdGlsbCB0aGV5IHJldHVybi4KICAgIFdoYXQgaWYgaGVyIGV5ZXMgd2VyZSB0aGVyZSwgdGhleSBpbiBoZXIgaGVhZD8KICAgIFRoZSBicmlnaHRuZXNzIG9mIGhlciBjaGVlayB3b3VsZCBzaGFtZSB0aG9zZSBzdGFycywKICAgIEFzIGRheWxpZ2h0IGRvdGggYSBsYW1wOyBoZXIgZXllcyBpbiBoZWF2ZW4KICAgIFdvdWxkIHRocm91Z2ggdGhlIGFpcnkgcmVnaW9uIHN0cmVhbSBzbyBicmlnaHQKICAgIFRoYXQgYmlyZHMgd291bGQgc2luZyBhbmQgdGhpbmsgaXQgd2VyZSBub3QgbmlnaHQuCiAgICBTZWUsIGhvdyBzaGUgbGVhbnMgaGVyIGNoZWVrIHVwb24gaGVyIGhhbmQhCiAgICBPLCB0aGF0IEkgd2VyZSBhIGdsb3ZlIHVwb24gdGhhdCBoYW5kLAogICAgVGhhdCBJIG1pZ2h0IHRvdWNoIHRoYXQgY2hlZWshCgpKVUxJRVQKCiAgICBBeSBtZSEKClJPTUVPCgogICAgU2hlIHNwZWFrczoKICAgIE8sIHNwZWFrIGFnYWluLCBicmlnaHQgYW5nZWwhIGZvciB0aG91IGFydAogICAgQXMgZ2xvcmlvdXMgdG8gdGhpcyBuaWdodCwgYmVpbmcgbydlciBteSBoZWFkCiAgICBBcyBpcyBhIHdpbmdlZCBtZXNzZW5nZXIgb2YgaGVhdmVuCiAgICBVbnRvIHRoZSB3aGl0ZS11cHR1cm5lZCB3b25kZXJpbmcgZXllcwogICAgT2YgbW9ydGFscyB0aGF0IGZhbGwgYmFjayB0byBnYXplIG9uIGhpbQogICAgV2hlbiBoZSBiZXN0cmlkZXMgdGhlIGxhenktcGFjaW5nIGNsb3VkcwogICAgQW5kIHNhaWxzIHVwb24gdGhlIGJvc29tIG9mIHRoZSBhaXIuCgpKVUxJRVQKCiAgICBPIFJvbWVvLCBSb21lbyEgd2hlcmVmb3JlIGFydCB0aG91IFJvbWVvPwogICAgRGVueSB0aHkgZmF0aGVyIGFuZCByZWZ1c2UgdGh5IG5hbWU7CiAgICBPciwgaWYgdGhvdSB3aWx0IG5vdCwgYmUgYnV0IHN3b3JuIG15IGxvdmUsCiAgICBBbmQgSSdsbCBubyBsb25nZXIgYmUgYSBDYXB1bGV0LgoKUk9NRU8KCiAgICBbQXNpZGVdIFNoYWxsIEkgaGVhciBtb3JlLCBvciBzaGFsbCBJIHNwZWFrIGF0IHRoaXMCgpKVUxJRVQKCiAgICAnVGlzIGJ1dCB0aHkgbmFtZSB0aGF0IGlzIG15IGVuZW15OwogICAgVGhvdSBhcnQgdGh5c2VsZiwgdGhvdWdoIG5vdCBhIE1vbnRhZ3VlLgogICAgV2hhdCdzIE1vbnRhZ3VlPyBpdCBpcyBub3IgaGFuZCwgbm9yIGZvb3QsCiAgICBOb3IgYXJtLCBub3IgZmFjZSwgbm9yIGFueSBvdGhlciBwYXJ0CiAgICBCZWxvbmdpbmcgdG8gYSBtYW4uIE8sIGJlIHNvbWUgb3RoZXIgbmFtZSEKICAgIFdoYXQncyBpbiBhIG5hbWUIHRoYXQgd2hpY2ggd2UgY2FsbCBhIHJvc2UKICAgIEJ5IGFueSBvdGhlciBuYW1lIHdvdWxkIHNtZWxsIGFzIHN3ZWV0OwogICAgU28gUm9tZW8gd291bGQsIHdlcmUgaGUgbm90IFJvbWVvIGNhbGwnZCwKICAgIFJldGFpbiB0aGF0IGRlYXIgcGVyZmVjdGlvbiB3aGljaCBoZSBvd2VzCiAgICBXaXRob3V0IHRoYXQgdGl0bGUuIFJvbWVvLCBkb2ZmIHRoeSBuYW1lLAogICAgQW5kIGZvciB0aGF0IG5hbWUgd2hpY2ggaXMgbm8gcGFydCBvZiB0aGVlCiAgICBUYWtlIGFsbCBteXNlbGYuCgpST01FTwoKICAgIEkgdGFrZSB0aGVlIGF0IHRoeSB3b3JkOgogICAgQ2FsbCBtZSBidXQgbG92ZSwgYW5kIEknbGwgYmUgbmV3IGJhcHRpemVkOwogICAgSGVuY2Vmb3J0aCBJIG5ldmVyIHdpbGwgYmUgUm9tZW8uCgpKVUxJRVQKCiAgICBXaGF0IG1hbiBhcnQgdGhvdSB0aGF0IHRodXMgYmVzY3JlZW4nZCBpbiBuaWdodAogICAgU28gc3R1bWJsZXN0IG9uIG15IGNvdW5zZWwCgpST01FTwoKICAgIEJ5IGEgbmFtZQogICAgSSBrbm93IG5vdCBob3cgdG8gdGVsbCB0aGVlIHdobyBJIGFtOgogICAgTXkgbmFtZSwgZGVhciBzYWludCwgaXMgaGF0ZWZ1bCB0byBteXNlbGYsCiAgICBCZWNhdXNlIGl0IGlzIGFuIGVuZW15IHRvIHRoZWU7CiAgICBIYWQgSSBpdCB3cml0dGVuLCBJIHdvdWxkIHRlYXIgdGhlIHdvcmQuCgpKVUxJRVQKCiAgICBNeSBlYXJzIGhhdmUgbm90IHlldCBkcnVuayBhIGh1bmRyZWQgd29yZHMKICAgIE9mIHRoYXQgdG9uZ3VlJ3MgdXR0ZXJhbmNlLCB5ZXQgSSBrbm93IHRoZSBzb3VuZDoKICAgIEFydCB0aG91IG5vdCBSb21lbyBhbmQgYSBNb250YWd1ZT8KClJPTUVPCgogICAgTmVpdGhlciwgZmFpciBzYWludCwgaWYgZWl0aGVyIHRoZWUgZGlzbGlrZS4KCkpVTElFVAoKICAgIEhvdyBjYW1lc3QgdGhvdSBoaXRoZXIsIHRlbGwgbWUsIGFuZCB3aGVyZWZvcmUCiAgICBUaGUgb3JjaGFyZCB3YWxscyBhcmUgaGlnaCBhbmQgaGFyZCB0byBjbGltYiwKICAgIEFuZCB0aGUgcGxhY2UgZGVhdGgsIGNvbnNpZGVyaW5nIHdobyB0aG91IGFydCwKICAgIElmIGFueSBvZiBteSBraW5zbWVuIGZpbmQgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBXaXRoIGxvdmUncyBsaWdodCB3aW5ncyBkaWQgSSBvJ2VyLXBlcmNoIHRoZXNlIHdhbGxzOwogICAgRm9yIHN0b255IGxpbWl0cyBjYW5ub3QgaG9sZCBsb3ZlIG91dCwKICAgIEFuZCB3aGF0IGxvdmUgY2FuIGRvIHRoYXQgZGFyZXMgbG92ZSBhdHRlbXB0OwogICAgVGhlcmVmb3JlIHRoeSBraW5zbWVuIGFyZSBubyBsZXQgdG8gbWUuCgpKVUxJRVQKCiAgICBJZiB0aGV5IGRvIHNlZSB0aGVlLCB0aGV5IHdpbGwgbXVyZGVyIHRoZWUuCgpST01FTwoKICAgIEFsYWNrLCB0aGVyZSBsaWVzIG1vcmUgcGVyaWwgaW4gdGhpbmUgZXllCiAgICBUaGFuIHR3ZW50eSBvZiB0aGVpciBzd29yZHM6IGxvb2sgdGhvdSBidXQgc3dlZXQsCiAgICBBbmQgSSBhbSBwcm9vZiBhZ2FpbnN0IHRoZWlyIGVubWl0eS4KCkpVTElFVAoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd29ybGQgdGhleSBzYXcgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBJIGhhdmUgbmlnaHQncyBjbG9hayB0byBoaWRlIG1lIGZyb20gdGhlaXIgc2lnaHQ7CiAgICBBbmQgYnV0IHRob3UgbG92ZSBtZSwgbGV0IHRoZW0gZmluZCBtZSBoZXJlOgogICAgTXkgbGlmZSB3ZXJlIGJldHRlciBlbmRlZCBieSB0aGVpciBoYXRlLAogICAgVGhhbiBkZWF0aCBwcm9yb2d1ZWQsIHdhbnRpbmcgb2YgdGh5IGxvdmUuCgpKVUxJRVQKCiAgICBCeSB3aG9zZSBkaXJlY3Rpb24gZm91bmQnc3QgdGhvdSBvdXQgdGhpcyBwbGFjZT8KClJPTUVPCgogICAgQnkgbG92ZSwgd2hvIGZpcnN0IGRpZCBwcm9tcHQgbWUgdG8gaW5xdWlyZTsKICAgIEhlIGxlbnQgbWUgY291bnNlbCBhbmQgSSBsZW50IGhpbSBleWVzLgogICAgSSBhbSBubyBwaWxvdDsgeWV0LCB3ZXJ0IHRob3UgYXMgZmFyCiAgICBBcyB0aGF0IHZhc3Qgc2hvcmUgd2FzaCdkIHdpdGggdGhlIGZhcnRoZXN0IHNlYSwKICAgIEkgd291bGQgYWR2ZW50dXJlIGZvciBzdWNoIG1lcmNoYW5kaXNlLgoKSlVMSUVUCgogICAgVGhvdSBrbm93J3N0IHRoZSBtYXNrIG9mIG5pZ2h0IGlzIG9uIG15IGZhY2UsCiAgICBFbHNlIHdvdWxkIGEgbWFpZGVuIGJsdXNoIGJlcGFpbnQgbXkgY2hlZWsKICAgIEZvciB0aGF0IHdoaWNoIHRob3UgaGFzdCBoZWFyZCBtZSBzcGVhayB0by1uaWdodAogICAgRmFpbiB3b3VsZCBJIGR3ZWxsIG9uIGZvcm0sIGZhaW4sIGZhaW4gZGVueQogICAgV2hhdCBJIGhhdmUgc3Bva2U6IGJ1dCBmYXJld2VsbCBjb21wbGltZW50IQogICAgRG9zdCB0aG91IGxvdmUgbWUIEkga25vdyB0aG91IHdpbHQgc2F5ICdBeSwnCiAgICBBbmQgSSB3aWxsIHRha2UgdGh5IHdvcmQ6IHlldCBpZiB0aG91IHN3ZWFyJ3N0LAogICAgVGhvdSBtYXlzdCBwcm92ZSBmYWxzZTsgYXQgbG92ZXJzJyBwZXJqdXJpZXMKICAgIFRoZW4gc2F5LCBKb3ZlIGxhdWdocy4gTyBnZW50bGUgUm9tZW8sCiAgICBJZiB0aG91IGRvc3QgbG92ZSwgcHJvbm91bmNlIGl0IGZhaXRoZnVsbHk6CiAgICBPciBpZiB0aG91IHRoaW5rJ3N0IEkgYW0gdG9vIHF1aWNrbHkgd29uLAogICAgSSdsbCBmcm93biBhbmQgYmUgcGVydmVyc2UgYW4gc2F5IHRoZWUgbmF5LAogICAgU28gdGhvdSB3aWx0IHdvbzsgYnV0IGVsc2UsIG5vdCBmb3IgdGhlIHdvcmxkLgogICAgSW4gdHJ1dGgsIGZhaXIgTW9udGFndWUsIEkgYW0gdG9vIGZvbmQsCiAgICBBbmQgdGhlcmVmb3JlIHRob3UgbWF5c3QgdGhpbmsgbXkgJ2hhdmlvciBsaWdodDoKICAgIEJ1dCB0cnVzdCBtZSwgZ2VudGxlbWFuLCBJJ2xsIHByb3ZlIG1vcmUgdHJ1ZQogICAgVGhhbiB0aG9zZSB0aGF0IGhhdmUgbW9yZSBjdW5uaW5nIHRvIGJlIHN0cmFuZ2UuCiAgICBJIHNob3VsZCBoYXZlIGJlZW4gbW9yZSBzdHJhbmdlLCBJIG11c3QgY29uZmVzcywKICAgIEJ1dCB0aGF0IHRob3Ugb3ZlcmhlYXJkJ3N0LCBlcmUgSSB3YXMgd2FyZSwKICAgIE15IHRydWUgbG92ZSdzIHBhc3Npb246IHRoZXJlZm9yZSBwYXJkb24gbWUsCiAgICBBbmQgbm90IGltcHV0ZSB0aGlzIHlpZWxkaW5nIHRvIGxpZ2h0IGxvdmUsCiAgICBXaGljaCB0aGUgZGFyayBuaWdodCBoYXRoIHNvIGRpc2NvdmVyZWQuCgpST01FTwoKICAgIExhZHksIGJ5IHlvbmRlciBibGVzc2VkIG1vb24gSSBzd2VhcgogICAgVGhhdCB0aXBzIHdpdGggc2lsdmVyIGFsbCB0aGVzZSBmcnVpdC10cmVlIHRvcHMtLQoKSlVMSUVUCgogICAgTywgc3dlYXIgbm90IGJ5IHRoZSBtb29uLCB0aGUgaW5jb25zdGFudCBtb29uLAogICAgVGhhdCBtb250aGx5IGNoYW5nZXMgaW4gaGVyIGNpcmNsZWQgb3JiLAogICAgTGVzdCB0aGF0IHRoeSBsb3ZlIHByb3ZlIGxpa2V3aXNlIHZhcmlhYmxlLgoKUk9NRU8KCiAgICBXaGF0IHNoYWxsIEkgc3dlYXIgYnkCgpKVUxJRVQKCiAgICBEbyBub3Qgc3dlYXIgYXQgYWxsOwogICAgT3IsIGlmIHRob3Ugd2lsdCwgc3dlYXIgYnkgdGh5IGdyYWNpb3VzIHNlbGYsCiAgICBXaGljaCBpcyB0aGUgZ29kIG9mIG15IGlkb2xhdHJ5LAogICAgQW5kIEknbGwgYmVsaWV2ZSB0aGVlLgoKUk9NRU8KCiAgICBJZiBteSBoZWFydCdzIGRlYXIgbG92ZS0tCgpKVUxJRVQKCiAgICBXZWxsLCBkbyBub3Qgc3dlYXI6IGFsdGhvdWdoIEkgam95IGluIHRoZWUsCiAgICBJIGhhdmUgbm8gam95IG9mIHRoaXMgY29udHJhY3QgdG8tbmlnaHQ6CiAgICBJdCBpcyB0b28gcmFzaCwgdG9vIHVuYWR2aXNlZCwgdG9vIHN1ZGRlbjsKICAgIFRvbyBsaWtlIHRoZSBsaWdodG5pbmcsIHdoaWNoIGRvdGggY2Vhc2UgdG8gYmUKICAgIEVyZSBvbmUgY2FuIHNheSAnSXQgbGlnaHRlbnMuJyBTd2VldCwgZ29vZCBuaWdodCEKICAgIFRoaXMgYnVkIG9mIGxvdmUsIGJ5IHN1bW1lcidzIHJpcGVuaW5nIGJyZWF0aCwKICAgIE1heSBwcm92ZSBhIGJlYXV0ZW91cyBmbG93ZXIgd2hlbiBuZXh0IHdlIG1lZXQuCiAgICBHb29kIG5pZ2h0LCBnb29kIG5pZ2h0ISBhcyBzd2VldCByZXBvc2UgYW5kIHJlc3QKICAgIENvbWUgdG8gdGh5IGhlYXJ0IGFzIHRoYXQgd2l0aGluIG15IGJyZWFzdCEKClJPTUVPCgogICAgTywgd2lsdCB0aG91IGxlYXZlIG1lIHNvIHVuc2F0aXNmaWVkPwoKSlVMSUVUCgogICAgV2hhdCBzYXRpc2ZhY3Rpb24gY2Fuc3QgdGhvdSBoYXZlIHRvLW5pZ2h0PwoKUk9NRU8KCiAgICBUaGUgZXhjaGFuZ2Ugb2YgdGh5IGxvdmUncyBmYWl0aGZ1bCB2b3cgZm9yIG1pbmUuCgpKVUxJRVQKCiAgICBJIGdhdmUgdGhlZSBtaW5lIGJlZm9yZSB0aG91IGRpZHN0IHJlcXVlc3QgaXQ6CiAgICBBbmQgeWV0IEkgd291bGQgaXQgd2VyZSB0byBnaXZlIGFnYWluLgoKUk9NRU8KCiAgICBXb3VsZHN0IHRob3Ugd2l0aGRyYXcgaXQIGZvciB3aGF0IHB1cnBvc2UsIGxvdmUCgpKVUxJRVQKCiAgICBCdXQgdG8gYmUgZnJhbmssIGFuZCBnaXZlIGl0IHRoZWUgYWdhaW4uCiAgICBBbmQgeWV0IEkgd2lzaCBidXQgZm9yIHRoZSB0aGluZyBJIGhhdmU6CiAgICBNeSBib3VudHkgaXMgYXMgYm91bmRsZXNzIGFzIHRoZSBzZWEsCiAgICBNeSBsb3ZlIGFzIGRlZXA7IHRoZSBtb3JlIEkgZ2l2ZSB0byB0aGVlLAogICAgVGhlIG1vcmUgSSBoYXZlLCBmb3IgYm90aCBhcmUgaW5maW5pdGUuCgogICAgTnVyc2UgY2FsbHMgd2l0aGluCiAgICBJIGhlYXIgc29tZSBub2lzZSB3aXRoaW47IGRlYXIgbG92ZSwgYWRpZXUhCiAgICBBbm9uLCBnb29kIG51cnNlISBTd2VldCBNb250YWd1ZSwgYmUgdHJ1ZS4KICAgIFN0YXkgYnV0IGEgbGl0dGxlLCBJIHdpbGwgY29tZSBhZ2Fpbi4KCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBPIGJsZXNzZWQsIGJsZXNzZWQgbmlnaHQhIEkgYW0gYWZlYXJkLgogICAgQmVpbmcgaW4gbmlnaHQsIGFsbCB0aGlzIGlzIGJ1dCBhIGRyZWFtLAogICAgVG9vIGZsYXR0ZXJpbmctc3dlZXQgdG8gYmUgc3Vic3RhbnRpYWwuCgogICAgUmUtZW50ZXIgSlVMSUVULCBhYm92ZQoKSlVMSUVUCgogICAgVGhyZWUgd29yZHMsIGRlYXIgUm9tZW8sIGFuZCBnb29kIG5pZ2h0IGluZGVlZC4KICAgIElmIHRoYXQgdGh5IGJlbnQgb2YgbG92ZSBiZSBob25vdXJhYmxlLAogICAgVGh5IHB1cnBvc2UgbWFycmlhZ2UsIHNlbmQgbWUgd29yZCB0by1tb3Jyb3csCiAgICBCeSBvbmUgdGhhdCBJJ2xsIHByb2N1cmUgdG8gY29tZSB0byB0aGVlLAogICAgV2hlcmUgYW5kIHdoYXQgdGltZSB0aG91IHdpbHQgcGVyZm9ybSB0aGUgcml0ZTsKICAgIEFuZCBhbGwgbXkgZm9ydHVuZXMgYXQgdGh5IGZvb3QgSSdsbCBsYXkKICAgIEFuZCBmb2xsb3cgdGhlZSBteSBsb3JkIHRocm91Z2hvdXQgdGhlIHdvcmxkLgoKTnVyc2UKCiAgICBbV2l0aGluXSBNYWRhbSEKCkpVTElFVAoKICAgIEkgY29tZSwgYW5vbi4tLUJ1dCBpZiB0aG91IG1lYW4nc3Qgbm90IHdlbGwsCiAgICBJIGRvIGJlc2VlY2ggdGhlZS0tCgpOdXJzZQoKICAgIFtXaXRoaW5dIE1hZGFtIQoKSlVMSUVUCgogICAgQnkgYW5kIGJ5LCBJIGNvbWU6LS0KICAgIFRvIGNlYXNlIHRoeSBzdWl0LCBhbmQgbGVhdmUgbWUgdG8gbXkgZ3JpZWY6CiAgICBUby1tb3Jyb3cgd2lsbCBJIHNlbmQuCgpST01FTwoKICAgIFNvIHRocml2ZSBteSBzb3VsLS0KCkpVTElFVAoKICAgIEEgdGhvdXNhbmQgdGltZXMgZ29vZCBuaWdodCEKCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBBIHRob3VzYW5kIHRpbWVzIHRoZSB3b3JzZSwgdG8gd2FudCB0aHkgbGlnaHQuCiAgICBMb3ZlIGdvZXMgdG93YXJkIGxvdmUsIGFzIHNjaG9vbGJveXMgZnJvbQogICAgdGhlaXIgYm9va3MsCiAgICBCdXQgbG92ZSBmcm9tIGxvdmUsIHRvd2FyZCBzY2hvb2wgd2l0aCBoZWF2eSBsb29rcy4KCiAgICBSZXRpcmluZwoKICAgIFJlLWVudGVyIEpVTElFVCwgYWJvdmUKCkpVTElFVAoKICAgIEhpc3QhIFJvbWVvLCBoaXN0ISBPLCBmb3IgYSBmYWxjb25lcidzIHZvaWNlLAogICAgVG8gbHVyZSB0aGlzIHRhc3NlbC1nZW50bGUgYmFjayBhZ2FpbiEKICAgIEJvbmRhZ2UgaXMgaG9hcnNlLCBhbmQgbWF5IG5vdCBzcGVhayBhbG91ZDsKICAgIEVsc2Ugd291bGQgSSB0ZWFyIHRoZSBjYXZlIHdoZXJlIEVjaG8gbGllcywKICAgIEFuZCBtYWtlIGhlciBhaXJ5IHRvbmd1ZSBtb3JlIGhvYXJzZSB0aGFuIG1pbmUsCiAgICBXaXRoIHJlcGV0aXRpb24gb2YgbXkgUm9tZW8ncyBuYW1lLgoKUk9NRU8KCiAgICBJdCBpcyBteSBzb3VsIHRoYXQgY2FsbHMgdXBvbiBteSBuYW1lOgogICAgSG93IHNpbHZlci1zd2VldCBzb3VuZCBsb3ZlcnMnIHRvbmd1ZXMgYnkgbmlnaHQsCiAgICBMaWtlIHNvZnRlc3QgbXVzaWMgdG8gYXR0ZW5kaW5nIGVhcnMhCgpKVUxJRVQKCiAgICBSb21lbyEKClJPTUVPCgogICAgTXkgZGVhcj8KCkpVTElFVAoKICAgIEF0IHdoYXQgbydjbG9jayB0by1tb3Jyb3cKICAgIFNoYWxsIEkgc2VuZCB0byB0aGVlPwoKUk9NRU8KCiAgICBBdCB0aGUgaG91ciBvZiBuaW5lLgoKSlVMSUVUCgogICAgSSB3aWxsIG5vdCBmYWlsOiAndGlzIHR3ZW50eSB5ZWFycyB0aWxsIHRoZW4uCiAgICBJIGhhdmUgZm9yZ290IHdoeSBJIGRpZCBjYWxsIHRoZWUgYmFjay4KClJPTUVPCgogICAgTGV0IG1lIHN0YW5kIGhlcmUgdGlsbCB0aG91IHJlbWVtYmVyIGl0LgoKSlVMSUVUCgogICAgSSBzaGFsbCBmb3JnZXQsIHRvIGhhdmUgdGhlZSBzdGlsbCBzdGFuZCB0aGVyZSwKICAgIFJlbWVtYmVyaW5nIGhvdyBJIGxvdmUgdGh5IGNvbXBhbnkuCgpST01FTwoKICAgIEFuZCBJJ2xsIHN0aWxsIHN0YXksIHRvIGhhdmUgdGhlZSBzdGlsbCBmb3JnZXQsCiAgICBGb3JnZXR0aW5nIGFueSBvdGhlciBob21lIGJ1dCB0aGlzLgoKSlVMSUVUCgogICAgJ1RpcyBhbG1vc3QgbW9ybmluZzsgSSB3b3VsZCBoYXZlIHRoZWUgZ29uZToKICAgIEFuZCB5ZXQgbm8gZnVydGhlciB0aGFuIGEgd2FudG9uJ3MgYmlyZDsKICAgIFdobyBsZXRzIGl0IGhvcCBhIGxpdHRsZSBmcm9tIGhlciBoYW5kLAogICAgTGlrZSBhIHBvb3IgcHJpc29uZXIgaW4gaGlzIHR3aXN0ZWQgZ3l2ZXMsCiAgICBBbmQgd2l0aCBhIHNpbGsgdGhyZWFkIHBsdWNrcyBpdCBiYWNrIGFnYWluLAogICAgU28gbG92aW5nLWplYWxvdXMgb2YgaGlzIGxpYmVydHkuCgpST01FTwoKICAgIEkgd291bGQgSSB3ZXJlIHRoeSBiaXJkLgoKSlVMSUVUCgogICAgU3dlZXQsIHNvIHdvdWxkIEk6CiAgICBZZXQgSSBzaG91bGQga2lsbCB0aGVlIHdpdGggbXVjaCBjaGVyaXNoaW5nLgogICAgR29vZCBuaWdodCwgZ29vZCBuaWdodCEgcGFydGluZyBpcyBzdWNoCiAgICBzd2VldCBzb3Jyb3csCiAgICBUaGF0IEkgc2hhbGwgc2F5IGdvb2QgbmlnaHQgdGlsbCBpdCBiZSBtb3Jyb3cuCgogICAgRXhpdCBhYm92ZQoKUk9NRU8KCiAgICBTbGVlcCBkd2VsbCB1cG9uIHRoaW5lIGV5ZXMsIHBlYWNlIGluIHRoeSBicmVhc3QhCiAgICBXb3VsZCBJIHdlcmUgc2xlZXAgYW5kIHBlYWNlLCBzbyBzd2VldCB0byByZXN0IQogICAgSGVuY2Ugd2lsbCBJIHRvIG15IGdob3N0bHkgZmF0aGVyJ3MgY2VsbCwKICAgIEhpcyBoZWxwIHRvIGNyYXZlLCBhbmQgbXkgZGVhciBoYXAgdG8gdGVsbC4KCiAgICBFeGl0CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSwgd2l0aCBhIGJhc2tldCAKCkZSSUFSIExBVVJFTkNFCgogICAgVGhlIGdyZXktZXllZCBtb3JuIHNtaWxlcyBvbiB0aGUgZnJvd25pbmcgbmlnaHQsCiAgICBDaGVxdWVyaW5nIHRoZSBlYXN0ZXJuIGNsb3VkcyB3aXRoIHN0cmVha3Mgb2YgbGlnaHQsCiAgICBBbmQgZmxlY2tlZCBkYXJrbmVzcyBsaWtlIGEgZHJ1bmthcmQgcmVlbHMKICAgIEZyb20gZm9ydGggZGF5J3MgcGF0aCBhbmQgVGl0YW4ncyBmaWVyeSB3aGVlbHM6CiAgICBOb3csIGVyZSB0aGUgc3VuIGFkdmFuY2UgaGlzIGJ1cm5pbmcgZXllLAogICAgVGhlIGRheSB0byBjaGVlciBhbmQgbmlnaHQncyBkYW5rIGRldyB0byBkcnksCiAgICBJIG11c3QgdXAtZmlsbCB0aGlzIG9zaWVyIGNhZ2Ugb2Ygb3VycwogICAgV2l0aCBiYWxlZnVsIHdlZWRzIGFuZCBwcmVjaW91cy1qdWljZWQgZmxvd2Vycy4KICAgIFRoZSBlYXJ0aCB0aGF0J3MgbmF0dXJlJ3MgbW90aGVyIGlzIGhlciB0b21iOwogICAgV2hhdCBpcyBoZXIgYnVyeWluZyBncmF2ZSB0aGF0IGlzIGhlciB3b21iLAogICAgQW5kIGZyb20gaGVyIHdvbWIgY2hpbGRyZW4gb2YgZGl2ZXJzIGtpbmQKICAgIFdlIHN1Y2tpbmcgb24gaGVyIG5hdHVyYWwgYm9zb20gZmluZCwKICAgIE1hbnkgZm9yIG1hbnkgdmlydHVlcyBleGNlbGxlbnQsCiAgICBOb25lIGJ1dCBmb3Igc29tZSBhbmQgeWV0IGFsbCBkaWZmZXJlbnQuCiAgICBPLCBtaWNrbGUgaXMgdGhlIHBvd2VyZnVsIGdyYWNlIHRoYXQgbGllcwogICAgSW4gaGVyYnMsIHBsYW50cywgc3RvbmVzLCBhbmQgdGhlaXIgdHJ1ZSBxdWFsaXRpZXM6CiAgICBGb3Igbm91Z2h0IHNvIHZpbGUgdGhhdCBvbiB0aGUgZWFydGggZG90aCBsaXZlCiAgICBCdXQgdG8gdGhlIGVhcnRoIHNvbWUgc3BlY2lhbCBnb29kIGRvdGggZ2l2ZSwKICAgIE5vciBhdWdodCBzbyBnb29kIGJ1dCBzdHJhaW4nZCBmcm9tIHRoYXQgZmFpciB1c2UKICAgIFJldm9sdHMgZnJvbSB0cnVlIGJpcnRoLCBzdHVtYmxpbmcgb24gYWJ1c2U6CiAgICBWaXJ0dWUgaXRzZWxmIHR1cm5zIHZpY2UsIGJlaW5nIG1pc2FwcGxpZWQ7CiAgICBBbmQgdmljZSBzb21ldGltZXMgYnkgYWN0aW9uIGRpZ25pZmllZC4KICAgIFdpdGhpbiB0aGUgaW5mYW50IHJpbmQgb2YgdGhpcyBzbWFsbCBmbG93ZXIKICAgIFBvaXNvbiBoYXRoIHJlc2lkZW5jZSBhbmQgbWVkaWNpbmUgcG93ZXI6CiAgICBGb3IgdGhpcywgYmVpbmcgc21lbHQsIHdpdGggdGhhdCBwYXJ0IGNoZWVycyBlYWNoIHBhcnQ7CiAgICBCZWluZyB0YXN0ZWQsIHNsYXlzIGFsbCBzZW5zZXMgd2l0aCB0aGUgaGVhcnQuCiAgICBUd28gc3VjaCBvcHBvc2VkIGtpbmdzIGVuY2FtcCB0aGVtIHN0aWxsCiAgICBJbiBtYW4gYXMgd2VsbCBhcyBoZXJicywgZ3JhY2UgYW5kIHJ1ZGUgd2lsbDsKICAgIEFuZCB3aGVyZSB0aGUgd29yc2VyIGlzIHByZWRvbWluYW50LAogICAgRnVsbCBzb29uIHRoZSBjYW5rZXIgZGVhdGggZWF0cyB1cCB0aGF0IHBsYW50LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEdvb2QgbW9ycm93LCBmYXRoZXIuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlbmVkaWNpdGUhCiAgICBXaGF0IGVhcmx5IHRvbmd1ZSBzbyBzd2VldCBzYWx1dGV0aCBtZT8KICAgIFlvdW5nIHNvbiwgaXQgYXJndWVzIGEgZGlzdGVtcGVyJ2QgaGVhZAogICAgU28gc29vbiB0byBiaWQgZ29vZCBtb3Jyb3cgdG8gdGh5IGJlZDoKICAgIENhcmUga2VlcHMgaGlzIHdhdGNoIGluIGV2ZXJ5IG9sZCBtYW4ncyBleWUsCiAgICBBbmQgd2hlcmUgY2FyZSBsb2RnZXMsIHNsZWVwIHdpbGwgbmV2ZXIgbGllOwogICAgQnV0IHdoZXJlIHVuYnJ1aXNlZCB5b3V0aCB3aXRoIHVuc3R1ZmYnZCBicmFpbgogICAgRG90aCBjb3VjaCBoaXMgbGltYnMsIHRoZXJlIGdvbGRlbiBzbGVlcCBkb3RoIHJlaWduOgogICAgVGhlcmVmb3JlIHRoeSBlYXJsaW5lc3MgZG90aCBtZSBhc3N1cmUKICAgIFRob3UgYXJ0IHVwLXJvdXNlZCBieSBzb21lIGRpc3RlbXBlcmF0dXJlOwogICAgT3IgaWYgbm90IHNvLCB0aGVuIGhlcmUgSSBoaXQgaXQgcmlnaHQsCiAgICBPdXIgUm9tZW8gaGF0aCBub3QgYmVlbiBpbiBiZWQgdG8tbmlnaHQuCgpST01FTwoKICAgIFRoYXQgbGFzdCBpcyB0cnVlOyB0aGUgc3dlZXRlciByZXN0IHdhcyBtaW5lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHb2QgcGFyZG9uIHNpbiEgd2FzdCB0aG91IHdpdGggUm9zYWxpbmUCgpST01FTwoKICAgIFdpdGggUm9zYWxpbmUsIG15IGdob3N0bHkgZmF0aGVyPyBubzsKICAgIEkgaGF2ZSBmb3Jnb3QgdGhhdCBuYW1lLCBhbmQgdGhhdCBuYW1lJ3Mgd29lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGF0J3MgbXkgZ29vZCBzb246IGJ1dCB3aGVyZSBoYXN0IHRob3UgYmVlbiwgdGhlbj8KClJPTUVPCgogICAgSSdsbCB0ZWxsIHRoZWUsIGVyZSB0aG91IGFzayBpdCBtZSBhZ2Fpbi4KICAgIEkgaGF2ZSBiZWVuIGZlYXN0aW5nIHdpdGggbWluZSBlbmVteSwKICAgIFdoZXJlIG9uIGEgc3VkZGVuIG9uZSBoYXRoIHdvdW5kZWQgbWUsCiAgICBUaGF0J3MgYnkgbWUgd291bmRlZDogYm90aCBvdXIgcmVtZWRpZXMKICAgIFdpdGhpbiB0aHkgaGVscCBhbmQgaG9seSBwaHlzaWMgbGllczoKICAgIEkgYmVhciBubyBoYXRyZWQsIGJsZXNzZWQgbWFuLCBmb3IsIGxvLAogICAgTXkgaW50ZXJjZXNzaW9uIGxpa2V3aXNlIHN0ZWFkcyBteSBmb2UuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlIHBsYWluLCBnb29kIHNvbiwgYW5kIGhvbWVseSBpbiB0aHkgZHJpZnQ7CiAgICBSaWRkbGluZyBjb25mZXNzaW9uIGZpbmRzIGJ1dCByaWRkbGluZyBzaHJpZnQuCgpST01FTwoKICAgIFRoZW4gcGxhaW5seSBrbm93IG15IGhlYXJ0J3MgZGVhciBsb3ZlIGlzIHNldAogICAgT24gdGhlIGZhaXIgZGF1Z2h0ZXIgb2YgcmljaCBDYXB1bGV0OgogICAgQXMgbWluZSBvbiBoZXJzLCBzbyBoZXJzIGlzIHNldCBvbiBtaW5lOwogICAgQW5kIGFsbCBjb21iaW5lZCwgc2F2ZSB3aGF0IHRob3UgbXVzdCBjb21iaW5lCiAgICBCeSBob2x5IG1hcnJpYWdlOiB3aGVuIGFuZCB3aGVyZSBhbmQgaG93CiAgICBXZSBtZXQsIHdlIHdvbydkIGFuZCBtYWRlIGV4Y2hhbmdlIG9mIHZvdywKICAgIEknbGwgdGVsbCB0aGVlIGFzIHdlIHBhc3M7IGJ1dCB0aGlzIEkgcHJheSwKICAgIFRoYXQgdGhvdSBjb25zZW50IHRvIG1hcnJ5IHVzIHRvLWRheS4KCkZSSUFSIExBVVJFTkNFCgogICAgSG9seSBTYWludCBGcmFuY2lzLCB3aGF0IGEgY2hhbmdlIGlzIGhlcmUhCiAgICBJcyBSb3NhbGluZSwgd2hvbSB0aG91IGRpZHN0IGxvdmUgc28gZGVhciwKICAgIFNvIHNvb24gZm9yc2FrZW4IHlvdW5nIG1lbidzIGxvdmUgdGhlbiBsaWVzCiAgICBOb3QgdHJ1bHkgaW4gdGhlaXIgaGVhcnRzLCBidXQgaW4gdGhlaXIgZXllcy4KICAgIEplc3UgTWFyaWEsIHdoYXQgYSBkZWFsIG9mIGJyaW5lCiAgICBIYXRoIHdhc2gnZCB0aHkgc2FsbG93IGNoZWVrcyBmb3IgUm9zYWxpbmUhCiAgICBIb3cgbXVjaCBzYWx0IHdhdGVyIHRocm93biBhd2F5IGluIHdhc3RlLAogICAgVG8gc2Vhc29uIGxvdmUsIHRoYXQgb2YgaXQgZG90aCBub3QgdGFzdGUhCiAgICBUaGUgc3VuIG5vdCB5ZXQgdGh5IHNpZ2hzIGZyb20gaGVhdmVuIGNsZWFycywKICAgIFRoeSBvbGQgZ3JvYW5zIHJpbmcgeWV0IGluIG15IGFuY2llbnQgZWFyczsKICAgIExvLCBoZXJlIHVwb24gdGh5IGNoZWVrIHRoZSBzdGFpbiBkb3RoIHNpdAogICAgT2YgYW4gb2xkIHRlYXIgdGhhdCBpcyBub3Qgd2FzaCdkIG9mZiB5ZXQ6CiAgICBJZiBlJ2VyIHRob3Ugd2FzdCB0aHlzZWxmIGFuZCB0aGVzZSB3b2VzIHRoaW5lLAogICAgVGhvdSBhbmQgdGhlc2Ugd29lcyB3ZXJlIGFsbCBmb3IgUm9zYWxpbmU6CiAgICBBbmQgYXJ0IHRob3UgY2hhbmdlZD8gcHJvbm91bmNlIHRoaXMgc2VudGVuY2UgdGhlbiwKICAgIFdvbWVuIG1heSBmYWxsLCB3aGVuIHRoZXJlJ3Mgbm8gc3RyZW5ndGggaW4gbWVuLgoKUk9NRU8KCiAgICBUaG91IGNoaWQnc3QgbWUgb2Z0IGZvciBsb3ZpbmcgUm9zYWxpbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIEZvciBkb3RpbmcsIG5vdCBmb3IgbG92aW5nLCBwdXBpbCBtaW5lLgoKUk9NRU8KCiAgICBBbmQgYmFkJ3N0IG1lIGJ1cnkgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTm90IGluIGEgZ3JhdmUsCiAgICBUbyBsYXkgb25lIGluLCBhbm90aGVyIG91dCB0byBoYXZlLgoKUk9NRU8KCiAgICBJIHByYXkgdGhlZSwgY2hpZGUgbm90OyBzaGUgd2hvbSBJIGxvdmUgbm93CiAgICBEb3RoIGdyYWNlIGZvciBncmFjZSBhbmQgbG92ZSBmb3IgbG92ZSBhbGxvdzsKICAgIFRoZSBvdGhlciBkaWQgbm90IHNvLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBPLCBzaGUga25ldyB3ZWxsCiAgICBUaHkgbG92ZSBkaWQgcmVhZCBieSByb3RlIGFuZCBjb3VsZCBub3Qgc3BlbGwuCiAgICBCdXQgY29tZSwgeW91bmcgd2F2ZXJlciwgY29tZSwgZ28gd2l0aCBtZSwKICAgIEluIG9uZSByZXNwZWN0IEknbGwgdGh5IGFzc2lzdGFudCBiZTsKICAgIEZvciB0aGlzIGFsbGlhbmNlIG1heSBzbyBoYXBweSBwcm92ZSwKICAgIFRvIHR1cm4geW91ciBob3VzZWhvbGRzJyByYW5jb3VyIHRvIHB1cmUgbG92ZS4KClJPTUVPCgogICAgTywgbGV0IHVzIGhlbmNlOyBJIHN0YW5kIG9uIHN1ZGRlbiBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2lzZWx5IGFuZCBzbG93OyB0aGV5IHN0dW1ibGUgdGhhdCBydW4gZmFzdC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBCRU5WT0xJTyBhbmQgTUVSQ1VUSU8gCgpNRVJDVVRJTwoKICAgIFdoZXJlIHRoZSBkZXZpbCBzaG91bGQgdGhpcyBSb21lbyBiZT8KICAgIENhbWUgaGUgbm90IGhvbWUgdG8tbmlnaHQCgpCRU5WT0xJTwoKICAgIE5vdCB0byBoaXMgZmF0aGVyJ3M7IEkgc3Bva2Ugd2l0aCBoaXMgbWFuLgoKTUVSQ1VUSU8KCiAgICBBaCwgdGhhdCBzYW1lIHBhbGUgaGFyZC1oZWFydGVkIHdlbmNoLCB0aGF0IFJvc2FsaW5lLgogICAgVG9ybWVudHMgaGltIHNvLCB0aGF0IGhlIHdpbGwgc3VyZSBydW4gbWFkLgoKQkVOVk9MSU8KCiAgICBUeWJhbHQsIHRoZSBraW5zbWFuIG9mIG9sZCBDYXB1bGV0LAogICAgSGF0aCBzZW50IGEgbGV0dGVyIHRvIGhpcyBmYXRoZXIncyBob3VzZS4KCk1FUkNVVElPCgogICAgQSBjaGFsbGVuZ2UsIG9uIG15IGxpZmUuCgpCRU5WT0xJTwoKICAgIFJvbWVvIHdpbGwgYW5zd2VyIGl0LgoKTUVSQ1VUSU8KCiAgICBBbnkgbWFuIHRoYXQgY2FuIHdyaXRlIG1heSBhbnN3ZXIgYSBsZXR0ZXIuCgpCRU5WT0xJTwoKICAgIE5heSwgaGUgd2lsbCBhbnN3ZXIgdGhlIGxldHRlcidzIG1hc3RlciwgaG93IGhlCiAgICBkYXJlcywgYmVpbmcgZGFyZWQuCgpNRVJDVVRJTwoKICAgIEFsYXMgcG9vciBSb21lbyEgaGUgaXMgYWxyZWFkeSBkZWFkOyBzdGFiYmVkIHdpdGggYQogICAgd2hpdGUgd2VuY2gncyBibGFjayBleWU7IHNob3QgdGhyb3VnaCB0aGUgZWFyIHdpdGggYQogICAgbG92ZS1zb25nOyB0aGUgdmVyeSBwaW4gb2YgaGlzIGhlYXJ0IGNsZWZ0IHdpdGggdGhlCiAgICBibGluZCBib3ctYm95J3MgYnV0dC1zaGFmdDogYW5kIGlzIGhlIGEgbWFuIHRvCiAgICBlbmNvdW50ZXIgVHliYWx0PwoKQkVOVk9MSU8KCiAgICBXaHksIHdoYXQgaXMgVHliYWx0PwoKTUVSQ1VUSU8KCiAgICBNb3JlIHRoYW4gcHJpbmNlIG9mIGNhdHMsIEkgY2FuIHRlbGwgeW91LiBPLCBoZSBpcwogICAgdGhlIGNvdXJhZ2VvdXMgY2FwdGFpbiBvZiBjb21wbGltZW50cy4gSGUgZmlnaHRzIGFzCiAgICB5b3Ugc2luZyBwcmljay1zb25nLCBrZWVwcyB0aW1lLCBkaXN0YW5jZSwgYW5kCiAgICBwcm9wb3J0aW9uOyByZXN0cyBtZSBoaXMgbWluaW0gcmVzdCwgb25lLCB0d28sIGFuZAogICAgdGhlIHRoaXJkIGluIHlvdXIgYm9zb206IHRoZSB2ZXJ5IGJ1dGNoZXIgb2YgYSBzaWxrCiAgICBidXR0b24sIGEgZHVlbGxpc3QsIGEgZHVlbGxpc3Q7IGEgZ2VudGxlbWFuIG9mIHRoZQogICAgdmVyeSBmaXJzdCBob3VzZSwgb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2F1c2U6CiAgICBhaCwgdGhlIGltbW9ydGFsIHBhc3NhZG8hIHRoZSBwdW50byByZXZlcnNvISB0aGUKICAgIGhhaSEKCkJFTlZPTElPCgogICAgVGhlIHdoYXQCgpNRVJDVVRJTwoKICAgIFRoZSBwb3ggb2Ygc3VjaCBhbnRpYywgbGlzcGluZywgYWZmZWN0aW5nCiAgICBmYW50YXN0aWNvZXM7IHRoZXNlIG5ldyB0dW5lcnMgb2YgYWNjZW50cyEgJ0J5IEplc3UsCiAgICBhIHZlcnkgZ29vZCBibGFkZSEgYSB2ZXJ5IHRhbGwgbWFuISBhIHZlcnkgZ29vZAogICAgd2hvcmUhJyBXaHksIGlzIG5vdCB0aGlzIGEgbGFtZW50YWJsZSB0aGluZywKICAgIGdyYW5kc2lyZSwgdGhhdCB3ZSBzaG91bGQgYmUgdGh1cyBhZmZsaWN0ZWQgd2l0aAogICAgdGhlc2Ugc3RyYW5nZSBmbGllcywgdGhlc2UgZmFzaGlvbi1tb25nZXJzLCB0aGVzZQogICAgcGVyZG9uYS1taSdzLCB3aG8gc3RhbmQgc28gbXVjaCBvbiB0aGUgbmV3IGZvcm0sCiAgICB0aGF0IHRoZXkgY2Fubm90IGF0IGVhc2Ugb24gdGhlIG9sZCBiZW5jaD8gTywgdGhlaXIKICAgIGJvbmVzLCB0aGVpciBib25lcyEKCiAgICBFbnRlciBST01FTwoKQkVOVk9MSU8KCiAgICBIZXJlIGNvbWVzIFJvbWVvLCBoZXJlIGNvbWVzIFJvbWVvLgoKTUVSQ1VUSU8KCiAgICBXaXRob3V0IGhpcyByb2UsIGxpa2UgYSBkcmllZCBoZXJyaW5nOiBmbGVzaCwgZmxlc2gsCiAgICBob3cgYXJ0IHRob3UgZmlzaGlmaWVkISBOb3cgaXMgaGUgZm9yIHRoZSBudW1iZXJzCiAgICB0aGF0IFBldHJhcmNoIGZsb3dlZCBpbjogTGF1cmEgdG8gaGlzIGxhZHkgd2FzIGJ1dCBhCiAgICBraXRjaGVuLXdlbmNoOyBtYXJyeSwgc2hlIGhhZCBhIGJldHRlciBsb3ZlIHRvCiAgICBiZS1yaHltZSBoZXI7IERpZG8gYSBkb3dkeTsgQ2xlb3BhdHJhIGEgZ2lwc3k7CiAgICBIZWxlbiBhbmQgSGVybyBoaWxkaW5ncyBhbmQgaGFybG90czsgVGhpc2JlIGEgZ3JleQogICAgZXllIG9yIHNvLCBidXQgbm90IHRvIHRoZSBwdXJwb3NlLiBTaWduaW9yCiAgICBSb21lbywgYm9uIGpvdXIhIHRoZXJlJ3MgYSBGcmVuY2ggc2FsdXRhdGlvbgogICAgdG8geW91ciBGcmVuY2ggc2xvcC4gWW91IGdhdmUgdXMgdGhlIGNvdW50ZXJmZWl0CiAgICBmYWlybHkgbGFzdCBuaWdodC4KClJPTUVPCgogICAgR29vZCBtb3Jyb3cgdG8geW91IGJvdGguIFdoYXQgY291bnRlcmZlaXQgZGlkIEkgZ2l2ZSB5b3UCgpNRVJDVVRJTwoKICAgIFRoZSBzaGlwLCBzaXIsIHRoZSBzbGlwOyBjYW4geW91IG5vdCBjb25jZWl2ZT8KClJPTUVPCgogICAgUGFyZG9uLCBnb29kIE1lcmN1dGlvLCBteSBidXNpbmVzcyB3YXMgZ3JlYXQ7IGFuZCBpbgogICAgc3VjaCBhIGNhc2UgYXMgbWluZSBhIG1hbiBtYXkgc3RyYWluIGNvdXJ0ZXN5LgoKTUVSQ1VUSU8KCiAgICBUaGF0J3MgYXMgbXVjaCBhcyB0byBzYXksIHN1Y2ggYSBjYXNlIGFzIHlvdXJzCiAgICBjb25zdHJhaW5zIGEgbWFuIHRvIGJvdyBpbiB0aGUgaGFtcy4KClJPTUVPCgogICAgTWVhbmluZywgdG8gY291cnQnc3kuCgpNRVJDVVRJTwoKICAgIFRob3UgaGFzdCBtb3N0IGtpbmRseSBoaXQgaXQuCgpST01FTwoKICAgIEEgbW9zdCBjb3VydGVvdXMgZXhwb3NpdGlvbi4KCk1FUkNVVElPCgogICAgTmF5LCBJIGFtIHRoZSB2ZXJ5IHBpbmsgb2YgY291cnRlc3kuCgpST01FTwoKICAgIFBpbmsgZm9yIGZsb3dlci4KCk1FUkNVVElPCgogICAgUmlnaHQuCgpST01FTwoKICAgIFdoeSwgdGhlbiBpcyBteSBwdW1wIHdlbGwgZmxvd2VyZWQuCgpNRVJDVVRJTwoKICAgIFdlbGwgc2FpZDogZm9sbG93IG1lIHRoaXMgamVzdCBub3cgdGlsbCB0aG91IGhhc3QKICAgIHdvcm4gb3V0IHRoeSBwdW1wLCB0aGF0IHdoZW4gdGhlIHNpbmdsZSBzb2xlIG9mIGl0CiAgICBpcyB3b3JuLCB0aGUgamVzdCBtYXkgcmVtYWluIGFmdGVyIHRoZSB3ZWFyaW5nIHNvbGUgc2luZ3VsYXIuCgpST01FTwoKICAgIE8gc2luZ2xlLXNvbGVkIGplc3QsIHNvbGVseSBzaW5ndWxhciBmb3IgdGhlCiAgICBzaW5nbGVuZXNzLgoKTUVSQ1VUSU8KCiAgICBDb21lIGJldHdlZW4gdXMsIGdvb2QgQmVudm9saW87IG15IHdpdHMgZmFpbnQuCgpST01FTwoKICAgIFN3aXRjaCBhbmQgc3B1cnMsIHN3aXRjaCBhbmQgc3B1cnM7IG9yIEknbGwgY3J5IGEgbWF0Y2guCgpNRVJDVVRJTwoKICAgIE5heSwgaWYgdGh5IHdpdHMgcnVuIHRoZSB3aWxkLWdvb3NlIGNoYXNlLCBJIGhhdmUKICAgIGRvbmUsIGZvciB0aG91IGhhc3QgbW9yZSBvZiB0aGUgd2lsZC1nb29zZSBpbiBvbmUgb2YKICAgIHRoeSB3aXRzIHRoYW4sIEkgYW0gc3VyZSwgSSBoYXZlIGluIG15IHdob2xlIGZpdmU6CiAgICB3YXMgSSB3aXRoIHlvdSB0aGVyZSBmb3IgdGhlIGdvb3NlPwoKUk9NRU8KCiAgICBUaG91IHdhc3QgbmV2ZXIgd2l0aCBtZSBmb3IgYW55IHRoaW5nIHdoZW4gdGhvdSB3YXN0CiAgICBub3QgdGhlcmUgZm9yIHRoZSBnb29zZS4KCk1FUkNVVElPCgogICAgSSB3aWxsIGJpdGUgdGhlZSBieSB0aGUgZWFyIGZvciB0aGF0IGplc3QuCgpST01FTwoKICAgIE5heSwgZ29vZCBnb29zZSwgYml0ZSBub3QuCgpNRVJDVVRJTwoKICAgIFRoeSB3aXQgaXMgYSB2ZXJ5IGJpdHRlciBzd2VldGluZzsgaXQgaXMgYSBtb3N0CiAgICBzaGFycCBzYXVjZS4KClJPTUVPCgogICAgQW5kIGlzIGl0IG5vdCB3ZWxsIHNlcnZlZCBpbiB0byBhIHN3ZWV0IGdvb3NlPwoKTUVSQ1VUSU8KCiAgICBPIGhlcmUncyBhIHdpdCBvZiBjaGV2ZXJpbCwgdGhhdCBzdHJldGNoZXMgZnJvbSBhbgogICAgaW5jaCBuYXJyb3cgdG8gYW4gZWxsIGJyb2FkIQoKUk9NRU8KCiAgICBJIHN0cmV0Y2ggaXQgb3V0IGZvciB0aGF0IHdvcmQgJ2Jyb2FkOycgd2hpY2ggYWRkZWQKICAgIHRvIHRoZSBnb29zZSwgcHJvdmVzIHRoZWUgZmFyIGFuZCB3aWRlIGEgYnJvYWQgZ29vc2UuCgpNRVJDVVRJTwoKICAgIFdoeSwgaXMgbm90IHRoaXMgYmV0dGVyIG5vdyB0aGFuIGdyb2FuaW5nIGZvciBsb3ZlPwogICAgbm93IGFydCB0aG91IHNvY2lhYmxlLCBub3cgYXJ0IHRob3UgUm9tZW87IG5vdyBhcnQKICAgIHRob3Ugd2hhdCB0aG91IGFydCwgYnkgYXJ0IGFzIHdlbGwgYXMgYnkgbmF0dXJlOgogICAgZm9yIHRoaXMgZHJpdmVsbGluZyBsb3ZlIGlzIGxpa2UgYSBncmVhdCBuYXR1cmFsLAogICAgdGhhdCBydW5zIGxvbGxpbmcgdXAgYW5kIGRvd24gdG8gaGlkZSBoaXMgYmF1YmxlIGluIGEgaG9sZS4KCkJFTlZPTElPCgogICAgU3RvcCB0aGVyZSwgc3RvcCB0aGVyZS4KCk1FUkNVVElPCgogICAgVGhvdSBkZXNpcmVzdCBtZSB0byBzdG9wIGluIG15IHRhbGUgYWdhaW5zdCB0aGUgaGFpci4KCkJFTlZPTElPCgogICAgVGhvdSB3b3VsZHN0IGVsc2UgaGF2ZSBtYWRlIHRoeSB0YWxlIGxhcmdlLgoKTUVSQ1VUSU8KCiAgICBPLCB0aG91IGFydCBkZWNlaXZlZDsgSSB3b3VsZCBoYXZlIG1hZGUgaXQgc2hvcnQ6CiAgICBmb3IgSSB3YXMgY29tZSB0byB0aGUgd2hvbGUgZGVwdGggb2YgbXkgdGFsZTsgYW5kCiAgICBtZWFudCwgaW5kZWVkLCB0byBvY2N1cHkgdGhlIGFyZ3VtZW50IG5vIGxvbmdlci4KClJPTUVPCgogICAgSGVyZSdzIGdvb2RseSBnZWFyIQoKICAgIEVudGVyIE51cnNlIGFuZCBQRVRFUgoKTUVSQ1VUSU8KCiAgICBBIHNhaWwsIGEgc2FpbCEKCkJFTlZPTElPCgogICAgVHdvLCB0d287IGEgc2hpcnQgYW5kIGEgc21vY2suCgpOdXJzZQoKICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBNeSBmYW4sIFBldGVyLgoKTUVSQ1VUSU8KCiAgICBHb29kIFBldGVyLCB0byBoaWRlIGhlciBmYWNlOyBmb3IgaGVyIGZhbidzIHRoZQogICAgZmFpcmVyIGZhY2UuCgpOdXJzZQoKICAgIEdvZCB5ZSBnb29kIG1vcnJvdywgZ2VudGxlbWVuLgoKTUVSQ1VUSU8KCiAgICBHb2QgeWUgZ29vZCBkZW4sIGZhaXIgZ2VudGxld29tYW4uCgpOdXJzZQoKICAgIElzIGl0IGdvb2QgZGVuPwoKTUVSQ1VUSU8KCiAgICAnVGlzIG5vIGxlc3MsIEkgdGVsbCB5b3UsIGZvciB0aGUgYmF3ZHkgaGFuZCBvZiB0aGUKICAgIGRpYWwgaXMgbm93IHVwb24gdGhlIHByaWNrIG9mIG5vb24uCgpOdXJzZQoKICAgIE91dCB1cG9uIHlvdSEgd2hhdCBhIG1hbiBhcmUgeW91IQoKUk9NRU8KCiAgICBPbmUsIGdlbnRsZXdvbWFuLCB0aGF0IEdvZCBoYXRoIG1hZGUgZm9yIGhpbXNlbGYgdG8KICAgIG1hci4KCk51cnNlCgogICAgQnkgbXkgdHJvdGgsIGl0IGlzIHdlbGwgc2FpZDsgJ2ZvciBoaW1zZWxmIHRvIG1hciwnCiAgICBxdW90aCBhJz8gR2VudGxlbWVuLCBjYW4gYW55IG9mIHlvdSB0ZWxsIG1lIHdoZXJlIEkKICAgIG1heSBmaW5kIHRoZSB5b3VuZyBSb21lbz8KClJPTUVPCgogICAgSSBjYW4gdGVsbCB5b3U7IGJ1dCB5b3VuZyBSb21lbyB3aWxsIGJlIG9sZGVyIHdoZW4KICAgIHlvdSBoYXZlIGZvdW5kIGhpbSB0aGFuIGhlIHdhcyB3aGVuIHlvdSBzb3VnaHQgaGltOgogICAgSSBhbSB0aGUgeW91bmdlc3Qgb2YgdGhhdCBuYW1lLCBmb3IgZmF1bHQgb2YgYSB3b3JzZS4KCk51cnNlCgogICAgWW91IHNheSB3ZWxsLgoKTUVSQ1VUSU8KCiAgICBZZWEsIGlzIHRoZSB3b3JzdCB3ZWxsPyB2ZXJ5IHdlbGwgdG9vaywgaScgZmFpdGg7CiAgICB3aXNlbHksIHdpc2VseS4KCk51cnNlCgogICAgaWYgeW91IGJlIGhlLCBzaXIsIEkgZGVzaXJlIHNvbWUgY29uZmlkZW5jZSB3aXRoCiAgICB5b3UuCgpCRU5WT0xJTwoKICAgIFNoZSB3aWxsIGluZGl0ZSBoaW0gdG8gc29tZSBzdXBwZXIuCgpNRVJDVVRJTwoKICAgIEEgYmF3ZCwgYSBiYXdkLCBhIGJhd2QhIHNvIGhvIQoKUk9NRU8KCiAgICBXaGF0IGhhc3QgdGhvdSBmb3VuZD8KCk1FUkNVVElPCgogICAgTm8gaGFyZSwgc2lyOyB1bmxlc3MgYSBoYXJlLCBzaXIsIGluIGEgbGVudGVuIHBpZSwKICAgIHRoYXQgaXMgc29tZXRoaW5nIHN0YWxlIGFuZCBob2FyIGVyZSBpdCBiZSBzcGVudC4KCiAgICBTaW5ncwogICAgQW4gb2xkIGhhcmUgaG9hciwKICAgIEFuZCBhbiBvbGQgaGFyZSBob2FyLAogICAgSXMgdmVyeSBnb29kIG1lYXQgaW4gbGVudAogICAgQnV0IGEgaGFyZSB0aGF0IGlzIGhvYXIKICAgIElzIHRvbyBtdWNoIGZvciBhIHNjb3JlLAogICAgV2hlbiBpdCBob2FycyBlcmUgaXQgYmUgc3BlbnQuCiAgICBSb21lbywgd2lsbCB5b3UgY29tZSB0byB5b3VyIGZhdGhlcidzPyB3ZSdsbAogICAgdG8gZGlubmVyLCB0aGl0aGVyLgoKUk9NRU8KCiAgICBJIHdpbGwgZm9sbG93IHlvdS4KCk1FUkNVVElPCgogICAgRmFyZXdlbGwsIGFuY2llbnQgbGFkeTsgZmFyZXdlbGwsCgogICAgU2luZ2luZwogICAgJ2xhZHksIGxhZHksIGxhZHkuJwoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KCk51cnNlCgogICAgTWFycnksIGZhcmV3ZWxsISBJIHByYXkgeW91LCBzaXIsIHdoYXQgc2F1Y3kKICAgIG1lcmNoYW50IHdhcyB0aGlzLCB0aGF0IHdhcyBzbyBmdWxsIG9mIGhpcyByb3BlcnkCgpST01FTwoKICAgIEEgZ2VudGxlbWFuLCBudXJzZSwgdGhhdCBsb3ZlcyB0byBoZWFyIGhpbXNlbGYgdGFsaywKICAgIGFuZCB3aWxsIHNwZWFrIG1vcmUgaW4gYSBtaW51dGUgdGhhbiBoZSB3aWxsIHN0YW5kCiAgICB0byBpbiBhIG1vbnRoLgoKTnVyc2UKCiAgICBBbiBhJyBzcGVhayBhbnkgdGhpbmcgYWdhaW5zdCBtZSwgSSdsbCB0YWtlIGhpbQogICAgZG93biwgYW4gYScgd2VyZSBsdXN0aWVyIHRoYW4gaGUgaXMsIGFuZCB0d2VudHkgc3VjaAogICAgSmFja3M7IGFuZCBpZiBJIGNhbm5vdCwgSSdsbCBmaW5kIHRob3NlIHRoYXQgc2hhbGwuCiAgICBTY3Vydnkga25hdmUhIEkgYW0gbm9uZSBvZiBoaXMgZmxpcnQtZ2lsbHM7IEkgYW0KICAgIG5vbmUgb2YgaGlzIHNrYWlucy1tYXRlcy4gQW5kIHRob3UgbXVzdCBzdGFuZCBieQogICAgdG9vLCBhbmQgc3VmZmVyIGV2ZXJ5IGtuYXZlIHRvIHVzZSBtZSBhdCBoaXMgcGxlYXN1cmUCgpQRVRFUgoKICAgIEkgc2F3IG5vIG1hbiB1c2UgeW91IGEgcGxlYXN1cmU7IGlmIEkgaGFkLCBteSB3ZWFwb24KICAgIHNob3VsZCBxdWlja2x5IGhhdmUgYmVlbiBvdXQsIEkgd2FycmFudCB5b3U6IEkgZGFyZQogICAgZHJhdyBhcyBzb29uIGFzIGFub3RoZXIgbWFuLCBpZiBJIHNlZSBvY2Nhc2lvbiBpbiBhCiAgICBnb29kIHF1YXJyZWwsIGFuZCB0aGUgbGF3IG9uIG15IHNpZGUuCgpOdXJzZQoKICAgIE5vdywgYWZvcmUgR29kLCBJIGFtIHNvIHZleGVkLCB0aGF0IGV2ZXJ5IHBhcnQgYWJvdXQKICAgIG1lIHF1aXZlcnMuIFNjdXJ2eSBrbmF2ZSEgUHJheSB5b3UsIHNpciwgYSB3b3JkOgogICAgYW5kIGFzIEkgdG9sZCB5b3UsIG15IHlvdW5nIGxhZHkgYmFkZSBtZSBpbnF1aXJlIHlvdQogICAgb3V0OyB3aGF0IHNoZSBiYWRlIG1lIHNheSwgSSB3aWxsIGtlZXAgdG8gbXlzZWxmOgogICAgYnV0IGZpcnN0IGxldCBtZSB0ZWxsIHllLCBpZiB5ZSBzaG91bGQgbGVhZCBoZXIgaW50bwogICAgYSBmb29sJ3MgcGFyYWRpc2UsIGFzIHRoZXkgc2F5LCBpdCB3ZXJlIGEgdmVyeSBncm9zcwogICAga2luZCBvZiBiZWhhdmlvciwgYXMgdGhleSBzYXk6IGZvciB0aGUgZ2VudGxld29tYW4KICAgIGlzIHlvdW5nOyBhbmQsIHRoZXJlZm9yZSwgaWYgeW91IHNob3VsZCBkZWFsIGRvdWJsZQogICAgd2l0aCBoZXIsIHRydWx5IGl0IHdlcmUgYW4gaWxsIHRoaW5nIHRvIGJlIG9mZmVyZWQKICAgIHRvIGFueSBnZW50bGV3b21hbiwgYW5kIHZlcnkgd2VhayBkZWFsaW5nLgoKUk9NRU8KCiAgICBOdXJzZSwgY29tbWVuZCBtZSB0byB0aHkgbGFkeSBhbmQgbWlzdHJlc3MuIEkKICAgIHByb3Rlc3QgdW50byB0aGVlLS0KCk51cnNlCgogICAgR29vZCBoZWFydCwgYW5kLCBpJyBmYWl0aCwgSSB3aWxsIHRlbGwgaGVyIGFzIG11Y2g6CiAgICBMb3JkLCBMb3JkLCBzaGUgd2lsbCBiZSBhIGpveWZ1bCB3b21hbi4KClJPTUVPCgogICAgV2hhdCB3aWx0IHRob3UgdGVsbCBoZXIsIG51cnNlPyB0aG91IGRvc3Qgbm90IG1hcmsgbWUuCgpOdXJzZQoKICAgIEkgd2lsbCB0ZWxsIGhlciwgc2lyLCB0aGF0IHlvdSBkbyBwcm90ZXN0OyB3aGljaCwgYXMKICAgIEkgdGFrZSBpdCwgaXMgYSBnZW50bGVtYW5saWtlIG9mZmVyLgoKUk9NRU8KCiAgICBCaWQgaGVyIGRldmlzZQogICAgU29tZSBtZWFucyB0byBjb21lIHRvIHNocmlmdCB0aGlzIGFmdGVybm9vbjsKICAgIEFuZCB0aGVyZSBzaGUgc2hhbGwgYXQgRnJpYXIgTGF1cmVuY2UnIGNlbGwKICAgIEJlIHNocml2ZWQgYW5kIG1hcnJpZWQuIEhlcmUgaXMgZm9yIHRoeSBwYWlucy4KCk51cnNlCgogICAgTm8gdHJ1bHkgc2lyOyBub3QgYSBwZW5ueS4KClJPTUVPCgogICAgR28gdG87IEkgc2F5IHlvdSBzaGFsbC4KCk51cnNlCgogICAgVGhpcyBhZnRlcm5vb24sIHNpcj8gd2VsbCwgc2hlIHNoYWxsIGJlIHRoZXJlLgoKUk9NRU8KCiAgICBBbmQgc3RheSwgZ29vZCBudXJzZSwgYmVoaW5kIHRoZSBhYmJleSB3YWxsOgogICAgV2l0aGluIHRoaXMgaG91ciBteSBtYW4gc2hhbGwgYmUgd2l0aCB0aGVlCiAgICBBbmQgYnJpbmcgdGhlZSBjb3JkcyBtYWRlIGxpa2UgYSB0YWNrbGVkIHN0YWlyOwogICAgV2hpY2ggdG8gdGhlIGhpZ2ggdG9wLWdhbGxhbnQgb2YgbXkgam95CiAgICBNdXN0IGJlIG15IGNvbnZveSBpbiB0aGUgc2VjcmV0IG5pZ2h0LgogICAgRmFyZXdlbGw7IGJlIHRydXN0eSwgYW5kIEknbGwgcXVpdCB0aHkgcGFpbnM6CiAgICBGYXJld2VsbDsgY29tbWVuZCBtZSB0byB0aHkgbWlzdHJlc3MuCgpOdXJzZQoKICAgIE5vdyBHb2QgaW4gaGVhdmVuIGJsZXNzIHRoZWUhIEhhcmsgeW91LCBzaXIuCgpST01FTwoKICAgIFdoYXQgc2F5J3N0IHRob3UsIG15IGRlYXIgbnVyc2UCgpOdXJzZQoKICAgIElzIHlvdXIgbWFuIHNlY3JldD8gRGlkIHlvdSBuZSdlciBoZWFyIHNheSwKICAgIFR3byBtYXkga2VlcCBjb3Vuc2VsLCBwdXR0aW5nIG9uZSBhd2F5PwoKUk9NRU8KCiAgICBJIHdhcnJhbnQgdGhlZSwgbXkgbWFuJ3MgYXMgdHJ1ZSBhcyBzdGVlbC4KCk5VUlNFCgogICAgV2VsbCwgc2lyOyBteSBtaXN0cmVzcyBpcyB0aGUgc3dlZXRlc3QgbGFkeS0tTG9yZCwKICAgIExvcmQhIHdoZW4gJ3R3YXMgYSBsaXR0bGUgcHJhdGluZyB0aGluZzotLU8sIHRoZXJlCiAgICBpcyBhIG5vYmxlbWFuIGluIHRvd24sIG9uZSBQYXJpcywgdGhhdCB3b3VsZCBmYWluCiAgICBsYXkga25pZmUgYWJvYXJkOyBidXQgc2hlLCBnb29kIHNvdWwsIGhhZCBhcyBsaWVmCiAgICBzZWUgYSB0b2FkLCBhIHZlcnkgdG9hZCwgYXMgc2VlIGhpbS4gSSBhbmdlciBoZXIKICAgIHNvbWV0aW1lcyBhbmQgdGVsbCBoZXIgdGhhdCBQYXJpcyBpcyB0aGUgcHJvcGVyZXIKICAgIG1hbjsgYnV0LCBJJ2xsIHdhcnJhbnQgeW91LCB3aGVuIEkgc2F5IHNvLCBzaGUgbG9va3MKICAgIGFzIHBhbGUgYXMgYW55IGNsb3V0IGluIHRoZSB2ZXJzYWwgd29ybGQuIERvdGggbm90CiAgICByb3NlbWFyeSBhbmQgUm9tZW8gYmVnaW4gYm90aCB3aXRoIGEgbGV0dGVyPwoKUk9NRU8KCiAgICBBeSwgbnVyc2U7IHdoYXQgb2YgdGhhdD8gYm90aCB3aXRoIGFuIFIuCgpOdXJzZQoKICAgIEFoLiBtb2NrZXIhIHRoYXQncyB0aGUgZG9nJ3MgbmFtZTsgUiBpcyBmb3IKICAgIHRoZS0tTm87IEkga25vdyBpdCBiZWdpbnMgd2l0aCBzb21lIG90aGVyCiAgICBsZXR0ZXI6LS1hbmQgc2hlIGhhdGggdGhlIHByZXR0aWVzdCBzZW50ZW50aW91cyBvZgogICAgaXQsIG9mIHlvdSBhbmQgcm9zZW1hcnksIHRoYXQgaXQgd291bGQgZG8geW91IGdvb2QKICAgIHRvIGhlYXIgaXQuCgpST01FTwoKICAgIENvbW1lbmQgbWUgdG8gdGh5IGxhZHkuCgpOdXJzZQoKICAgIEF5LCBhIHRob3VzYW5kIHRpbWVzLgoKICAgIEV4aXQgUm9tZW8KICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBQZXRlciwgdGFrZSBteSBmYW4sIGFuZCBnbyBiZWZvcmUgYW5kIGFwYWNlLgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgSlVMSUVUIAoKSlVMSUVUCgogICAgVGhlIGNsb2NrIHN0cnVjayBuaW5lIHdoZW4gSSBkaWQgc2VuZCB0aGUgbnVyc2U7CiAgICBJbiBoYWxmIGFuIGhvdXIgc2hlIHByb21pc2VkIHRvIHJldHVybi4KICAgIFBlcmNoYW5jZSBzaGUgY2Fubm90IG1lZXQgaGltOiB0aGF0J3Mgbm90IHNvLgogICAgTywgc2hlIGlzIGxhbWUhIGxvdmUncyBoZXJhbGRzIHNob3VsZCBiZSB0aG91Z2h0cywKICAgIFdoaWNoIHRlbiB0aW1lcyBmYXN0ZXIgZ2xpZGUgdGhhbiB0aGUgc3VuJ3MgYmVhbXMsCiAgICBEcml2aW5nIGJhY2sgc2hhZG93cyBvdmVyIGxvdXJpbmcgaGlsbHM6CiAgICBUaGVyZWZvcmUgZG8gbmltYmxlLXBpbmlvbidkIGRvdmVzIGRyYXcgbG92ZSwKICAgIEFuZCB0aGVyZWZvcmUgaGF0aCB0aGUgd2luZC1zd2lmdCBDdXBpZCB3aW5ncy4KICAgIE5vdyBpcyB0aGUgc3VuIHVwb24gdGhlIGhpZ2htb3N0IGhpbGwKICAgIE9mIHRoaXMgZGF5J3Mgam91cm5leSwgYW5kIGZyb20gbmluZSB0aWxsIHR3ZWx2ZQogICAgSXMgdGhyZWUgbG9uZyBob3VycywgeWV0IHNoZSBpcyBub3QgY29tZS4KICAgIEhhZCBzaGUgYWZmZWN0aW9ucyBhbmQgd2FybSB5b3V0aGZ1bCBibG9vZCwKICAgIFNoZSB3b3VsZCBiZSBhcyBzd2lmdCBpbiBtb3Rpb24gYXMgYSBiYWxsOwogICAgTXkgd29yZHMgd291bGQgYmFuZHkgaGVyIHRvIG15IHN3ZWV0IGxvdmUsCiAgICBBbmQgaGlzIHRvIG1lOgogICAgQnV0IG9sZCBmb2xrcywgbWFueSBmZWlnbiBhcyB0aGV5IHdlcmUgZGVhZDsKICAgIFVud2llbGR5LCBzbG93LCBoZWF2eSBhbmQgcGFsZSBhcyBsZWFkLgogICAgTyBHb2QsIHNoZSBjb21lcyEKCiAgICBFbnRlciBOdXJzZSBhbmQgUEVURVIKICAgIE8gaG9uZXkgbnVyc2UsIHdoYXQgbmV3cz8KICAgIEhhc3QgdGhvdSBtZXQgd2l0aCBoaW0IFNlbmQgdGh5IG1hbiBhd2F5LgoKTnVyc2UKCiAgICBQZXRlciwgc3RheSBhdCB0aGUgZ2F0ZS4KCiAgICBFeGl0IFBFVEVSCgpKVUxJRVQKCiAgICBOb3csIGdvb2Qgc3dlZXQgbnVyc2UsLS1PIExvcmQsIHdoeSBsb29rJ3N0IHRob3Ugc2FkPwogICAgVGhvdWdoIG5ld3MgYmUgc2FkLCB5ZXQgdGVsbCB0aGVtIG1lcnJpbHk7CiAgICBJZiBnb29kLCB0aG91IHNoYW1lc3QgdGhlIG11c2ljIG9mIHN3ZWV0IG5ld3MKICAgIEJ5IHBsYXlpbmcgaXQgdG8gbWUgd2l0aCBzbyBzb3VyIGEgZmFjZS4KCk51cnNlCgogICAgSSBhbSBhLXdlYXJ5LCBnaXZlIG1lIGxlYXZlIGF3aGlsZToKICAgIEZpZSwgaG93IG15IGJvbmVzIGFjaGUhIHdoYXQgYSBqYXVudCBoYXZlIEkgaGFkIQoKSlVMSUVUCgogICAgSSB3b3VsZCB0aG91IGhhZHN0IG15IGJvbmVzLCBhbmQgSSB0aHkgbmV3czoKICAgIE5heSwgY29tZSwgSSBwcmF5IHRoZWUsIHNwZWFrOyBnb29kLCBnb29kIG51cnNlLCBzcGVhay4KCk51cnNlCgogICAgSmVzdSwgd2hhdCBoYXN0ZT8gY2FuIHlvdSBub3Qgc3RheSBhd2hpbGUCiAgICBEbyB5b3Ugbm90IHNlZSB0aGF0IEkgYW0gb3V0IG9mIGJyZWF0aD8KCkpVTElFVAoKICAgIEhvdyBhcnQgdGhvdSBvdXQgb2YgYnJlYXRoLCB3aGVuIHRob3UgaGFzdCBicmVhdGgKICAgIFRvIHNheSB0byBtZSB0aGF0IHRob3UgYXJ0IG91dCBvZiBicmVhdGgCiAgICBUaGUgZXhjdXNlIHRoYXQgdGhvdSBkb3N0IG1ha2UgaW4gdGhpcyBkZWxheQogICAgSXMgbG9uZ2VyIHRoYW4gdGhlIHRhbGUgdGhvdSBkb3N0IGV4Y3VzZS4KICAgIElzIHRoeSBuZXdzIGdvb2QsIG9yIGJhZD8gYW5zd2VyIHRvIHRoYXQ7CiAgICBTYXkgZWl0aGVyLCBhbmQgSSdsbCBzdGF5IHRoZSBjaXJjdW1zdGFuY2U6CiAgICBMZXQgbWUgYmUgc2F0aXNmaWVkLCBpcyd0IGdvb2Qgb3IgYmFkPwoKTnVyc2UKCiAgICBXZWxsLCB5b3UgaGF2ZSBtYWRlIGEgc2ltcGxlIGNob2ljZTsgeW91IGtub3cgbm90CiAgICBob3cgdG8gY2hvb3NlIGEgbWFuOiBSb21lbyEgbm8sIG5vdCBoZTsgdGhvdWdoIGhpcwogICAgZmFjZSBiZSBiZXR0ZXIgdGhhbiBhbnkgbWFuJ3MsIHlldCBoaXMgbGVnIGV4Y2VscwogICAgYWxsIG1lbidzOyBhbmQgZm9yIGEgaGFuZCwgYW5kIGEgZm9vdCwgYW5kIGEgYm9keSwKICAgIHRob3VnaCB0aGV5IGJlIG5vdCB0byBiZSB0YWxrZWQgb24sIHlldCB0aGV5IGFyZQogICAgcGFzdCBjb21wYXJlOiBoZSBpcyBub3QgdGhlIGZsb3dlciBvZiBjb3VydGVzeSwKICAgIGJ1dCwgSSdsbCB3YXJyYW50IGhpbSwgYXMgZ2VudGxlIGFzIGEgbGFtYi4gR28gdGh5CiAgICB3YXlzLCB3ZW5jaDsgc2VydmUgR29kLiBXaGF0LCBoYXZlIHlvdSBkaW5lZCBhdCBob21lPwoKSlVMSUVUCgogICAgTm8sIG5vOiBidXQgYWxsIHRoaXMgZGlkIEkga25vdyBiZWZvcmUuCiAgICBXaGF0IHNheXMgaGUgb2Ygb3VyIG1hcnJpYWdlPyB3aGF0IG9mIHRoYXQCgpOdXJzZQoKICAgIExvcmQsIGhvdyBteSBoZWFkIGFjaGVzISB3aGF0IGEgaGVhZCBoYXZlIEkhCiAgICBJdCBiZWF0cyBhcyBpdCB3b3VsZCBmYWxsIGluIHR3ZW50eSBwaWVjZXMuCiAgICBNeSBiYWNrIG8nIHQnIG90aGVyIHNpZGUsLS1PLCBteSBiYWNrLCBteSBiYWNrIQogICAgQmVzaHJldyB5b3VyIGhlYXJ0IGZvciBzZW5kaW5nIG1lIGFib3V0LAogICAgVG8gY2F0Y2ggbXkgZGVhdGggd2l0aCBqYXVudGluZyB1cCBhbmQgZG93biEKCkpVTElFVAoKICAgIEknIGZhaXRoLCBJIGFtIHNvcnJ5IHRoYXQgdGhvdSBhcnQgbm90IHdlbGwuCiAgICBTd2VldCwgc3dlZXQsIHN3ZWV0IG51cnNlLCB0ZWxsIG1lLCB3aGF0IHNheXMgbXkgbG92ZT8KCk51cnNlCgogICAgWW91ciBsb3ZlIHNheXMsIGxpa2UgYW4gaG9uZXN0IGdlbnRsZW1hbiwgYW5kIGEKICAgIGNvdXJ0ZW91cywgYW5kIGEga2luZCwgYW5kIGEgaGFuZHNvbWUsIGFuZCwgSQogICAgd2FycmFudCwgYSB2aXJ0dW91cywtLVdoZXJlIGlzIHlvdXIgbW90aGVyPwoKSlVMSUVUCgogICAgV2hlcmUgaXMgbXkgbW90aGVyISB3aHksIHNoZSBpcyB3aXRoaW47CiAgICBXaGVyZSBzaG91bGQgc2hlIGJlPyBIb3cgb2RkbHkgdGhvdSByZXBsaWVzdCEKICAgICdZb3VyIGxvdmUgc2F5cywgbGlrZSBhbiBob25lc3QgZ2VudGxlbWFuLAogICAgV2hlcmUgaXMgeW91ciBtb3RoZXIJwoKTnVyc2UKCiAgICBPIEdvZCdzIGxhZHkgZGVhciEKICAgIEFyZSB5b3Ugc28gaG90PyBtYXJyeSwgY29tZSB1cCwgSSB0cm93OwogICAgSXMgdGhpcyB0aGUgcG91bHRpY2UgZm9yIG15IGFjaGluZyBib25lcz8KICAgIEhlbmNlZm9yd2FyZCBkbyB5b3VyIG1lc3NhZ2VzIHlvdXJzZWxmLgoKSlVMSUVUCgogICAgSGVyZSdzIHN1Y2ggYSBjb2lsISBjb21lLCB3aGF0IHNheXMgUm9tZW8CgpOdXJzZQoKICAgIEhhdmUgeW91IGdvdCBsZWF2ZSB0byBnbyB0byBzaHJpZnQgdG8tZGF5PwoKSlVMSUVUCgogICAgSSBoYXZlLgoKTnVyc2UKCiAgICBUaGVuIGhpZSB5b3UgaGVuY2UgdG8gRnJpYXIgTGF1cmVuY2UnIGNlbGw7CiAgICBUaGVyZSBzdGF5cyBhIGh1c2JhbmQgdG8gbWFrZSB5b3UgYSB3aWZlOgogICAgTm93IGNvbWVzIHRoZSB3YW50b24gYmxvb2QgdXAgaW4geW91ciBjaGVla3MsCiAgICBUaGV5J2xsIGJlIGluIHNjYXJsZXQgc3RyYWlnaHQgYXQgYW55IG5ld3MuCiAgICBIaWUgeW91IHRvIGNodXJjaDsgSSBtdXN0IGFub3RoZXIgd2F5LAogICAgVG8gZmV0Y2ggYSBsYWRkZXIsIGJ5IHRoZSB3aGljaCB5b3VyIGxvdmUKICAgIE11c3QgY2xpbWIgYSBiaXJkJ3MgbmVzdCBzb29uIHdoZW4gaXQgaXMgZGFyazoKICAgIEkgYW0gdGhlIGRydWRnZSBhbmQgdG9pbCBpbiB5b3VyIGRlbGlnaHQsCiAgICBCdXQgeW91IHNoYWxsIGJlYXIgdGhlIGJ1cmRlbiBzb29uIGF0IG5pZ2h0LgogICAgR287IEknbGwgdG8gZGlubmVyOiBoaWUgeW91IHRvIHRoZSBjZWxsLgoKSlVMSUVUCgogICAgSGllIHRvIGhpZ2ggZm9ydHVuZSEgSG9uZXN0IG51cnNlLCBmYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIFZJLiBGcmlhciBMYXVyZW5jZSdzIGNlbGwuCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UgYW5kIFJPTUVPIAoKRlJJQVIgTEFVUkVOQ0UKCiAgICBTbyBzbWlsZSB0aGUgaGVhdmVucyB1cG9uIHRoaXMgaG9seSBhY3QsCiAgICBUaGF0IGFmdGVyIGhvdXJzIHdpdGggc29ycm93IGNoaWRlIHVzIG5vdCEKClJPTUVPCgogICAgQW1lbiwgYW1lbiEgYnV0IGNvbWUgd2hhdCBzb3Jyb3cgY2FuLAogICAgSXQgY2Fubm90IGNvdW50ZXJ2YWlsIHRoZSBleGNoYW5nZSBvZiBqb3kKICAgIFRoYXQgb25lIHNob3J0IG1pbnV0ZSBnaXZlcyBtZSBpbiBoZXIgc2lnaHQ6CiAgICBEbyB0aG91IGJ1dCBjbG9zZSBvdXIgaGFuZHMgd2l0aCBob2x5IHdvcmRzLAogICAgVGhlbiBsb3ZlLWRldm91cmluZyBkZWF0aCBkbyB3aGF0IGhlIGRhcmU7CiAgICBJdCBpcyBlbm91Z2ggSSBtYXkgYnV0IGNhbGwgaGVyIG1pbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFRoZXNlIHZpb2xlbnQgZGVsaWdodHMgaGF2ZSB2aW9sZW50IGVuZHMKICAgIEFuZCBpbiB0aGVpciB0cml1bXBoIGRpZSwgbGlrZSBmaXJlIGFuZCBwb3dkZXIsCiAgICBXaGljaCBhcyB0aGV5IGtpc3MgY29uc3VtZTogdGhlIHN3ZWV0ZXN0IGhvbmV5CiAgICBJcyBsb2F0aHNvbWUgaW4gaGlzIG93biBkZWxpY2lvdXNuZXNzCiAgICBBbmQgaW4gdGhlIHRhc3RlIGNvbmZvdW5kcyB0aGUgYXBwZXRpdGU6CiAgICBUaGVyZWZvcmUgbG92ZSBtb2RlcmF0ZWx5OyBsb25nIGxvdmUgZG90aCBzbzsKICAgIFRvbyBzd2lmdCBhcnJpdmVzIGFzIHRhcmR5IGFzIHRvbyBzbG93LgoKICAgIEVudGVyIEpVTElFVAogICAgSGVyZSBjb21lcyB0aGUgbGFkeTogTywgc28gbGlnaHQgYSBmb290CiAgICBXaWxsIG5lJ2VyIHdlYXIgb3V0IHRoZSBldmVybGFzdGluZyBmbGludDoKICAgIEEgbG92ZXIgbWF5IGJlc3RyaWRlIHRoZSBnb3NzYW1lcgogICAgVGhhdCBpZGxlcyBpbiB0aGUgd2FudG9uIHN1bW1lciBhaXIsCiAgICBBbmQgeWV0IG5vdCBmYWxsOyBzbyBsaWdodCBpcyB2YW5pdHkuCgpKVUxJRVQKCiAgICBHb29kIGV2ZW4gdG8gbXkgZ2hvc3RseSBjb25mZXNzb3IuCgpGUklBUiBMQVVSRU5DRQoKICAgIFJvbWVvIHNoYWxsIHRoYW5rIHRoZWUsIGRhdWdodGVyLCBmb3IgdXMgYm90aC4KCkpVTElFVAoKICAgIEFzIG11Y2ggdG8gaGltLCBlbHNlIGlzIGhpcyB0aGFua3MgdG9vIG11Y2guCgpST01FTwoKICAgIEFoLCBKdWxpZXQsIGlmIHRoZSBtZWFzdXJlIG9mIHRoeSBqb3kKICAgIEJlIGhlYXAnZCBsaWtlIG1pbmUgYW5kIHRoYXQgdGh5IHNraWxsIGJlIG1vcmUKICAgIFRvIGJsYXpvbiBpdCwgdGhlbiBzd2VldGVuIHdpdGggdGh5IGJyZWF0aAogICAgVGhpcyBuZWlnaGJvdXIgYWlyLCBhbmQgbGV0IHJpY2ggbXVzaWMncyB0b25ndWUKICAgIFVuZm9sZCB0aGUgaW1hZ2luZWQgaGFwcGluZXNzIHRoYXQgYm90aAogICAgUmVjZWl2ZSBpbiBlaXRoZXIgYnkgdGhpcyBkZWFyIGVuY291bnRlci4KCkpVTElFVAoKICAgIENvbmNlaXQsIG1vcmUgcmljaCBpbiBtYXR0ZXIgdGhhbiBpbiB3b3JkcywKICAgIEJyYWdzIG9mIGhpcyBzdWJzdGFuY2UsIG5vdCBvZiBvcm5hbWVudDoKICAgIFRoZXkgYXJlIGJ1dCBiZWdnYXJzIHRoYXQgY2FuIGNvdW50IHRoZWlyIHdvcnRoOwogICAgQnV0IG15IHRydWUgbG92ZSBpcyBncm93biB0byBzdWNoIGV4Y2VzcwogICAgSSBjYW5ub3Qgc3VtIHVwIHN1bSBvZiBoYWxmIG15IHdlYWx0aC4KCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgY29tZSB3aXRoIG1lLCBhbmQgd2Ugd2lsbCBtYWtlIHNob3J0IHdvcms7CiAgICBGb3IsIGJ5IHlvdXIgbGVhdmVzLCB5b3Ugc2hhbGwgbm90IHN0YXkgYWxvbmUKICAgIFRpbGwgaG9seSBjaHVyY2ggaW5jb3Jwb3JhdGUgdHdvIGluIG9uZS4KCiAgICBFeGV1bnQKCkFDVCBJSUkKU0NFTkUgSS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgTUVSQ1VUSU8sIEJFTlZPTElPLCBQYWdlLCBhbmQgU2VydmFudHMgCgpCRU5WT0xJTwoKICAgIEkgcHJheSB0aGVlLCBnb29kIE1lcmN1dGlvLCBsZXQncyByZXRpcmU6CiAgICBUaGUgZGF5IGlzIGhvdCwgdGhlIENhcHVsZXRzIGFicm9hZCwKICAgIEFuZCwgaWYgd2UgbWVldCwgd2Ugc2hhbGwgbm90IHNjYXBlIGEgYnJhd2w7CiAgICBGb3Igbm93LCB0aGVzZSBob3QgZGF5cywgaXMgdGhlIG1hZCBibG9vZCBzdGlycmluZy4KCk1FUkNVVElPCgogICAgVGhvdSBhcnQgbGlrZSBvbmUgb2YgdGhvc2UgZmVsbG93cyB0aGF0IHdoZW4gaGUKICAgIGVudGVycyB0aGUgY29uZmluZXMgb2YgYSB0YXZlcm4gY2xhcHMgbWUgaGlzIHN3b3JkCiAgICB1cG9uIHRoZSB0YWJsZSBhbmQgc2F5cyAnR29kIHNlbmQgbWUgbm8gbmVlZCBvZgogICAgdGhlZSEnIGFuZCBieSB0aGUgb3BlcmF0aW9uIG9mIHRoZSBzZWNvbmQgY3VwIGRyYXdzCiAgICBpdCBvbiB0aGUgZHJhd2VyLCB3aGVuIGluZGVlZCB0aGVyZSBpcyBubyBuZWVkLgoKQkVOVk9MSU8KCiAgICBBbSBJIGxpa2Ugc3VjaCBhIGZlbGxvdz8KCk1FUkNVVElPCgogICAgQ29tZSwgY29tZSwgdGhvdSBhcnQgYXMgaG90IGEgSmFjayBpbiB0aHkgbW9vZCBhcwogICAgYW55IGluIEl0YWx5LCBhbmQgYXMgc29vbiBtb3ZlZCB0byBiZSBtb29keSwgYW5kIGFzCiAgICBzb29uIG1vb2R5IHRvIGJlIG1vdmVkLgoKQkVOVk9MSU8KCiAgICBBbmQgd2hhdCB0bz8KCk1FUkNVVElPCgogICAgTmF5LCBhbiB0aGVyZSB3ZXJlIHR3byBzdWNoLCB3ZSBzaG91bGQgaGF2ZSBub25lCiAgICBzaG9ydGx5LCBmb3Igb25lIHdvdWxkIGtpbGwgdGhlIG90aGVyLiBUaG91ISB3aHksCiAgICB0aG91IHdpbHQgcXVhcnJlbCB3aXRoIGEgbWFuIHRoYXQgaGF0aCBhIGhhaXIgbW9yZSwKICAgIG9yIGEgaGFpciBsZXNzLCBpbiBoaXMgYmVhcmQsIHRoYW4gdGhvdSBoYXN0OiB0aG91CiAgICB3aWx0IHF1YXJyZWwgd2l0aCBhIG1hbiBmb3IgY3JhY2tpbmcgbnV0cywgaGF2aW5nIG5vCiAgICBvdGhlciByZWFzb24gYnV0IGJlY2F1c2UgdGhvdSBoYXN0IGhhemVsIGV5ZXM6IHdoYXQKICAgIGV5ZSBidXQgc3VjaCBhbiBleWUgd291bGQgc3B5IG91dCBzdWNoIGEgcXVhcnJlbD8KICAgIFRoeSBoZWFkIGlzIGFzIGZ1biBvZiBxdWFycmVscyBhcyBhbiBlZ2cgaXMgZnVsbCBvZgogICAgbWVhdCwgYW5kIHlldCB0aHkgaGVhZCBoYXRoIGJlZW4gYmVhdGVuIGFzIGFkZGxlIGFzCiAgICBhbiBlZ2cgZm9yIHF1YXJyZWxsaW5nOiB0aG91IGhhc3QgcXVhcnJlbGxlZCB3aXRoIGEKICAgIG1hbiBmb3IgY291Z2hpbmcgaW4gdGhlIHN0cmVldCwgYmVjYXVzZSBoZSBoYXRoCiAgICB3YWtlbmVkIHRoeSBkb2cgdGhhdCBoYXRoIGxhaW4gYXNsZWVwIGluIHRoZSBzdW46CiAgICBkaWRzdCB0aG91IG5vdCBmYWxsIG91dCB3aXRoIGEgdGFpbG9yIGZvciB3ZWFyaW5nCiAgICBoaXMgbmV3IGRvdWJsZXQgYmVmb3JlIEVhc3Rlcj8gd2l0aCBhbm90aGVyLCBmb3IKICAgIHR5aW5nIGhpcyBuZXcgc2hvZXMgd2l0aCBvbGQgcmliYW5kPyBhbmQgeWV0IHRob3UKICAgIHdpbHQgdHV0b3IgbWUgZnJvbSBxdWFycmVsbGluZyEKCkJFTlZPTElPCgogICAgQW4gSSB3ZXJlIHNvIGFwdCB0byBxdWFycmVsIGFzIHRob3UgYXJ0LCBhbnkgbWFuCiAgICBzaG91bGQgYnV5IHRoZSBmZWUtc2ltcGxlIG9mIG15IGxpZmUgZm9yIGFuIGhvdXIgYW5kIGEgcXVhcnRlci4KCk1FUkNVVElPCgogICAgVGhlIGZlZS1zaW1wbGUhIE8gc2ltcGxlIQoKQkVOVk9MSU8KCiAgICBCeSBteSBoZWFkLCBoZXJlIGNvbWUgdGhlIENhcHVsZXRzLgoKTUVSQ1VUSU8KCiAgICBCeSBteSBoZWVsLCBJIGNhcmUgbm90LgoKICAgIEVudGVyIFRZQkFMVCBhbmQgb3RoZXJzCgpUWUJBTFQKCiAgICBGb2xsb3cgbWUgY2xvc2UsIGZvciBJIHdpbGwgc3BlYWsgdG8gdGhlbS4KICAgIEdlbnRsZW1lbiwgZ29vZCBkZW46IGEgd29yZCB3aXRoIG9uZSBvZiB5b3UuCgpNRVJDVVRJTwoKICAgIEFuZCBidXQgb25lIHdvcmQgd2l0aCBvbmUgb2YgdXMIGNvdXBsZSBpdCB3aXRoCiAgICBzb21ldGhpbmc7IG1ha2UgaXQgYSB3b3JkIGFuZCBhIGJsb3cuCgpUWUJBTFQKCiAgICBZb3Ugc2hhbGwgZmluZCBtZSBhcHQgZW5vdWdoIHRvIHRoYXQsIHNpciwgYW4geW91CiAgICB3aWxsIGdpdmUgbWUgb2NjYXNpb24uCgpNRVJDVVRJTwoKICAgIENvdWxkIHlvdSBub3QgdGFrZSBzb21lIG9jY2FzaW9uIHdpdGhvdXQgZ2l2aW5nPwoKVFlCQUxUCgogICAgTWVyY3V0aW8sIHRob3UgY29uc29ydCdzdCB3aXRoIFJvbWVvLC0tCgpNRVJDVVRJTwoKICAgIENvbnNvcnQhIHdoYXQsIGRvc3QgdGhvdSBtYWtlIHVzIG1pbnN0cmVscz8gYW4KICAgIHRob3UgbWFrZSBtaW5zdHJlbHMgb2YgdXMsIGxvb2sgdG8gaGVhciBub3RoaW5nIGJ1dAogICAgZGlzY29yZHM6IGhlcmUncyBteSBmaWRkbGVzdGljazsgaGVyZSdzIHRoYXQgc2hhbGwKICAgIG1ha2UgeW91IGRhbmNlLiAnWm91bmRzLCBjb25zb3J0IQoKQkVOVk9MSU8KCiAgICBXZSB0YWxrIGhlcmUgaW4gdGhlIHB1YmxpYyBoYXVudCBvZiBtZW46CiAgICBFaXRoZXIgd2l0aGRyYXcgdW50byBzb21lIHByaXZhdGUgcGxhY2UsCiAgICBBbmQgcmVhc29uIGNvbGRseSBvZiB5b3VyIGdyaWV2YW5jZXMsCiAgICBPciBlbHNlIGRlcGFydDsgaGVyZSBhbGwgZXllcyBnYXplIG9uIHVzLgoKTUVSQ1VUSU8KCiAgICBNZW4ncyBleWVzIHdlcmUgbWFkZSB0byBsb29rLCBhbmQgbGV0IHRoZW0gZ2F6ZTsKICAgIEkgd2lsbCBub3QgYnVkZ2UgZm9yIG5vIG1hbidzIHBsZWFzdXJlLCBJLgoKICAgIEVudGVyIFJPTUVPCgpUWUJBTFQKCiAgICBXZWxsLCBwZWFjZSBiZSB3aXRoIHlvdSwgc2lyOiBoZXJlIGNvbWVzIG15IG1hbi4KCk1FUkNVVElPCgogICAgQnV0IEknbGwgYmUgaGFuZ2VkLCBzaXIsIGlmIGhlIHdlYXIgeW91ciBsaXZlcnk6CiAgICBNYXJyeSwgZ28gYmVmb3JlIHRvIGZpZWxkLCBoZSdsbCBiZSB5b3VyIGZvbGxvd2VyOwogICAgWW91ciB3b3JzaGlwIGluIHRoYXQgc2Vuc2UgbWF5IGNhbGwgaGltICdtYW4uJwoKVFlCQUxUCgogICAgUm9tZW8sIHRoZSBoYXRlIEkgYmVhciB0aGVlIGNhbiBhZmZvcmQKICAgIE5vIGJldHRlciB0ZXJtIHRoYW4gdGhpcywtLXRob3UgYXJ0IGEgdmlsbGFpbi4KClJPTUVPCgogICAgVHliYWx0LCB0aGUgcmVhc29uIHRoYXQgSSBoYXZlIHRvIGxvdmUgdGhlZQogICAgRG90aCBtdWNoIGV4Y3VzZSB0aGUgYXBwZXJ0YWluaW5nIHJhZ2UKICAgIFRvIHN1Y2ggYSBncmVldGluZzogdmlsbGFpbiBhbSBJIG5vbmU7CiAgICBUaGVyZWZvcmUgZmFyZXdlbGw7IEkgc2VlIHRob3Uga25vdydzdCBtZSBub3QuCgpUWUJBTFQKCiAgICBCb3ksIHRoaXMgc2hhbGwgbm90IGV4Y3VzZSB0aGUgaW5qdXJpZXMKICAgIFRoYXQgdGhvdSBoYXN0IGRvbmUgbWU7IHRoZXJlZm9yZSB0dXJuIGFuZCBkcmF3LgoKUk9NRU8KCiAgICBJIGRvIHByb3Rlc3QsIEkgbmV2ZXIgaW5qdXJlZCB0aGVlLAogICAgQnV0IGxvdmUgdGhlZSBiZXR0ZXIgdGhhbiB0aG91IGNhbnN0IGRldmlzZSwKICAgIFRpbGwgdGhvdSBzaGFsdCBrbm93IHRoZSByZWFzb24gb2YgbXkgbG92ZToKICAgIEFuZCBzbywgZ29vZCBDYXB1bGV0LC0td2hpY2ggbmFtZSBJIHRlbmRlcgogICAgQXMgZGVhcmx5IGFzIG15IG93biwtLWJlIHNhdGlzZmllZC4KCk1FUkNVVElPCgogICAgTyBjYWxtLCBkaXNob25vdXJhYmxlLCB2aWxlIHN1Ym1pc3Npb24hCiAgICBBbGxhIHN0b2NjYXRhIGNhcnJpZXMgaXQgYXdheS4KCiAgICBEcmF3cwogICAgVHliYWx0LCB5b3UgcmF0LWNhdGNoZXIsIHdpbGwgeW91IHdhbGsCgpUWUJBTFQKCiAgICBXaGF0IHdvdWxkc3QgdGhvdSBoYXZlIHdpdGggbWUCgpNRVJDVVRJTwoKICAgIEdvb2Qga2luZyBvZiBjYXRzLCBub3RoaW5nIGJ1dCBvbmUgb2YgeW91ciBuaW5lCiAgICBsaXZlczsgdGhhdCBJIG1lYW4gdG8gbWFrZSBib2xkIHdpdGhhbCwgYW5kIGFzIHlvdQogICAgc2hhbGwgdXNlIG1lIGhlcmVhZnRlciwgZHJ5YmVhdCB0aGUgcmVzdCBvZiB0aGUKICAgIGVpZ2h0LiBXaWxsIHlvdSBwbHVjayB5b3VyIHN3b3JkIG91dCBvZiBoaXMgcGl0Y2hlcgogICAgYnkgdGhlIGVhcnMIG1ha2UgaGFzdGUsIGxlc3QgbWluZSBiZSBhYm91dCB5b3VyCiAgICBlYXJzIGVyZSBpdCBiZSBvdXQuCgpUWUJBTFQKCiAgICBJIGFtIGZvciB5b3UuCgogICAgRHJhd2luZwoKUk9NRU8KCiAgICBHZW50bGUgTWVyY3V0aW8sIHB1dCB0aHkgcmFwaWVyIHVwLgoKTUVSQ1VUSU8KCiAgICBDb21lLCBzaXIsIHlvdXIgcGFzc2Fkby4KCiAgICBUaGV5IGZpZ2h0CgpST01FTwoKICAgIERyYXcsIEJlbnZvbGlvOyBiZWF0IGRvd24gdGhlaXIgd2VhcG9ucy4KICAgIEdlbnRsZW1lbiwgZm9yIHNoYW1lLCBmb3JiZWFyIHRoaXMgb3V0cmFnZSEKICAgIFR5YmFsdCwgTWVyY3V0aW8sIHRoZSBwcmluY2UgZXhwcmVzc2x5IGhhdGgKICAgIEZvcmJpZGRlbiBiYW5keWluZyBpbiBWZXJvbmEgc3RyZWV0czoKICAgIEhvbGQsIFR5YmFsdCEgZ29vZCBNZXJjdXRpbyEKCiAgICBUWUJBTFQgdW5kZXIgUk9NRU8ncyBhcm0gc3RhYnMgTUVSQ1VUSU8sIGFuZCBmbGllcyB3aXRoIGhpcyBmb2xsb3dlcnMKCk1FUkNVVElPCgogICAgSSBhbSBodXJ0LgogICAgQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEgSSBhbSBzcGVkLgogICAgSXMgaGUgZ29uZSwgYW5kIGhhdGggbm90aGluZz8KCkJFTlZPTElPCgogICAgV2hhdCwgYXJ0IHRob3UgaHVydD8KCk1FUkNVVElPCgogICAgQXksIGF5LCBhIHNjcmF0Y2gsIGEgc2NyYXRjaDsgbWFycnksICd0aXMgZW5vdWdoLgogICAgV2hlcmUgaXMgbXkgcGFnZT8gR28sIHZpbGxhaW4sIGZldGNoIGEgc3VyZ2Vvbi4KCiAgICBFeGl0IFBhZ2UKClJPTUVPCgogICAgQ291cmFnZSwgbWFuOyB0aGUgaHVydCBjYW5ub3QgYmUgbXVjaC4KCk1FUkNVVElPCgogICAgTm8sICd0aXMgbm90IHNvIGRlZXAgYXMgYSB3ZWxsLCBub3Igc28gd2lkZSBhcyBhCiAgICBjaHVyY2gtZG9vcjsgYnV0ICd0aXMgZW5vdWdoLCd0d2lsbCBzZXJ2ZTogYXNrIGZvcgogICAgbWUgdG8tbW9ycm93LCBhbmQgeW91IHNoYWxsIGZpbmQgbWUgYSBncmF2ZSBtYW4uIEkKICAgIGFtIHBlcHBlcmVkLCBJIHdhcnJhbnQsIGZvciB0aGlzIHdvcmxkLiBBIHBsYWd1ZSBvJwogICAgYm90aCB5b3VyIGhvdXNlcyEgJ1pvdW5kcywgYSBkb2csIGEgcmF0LCBhIG1vdXNlLCBhCiAgICBjYXQsIHRvIHNjcmF0Y2ggYSBtYW4gdG8gZGVhdGghIGEgYnJhZ2dhcnQsIGEKICAgIHJvZ3VlLCBhIHZpbGxhaW4sIHRoYXQgZmlnaHRzIGJ5IHRoZSBib29rIG9mCiAgICBhcml0aG1ldGljISBXaHkgdGhlIGRldmlsIGNhbWUgeW91IGJldHdlZW4gdXMIEkKICAgIHdhcyBodXJ0IHVuZGVyIHlvdXIgYXJtLgoKUk9NRU8KCiAgICBJIHRob3VnaHQgYWxsIGZvciB0aGUgYmVzdC4KCk1FUkNVVElPCgogICAgSGVscCBtZSBpbnRvIHNvbWUgaG91c2UsIEJlbnZvbGlvLAogICAgT3IgSSBzaGFsbCBmYWludC4gQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEKICAgIFRoZXkgaGF2ZSBtYWRlIHdvcm1zJyBtZWF0IG9mIG1lOiBJIGhhdmUgaXQsCiAgICBBbmQgc291bmRseSB0b286IHlvdXIgaG91c2VzIQoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KClJPTUVPCgogICAgVGhpcyBnZW50bGVtYW4sIHRoZSBwcmluY2UncyBuZWFyIGFsbHksCiAgICBNeSB2ZXJ5IGZyaWVuZCwgaGF0aCBnb3QgaGlzIG1vcnRhbCBodXJ0CiAgICBJbiBteSBiZWhhbGY7IG15IHJlcHV0YXRpb24gc3RhaW4nZAogICAgV2l0aCBUeWJhbHQncyBzbGFuZGVyLC0tVHliYWx0LCB0aGF0IGFuIGhvdXIKICAgIEhhdGggYmVlbiBteSBraW5zbWFuISBPIHN3ZWV0IEp1bGlldCwKICAgIFRoeSBiZWF1dHkgaGF0aCBtYWRlIG1lIGVmZmVtaW5hdGUKICAgIEFuZCBpbiBteSB0ZW1wZXIgc29mdGVuJ2QgdmFsb3VyJ3Mgc3RlZWwhCgogICAgUmUtZW50ZXIgQkVOVk9MSU8KCkJFTlZPTElPCgogICAgTyBSb21lbywgUm9tZW8sIGJyYXZlIE1lcmN1dGlvJ3MgZGVhZCEKICAgIFRoYXQgZ2FsbGFudCBzcGlyaXQgaGF0aCBhc3BpcmVkIHRoZSBjbG91ZHMsCiAgICBXaGljaCB0b28gdW50aW1lbHkgaGVyZSBkaWQgc2Nvcm4gdGhlIGVhcnRoLgoKUk9NRU8KCiAgICBUaGlzIGRheSdzIGJsYWNrIGZhdGUgb24gbW9yZSBkYXlzIGRvdGggZGVwZW5kOwogICAgVGhpcyBidXQgYmVnaW5zIHRoZSB3b2UsIG90aGVycyBtdXN0IGVuZC4KCkJFTlZPTElPCgogICAgSGVyZSBjb21lcyB0aGUgZnVyaW91cyBUeWJhbHQgYmFjayBhZ2Fpbi4KClJPTUVPCgogICAgQWxpdmUsIGluIHRyaXVtcGghIGFuZCBNZXJjdXRpbyBzbGFpbiEKICAgIEF3YXkgdG8gaGVhdmVuLCByZXNwZWN0aXZlIGxlbml0eSwKICAgIEFuZCBmaXJlLWV5ZWQgZnVyeSBiZSBteSBjb25kdWN0IG5vdyEKCiAgICBSZS1lbnRlciBUWUJBTFQKICAgIE5vdywgVHliYWx0LCB0YWtlIHRoZSB2aWxsYWluIGJhY2sgYWdhaW4sCiAgICBUaGF0IGxhdGUgdGhvdSBnYXZlc3QgbWU7IGZvciBNZXJjdXRpbydzIHNvdWwKICAgIElzIGJ1dCBhIGxpdHRsZSB3YXkgYWJvdmUgb3VyIGhlYWRzLAogICAgU3RheWluZyBmb3IgdGhpbmUgdG8ga2VlcCBoaW0gY29tcGFueToKICAgIEVpdGhlciB0aG91LCBvciBJLCBvciBib3RoLCBtdXN0IGdvIHdpdGggaGltLgoKVFlCQUxUCgogICAgVGhvdSwgd3JldGNoZWQgYm95LCB0aGF0IGRpZHN0IGNvbnNvcnQgaGltIGhlcmUsCiAgICBTaGFsdCB3aXRoIGhpbSBoZW5jZS4KClJPTUVPCgogICAgVGhpcyBzaGFsbCBkZXRlcm1pbmUgdGhhdC4KCiAgICBUaGV5IGZpZ2h0OyBUWUJBTFQgZmFsbHMKCkJFTlZPTElPCgogICAgUm9tZW8sIGF3YXksIGJlIGdvbmUhCiAgICBUaGUgY2l0aXplbnMgYXJlIHVwLCBhbmQgVHliYWx0IHNsYWluLgogICAgU3RhbmQgbm90IGFtYXplZDogdGhlIHByaW5jZSB3aWxsIGRvb20gdGhlZSBkZWF0aCwKICAgIElmIHRob3UgYXJ0IHRha2VuOiBoZW5jZSwgYmUgZ29uZSwgYXdheSEKClJPTUVPCgogICAgTywgSSBhbSBmb3J0dW5lJ3MgZm9vbCEKCkJFTlZPTElPCgogICAgV2h5IGRvc3QgdGhvdSBzdGF5PwoKICAgIEV4aXQgUk9NRU8KCiAgICBFbnRlciBDaXRpemVucywgJiBjCgpGaXJzdCBDaXRpemVuCgogICAgV2hpY2ggd2F5IHJhbiBoZSB0aGF0IGtpbGwnZCBNZXJjdXRpbz8KICAgIFR5YmFsdCwgdGhhdCBtdXJkZXJlciwgd2hpY2ggd2F5IHJhbiBoZT8KCkJFTlZPTElPCgogICAgVGhlcmUgbGllcyB0aGF0IFR5YmFsdC4KCkZpcnN0IENpdGl6ZW4KCiAgICBVcCwgc2lyLCBnbyB3aXRoIG1lOwogICAgSSBjaGFyZ2UgdGhlZSBpbiB0aGUgcHJpbmNlcyBuYW1lLCBvYmV5LgoKICAgIEVudGVyIFByaW5jZSwgYXR0ZW5kZWQ7IE1PTlRBR1VFLCBDQVBVTEVULCB0aGVpciBXaXZlcywgYW5kIG90aGVycwoKUFJJTkNFCgogICAgV2hlcmUgYXJlIHRoZSB2aWxlIGJlZ2lubmVycyBvZiB0aGlzIGZyYXkCgpCRU5WT0xJTwoKICAgIE8gbm9ibGUgcHJpbmNlLCBJIGNhbiBkaXNjb3ZlciBhbGwKICAgIFRoZSB1bmx1Y2t5IG1hbmFnZSBvZiB0aGlzIGZhdGFsIGJyYXdsOgogICAgVGhlcmUgbGllcyB0aGUgbWFuLCBzbGFpbiBieSB5b3VuZyBSb21lbywKICAgIFRoYXQgc2xldyB0aHkga2luc21hbiwgYnJhdmUgTWVyY3V0aW8uCgpMQURZIENBUFVMRVQKCiAgICBUeWJhbHQsIG15IGNvdXNpbiEgTyBteSBicm90aGVyJ3MgY2hpbGQhCiAgICBPIHByaW5jZSEgTyBjb3VzaW4hIGh1c2JhbmQhIE8sIHRoZSBibG9vZCBpcyBzcGlsdAogICAgTyBteSBkZWFyIGtpbnNtYW4hIFByaW5jZSwgYXMgdGhvdSBhcnQgdHJ1ZSwKICAgIEZvciBibG9vZCBvZiBvdXJzLCBzaGVkIGJsb29kIG9mIE1vbnRhZ3VlLgogICAgTyBjb3VzaW4sIGNvdXNpbiEKClBSSU5DRQoKICAgIEJlbnZvbGlvLCB3aG8gYmVnYW4gdGhpcyBibG9vZHkgZnJheT8KCkJFTlZPTElPCgogICAgVHliYWx0LCBoZXJlIHNsYWluLCB3aG9tIFJvbWVvJ3MgaGFuZCBkaWQgc2xheTsKICAgIFJvbWVvIHRoYXQgc3Bva2UgaGltIGZhaXIsIGJhZGUgaGltIGJldGhpbmsKICAgIEhvdyBuaWNlIHRoZSBxdWFycmVsIHdhcywgYW5kIHVyZ2VkIHdpdGhhbAogICAgWW91ciBoaWdoIGRpc3BsZWFzdXJlOiBhbGwgdGhpcyB1dHRlcmVkCiAgICBXaXRoIGdlbnRsZSBicmVhdGgsIGNhbG0gbG9vaywga25lZXMgaHVtYmx5IGJvdydkLAogICAgQ291bGQgbm90IHRha2UgdHJ1Y2Ugd2l0aCB0aGUgdW5ydWx5IHNwbGVlbgogICAgT2YgVHliYWx0IGRlYWYgdG8gcGVhY2UsIGJ1dCB0aGF0IGhlIHRpbHRzCiAgICBXaXRoIHBpZXJjaW5nIHN0ZWVsIGF0IGJvbGQgTWVyY3V0aW8ncyBicmVhc3QsCiAgICBXaG8gYWxsIGFzIGhvdCwgdHVybnMgZGVhZGx5IHBvaW50IHRvIHBvaW50LAogICAgQW5kLCB3aXRoIGEgbWFydGlhbCBzY29ybiwgd2l0aCBvbmUgaGFuZCBiZWF0cwogICAgQ29sZCBkZWF0aCBhc2lkZSwgYW5kIHdpdGggdGhlIG90aGVyIHNlbmRzCiAgICBJdCBiYWNrIHRvIFR5YmFsdCwgd2hvc2UgZGV4dGVyaXR5LAogICAgUmV0b3J0cyBpdDogUm9tZW8gaGUgY3JpZXMgYWxvdWQsCiAgICAnSG9sZCwgZnJpZW5kcyEgZnJpZW5kcywgcGFydCEnIGFuZCwgc3dpZnRlciB0aGFuCiAgICBoaXMgdG9uZ3VlLAogICAgSGlzIGFnaWxlIGFybSBiZWF0cyBkb3duIHRoZWlyIGZhdGFsIHBvaW50cywKICAgIEFuZCAndHdpeHQgdGhlbSBydXNoZXM7IHVuZGVybmVhdGggd2hvc2UgYXJtCiAgICBBbiBlbnZpb3VzIHRocnVzdCBmcm9tIFR5YmFsdCBoaXQgdGhlIGxpZmUKICAgIE9mIHN0b3V0IE1lcmN1dGlvLCBhbmQgdGhlbiBUeWJhbHQgZmxlZDsKICAgIEJ1dCBieSBhbmQgYnkgY29tZXMgYmFjayB0byBSb21lbywKICAgIFdobyBoYWQgYnV0IG5ld2x5IGVudGVydGFpbidkIHJldmVuZ2UsCiAgICBBbmQgdG8gJ3QgdGhleSBnbyBsaWtlIGxpZ2h0bmluZywgZm9yLCBlcmUgSQogICAgQ291bGQgZHJhdyB0byBwYXJ0IHRoZW0sIHdhcyBzdG91dCBUeWJhbHQgc2xhaW4uCiAgICBBbmQsIGFzIGhlIGZlbGwsIGRpZCBSb21lbyB0dXJuIGFuZCBmbHkuCiAgICBUaGlzIGlzIHRoZSB0cnV0aCwgb3IgbGV0IEJlbnZvbGlvIGRpZS4KCkxBRFkgQ0FQVUxFVAoKICAgIEhlIGlzIGEga2luc21hbiB0byB0aGUgTW9udGFndWU7CiAgICBBZmZlY3Rpb24gbWFrZXMgaGltIGZhbHNlOyBoZSBzcGVha3Mgbm90IHRydWU6CiAgICBTb21lIHR3ZW50eSBvZiB0aGVtIGZvdWdodCBpbiB0aGlzIGJsYWNrIHN0cmlmZSwKICAgIEFuZCBhbGwgdGhvc2UgdHdlbnR5IGNvdWxkIGJ1dCBraWxsIG9uZSBsaWZlLgogICAgSSBiZWcgZm9yIGp1c3RpY2UsIHdoaWNoIHRob3UsIHByaW5jZSwgbXVzdCBnaXZlOwogICAgUm9tZW8gc2xldyBUeWJhbHQsIFJvbWVvIG11c3Qgbm90IGxpdmUuCgpQUklOQ0UKCiAgICBSb21lbyBzbGV3IGhpbSwgaGUgc2xldyBNZXJjdXRpbzsKICAgIFdobyBub3cgdGhlIHByaWNlIG9mIGhpcyBkZWFyIGJsb29kIGRvdGggb3dlPwoKTU9OVEFHVUUKCiAgICBOb3QgUm9tZW8sIHByaW5jZSwgaGUgd2FzIE1lcmN1dGlvJ3MgZnJpZW5kOwogICAgSGlzIGZhdWx0IGNvbmNsdWRlcyBidXQgd2hhdCB0aGUgbGF3IHNob3VsZCBlbmQsCiAgICBUaGUgbGlmZSBvZiBUeWJhbHQuCgpQUklOQ0UKCiAgICBBbmQgZm9yIHRoYXQgb2ZmZW5jZQogICAgSW1tZWRpYXRlbHkgd2UgZG8gZXhpbGUgaGltIGhlbmNlOgogICAgSSBoYXZlIGFuIGludGVyZXN0IGluIHlvdXIgaGF0ZSdzIHByb2NlZWRpbmcsCiAgICBNeSBibG9vZCBmb3IgeW91ciBydWRlIGJyYXdscyBkb3RoIGxpZSBhLWJsZWVkaW5nOwogICAgQnV0IEknbGwgYW1lcmNlIHlvdSB3aXRoIHNvIHN0cm9uZyBhIGZpbmUKICAgIFRoYXQgeW91IHNoYWxsIGFsbCByZXBlbnQgdGhlIGxvc3Mgb2YgbWluZToKICAgIEkgd2lsbCBiZSBkZWFmIHRvIHBsZWFkaW5nIGFuZCBleGN1c2VzOwogICAgTm9yIHRlYXJzIG5vciBwcmF5ZXJzIHNoYWxsIHB1cmNoYXNlIG91dCBhYnVzZXM6CiAgICBUaGVyZWZvcmUgdXNlIG5vbmU6IGxldCBSb21lbyBoZW5jZSBpbiBoYXN0ZSwKICAgIEVsc2UsIHdoZW4gaGUncyBmb3VuZCwgdGhhdCBob3VyIGlzIGhpcyBsYXN0LgogICAgQmVhciBoZW5jZSB0aGlzIGJvZHkgYW5kIGF0dGVuZCBvdXIgd2lsbDoKICAgIE1lcmN5IGJ1dCBtdXJkZXJzLCBwYXJkb25pbmcgdGhvc2UgdGhhdCBraWxsLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIENhcHVsZXQncyBvcmNoYXJkLgoKICAgIEVudGVyIEpVTElFVCAKCkpVTElFVAoKICAgIEdhbGxvcCBhcGFjZSwgeW91IGZpZXJ5LWZvb3RlZCBzdGVlZHMsCiAgICBUb3dhcmRzIFBob2VidXMnIGxvZGdpbmc6IHN1Y2ggYSB3YWdvbmVyCiAgICBBcyBQaGFldGhvbiB3b3VsZCB3aGlwIHlvdSB0byB0aGUgd2VzdCwKICAgIEFuZCBicmluZyBpbiBjbG91ZHkgbmlnaHQgaW1tZWRpYXRlbHkuCiAgICBTcHJlYWQgdGh5IGNsb3NlIGN1cnRhaW4sIGxvdmUtcGVyZm9ybWluZyBuaWdodCwKICAgIFRoYXQgcnVuYXdheSdzIGV5ZXMgbWF5IHdpbmsgYW5kIFJvbWVvCiAgICBMZWFwIHRvIHRoZXNlIGFybXMsIHVudGFsaydkIG9mIGFuZCB1bnNlZW4uCiAgICBMb3ZlcnMgY2FuIHNlZSB0byBkbyB0aGVpciBhbW9yb3VzIHJpdGVzCiAgICBCeSB0aGVpciBvd24gYmVhdXRpZXM7IG9yLCBpZiBsb3ZlIGJlIGJsaW5kLAogICAgSXQgYmVzdCBhZ3JlZXMgd2l0aCBuaWdodC4gQ29tZSwgY2l2aWwgbmlnaHQsCiAgICBUaG91IHNvYmVyLXN1aXRlZCBtYXRyb24sIGFsbCBpbiBibGFjaywKICAgIEFuZCBsZWFybiBtZSBob3cgdG8gbG9zZSBhIHdpbm5pbmcgbWF0Y2gsCiAgICBQbGF5J2QgZm9yIGEgcGFpciBvZiBzdGFpbmxlc3MgbWFpZGVuaG9vZHM6CiAgICBIb29kIG15IHVubWFubidkIGJsb29kLCBiYXRpbmcgaW4gbXkgY2hlZWtzLAogICAgV2l0aCB0aHkgYmxhY2sgbWFudGxlOyB0aWxsIHN0cmFuZ2UgbG92ZSwgZ3Jvd24gYm9sZCwKICAgIFRoaW5rIHRydWUgbG92ZSBhY3RlZCBzaW1wbGUgbW9kZXN0eS4KICAgIENvbWUsIG5pZ2h0OyBjb21lLCBSb21lbzsgY29tZSwgdGhvdSBkYXkgaW4gbmlnaHQ7CiAgICBGb3IgdGhvdSB3aWx0IGxpZSB1cG9uIHRoZSB3aW5ncyBvZiBuaWdodAogICAgV2hpdGVyIHRoYW4gbmV3IHNub3cgb24gYSByYXZlbidzIGJhY2suCiAgICBDb21lLCBnZW50bGUgbmlnaHQsIGNvbWUsIGxvdmluZywgYmxhY2stYnJvdydkIG5pZ2h0LAogICAgR2l2ZSBtZSBteSBSb21lbzsgYW5kLCB3aGVuIGhlIHNoYWxsIGRpZSwKICAgIFRha2UgaGltIGFuZCBjdXQgaGltIG91dCBpbiBsaXR0bGUgc3RhcnMsCiAgICBBbmQgaGUgd2lsbCBtYWtlIHRoZSBmYWNlIG9mIGhlYXZlbiBzbyBmaW5lCiAgICBUaGF0IGFsbCB0aGUgd29ybGQgd2lsbCBiZSBpbiBsb3ZlIHdpdGggbmlnaHQKICAgIEFuZCBwYXkgbm8gd29yc2hpcCB0byB0aGUgZ2FyaXNoIHN1bi4KICAgIE8sIEkgaGF2ZSBib3VnaHQgdGhlIG1hbnNpb24gb2YgYSBsb3ZlLAogICAgQnV0IG5vdCBwb3NzZXNzJ2QgaXQsIGFuZCwgdGhvdWdoIEkgYW0gc29sZCwKICAgIE5vdCB5ZXQgZW5qb3knZDogc28gdGVkaW91cyBpcyB0aGlzIGRheQogICAgQXMgaXMgdGhlIG5pZ2h0IGJlZm9yZSBzb21lIGZlc3RpdmFsCiAgICBUbyBhbiBpbXBhdGllbnQgY2hpbGQgdGhhdCBoYXRoIG5ldyByb2JlcwogICAgQW5kIG1heSBub3Qgd2VhciB0aGVtLiBPLCBoZXJlIGNvbWVzIG15IG51cnNlLAogICAgQW5kIHNoZSBicmluZ3MgbmV3czsgYW5kIGV2ZXJ5IHRvbmd1ZSB0aGF0IHNwZWFrcwogICAgQnV0IFJvbWVvJ3MgbmFtZSBzcGVha3MgaGVhdmVubHkgZWxvcXVlbmNlLgoKICAgIEVudGVyIE51cnNlLCB3aXRoIGNvcmRzCiAgICBOb3csIG51cnNlLCB3aGF0IG5ld3MIFdoYXQgaGFzdCB0aG91IHRoZXJlPyB0aGUgY29yZHMKICAgIFRoYXQgUm9tZW8gYmlkIHRoZWUgZmV0Y2gCgpOdXJzZQoKICAgIEF5LCBheSwgdGhlIGNvcmRzLgoKICAgIFRocm93cyB0aGVtIGRvd24KCkpVTElFVAoKICAgIEF5IG1lISB3aGF0IG5ld3MIHdoeSBkb3N0IHRob3Ugd3JpbmcgdGh5IGhhbmRzPwoKTnVyc2UKCiAgICBBaCwgd2VsbC1hLWRheSEgaGUncyBkZWFkLCBoZSdzIGRlYWQsIGhlJ3MgZGVhZCEKICAgIFdlIGFyZSB1bmRvbmUsIGxhZHksIHdlIGFyZSB1bmRvbmUhCiAgICBBbGFjayB0aGUgZGF5ISBoZSdzIGdvbmUsIGhlJ3Mga2lsbCdkLCBoZSdzIGRlYWQhCgpKVUxJRVQKCiAgICBDYW4gaGVhdmVuIGJlIHNvIGVudmlvdXMCgpOdXJzZQoKICAgIFJvbWVvIGNhbiwKICAgIFRob3VnaCBoZWF2ZW4gY2Fubm90OiBPIFJvbWVvLCBSb21lbyEKICAgIFdobyBldmVyIHdvdWxkIGhhdmUgdGhvdWdodCBpdD8gUm9tZW8hCgpKVUxJRVQKCiAgICBXaGF0IGRldmlsIGFydCB0aG91LCB0aGF0IGRvc3QgdG9ybWVudCBtZSB0aHVzPwogICAgVGhpcyB0b3J0dXJlIHNob3VsZCBiZSByb2FyJ2QgaW4gZGlzbWFsIGhlbGwuCiAgICBIYXRoIFJvbWVvIHNsYWluIGhpbXNlbGYIHNheSB0aG91IGJ1dCAnSSwnCiAgICBBbmQgdGhhdCBiYXJlIHZvd2VsICdJJyBzaGFsbCBwb2lzb24gbW9yZQogICAgVGhhbiB0aGUgZGVhdGgtZGFydGluZyBleWUgb2YgY29ja2F0cmljZToKICAgIEkgYW0gbm90IEksIGlmIHRoZXJlIGJlIHN1Y2ggYW4gSTsKICAgIE9yIHRob3NlIGV5ZXMgc2h1dCwgdGhhdCBtYWtlIHRoZWUgYW5zd2VyICdJLicKICAgIElmIGhlIGJlIHNsYWluLCBzYXkgJ0knOyBvciBpZiBub3QsIG5vOgogICAgQnJpZWYgc291bmRzIGRldGVybWluZSBvZiBteSB3ZWFsIG9yIHdvZS4KCk51cnNlCgogICAgSSBzYXcgdGhlIHdvdW5kLCBJIHNhdyBpdCB3aXRoIG1pbmUgZXllcywtLQogICAgR29kIHNhdmUgdGhlIG1hcmshLS1oZXJlIG9uIGhpcyBtYW5seSBicmVhc3Q6CiAgICBBIHBpdGVvdXMgY29yc2UsIGEgYmxvb2R5IHBpdGVvdXMgY29yc2U7CiAgICBQYWxlLCBwYWxlIGFzIGFzaGVzLCBhbGwgYmVkYXViJ2QgaW4gYmxvb2QsCiAgICBBbGwgaW4gZ29yZS1ibG9vZDsgSSBzd291bmRlZCBhdCB0aGUgc2lnaHQuCgpKVUxJRVQKCiAgICBPLCBicmVhaywgbXkgaGVhcnQhIHBvb3IgYmFua3J1cHQsIGJyZWFrIGF0IG9uY2UhCiAgICBUbyBwcmlzb24sIGV5ZXMsIG5lJ2VyIGxvb2sgb24gbGliZXJ0eSEKICAgIFZpbGUgZWFydGgsIHRvIGVhcnRoIHJlc2lnbjsgZW5kIG1vdGlvbiBoZXJlOwogICAgQW5kIHRob3UgYW5kIFJvbWVvIHByZXNzIG9uZSBoZWF2eSBiaWVyIQoKTnVyc2UKCiAgICBPIFR5YmFsdCwgVHliYWx0LCB0aGUgYmVzdCBmcmllbmQgSSBoYWQhCiAgICBPIGNvdXJ0ZW91cyBUeWJhbHQhIGhvbmVzdCBnZW50bGVtYW4hCiAgICBUaGF0IGV2ZXIgSSBzaG91bGQgbGl2ZSB0byBzZWUgdGhlZSBkZWFkIQoKSlVMSUVUCgogICAgV2hhdCBzdG9ybSBpcyB0aGlzIHRoYXQgYmxvd3Mgc28gY29udHJhcnkCiAgICBJcyBSb21lbyBzbGF1Z2h0ZXInZCwgYW5kIGlzIFR5YmFsdCBkZWFkPwogICAgTXkgZGVhci1sb3ZlZCBjb3VzaW4sIGFuZCBteSBkZWFyZXIgbG9yZD8KICAgIFRoZW4sIGRyZWFkZnVsIHRydW1wZXQsIHNvdW5kIHRoZSBnZW5lcmFsIGRvb20hCiAgICBGb3Igd2hvIGlzIGxpdmluZywgaWYgdGhvc2UgdHdvIGFyZSBnb25lPwoKTnVyc2UKCiAgICBUeWJhbHQgaXMgZ29uZSwgYW5kIFJvbWVvIGJhbmlzaGVkOwogICAgUm9tZW8gdGhhdCBraWxsJ2QgaGltLCBoZSBpcyBiYW5pc2hlZC4KCkpVTElFVAoKICAgIE8gR29kISBkaWQgUm9tZW8ncyBoYW5kIHNoZWQgVHliYWx0J3MgYmxvb2QCgpOdXJzZQoKICAgIEl0IGRpZCwgaXQgZGlkOyBhbGFzIHRoZSBkYXksIGl0IGRpZCEKCkpVTElFVAoKICAgIE8gc2VycGVudCBoZWFydCwgaGlkIHdpdGggYSBmbG93ZXJpbmcgZmFjZSEKICAgIERpZCBldmVyIGRyYWdvbiBrZWVwIHNvIGZhaXIgYSBjYXZlPwogICAgQmVhdXRpZnVsIHR5cmFudCEgZmllbmQgYW5nZWxpY2FsIQogICAgRG92ZS1mZWF0aGVyJ2QgcmF2ZW4hIHdvbHZpc2gtcmF2ZW5pbmcgbGFtYiEKICAgIERlc3Bpc2VkIHN1YnN0YW5jZSBvZiBkaXZpbmVzdCBzaG93IQogICAgSnVzdCBvcHBvc2l0ZSB0byB3aGF0IHRob3UganVzdGx5IHNlZW0nc3QsCiAgICBBIGRhbW5lZCBzYWludCwgYW4gaG9ub3VyYWJsZSB2aWxsYWluIQogICAgTyBuYXR1cmUsIHdoYXQgaGFkc3QgdGhvdSB0byBkbyBpbiBoZWxsLAogICAgV2hlbiB0aG91IGRpZHN0IGJvd2VyIHRoZSBzcGlyaXQgb2YgYSBmaWVuZAogICAgSW4gbW9yYWwgcGFyYWRpc2Ugb2Ygc3VjaCBzd2VldCBmbGVzaD8KICAgIFdhcyBldmVyIGJvb2sgY29udGFpbmluZyBzdWNoIHZpbGUgbWF0dGVyCiAgICBTbyBmYWlybHkgYm91bmQIE8gdGhhdCBkZWNlaXQgc2hvdWxkIGR3ZWxsCiAgICBJbiBzdWNoIGEgZ29yZ2VvdXMgcGFsYWNlIQoKTnVyc2UKCiAgICBUaGVyZSdzIG5vIHRydXN0LAogICAgTm8gZmFpdGgsIG5vIGhvbmVzdHkgaW4gbWVuOyBhbGwgcGVyanVyZWQsCiAgICBBbGwgZm9yc3dvcm4sIGFsbCBuYXVnaHQsIGFsbCBkaXNzZW1ibGVycy4KICAgIEFoLCB3aGVyZSdzIG15IG1hbj8gZ2l2ZSBtZSBzb21lIGFxdWEgdml0YWU6CiAgICBUaGVzZSBncmllZnMsIHRoZXNlIHdvZXMsIHRoZXNlIHNvcnJvd3MgbWFrZSBtZSBvbGQuCiAgICBTaGFtZSBjb21lIHRvIFJvbWVvIQoKSlVMSUVUCgogICAgQmxpc3RlcidkIGJlIHRoeSB0b25ndWUKICAgIEZvciBzdWNoIGEgd2lzaCEgaGUgd2FzIG5vdCBib3JuIHRvIHNoYW1lOgogICAgVXBvbiBoaXMgYnJvdyBzaGFtZSBpcyBhc2hhbWVkIHRvIHNpdDsKICAgIEZvciAndGlzIGEgdGhyb25lIHdoZXJlIGhvbm91ciBtYXkgYmUgY3Jvd24nZAogICAgU29sZSBtb25hcmNoIG9mIHRoZSB1bml2ZXJzYWwgZWFydGguCiAgICBPLCB3aGF0IGEgYmVhc3Qgd2FzIEkgdG8gY2hpZGUgYXQgaGltIQoKTnVyc2UKCiAgICBXaWxsIHlvdSBzcGVhayB3ZWxsIG9mIGhpbSB0aGF0IGtpbGwnZCB5b3VyIGNvdXNpbj8KCkpVTElFVAoKICAgIFNoYWxsIEkgc3BlYWsgaWxsIG9mIGhpbSB0aGF0IGlzIG15IGh1c2JhbmQCiAgICBBaCwgcG9vciBteSBsb3JkLCB3aGF0IHRvbmd1ZSBzaGFsbCBzbW9vdGggdGh5IG5hbWUsCiAgICBXaGVuIEksIHRoeSB0aHJlZS1ob3VycyB3aWZlLCBoYXZlIG1hbmdsZWQgaXQCiAgICBCdXQsIHdoZXJlZm9yZSwgdmlsbGFpbiwgZGlkc3QgdGhvdSBraWxsIG15IGNvdXNpbj8KICAgIFRoYXQgdmlsbGFpbiBjb3VzaW4gd291bGQgaGF2ZSBraWxsJ2QgbXkgaHVzYmFuZDoKICAgIEJhY2ssIGZvb2xpc2ggdGVhcnMsIGJhY2sgdG8geW91ciBuYXRpdmUgc3ByaW5nOwogICAgWW91ciB0cmlidXRhcnkgZHJvcHMgYmVsb25nIHRvIHdvZSwKICAgIFdoaWNoIHlvdSwgbWlzdGFraW5nLCBvZmZlciB1cCB0byBqb3kuCiAgICBNeSBodXNiYW5kIGxpdmVzLCB0aGF0IFR5YmFsdCB3b3VsZCBoYXZlIHNsYWluOwogICAgQW5kIFR5YmFsdCdzIGRlYWQsIHRoYXQgd291bGQgaGF2ZSBzbGFpbiBteSBodXNiYW5kOgogICAgQWxsIHRoaXMgaXMgY29tZm9ydDsgd2hlcmVmb3JlIHdlZXAgSSB0aGVuPwogICAgU29tZSB3b3JkIHRoZXJlIHdhcywgd29yc2VyIHRoYW4gVHliYWx0J3MgZGVhdGgsCiAgICBUaGF0IG11cmRlcidkIG1lOiBJIHdvdWxkIGZvcmdldCBpdCBmYWluOwogICAgQnV0LCBPLCBpdCBwcmVzc2VzIHRvIG15IG1lbW9yeSwKICAgIExpa2UgZGFtbmVkIGd1aWx0eSBkZWVkcyB0byBzaW5uZXJzJyBtaW5kczoKICAgICdUeWJhbHQgaXMgZGVhZCwgYW5kIFJvbWVvLS1iYW5pc2hlZDsnCiAgICBUaGF0ICdiYW5pc2hlZCwnIHRoYXQgb25lIHdvcmQgJ2JhbmlzaGVkLCcKICAgIEhhdGggc2xhaW4gdGVuIHRob3VzYW5kIFR5YmFsdHMuIFR5YmFsdCdzIGRlYXRoCiAgICBXYXMgd29lIGVub3VnaCwgaWYgaXQgaGFkIGVuZGVkIHRoZXJlOgogICAgT3IsIGlmIHNvdXIgd29lIGRlbGlnaHRzIGluIGZlbGxvd3NoaXAKICAgIEFuZCBuZWVkbHkgd2lsbCBiZSByYW5rJ2Qgd2l0aCBvdGhlciBncmllZnMsCiAgICBXaHkgZm9sbG93J2Qgbm90LCB3aGVuIHNoZSBzYWlkICdUeWJhbHQncyBkZWFkLCcKICAgIFRoeSBmYXRoZXIsIG9yIHRoeSBtb3RoZXIsIG5heSwgb3IgYm90aCwKICAgIFdoaWNoIG1vZGVybiBsYW1lbnRhdGlvbnMgbWlnaHQgaGF2ZSBtb3ZlZD8KICAgIEJ1dCB3aXRoIGEgcmVhci13YXJkIGZvbGxvd2luZyBUeWJhbHQncyBkZWF0aCwKICAgICdSb21lbyBpcyBiYW5pc2hlZCwnIHRvIHNwZWFrIHRoYXQgd29yZCwKICAgIElzIGZhdGhlciwgbW90aGVyLCBUeWJhbHQsIFJvbWVvLCBKdWxpZXQsCiAgICBBbGwgc2xhaW4sIGFsbCBkZWFkLiAnUm9tZW8gaXMgYmFuaXNoZWQhJwogICAgVGhlcmUgaXMgbm8gZW5kLCBubyBsaW1pdCwgbWVhc3VyZSwgYm91bmQsCiAgICBJbiB0aGF0IHdvcmQncyBkZWF0aDsgbm8gd29yZHMgY2FuIHRoYXQgd29lIHNvdW5kLgogICAgV2hlcmUgaXMgbXkgZmF0aGVyLCBhbmQgbXkgbW90aGVyLCBudXJzZT8KCk51cnNlCgogICAgV2VlcGluZyBhbmQgd2FpbGluZyBvdmVyIFR5YmFsdCdzIGNvcnNlOgogICAgV2lsbCB5b3UgZ28gdG8gdGhlbT8gSSB3aWxsIGJyaW5nIHlvdSB0aGl0aGVyLgoKSlVMSUVUCgogICAgV2FzaCB0aGV5IGhpcyB3b3VuZHMgd2l0aCB0ZWFyczogbWluZSBzaGFsbCBiZSBzcGVudCwKICAgIFdoZW4gdGhlaXJzIGFyZSBkcnksIGZvciBSb21lbydzIGJhbmlzaG1lbnQuCiAgICBUYWtlIHVwIHRob3NlIGNvcmRzOiBwb29yIHJvcGVzLCB5b3UgYXJlIGJlZ3VpbGVkLAogICAgQm90aCB5b3UgYW5kIEk7IGZvciBSb21lbyBpcyBleGlsZWQ6CiAgICBIZSBtYWRlIHlvdSBmb3IgYSBoaWdod2F5IHRvIG15IGJlZDsKICAgIEJ1dCBJLCBhIG1haWQsIGRpZSBtYWlkZW4td2lkb3dlZC4KICAgIENvbWUsIGNvcmRzLCBjb21lLCBudXJzZTsgSSdsbCB0byBteSB3ZWRkaW5nLWJlZDsKICAgIEFuZCBkZWF0aCwgbm90IFJvbWVvLCB0YWtlIG15IG1haWRlbmhlYWQhCgpOdXJzZQoKICAgIEhpZSB0byB5b3VyIGNoYW1iZXI6IEknbGwgZmluZCBSb21lbwogICAgVG8gY29tZm9ydCB5b3U6IEkgd290IHdlbGwgd2hlcmUgaGUgaXMuCiAgICBIYXJrIHllLCB5b3VyIFJvbWVvIHdpbGwgYmUgaGVyZSBhdCBuaWdodDoKICAgIEknbGwgdG8gaGltOyBoZSBpcyBoaWQgYXQgTGF1cmVuY2UnIGNlbGwuCgpKVUxJRVQKCiAgICBPLCBmaW5kIGhpbSEgZ2l2ZSB0aGlzIHJpbmcgdG8gbXkgdHJ1ZSBrbmlnaHQsCiAgICBBbmQgYmlkIGhpbSBjb21lIHRvIHRha2UgaGlzIGxhc3QgZmFyZXdlbGwuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSAKCkZSSUFSIExBVVJFTkNFCgogICAgUm9tZW8sIGNvbWUgZm9ydGg7IGNvbWUgZm9ydGgsIHRob3UgZmVhcmZ1bCBtYW46CiAgICBBZmZsaWN0aW9uIGlzIGVuYW1vdXInZCBvZiB0aHkgcGFydHMsCiAgICBBbmQgdGhvdSBhcnQgd2VkZGVkIHRvIGNhbGFtaXR5LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEZhdGhlciwgd2hhdCBuZXdzPyB3aGF0IGlzIHRoZSBwcmluY2UncyBkb29tPwogICAgV2hhdCBzb3Jyb3cgY3JhdmVzIGFjcXVhaW50YW5jZSBhdCBteSBoYW5kLAogICAgVGhhdCBJIHlldCBrbm93IG5vdD8KCkZSSUFSIExBVVJFTkNFCgogICAgVG9vIGZhbWlsaWFyCiAgICBJcyBteSBkZWFyIHNvbiB3aXRoIHN1Y2ggc291ciBjb21wYW55OgogICAgSSBicmluZyB0aGVlIHRpZGluZ3Mgb2YgdGhlIHByaW5jZSdzIGRvb20uCgpST01FTwoKICAgIFdoYXQgbGVzcyB0aGFuIGRvb21zLWRheSBpcyB0aGUgcHJpbmNlJ3MgZG9vbT8KCkZSSUFSIExBVVJFTkNFCgogICAgQSBnZW50bGVyIGp1ZGdtZW50IHZhbmlzaCdkIGZyb20gaGlzIGxpcHMsCiAgICBOb3QgYm9keSdzIGRlYXRoLCBidXQgYm9keSdzIGJhbmlzaG1lbnQuCgpST01FTwoKICAgIEhhLCBiYW5pc2htZW50ISBiZSBtZXJjaWZ1bCwgc2F5ICdkZWF0aDsnCiAgICBGb3IgZXhpbGUgaGF0aCBtb3JlIHRlcnJvciBpbiBoaXMgbG9vaywKICAgIE11Y2ggbW9yZSB0aGFuIGRlYXRoOiBkbyBub3Qgc2F5ICdiYW5pc2htZW50LicKCkZSSUFSIExBVVJFTkNFCgogICAgSGVuY2UgZnJvbSBWZXJvbmEgYXJ0IHRob3UgYmFuaXNoZWQ6CiAgICBCZSBwYXRpZW50LCBmb3IgdGhlIHdvcmxkIGlzIGJyb2FkIGFuZCB3aWRlLgoKUk9NRU8KCiAgICBUaGVyZSBpcyBubyB3b3JsZCB3aXRob3V0IFZlcm9uYSB3YWxscywKICAgIEJ1dCBwdXJnYXRvcnksIHRvcnR1cmUsIGhlbGwgaXRzZWxmLgogICAgSGVuY2UtYmFuaXNoZWQgaXMgYmFuaXNoJ2QgZnJvbSB0aGUgd29ybGQsCiAgICBBbmQgd29ybGQncyBleGlsZSBpcyBkZWF0aDogdGhlbiBiYW5pc2hlZCwKICAgIElzIGRlYXRoIG1pcy10ZXJtJ2Q6IGNhbGxpbmcgZGVhdGggYmFuaXNobWVudCwKICAgIFRob3UgY3V0dCdzdCBteSBoZWFkIG9mZiB3aXRoIGEgZ29sZGVuIGF4ZSwKICAgIEFuZCBzbWlsZXN0IHVwb24gdGhlIHN0cm9rZSB0aGF0IG11cmRlcnMgbWUuCgpGUklBUiBMQVVSRU5DRQoKICAgIE8gZGVhZGx5IHNpbiEgTyBydWRlIHVudGhhbmtmdWxuZXNzIQogICAgVGh5IGZhdWx0IG91ciBsYXcgY2FsbHMgZGVhdGg7IGJ1dCB0aGUga2luZCBwcmluY2UsCiAgICBUYWtpbmcgdGh5IHBhcnQsIGhhdGggcnVzaCdkIGFzaWRlIHRoZSBsYXcsCiAgICBBbmQgdHVybidkIHRoYXQgYmxhY2sgd29yZCBkZWF0aCB0byBiYW5pc2htZW50OgogICAgVGhpcyBpcyBkZWFyIG1lcmN5LCBhbmQgdGhvdSBzZWVzdCBpdCBub3QuCgpST01FTwoKICAgICdUaXMgdG9ydHVyZSwgYW5kIG5vdCBtZXJjeTogaGVhdmVuIGlzIGhlcmUsCiAgICBXaGVyZSBKdWxpZXQgbGl2ZXM7IGFuZCBldmVyeSBjYXQgYW5kIGRvZwogICAgQW5kIGxpdHRsZSBtb3VzZSwgZXZlcnkgdW53b3J0aHkgdGhpbmcsCiAgICBMaXZlIGhlcmUgaW4gaGVhdmVuIGFuZCBtYXkgbG9vayBvbiBoZXI7CiAgICBCdXQgUm9tZW8gbWF5IG5vdDogbW9yZSB2YWxpZGl0eSwKICAgIE1vcmUgaG9ub3VyYWJsZSBzdGF0ZSwgbW9yZSBjb3VydHNoaXAgbGl2ZXMKICAgIEluIGNhcnJpb24tZmxpZXMgdGhhbiBSb21lbzogdGhleSBteSBzZWl6ZQogICAgT24gdGhlIHdoaXRlIHdvbmRlciBvZiBkZWFyIEp1bGlldCdzIGhhbmQKICAgIEFuZCBzdGVhbCBpbW1vcnRhbCBibGVzc2luZyBmcm9tIGhlciBsaXBzLAogICAgV2hvIGV2ZW4gaW4gcHVyZSBhbmQgdmVzdGFsIG1vZGVzdHksCiAgICBTdGlsbCBibHVzaCwgYXMgdGhpbmtpbmcgdGhlaXIgb3duIGtpc3NlcyBzaW47CiAgICBCdXQgUm9tZW8gbWF5IG5vdDsgaGUgaXMgYmFuaXNoZWQ6CiAgICBGbGllcyBtYXkgZG8gdGhpcywgYnV0IEkgZnJvbSB0aGlzIG11c3QgZmx5OgogICAgVGhleSBhcmUgZnJlZSBtZW4sIGJ1dCBJIGFtIGJhbmlzaGVkLgogICAgQW5kIHNheSdzdCB0aG91IHlldCB0aGF0IGV4aWxlIGlzIG5vdCBkZWF0aD8KICAgIEhhZHN0IHRob3Ugbm8gcG9pc29uIG1peCdkLCBubyBzaGFycC1ncm91bmQga25pZmUsCiAgICBObyBzdWRkZW4gbWVhbiBvZiBkZWF0aCwgdGhvdWdoIG5lJ2VyIHNvIG1lYW4sCiAgICBCdXQgJ2JhbmlzaGVkJyB0byBraWxsIG1lPy0tJ2JhbmlzaGVkJz8KICAgIE8gZnJpYXIsIHRoZSBkYW1uZWQgdXNlIHRoYXQgd29yZCBpbiBoZWxsOwogICAgSG93bGluZ3MgYXR0ZW5kIGl0OiBob3cgaGFzdCB0aG91IHRoZSBoZWFydCwKICAgIEJlaW5nIGEgZGl2aW5lLCBhIGdob3N0bHkgY29uZmVzc29yLAogICAgQSBzaW4tYWJzb2x2ZXIsIGFuZCBteSBmcmllbmQgcHJvZmVzcydkLAogICAgVG8gbWFuZ2xlIG1lIHdpdGggdGhhdCB3b3JkICdiYW5pc2hlZCcCgpGUklBUiBMQVVSRU5DRQoKICAgIFRob3UgZm9uZCBtYWQgbWFuLCBoZWFyIG1lIGJ1dCBzcGVhayBhIHdvcmQuCgpST01FTwoKICAgIE8sIHRob3Ugd2lsdCBzcGVhayBhZ2FpbiBvZiBiYW5pc2htZW50LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJJ2xsIGdpdmUgdGhlZSBhcm1vdXIgdG8ga2VlcCBvZmYgdGhhdCB3b3JkOgogICAgQWR2ZXJzaXR5J3Mgc3dlZXQgbWlsaywgcGhpbG9zb3BoeSwKICAgIFRvIGNvbWZvcnQgdGhlZSwgdGhvdWdoIHRob3UgYXJ0IGJhbmlzaGVkLgoKUk9NRU8KCiAgICBZZXQgJ2JhbmlzaGVkJz8gSGFuZyB1cCBwaGlsb3NvcGh5IQogICAgVW5sZXNzIHBoaWxvc29waHkgY2FuIG1ha2UgYSBKdWxpZXQsCiAgICBEaXNwbGFudCBhIHRvd24sIHJldmVyc2UgYSBwcmluY2UncyBkb29tLAogICAgSXQgaGVscHMgbm90LCBpdCBwcmV2YWlscyBub3Q6IHRhbGsgbm8gbW9yZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTywgdGhlbiBJIHNlZSB0aGF0IG1hZG1lbiBoYXZlIG5vIGVhcnMuCgpST01FTwoKICAgIEhvdyBzaG91bGQgdGhleSwgd2hlbiB0aGF0IHdpc2UgbWVuIGhhdmUgbm8gZXllcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTGV0IG1lIGRpc3B1dGUgd2l0aCB0aGVlIG9mIHRoeSBlc3RhdGUuCgpST01FTwoKICAgIFRob3UgY2Fuc3Qgbm90IHNwZWFrIG9mIHRoYXQgdGhvdSBkb3N0IG5vdCBmZWVsOgogICAgV2VydCB0aG91IGFzIHlvdW5nIGFzIEksIEp1bGlldCB0aHkgbG92ZSwKICAgIEFuIGhvdXIgYnV0IG1hcnJpZWQsIFR5YmFsdCBtdXJkZXJlZCwKICAgIERvdGluZyBsaWtlIG1lIGFuZCBsaWtlIG1lIGJhbmlzaGVkLAogICAgVGhlbiBtaWdodHN0IHRob3Ugc3BlYWssIHRoZW4gbWlnaHRzdCB0aG91IHRlYXIgdGh5IGhhaXIsCiAgICBBbmQgZmFsbCB1cG9uIHRoZSBncm91bmQsIGFzIEkgZG8gbm93LAogICAgVGFraW5nIHRoZSBtZWFzdXJlIG9mIGFuIHVubWFkZSBncmF2ZS4KCiAgICBLbm9ja2luZyB3aXRoaW4KCkZSSUFSIExBVVJFTkNFCgogICAgQXJpc2U7IG9uZSBrbm9ja3M7IGdvb2QgUm9tZW8sIGhpZGUgdGh5c2VsZi4KClJPTUVPCgogICAgTm90IEk7IHVubGVzcyB0aGUgYnJlYXRoIG9mIGhlYXJ0c2ljayBncm9hbnMsCiAgICBNaXN0LWxpa2UsIGluZm9sZCBtZSBmcm9tIHRoZSBzZWFyY2ggb2YgZXllcy4KCiAgICBLbm9ja2luZwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIYXJrLCBob3cgdGhleSBrbm9jayEgV2hvJ3MgdGhlcmUIFJvbWVvLCBhcmlzZTsKICAgIFRob3Ugd2lsdCBiZSB0YWtlbi4gU3RheSBhd2hpbGUhIFN0YW5kIHVwOwoKICAgIEtub2NraW5nCiAgICBSdW4gdG8gbXkgc3R1ZHkuIEJ5IGFuZCBieSEgR29kJ3Mgd2lsbCwKICAgIFdoYXQgc2ltcGxlbmVzcyBpcyB0aGlzISBJIGNvbWUsIEkgY29tZSEKCiAgICBLbm9ja2luZwogICAgV2hvIGtub2NrcyBzbyBoYXJkPyB3aGVuY2UgY29tZSB5b3UIHdoYXQncyB5b3VyIHdpbGwCgpOdXJzZQoKICAgIFtXaXRoaW5dIExldCBtZSBjb21lIGluLCBhbmQgeW91IHNoYWxsIGtub3cKICAgIG15IGVycmFuZDsKICAgIEkgY29tZSBmcm9tIExhZHkgSnVsaWV0LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXZWxjb21lLCB0aGVuLgoKICAgIEVudGVyIE51cnNlCgpOdXJzZQoKICAgIE8gaG9seSBmcmlhciwgTywgdGVsbCBtZSwgaG9seSBmcmlhciwKICAgIFdoZXJlIGlzIG15IGxhZHkncyBsb3JkLCB3aGVyZSdzIFJvbWVvPwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGVyZSBvbiB0aGUgZ3JvdW5kLCB3aXRoIGhpcyBvd24gdGVhcnMgbWFkZSBkcnVuay4KCk51cnNlCgogICAgTywgaGUgaXMgZXZlbiBpbiBteSBtaXN0cmVzcycgY2FzZSwKICAgIEp1c3QgaW4gaGVyIGNhc2UhIE8gd29mdWwgc3ltcGF0aHkhCiAgICBQaXRlb3VzIHByZWRpY2FtZW50ISBFdmVuIHNvIGxpZXMgc2hlLAogICAgQmx1YmJlcmluZyBhbmQgd2VlcGluZywgd2VlcGluZyBhbmQgYmx1YmJlcmluZy4KICAgIFN0YW5kIHVwLCBzdGFuZCB1cDsgc3RhbmQsIGFuZCB5b3UgYmUgYSBtYW46CiAgICBGb3IgSnVsaWV0J3Mgc2FrZSwgZm9yIGhlciBzYWtlLCByaXNlIGFuZCBzdGFuZDsKICAgIFdoeSBzaG91bGQgeW91IGZhbGwgaW50byBzbyBkZWVwIGFuIE8CgpST01FTwoKICAgIE51cnNlIQoKTnVyc2UKCiAgICBBaCBzaXIhIGFoIHNpciEgV2VsbCwgZGVhdGgncyB0aGUgZW5kIG9mIGFsbC4KClJPTUVPCgogICAgU3Bha2VzdCB0aG91IG9mIEp1bGlldD8gaG93IGlzIGl0IHdpdGggaGVyPwogICAgRG90aCBzaGUgbm90IHRoaW5rIG1lIGFuIG9sZCBtdXJkZXJlciwKICAgIE5vdyBJIGhhdmUgc3RhaW4nZCB0aGUgY2hpbGRob29kIG9mIG91ciBqb3kKICAgIFdpdGggYmxvb2QgcmVtb3ZlZCBidXQgbGl0dGxlIGZyb20gaGVyIG93bj8KICAgIFdoZXJlIGlzIHNoZT8gYW5kIGhvdyBkb3RoIHNoZT8gYW5kIHdoYXQgc2F5cwogICAgTXkgY29uY2VhbCdkIGxhZHkgdG8gb3VyIGNhbmNlbGwnZCBsb3ZlPwoKTnVyc2UKCiAgICBPLCBzaGUgc2F5cyBub3RoaW5nLCBzaXIsIGJ1dCB3ZWVwcyBhbmQgd2VlcHM7CiAgICBBbmQgbm93IGZhbGxzIG9uIGhlciBiZWQ7IGFuZCB0aGVuIHN0YXJ0cyB1cCwKICAgIEFuZCBUeWJhbHQgY2FsbHM7IGFuZCB0aGVuIG9uIFJvbWVvIGNyaWVzLAogICAgQW5kIHRoZW4gZG93biBmYWxscyBhZ2Fpbi4KClJPTUVPCgogICAgQXMgaWYgdGhhdCBuYW1lLAogICAgU2hvdCBmcm9tIHRoZSBkZWFkbHkgbGV2ZWwgb2YgYSBndW4sCiAgICBEaWQgbXVyZGVyIGhlcjsgYXMgdGhhdCBuYW1lJ3MgY3Vyc2VkIGhhbmQKICAgIE11cmRlcidkIGhlciBraW5zbWFuLiBPLCB0ZWxsIG1lLCBmcmlhciwgdGVsbCBtZSwKICAgIEluIHdoYXQgdmlsZSBwYXJ0IG9mIHRoaXMgYW5hdG9teQogICAgRG90aCBteSBuYW1lIGxvZGdlPyB0ZWxsIG1lLCB0aGF0IEkgbWF5IHNhY2sKICAgIFRoZSBoYXRlZnVsIG1hbnNpb24uCgogICAgRHJhd2luZyBoaXMgc3dvcmQKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZCB0aHkgZGVzcGVyYXRlIGhhbmQ6CiAgICBBcnQgdGhvdSBhIG1hbj8gdGh5IGZvcm0gY3JpZXMgb3V0IHRob3UgYXJ0OgogICAgVGh5IHRlYXJzIGFyZSB3b21hbmlzaDsgdGh5IHdpbGQgYWN0cyBkZW5vdGUKICAgIFRoZSB1bnJlYXNvbmFibGUgZnVyeSBvZiBhIGJlYXN0OgogICAgVW5zZWVtbHkgd29tYW4gaW4gYSBzZWVtaW5nIG1hbiEKICAgIE9yIGlsbC1iZXNlZW1pbmcgYmVhc3QgaW4gc2VlbWluZyBib3RoIQogICAgVGhvdSBoYXN0IGFtYXplZCBtZTogYnkgbXkgaG9seSBvcmRlciwKICAgIEkgdGhvdWdodCB0aHkgZGlzcG9zaXRpb24gYmV0dGVyIHRlbXBlcidkLgogICAgSGFzdCB0aG91IHNsYWluIFR5YmFsdD8gd2lsdCB0aG91IHNsYXkgdGh5c2VsZj8KICAgIEFuZCBzdGF5IHRoeSBsYWR5IHRvbyB0aGF0IGxpdmVzIGluIHRoZWUsCiAgICBCeSBkb2luZyBkYW1uZWQgaGF0ZSB1cG9uIHRoeXNlbGYCiAgICBXaHkgcmFpbCdzdCB0aG91IG9uIHRoeSBiaXJ0aCwgdGhlIGhlYXZlbiwgYW5kIGVhcnRoPwogICAgU2luY2UgYmlydGgsIGFuZCBoZWF2ZW4sIGFuZCBlYXJ0aCwgYWxsIHRocmVlIGRvIG1lZXQKICAgIEluIHRoZWUgYXQgb25jZTsgd2hpY2ggdGhvdSBhdCBvbmNlIHdvdWxkc3QgbG9zZS4KICAgIEZpZSwgZmllLCB0aG91IHNoYW1lc3QgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDsKICAgIFdoaWNoLCBsaWtlIGEgdXN1cmVyLCBhYm91bmQnc3QgaW4gYWxsLAogICAgQW5kIHVzZXN0IG5vbmUgaW4gdGhhdCB0cnVlIHVzZSBpbmRlZWQKICAgIFdoaWNoIHNob3VsZCBiZWRlY2sgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDoKICAgIFRoeSBub2JsZSBzaGFwZSBpcyBidXQgYSBmb3JtIG9mIHdheCwKICAgIERpZ3Jlc3NpbmcgZnJvbSB0aGUgdmFsb3VyIG9mIGEgbWFuOwogICAgVGh5IGRlYXIgbG92ZSBzd29ybiBidXQgaG9sbG93IHBlcmp1cnksCiAgICBLaWxsaW5nIHRoYXQgbG92ZSB3aGljaCB0aG91IGhhc3Qgdm93J2QgdG8gY2hlcmlzaDsKICAgIFRoeSB3aXQsIHRoYXQgb3JuYW1lbnQgdG8gc2hhcGUgYW5kIGxvdmUsCiAgICBNaXNzaGFwZW4gaW4gdGhlIGNvbmR1Y3Qgb2YgdGhlbSBib3RoLAogICAgTGlrZSBwb3dkZXIgaW4gYSBza2l0bGVzcyBzb2xkaWVyJ3MgZmxhc2ssCiAgICBJcyBzZXQgYWZpcmUgYnkgdGhpbmUgb3duIGlnbm9yYW5jZSwKICAgIEFuZCB0aG91IGRpc21lbWJlcidkIHdpdGggdGhpbmUgb3duIGRlZmVuY2UuCiAgICBXaGF0LCByb3VzZSB0aGVlLCBtYW4hIHRoeSBKdWxpZXQgaXMgYWxpdmUsCiAgICBGb3Igd2hvc2UgZGVhciBzYWtlIHRob3Ugd2FzdCBidXQgbGF0ZWx5IGRlYWQ7CiAgICBUaGVyZSBhcnQgdGhvdSBoYXBweTogVHliYWx0IHdvdWxkIGtpbGwgdGhlZSwKICAgIEJ1dCB0aG91IHNsZXcnc3QgVHliYWx0OyB0aGVyZSBhcmUgdGhvdSBoYXBweSB0b286CiAgICBUaGUgbGF3IHRoYXQgdGhyZWF0ZW4nZCBkZWF0aCBiZWNvbWVzIHRoeSBmcmllbmQKICAgIEFuZCB0dXJucyBpdCB0byBleGlsZTsgdGhlcmUgYXJ0IHRob3UgaGFwcHk6CiAgICBBIHBhY2sgb2YgYmxlc3NpbmdzIGxpZ2h0cyB1cCB1cG9uIHRoeSBiYWNrOwogICAgSGFwcGluZXNzIGNvdXJ0cyB0aGVlIGluIGhlciBiZXN0IGFycmF5OwogICAgQnV0LCBsaWtlIGEgbWlzYmVoYXZlZCBhbmQgc3VsbGVuIHdlbmNoLAogICAgVGhvdSBwb3V0J3N0IHVwb24gdGh5IGZvcnR1bmUgYW5kIHRoeSBsb3ZlOgogICAgVGFrZSBoZWVkLCB0YWtlIGhlZWQsIGZvciBzdWNoIGRpZSBtaXNlcmFibGUuCiAgICBHbywgZ2V0IHRoZWUgdG8gdGh5IGxvdmUsIGFzIHdhcyBkZWNyZWVkLAogICAgQXNjZW5kIGhlciBjaGFtYmVyLCBoZW5jZSBhbmQgY29tZm9ydCBoZXI6CiAgICBCdXQgbG9vayB0aG91IHN0YXkgbm90IHRpbGwgdGhlIHdhdGNoIGJlIHNldCwKICAgIEZvciB0aGVuIHRob3UgY2Fuc3Qgbm90IHBhc3MgdG8gTWFudHVhOwogICAgV2hlcmUgdGhvdSBzaGFsdCBsaXZlLCB0aWxsIHdlIGNhbiBmaW5kIGEgdGltZQogICAgVG8gYmxhemUgeW91ciBtYXJyaWFnZSwgcmVjb25jaWxlIHlvdXIgZnJpZW5kcywKICAgIEJlZyBwYXJkb24gb2YgdGhlIHByaW5jZSwgYW5kIGNhbGwgdGhlZSBiYWNrCiAgICBXaXRoIHR3ZW50eSBodW5kcmVkIHRob3VzYW5kIHRpbWVzIG1vcmUgam95CiAgICBUaGFuIHRob3Ugd2VudCdzdCBmb3J0aCBpbiBsYW1lbnRhdGlvbi4KICAgIEdvIGJlZm9yZSwgbnVyc2U6IGNvbW1lbmQgbWUgdG8gdGh5IGxhZHk7CiAgICBBbmQgYmlkIGhlciBoYXN0ZW4gYWxsIHRoZSBob3VzZSB0byBiZWQsCiAgICBXaGljaCBoZWF2eSBzb3Jyb3cgbWFrZXMgdGhlbSBhcHQgdW50bzoKICAgIFJvbWVvIGlzIGNvbWluZy4KCk51cnNlCgogICAgTyBMb3JkLCBJIGNvdWxkIGhhdmUgc3RheSdkIGhlcmUgYWxsIHRoZSBuaWdodAogICAgVG8gaGVhciBnb29kIGNvdW5zZWw6IE8sIHdoYXQgbGVhcm5pbmcgaXMhCiAgICBNeSBsb3JkLCBJJ2xsIHRlbGwgbXkgbGFkeSB5b3Ugd2lsbCBjb21lLgoKUk9NRU8KCiAgICBEbyBzbywgYW5kIGJpZCBteSBzd2VldCBwcmVwYXJlIHRvIGNoaWRlLgoKTnVyc2UKCiAgICBIZXJlLCBzaXIsIGEgcmluZyBzaGUgYmlkIG1lIGdpdmUgeW91LCBzaXI6CiAgICBIaWUgeW91LCBtYWtlIGhhc3RlLCBmb3IgaXQgZ3Jvd3MgdmVyeSBsYXRlLgoKICAgIEV4aXQKClJPTUVPCgogICAgSG93IHdlbGwgbXkgY29tZm9ydCBpcyByZXZpdmVkIGJ5IHRoaXMhCgpGUklBUiBMQVVSRU5DRQoKICAgIEdvIGhlbmNlOyBnb29kIG5pZ2h0OyBhbmQgaGVyZSBzdGFuZHMgYWxsIHlvdXIgc3RhdGU6CiAgICBFaXRoZXIgYmUgZ29uZSBiZWZvcmUgdGhlIHdhdGNoIGJlIHNldCwKICAgIE9yIGJ5IHRoZSBicmVhayBvZiBkYXkgZGlzZ3Vpc2VkIGZyb20gaGVuY2U6CiAgICBTb2pvdXJuIGluIE1hbnR1YTsgSSdsbCBmaW5kIG91dCB5b3VyIG1hbiwKICAgIEFuZCBoZSBzaGFsbCBzaWduaWZ5IGZyb20gdGltZSB0byB0aW1lCiAgICBFdmVyeSBnb29kIGhhcCB0byB5b3UgdGhhdCBjaGFuY2VzIGhlcmU6CiAgICBHaXZlIG1lIHRoeSBoYW5kOyAndGlzIGxhdGU6IGZhcmV3ZWxsOyBnb29kIG5pZ2h0LgoKUk9NRU8KCiAgICBCdXQgdGhhdCBhIGpveSBwYXN0IGpveSBjYWxscyBvdXQgb24gbWUsCiAgICBJdCB3ZXJlIGEgZ3JpZWYsIHNvIGJyaWVmIHRvIHBhcnQgd2l0aCB0aGVlOiBGYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHJvb20gaW4gQ2FwdWxldCdzIGhvdXNlLgoKICAgIEVudGVyIENBUFVMRVQsIExBRFkgQ0FQVUxFVCwgYW5kIFBBUklTIAoKQ0FQVUxFVAoKICAgIFRoaW5ncyBoYXZlIGZhbGwnbiBvdXQsIHNpciwgc28gdW5sdWNraWx5LAogICAgVGhhdCB3ZSBoYXZlIGhhZCBubyB0aW1lIHRvIG1vdmUgb3VyIGRhdWdodGVyOgogICAgTG9vayB5b3UsIHNoZSBsb3ZlZCBoZXIga2luc21hbiBUeWJhbHQgZGVhcmx5LAogICAgQW5kIHNvIGRpZCBJOi0tV2VsbCwgd2Ugd2VyZSBib3JuIHRvIGRpZS4KICAgICdUaXMgdmVyeSBsYXRlLCBzaGUnbGwgbm90IGNvbWUgZG93biB0by1uaWdodDoKICAgIEkgcHJvbWlzZSB5b3UsIGJ1dCBmb3IgeW91ciBjb21wYW55LAogICAgSSB3b3VsZCBoYXZlIGJlZW4gYS1iZWQgYW4gaG91ciBhZ28uCgpQQVJJUwoKICAgIFRoZXNlIHRpbWVzIG9mIHdvZSBhZmZvcmQgbm8gdGltZSB0byB3b28uCiAgICBNYWRhbSwgZ29vZCBuaWdodDogY29tbWVuZCBtZSB0byB5b3VyIGRhdWdodGVyLgoKTEFEWSBDQVBVTEVUCgogICAgSSB3aWxsLCBhbmQga25vdyBoZXIgbWluZCBlYXJseSB0by1tb3Jyb3c7CiAgICBUby1uaWdodCBzaGUgaXMgbWV3J2QgdXAgdG8gaGVyIGhlYXZpbmVzcy4KCkNBUFVMRVQKCiAgICBTaXIgUGFyaXMsIEkgd2lsbCBtYWtlIGEgZGVzcGVyYXRlIHRlbmRlcgogICAgT2YgbXkgY2hpbGQncyBsb3ZlOiBJIHRoaW5rIHNoZSB3aWxsIGJlIHJ1bGVkCiAgICBJbiBhbGwgcmVzcGVjdHMgYnkgbWU7IG5heSwgbW9yZSwgSSBkb3VidCBpdCBub3QuCiAgICBXaWZlLCBnbyB5b3UgdG8gaGVyIGVyZSB5b3UgZ28gdG8gYmVkOwogICAgQWNxdWFpbnQgaGVyIGhlcmUgb2YgbXkgc29uIFBhcmlzJyBsb3ZlOwogICAgQW5kIGJpZCBoZXIsIG1hcmsgeW91IG1lLCBvbiBXZWRuZXNkYXkgbmV4dC0tCiAgICBCdXQsIHNvZnQhIHdoYXQgZGF5IGlzIHRoaXMCgpQQVJJUwoKICAgIE1vbmRheSwgbXkgbG9yZCwKCkNBUFVMRVQKCiAgICBNb25kYXkhIGhhLCBoYSEgV2VsbCwgV2VkbmVzZGF5IGlzIHRvbyBzb29uLAogICAgTycgVGh1cnNkYXkgbGV0IGl0IGJlOiBvJyBUaHVyc2RheSwgdGVsbCBoZXIsCiAgICBTaGUgc2hhbGwgYmUgbWFycmllZCB0byB0aGlzIG5vYmxlIGVhcmwuCiAgICBXaWxsIHlvdSBiZSByZWFkeT8gZG8geW91IGxpa2UgdGhpcyBoYXN0ZT8KICAgIFdlJ2xsIGtlZXAgbm8gZ3JlYXQgYWRvLC0tYSBmcmllbmQgb3IgdHdvOwogICAgRm9yLCBoYXJrIHlvdSwgVHliYWx0IGJlaW5nIHNsYWluIHNvIGxhdGUsCiAgICBJdCBtYXkgYmUgdGhvdWdodCB3ZSBoZWxkIGhpbSBjYXJlbGVzc2x5LAogICAgQmVpbmcgb3VyIGtpbnNtYW4sIGlmIHdlIHJldmVsIG11Y2g6CiAgICBUaGVyZWZvcmUgd2UnbGwgaGF2ZSBzb21lIGhhbGYgYSBkb3plbiBmcmllbmRzLAogICAgQW5kIHRoZXJlIGFuIGVuZC4gQnV0IHdoYXQgc2F5IHlvdSB0byBUaHVyc2RheT8KClBBUklTCgogICAgTXkgbG9yZCwgSSB3b3VsZCB0aGF0IFRodXJzZGF5IHdlcmUgdG8tbW9ycm93LgoKQ0FQVUxFVAoKICAgIFdlbGwgZ2V0IHlvdSBnb25lOiBvJyBUaHVyc2RheSBiZSBpdCwgdGhlbi4KICAgIEdvIHlvdSB0byBKdWxpZXQgZXJlIHlvdSBnbyB0byBiZWQsCiAgICBQcmVwYXJlIGhlciwgd2lmZSwgYWdhaW5zdCB0aGlzIHdlZGRpbmctZGF5LgogICAgRmFyZXdlbGwsIG15IGxvcmQuIExpZ2h0IHRvIG15IGNoYW1iZXIsIGhvIQogICAgQWZvcmUgbWUhIGl0IGlzIHNvIHZlcnkgdmVyeSBsYXRlLAogICAgVGhhdCB3ZSBtYXkgY2FsbCBpdCBlYXJseSBieSBhbmQgYnkuCiAgICBHb29kIG5pZ2h0LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gYW5kIEpVTElFVCBhYm92ZSwgYXQgdGhlIHdpbmRvdyAKCkpVTElFVAoKICAgIFdpbHQgdGhvdSBiZSBnb25lPyBpdCBpcyBub3QgeWV0IG5lYXIgZGF5OgogICAgSXQgd2FzIHRoZSBuaWdodGluZ2FsZSwgYW5kIG5vdCB0aGUgbGFyaywKICAgIFRoYXQgcGllcmNlZCB0aGUgZmVhcmZ1bCBob2xsb3cgb2YgdGhpbmUgZWFyOwogICAgTmlnaHRseSBzaGUgc2luZ3Mgb24geW9uIHBvbWVncmFuYXRlLXRyZWU6CiAgICBCZWxpZXZlIG1lLCBsb3ZlLCBpdCB3YXMgdGhlIG5pZ2h0aW5nYWxlLgoKUk9NRU8KCiAgICBJdCB3YXMgdGhlIGxhcmssIHRoZSBoZXJhbGQgb2YgdGhlIG1vcm4sCiAgICBObyBuaWdodGluZ2FsZTogbG9vaywgbG92ZSwgd2hhdCBlbnZpb3VzIHN0cmVha3MKICAgIERvIGxhY2UgdGhlIHNldmVyaW5nIGNsb3VkcyBpbiB5b25kZXIgZWFzdDoKICAgIE5pZ2h0J3MgY2FuZGxlcyBhcmUgYnVybnQgb3V0LCBhbmQgam9jdW5kIGRheQogICAgU3RhbmRzIHRpcHRvZSBvbiB0aGUgbWlzdHkgbW91bnRhaW4gdG9wcy4KICAgIEkgbXVzdCBiZSBnb25lIGFuZCBsaXZlLCBvciBzdGF5IGFuZCBkaWUuCgpKVUxJRVQKCiAgICBZb24gbGlnaHQgaXMgbm90IGRheS1saWdodCwgSSBrbm93IGl0LCBJOgogICAgSXQgaXMgc29tZSBtZXRlb3IgdGhhdCB0aGUgc3VuIGV4aGFsZXMsCiAgICBUbyBiZSB0byB0aGVlIHRoaXMgbmlnaHQgYSB0b3JjaC1iZWFyZXIsCiAgICBBbmQgbGlnaHQgdGhlZSBvbiB0aHkgd2F5IHRvIE1hbnR1YToKICAgIFRoZXJlZm9yZSBzdGF5IHlldDsgdGhvdSBuZWVkJ3N0IG5vdCB0byBiZSBnb25lLgoKUk9NRU8KCiAgICBMZXQgbWUgYmUgdGEnZW4sIGxldCBtZSBiZSBwdXQgdG8gZGVhdGg7CiAgICBJIGFtIGNvbnRlbnQsIHNvIHRob3Ugd2lsdCBoYXZlIGl0IHNvLgogICAgSSdsbCBzYXkgeW9uIGdyZXkgaXMgbm90IHRoZSBtb3JuaW5nJ3MgZXllLAogICAgJ1RpcyBidXQgdGhlIHBhbGUgcmVmbGV4IG9mIEN5bnRoaWEncyBicm93OwogICAgTm9yIHRoYXQgaXMgbm90IHRoZSBsYXJrLCB3aG9zZSBub3RlcyBkbyBiZWF0CiAgICBUaGUgdmF1bHR5IGhlYXZlbiBzbyBoaWdoIGFib3ZlIG91ciBoZWFkczoKICAgIEkgaGF2ZSBtb3JlIGNhcmUgdG8gc3RheSB0aGFuIHdpbGwgdG8gZ286CiAgICBDb21lLCBkZWF0aCwgYW5kIHdlbGNvbWUhIEp1bGlldCB3aWxscyBpdCBzby4KICAgIEhvdyBpcyd0LCBteSBzb3VsPyBsZXQncyB0YWxrOyBpdCBpcyBub3QgZGF5LgoKSlVMSUVUCgogICAgSXQgaXMsIGl0IGlzOiBoaWUgaGVuY2UsIGJlIGdvbmUsIGF3YXkhCiAgICBJdCBpcyB0aGUgbGFyayB0aGF0IHNpbmdzIHNvIG91dCBvZiB0dW5lLAogICAgU3RyYWluaW5nIGhhcnNoIGRpc2NvcmRzIGFuZCB1bnBsZWFzaW5nIHNoYXJwcy4KICAgIFNvbWUgc2F5IHRoZSBsYXJrIG1ha2VzIHN3ZWV0IGRpdmlzaW9uOwogICAgVGhpcyBkb3RoIG5vdCBzbywgZm9yIHNoZSBkaXZpZGV0aCB1czoKICAgIFNvbWUgc2F5IHRoZSBsYXJrIGFuZCBsb2F0aGVkIHRvYWQgY2hhbmdlIGV5ZXMsCiAgICBPLCBub3cgSSB3b3VsZCB0aGV5IGhhZCBjaGFuZ2VkIHZvaWNlcyB0b28hCiAgICBTaW5jZSBhcm0gZnJvbSBhcm0gdGhhdCB2b2ljZSBkb3RoIHVzIGFmZnJheSwKICAgIEh1bnRpbmcgdGhlZSBoZW5jZSB3aXRoIGh1bnQnc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cmUgd2VlcGluZyBmb3IgeW91ciBjb3VzaW4ncyBkZWF0aD8KICAgIFdoYXQsIHdpbHQgdGhvdSB3YXNoIGhpbSBmcm9tIGhpcyBncmF2ZSB3aXRoIHRlYXJzPwogICAgQW4gaWYgdGhvdSBjb3VsZHN0LCB0aG91IGNvdWxkc3Qgbm90IG1ha2UgaGltIGxpdmU7CiAgICBUaGVyZWZvcmUsIGhhdmUgZG9uZTogc29tZSBncmllZiBzaG93cyBtdWNoIG9mIGxvdmU7CiAgICBCdXQgbXVjaCBvZiBncmllZiBzaG93cyBzdGlsbCBzb21lIHdhbnQgb2Ygd2l0LgoKSlVMSUVUCgogICAgWWV0IGxldCBtZSB3ZWVwIGZvciBzdWNoIGEgZmVlbGluZyBsb3NzLgoKTEFEWSBDQVBVTEVUCgogICAgU28gc2hhbGwgeW91IGZlZWwgdGhlIGxvc3MsIGJ1dCBub3QgdGhlIGZyaWVuZAogICAgV2hpY2ggeW91IHdlZXAgZm9yLgoKSlVMSUVUCgogICAgRmVlbGluZyBzbyB0aGUgbG9zcywKICAgIENhbm5vdCBjaG9vc2UgYnV0IGV2ZXIgd2VlcCB0aGUgZnJpZW5kLgoKTEFEWSBDQVBVTEVUCgogICAgV2VsbCwgZ2lybCwgdGhvdSB3ZWVwJ3N0IG5vdCBzbyBtdWNoIGZvciBoaXMgZGVhdGgsCiAgICBBcyB0aGF0IHRoZSB2aWxsYWluIGxpdmVzIHdoaWNoIHNsYXVnaHRlcidkIGhpbS4KCkpVTElFVAoKICAgIFdoYXQgdmlsbGFpbiBtYWRhbT8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoYXQgc2FtZSB2aWxsYWluLCBSb21lby4KCkpVTElFVAoKICAgIFtBc2lkZV0gVmlsbGFpbiBhbmQgaGUgYmUgbWFueSBtaWxlcyBhc3VuZGVyLi0tCiAgICBHb2QgUGFyZG9uIGhpbSEgSSBkbywgd2l0aCBhbGwgbXkgaGVhcnQ7CiAgICBBbmQgeWV0IG5vIG1hbiBsaWtlIGhlIGRvdGggZ3JpZXZlIG15IGhlYXJ0LgoKTEFEWSBDQVBVTEVUCgogICAgVGhhdCBpcywgYmVjYXVzZSB0aGUgdHJhaXRvciBtdXJkZXJlciBsaXZlcy4KCkpVTElFVAoKICAgIEF5LCBtYWRhbSwgZnJvbSB0aGUgcmVhY2ggb2YgdGhlc2UgbXkgaGFuZHM6CiAgICBXb3VsZCBub25lIGJ1dCBJIG1pZ2h0IHZlbmdlIG15IGNvdXNpbidzIGRlYXRoIQoKTEFEWSBDQVBVTEVUCgogICAgV2Ugd2lsbCBoYXZlIHZlbmdlYW5jZSBmb3IgaXQsIGZlYXIgdGhvdSBub3Q6CiAgICBUaGVuIHdlZXAgbm8gbW9yZS4gSSdsbCBzZW5kIHRvIG9uZSBpbiBNYW50dWEsCiAgICBXaGVyZSB0aGF0IHNhbWUgYmFuaXNoJ2QgcnVuYWdhdGUgZG90aCBsaXZlLAogICAgU2hhbGwgZ2l2ZSBoaW0gc3VjaCBhbiB1bmFjY3VzdG9tJ2QgZHJhbSwKICAgIFRoYXQgaGUgc2hhbGwgc29vbiBrZWVwIFR5YmFsdCBjb21wYW55OgogICAgQW5kIHRoZW4sIEkgaG9wZSwgdGhvdSB3aWx0IGJlIHNhdGlzZmllZC4KCkpVTElFVAoKICAgIEluZGVlZCwgSSBuZXZlciBzaGFsbCBiZSBzYXRpc2ZpZWQKICAgIFdpdGggUm9tZW8sIHRpbGwgSSBiZWhvbGQgaGltLS1kZWFkLS0KICAgIElzIG15IHBvb3IgaGVhcnQgZm9yIGEga2luc21hbiB2ZXgnZC4KICAgIE1hZGFtLCBpZiB5b3UgY291bGQgZmluZCBvdXQgYnV0IGEgbWFuCiAgICBUbyBiZWFyIGEgcG9pc29uLCBJIHdvdWxkIHRlbXBlciBpdDsKICAgIFRoYXQgUm9tZW8gc2hvdWxkLCB1cG9uIHJlY2VpcHQgdGhlcmVvZiwKICAgIFNvb24gc2xlZXAgaW4gcXVpZXQuIE8sIGhvdyBteSBoZWFydCBhYmhvcnMKICAgIFRvIGhlYXIgaGltIG5hbWVkLCBhbmQgY2Fubm90IGNvbWUgdG8gaGltLgogICAgVG8gd3JlYWsgdGhlIGxvdmUgSSBib3JlIG15IGNvdXNpbgogICAgVXBvbiBoaXMgYm9keSB0aGF0IHNsYXVnaHRlcidkIGhpbSEKCkxBRFkgQ0FQVUxFVAoKICAgIEZpbmQgdGhvdSB0aGUgbWVhbnMsIGFuZCBJJ2xsIGZpbmQgc3VjaCBhIG1hbi4KICAgIEJ1dCBub3cgSSdsbCB0ZWxsIHRoZWUgam95ZnVsIHRpZGluZ3MsIGdpcmwuCgpKVUxJRVQKCiAgICBBbmQgam95IGNvbWVzIHdlbGwgaW4gc3VjaCBhIG5lZWR5IHRpbWU6CiAgICBXaGF0IGFyZSB0aGV5LCBJIGJlc2VlY2ggeW91ciBsYWR5c2hpcD8KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHdlbGwsIHRob3UgaGFzdCBhIGNhcmVmdWwgZmF0aGVyLCBjaGlsZDsKICAgIE9uZSB3aG8sIHRvIHB1dCB0aGVlIGZyb20gdGh5IGhlYXZpbmVzcywKICAgIEhhdGggc29ydGVkIG91dCBhIHN1ZGRlbiBkYXkgb2Ygam95LAogICAgVGhhdCB0aG91IGV4cGVjdCdzdCBub3Qgbm9yIEkgbG9vaydkIG5vdCBmb3IuCgpKVUxJRVQKCiAgICBNYWRhbSwgaW4gaGFwcHkgdGltZSwgd2hhdCBkYXkgaXMgdGhhdD8KCkxBRFkgQ0FQVUxFVAoKICAgIE1hcnJ5LCBteSBjaGlsZCwgZWFybHkgbmV4dCBUaHVyc2RheSBtb3JuLAogICAgVGhlIGdhbGxhbnQsIHlvdW5nIGFuZCBub2JsZSBnZW50bGVtYW4sCiAgICBUaGUgQ291bnR5IFBhcmlzLCBhdCBTYWludCBQZXRlcidzIENodXJjaCwKICAgIFNoYWxsIGhhcHBpbHkgbWFrZSB0aGVlIHRoZXJlIGEgam95ZnVsIGJyaWRlLgoKSlVMSUVUCgogICAgTm93LCBieSBTYWludCBQZXRlcidzIENodXJjaCBhbmQgUGV0ZXIgdG9vLAogICAgSGUgc2hhbGwgbm90IG1ha2UgbWUgdGhlcmUgYSBqb3lmdWwgYnJpZGUuCiAgICBJIHdvbmRlciBhdCB0aGlzIGhhc3RlOyB0aGF0IEkgbXVzdCB3ZWQKICAgIEVyZSBoZSwgdGhhdCBzaG91bGQgYmUgaHVzYmFuZCwgY29tZXMgdG8gd29vLgogICAgSSBwcmF5IHlvdSwgdGVsbCBteSBsb3JkIGFuZCBmYXRoZXIsIG1hZGFtLAogICAgSSB3aWxsIG5vdCBtYXJyeSB5ZXQ7IGFuZCwgd2hlbiBJIGRvLCBJIHN3ZWFyLAogICAgSXQgc2hhbGwgYmUgUm9tZW8sIHdob20geW91IGtub3cgSSBoYXRlLAogICAgUmF0aGVyIHRoYW4gUGFyaXMuIFRoZXNlIGFyZSBuZXdzIGluZGVlZCEKCkxBRFkgQ0FQVUxFVAoKICAgIEhlcmUgY29tZXMgeW91ciBmYXRoZXI7IHRlbGwgaGltIHNvIHlvdXJzZWxmLAogICAgQW5kIHNlZSBob3cgaGUgd2lsbCB0YWtlIGl0IGF0IHlvdXIgaGFuZHMuCgogICAgRW50ZXIgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBXaGVuIHRoZSBzdW4gc2V0cywgdGhlIGFpciBkb3RoIGRyaXp6bGUgZGV3OwogICAgQnV0IGZvciB0aGUgc3Vuc2V0IG9mIG15IGJyb3RoZXIncyBzb24KICAgIEl0IHJhaW5zIGRvd25yaWdodC4KICAgIEhvdyBub3chIGEgY29uZHVpdCwgZ2lybD8gd2hhdCwgc3RpbGwgaW4gdGVhcnMCiAgICBFdmVybW9yZSBzaG93ZXJpbmcIEluIG9uZSBsaXR0bGUgYm9keQogICAgVGhvdSBjb3VudGVyZmVpdCdzdCBhIGJhcmssIGEgc2VhLCBhIHdpbmQ7CiAgICBGb3Igc3RpbGwgdGh5IGV5ZXMsIHdoaWNoIEkgbWF5IGNhbGwgdGhlIHNlYSwKICAgIERvIGViYiBhbmQgZmxvdyB3aXRoIHRlYXJzOyB0aGUgYmFyayB0aHkgYm9keSBpcywKICAgIFNhaWxpbmcgaW4gdGhpcyBzYWx0IGZsb29kOyB0aGUgd2luZHMsIHRoeSBzaWdoczsKICAgIFdobywgcmFnaW5nIHdpdGggdGh5IHRlYXJzLCBhbmQgdGhleSB3aXRoIHRoZW0sCiAgICBXaXRob3V0IGEgc3VkZGVuIGNhbG0sIHdpbGwgb3ZlcnNldAogICAgVGh5IHRlbXBlc3QtdG9zc2VkIGJvZHkuIEhvdyBub3csIHdpZmUhCiAgICBIYXZlIHlvdSBkZWxpdmVyJ2QgdG8gaGVyIG91ciBkZWNyZWUCgpMQURZIENBUFVMRVQKCiAgICBBeSwgc2lyOyBidXQgc2hlIHdpbGwgbm9uZSwgc2hlIGdpdmVzIHlvdSB0aGFua3MuCiAgICBJIHdvdWxkIHRoZSBmb29sIHdlcmUgbWFycmllZCB0byBoZXIgZ3JhdmUhCgpDQVBVTEVUCgogICAgU29mdCEgdGFrZSBtZSB3aXRoIHlvdSwgdGFrZSBtZSB3aXRoIHlvdSwgd2lmZS4KICAgIEhvdyEgd2lsbCBzaGUgbm9uZT8gZG90aCBzaGUgbm90IGdpdmUgdXMgdGhhbmtzPwogICAgSXMgc2hlIG5vdCBwcm91ZD8gZG90aCBzaGUgbm90IGNvdW50IGhlciBibGVzdCwKICAgIFVud29ydGh5IGFzIHNoZSBpcywgdGhhdCB3ZSBoYXZlIHdyb3VnaHQKICAgIFNvIHdvcnRoeSBhIGdlbnRsZW1hbiB0byBiZSBoZXIgYnJpZGVncm9vbT8KCkpVTElFVAoKICAgIE5vdCBwcm91ZCwgeW91IGhhdmU7IGJ1dCB0aGFua2Z1bCwgdGhhdCB5b3UgaGF2ZToKICAgIFByb3VkIGNhbiBJIG5ldmVyIGJlIG9mIHdoYXQgSSBoYXRlOwogICAgQnV0IHRoYW5rZnVsIGV2ZW4gZm9yIGhhdGUsIHRoYXQgaXMgbWVhbnQgbG92ZS4KCkNBUFVMRVQKCiAgICBIb3cgbm93LCBob3cgbm93LCBjaG9wLWxvZ2ljISBXaGF0IGlzIHRoaXMCiAgICAnUHJvdWQsJyBhbmQgJ0kgdGhhbmsgeW91LCcgYW5kICdJIHRoYW5rIHlvdSBub3Q7JwogICAgQW5kIHlldCAnbm90IHByb3VkLCcgbWlzdHJlc3MgbWluaW9uLCB5b3UsCiAgICBUaGFuayBtZSBubyB0aGFua2luZ3MsIG5vciwgcHJvdWQgbWUgbm8gcHJvdWRzLAogICAgQnV0IGZldHRsZSB5b3VyIGZpbmUgam9pbnRzICdnYWluc3QgVGh1cnNkYXkgbmV4dCwKICAgIFRvIGdvIHdpdGggUGFyaXMgdG8gU2FpbnQgUGV0ZXIncyBDaHVyY2gsCiAgICBPciBJIHdpbGwgZHJhZyB0aGVlIG9uIGEgaHVyZGxlIHRoaXRoZXIuCiAgICBPdXQsIHlvdSBncmVlbi1zaWNrbmVzcyBjYXJyaW9uISBvdXQsIHlvdSBiYWdnYWdlIQogICAgWW91IHRhbGxvdy1mYWNlIQoKTEFEWSBDQVBVTEVUCgogICAgRmllLCBmaWUhIHdoYXQsIGFyZSB5b3UgbWFkPwoKSlVMSUVUCgogICAgR29vZCBmYXRoZXIsIEkgYmVzZWVjaCB5b3Ugb24gbXkga25lZXMsCiAgICBIZWFyIG1lIHdpdGggcGF0aWVuY2UgYnV0IHRvIHNwZWFrIGEgd29yZC4KCkNBUFVMRVQKCiAgICBIYW5nIHRoZWUsIHlvdW5nIGJhZ2dhZ2UhIGRpc29iZWRpZW50IHdyZXRjaCEKICAgIEkgdGVsbCB0aGVlIHdoYXQ6IGdldCB0aGVlIHRvIGNodXJjaCBvJyBUaHVyc2RheSwKICAgIE9yIG5ldmVyIGFmdGVyIGxvb2sgbWUgaW4gdGhlIGZhY2U6CiAgICBTcGVhayBub3QsIHJlcGx5IG5vdCwgZG8gbm90IGFuc3dlciBtZTsKICAgIE15IGZpbmdlcnMgaXRjaC4gV2lmZSwgd2Ugc2NhcmNlIHRob3VnaHQgdXMgYmxlc3QKICAgIFRoYXQgR29kIGhhZCBsZW50IHVzIGJ1dCB0aGlzIG9ubHkgY2hpbGQ7CiAgICBCdXQgbm93IEkgc2VlIHRoaXMgb25lIGlzIG9uZSB0b28gbXVjaCwKICAgIEFuZCB0aGF0IHdlIGhhdmUgYSBjdXJzZSBpbiBoYXZpbmcgaGVyOgogICAgT3V0IG9uIGhlciwgaGlsZGluZyEKCk51cnNlCgogICAgR29kIGluIGhlYXZlbiBibGVzcyBoZXIhCiAgICBZb3UgYXJlIHRvIGJsYW1lLCBteSBsb3JkLCB0byByYXRlIGhlciBzby4KCkNBUFVMRVQKCiAgICBBbmQgd2h5LCBteSBsYWR5IHdpc2RvbT8gaG9sZCB5b3VyIHRvbmd1ZSwKICAgIEdvb2QgcHJ1ZGVuY2U7IHNtYXR0ZXIgd2l0aCB5b3VyIGdvc3NpcHMsIGdvLgoKTnVyc2UKCiAgICBJIHNwZWFrIG5vIHRyZWFzb24uCgpDQVBVTEVUCgogICAgTywgR29kIHllIGdvZC1kZW4uCgpOdXJzZQoKICAgIE1heSBub3Qgb25lIHNwZWFrPwoKQ0FQVUxFVAoKICAgIFBlYWNlLCB5b3UgbXVtYmxpbmcgZm9vbCEKICAgIFV0dGVyIHlvdXIgZ3Jhdml0eSBvJ2VyIGEgZ29zc2lwJ3MgYm93bDsKICAgIEZvciBoZXJlIHdlIG5lZWQgaXQgbm90LgoKTEFEWSBDQVBVTEVUCgogICAgWW91IGFyZSB0b28gaG90LgoKQ0FQVUxFVAoKICAgIEdvZCdzIGJyZWFkISBpdCBtYWtlcyBtZSBtYWQ6CiAgICBEYXksIG5pZ2h0LCBob3VyLCB0aWRlLCB0aW1lLCB3b3JrLCBwbGF5LAogICAgQWxvbmUsIGluIGNvbXBhbnksIHN0aWxsIG15IGNhcmUgaGF0aCBiZWVuCiAgICBUbyBoYXZlIGhlciBtYXRjaCdkOiBhbmQgaGF2aW5nIG5vdyBwcm92aWRlZAogICAgQSBnZW50bGVtYW4gb2Ygbm9ibGUgcGFyZW50YWdlLAogICAgT2YgZmFpciBkZW1lc25lcywgeW91dGhmdWwsIGFuZCBub2JseSB0cmFpbidkLAogICAgU3R1ZmYnZCwgYXMgdGhleSBzYXksIHdpdGggaG9ub3VyYWJsZSBwYXJ0cywKICAgIFByb3BvcnRpb24nZCBhcyBvbmUncyB0aG91Z2h0IHdvdWxkIHdpc2ggYSBtYW47CiAgICBBbmQgdGhlbiB0byBoYXZlIGEgd3JldGNoZWQgcHVsaW5nIGZvb2wsCiAgICBBIHdoaW5pbmcgbWFtbWV0LCBpbiBoZXIgZm9ydHVuZSdzIHRlbmRlciwKICAgIFRvIGFuc3dlciAnSSdsbCBub3Qgd2VkOyBJIGNhbm5vdCBsb3ZlLAogICAgSSBhbSB0b28geW91bmc7IEkgcHJheSB5b3UsIHBhcmRvbiBtZS4nCiAgICBCdXQsIGFzIHlvdSB3aWxsIG5vdCB3ZWQsIEknbGwgcGFyZG9uIHlvdToKICAgIEdyYXplIHdoZXJlIHlvdSB3aWxsIHlvdSBzaGFsbCBub3QgaG91c2Ugd2l0aCBtZToKICAgIExvb2sgdG8ndCwgdGhpbmsgb24ndCwgSSBkbyBub3QgdXNlIHRvIGplc3QuCiAgICBUaHVyc2RheSBpcyBuZWFyOyBsYXkgaGFuZCBvbiBoZWFydCwgYWR2aXNlOgogICAgQW4geW91IGJlIG1pbmUsIEknbGwgZ2l2ZSB5b3UgdG8gbXkgZnJpZW5kOwogICAgQW5kIHlvdSBiZSBub3QsIGhhbmcsIGJlZywgc3RhcnZlLCBkaWUgaW4KICAgIHRoZSBzdHJlZXRzLAogICAgRm9yLCBieSBteSBzb3VsLCBJJ2xsIG5lJ2VyIGFja25vd2xlZGdlIHRoZWUsCiAgICBOb3Igd2hhdCBpcyBtaW5lIHNoYWxsIG5ldmVyIGRvIHRoZWUgZ29vZDoKICAgIFRydXN0IHRvJ3QsIGJldGhpbmsgeW91OyBJJ2xsIG5vdCBiZSBmb3Jzd29ybi4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBJcyB0aGVyZSBubyBwaXR5IHNpdHRpbmcgaW4gdGhlIGNsb3VkcywKICAgIFRoYXQgc2VlcyBpbnRvIHRoZSBib3R0b20gb2YgbXkgZ3JpZWYCiAgICBPLCBzd2VldCBteSBtb3RoZXIsIGNhc3QgbWUgbm90IGF3YXkhCiAgICBEZWxheSB0aGlzIG1hcnJpYWdlIGZvciBhIG1vbnRoLCBhIHdlZWs7CiAgICBPciwgaWYgeW91IGRvIG5vdCwgbWFrZSB0aGUgYnJpZGFsIGJlZAogICAgSW4gdGhhdCBkaW0gbW9udW1lbnQgd2hlcmUgVHliYWx0IGxpZXMuCgpMQURZIENBUFVMRVQKCiAgICBUYWxrIG5vdCB0byBtZSwgZm9yIEknbGwgbm90IHNwZWFrIGEgd29yZDoKICAgIERvIGFzIHRob3Ugd2lsdCwgZm9yIEkgaGF2ZSBkb25lIHdpdGggdGhlZS4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIEdvZCEtLU8gbnVyc2UsIGhvdyBzaGFsbCB0aGlzIGJlIHByZXZlbnRlZD8KICAgIE15IGh1c2JhbmQgaXMgb24gZWFydGgsIG15IGZhaXRoIGluIGhlYXZlbjsKICAgIEhvdyBzaGFsbCB0aGF0IGZhaXRoIHJldHVybiBhZ2FpbiB0byBlYXJ0aCwKICAgIFVubGVzcyB0aGF0IGh1c2JhbmQgc2VuZCBpdCBtZSBmcm9tIGhlYXZlbgogICAgQnkgbGVhdmluZyBlYXJ0aD8gY29tZm9ydCBtZSwgY291bnNlbCBtZS4KICAgIEFsYWNrLCBhbGFjaywgdGhhdCBoZWF2ZW4gc2hvdWxkIHByYWN0aXNlIHN0cmF0YWdlbXMKICAgIFVwb24gc28gc29mdCBhIHN1YmplY3QgYXMgbXlzZWxmIQogICAgV2hhdCBzYXknc3QgdGhvdT8gaGFzdCB0aG91IG5vdCBhIHdvcmQgb2Ygam95PwogICAgU29tZSBjb21mb3J0LCBudXJzZS4KCk51cnNlCgogICAgRmFpdGgsIGhlcmUgaXQgaXMuCiAgICBSb21lbyBpcyBiYW5pc2gnZDsgYW5kIGFsbCB0aGUgd29ybGQgdG8gbm90aGluZywKICAgIFRoYXQgaGUgZGFyZXMgbmUnZXIgY29tZSBiYWNrIHRvIGNoYWxsZW5nZSB5b3U7CiAgICBPciwgaWYgaGUgZG8sIGl0IG5lZWRzIG11c3QgYmUgYnkgc3RlYWx0aC4KICAgIFRoZW4sIHNpbmNlIHRoZSBjYXNlIHNvIHN0YW5kcyBhcyBub3cgaXQgZG90aCwKICAgIEkgdGhpbmsgaXQgYmVzdCB5b3UgbWFycmllZCB3aXRoIHRoZSBjb3VudHkuCiAgICBPLCBoZSdzIGEgbG92ZWx5IGdlbnRsZW1hbiEKICAgIFJvbWVvJ3MgYSBkaXNoY2xvdXQgdG8gaGltOiBhbiBlYWdsZSwgbWFkYW0sCiAgICBIYXRoIG5vdCBzbyBncmVlbiwgc28gcXVpY2ssIHNvIGZhaXIgYW4gZXllCiAgICBBcyBQYXJpcyBoYXRoLiBCZXNocmV3IG15IHZlcnkgaGVhcnQsCiAgICBJIHRoaW5rIHlvdSBhcmUgaGFwcHkgaW4gdGhpcyBzZWNvbmQgbWF0Y2gsCiAgICBGb3IgaXQgZXhjZWxzIHlvdXIgZmlyc3Q6IG9yIGlmIGl0IGRpZCBub3QsCiAgICBZb3VyIGZpcnN0IGlzIGRlYWQ7IG9yICd0d2VyZSBhcyBnb29kIGhlIHdlcmUsCiAgICBBcyBsaXZpbmcgaGVyZSBhbmQgeW91IG5vIHVzZSBvZiBoaW0uCgpKVUxJRVQKCiAgICBTcGVha2VzdCB0aG91IGZyb20gdGh5IGhlYXJ0PwoKTnVyc2UKCiAgICBBbmQgZnJvbSBteSBzb3VsIHRvbzsKICAgIE9yIGVsc2UgYmVzaHJldyB0aGVtIGJvdGguCgpKVUxJRVQKCiAgICBBbWVuIQoKTnVyc2UKCiAgICBXaGF0PwoKSlVMSUVUCgogICAgV2VsbCwgdGhvdSBoYXN0IGNvbWZvcnRlZCBtZSBtYXJ2ZWxsb3VzIG11Y2guCiAgICBHbyBpbjogYW5kIHRlbGwgbXkgbGFkeSBJIGFtIGdvbmUsCiAgICBIYXZpbmcgZGlzcGxlYXNlZCBteSBmYXRoZXIsIHRvIExhdXJlbmNlJyBjZWxsLAogICAgVG8gbWFrZSBjb25mZXNzaW9uIGFuZCB0byBiZSBhYnNvbHZlZC4KCk51cnNlCgogICAgTWFycnksIEkgd2lsbDsgYW5kIHRoaXMgaXMgd2lzZWx5IGRvbmUuCgogICAgRXhpdAoKSlVMSUVUCgogICAgQW5jaWVudCBkYW1uYXRpb24hIE8gbW9zdCB3aWNrZWQgZmllbmQhCiAgICBJcyBpdCBtb3JlIHNpbiB0byB3aXNoIG1lIHRodXMgZm9yc3dvcm4sCiAgICBPciB0byBkaXNwcmFpc2UgbXkgbG9yZCB3aXRoIHRoYXQgc2FtZSB0b25ndWUKICAgIFdoaWNoIHNoZSBoYXRoIHByYWlzZWQgaGltIHdpdGggYWJvdmUgY29tcGFyZQogICAgU28gbWFueSB0aG91c2FuZCB0aW1lcz8gR28sIGNvdW5zZWxsb3I7CiAgICBUaG91IGFuZCBteSBib3NvbSBoZW5jZWZvcnRoIHNoYWxsIGJlIHR3YWluLgogICAgSSdsbCB0byB0aGUgZnJpYXIsIHRvIGtub3cgaGlzIHJlbWVkeToKICAgIElmIGFsbCBlbHNlIGZhaWwsIG15c2VsZiBoYXZlIHBvd2VyIHRvIGRpZS4KCiAgICBFeGl0CgpBQ1QgSVYKU0NFTkUgSS4gRnJpYXIgTGF1cmVuY2UncyBjZWxsLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUyAKCkZSSUFSIExBVVJFTkNFCgogICAgT24gVGh1cnNkYXksIHNpcj8gdGhlIHRpbWUgaXMgdmVyeSBzaG9ydC4KClBBUklTCgogICAgTXkgZmF0aGVyIENhcHVsZXQgd2lsbCBoYXZlIGl0IHNvOwogICAgQW5kIEkgYW0gbm90aGluZyBzbG93IHRvIHNsYWNrIGhpcyBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgWW91IHNheSB5b3UgZG8gbm90IGtub3cgdGhlIGxhZHkncyBtaW5kOgogICAgVW5ldmVuIGlzIHRoZSBjb3Vyc2UsIEkgbGlrZSBpdCBub3QuCgpQQVJJUwoKICAgIEltbW9kZXJhdGVseSBzaGUgd2VlcHMgZm9yIFR5YmFsdCdzIGRlYXRoLAogICAgQW5kIHRoZXJlZm9yZSBoYXZlIEkgbGl0dGxlIHRhbGsnZCBvZiBsb3ZlOwogICAgRm9yIFZlbnVzIHNtaWxlcyBub3QgaW4gYSBob3VzZSBvZiB0ZWFycy4KICAgIE5vdywgc2lyLCBoZXIgZmF0aGVyIGNvdW50cyBpdCBkYW5nZXJvdXMKICAgIFRoYXQgc2hlIGRvdGggZ2l2ZSBoZXIgc29ycm93IHNvIG11Y2ggc3dheSwKICAgIEFuZCBpbiBoaXMgd2lzZG9tIGhhc3RlcyBvdXIgbWFycmlhZ2UsCiAgICBUbyBzdG9wIHRoZSBpbnVuZGF0aW9uIG9mIGhlciB0ZWFyczsKICAgIFdoaWNoLCB0b28gbXVjaCBtaW5kZWQgYnkgaGVyc2VsZiBhbG9uZSwKICAgIE1heSBiZSBwdXQgZnJvbSBoZXIgYnkgc29jaWV0eToKICAgIE5vdyBkbyB5b3Uga25vdyB0aGUgcmVhc29uIG9mIHRoaXMgaGFzdGUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFtBc2lkZV0gSSB3b3VsZCBJIGtuZXcgbm90IHdoeSBpdCBzaG91bGQgYmUgc2xvdydkLgogICAgTG9vaywgc2lyLCBoZXJlIGNvbWVzIHRoZSBsYWR5IHRvd2FyZHMgbXkgY2VsbC4KCiAgICBFbnRlciBKVUxJRVQKClBBUklTCgogICAgSGFwcGlseSBtZXQsIG15IGxhZHkgYW5kIG15IHdpZmUhCgpKVUxJRVQKCiAgICBUaGF0IG1heSBiZSwgc2lyLCB3aGVuIEkgbWF5IGJlIGEgd2lmZS4KClBBUklTCgogICAgVGhhdCBtYXkgYmUgbXVzdCBiZSwgbG92ZSwgb24gVGh1cnNkYXkgbmV4dC4KCkpVTElFVAoKICAgIFdoYXQgbXVzdCBiZSBzaGFsbCBiZS4KCkZSSUFSIExBVVJFTkNFCgogICAgVGhhdCdzIGEgY2VydGFpbiB0ZXh0LgoKUEFSSVMKCiAgICBDb21lIHlvdSB0byBtYWtlIGNvbmZlc3Npb24gdG8gdGhpcyBmYXRoZXICgpKVUxJRVQKCiAgICBUbyBhbnN3ZXIgdGhhdCwgSSBzaG91bGQgY29uZmVzcyB0byB5b3UuCgpQQVJJUwoKICAgIERvIG5vdCBkZW55IHRvIGhpbSB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSSB3aWxsIGNvbmZlc3MgdG8geW91IHRoYXQgSSBsb3ZlIGhpbS4KClBBUklTCgogICAgU28gd2lsbCB5ZSwgSSBhbSBzdXJlLCB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSWYgSSBkbyBzbywgaXQgd2lsbCBiZSBvZiBtb3JlIHByaWNlLAogICAgQmVpbmcgc3Bva2UgYmVoaW5kIHlvdXIgYmFjaywgdGhhbiB0byB5b3VyIGZhY2UuCgpQQVJJUwoKICAgIFBvb3Igc291bCwgdGh5IGZhY2UgaXMgbXVjaCBhYnVzZWQgd2l0aCB0ZWFycy4KCkpVTElFVAoKICAgIFRoZSB0ZWFycyBoYXZlIGdvdCBzbWFsbCB2aWN0b3J5IGJ5IHRoYXQ7CiAgICBGb3IgaXQgd2FzIGJhZCBlbm91Z2ggYmVmb3JlIHRoZWlyIHNwaXRlLgoKUEFSSVMKCiAgICBUaG91IHdyb25nJ3N0IGl0LCBtb3JlIHRoYW4gdGVhcnMsIHdpdGggdGhhdCByZXBvcnQuCgpKVUxJRVQKCiAgICBUaGF0IGlzIG5vIHNsYW5kZXIsIHNpciwgd2hpY2ggaXMgYSB0cnV0aDsKICAgIEFuZCB3aGF0IEkgc3Bha2UsIEkgc3Bha2UgaXQgdG8gbXkgZmFjZS4KClBBUklTCgogICAgVGh5IGZhY2UgaXMgbWluZSwgYW5kIHRob3UgaGFzdCBzbGFuZGVyJ2QgaXQuCgpKVUxJRVQKCiAgICBJdCBtYXkgYmUgc28sIGZvciBpdCBpcyBub3QgbWluZSBvd24uCiAgICBBcmUgeW91IGF0IGxlaXN1cmUsIGhvbHkgZmF0aGVyLCBub3c7CiAgICBPciBzaGFsbCBJIGNvbWUgdG8geW91IGF0IGV2ZW5pbmcgbWFzcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTXkgbGVpc3VyZSBzZXJ2ZXMgbWUsIHBlbnNpdmUgZGF1Z2h0ZXIsIG5vdy4KICAgIE15IGxvcmQsIHdlIG11c3QgZW50cmVhdCB0aGUgdGltZSBhbG9uZS4KClBBUklTCgogICAgR29kIHNoaWVsZCBJIHNob3VsZCBkaXN0dXJiIGRldm90aW9uIQogICAgSnVsaWV0LCBvbiBUaHVyc2RheSBlYXJseSB3aWxsIEkgcm91c2UgeWU6CiAgICBUaWxsIHRoZW4sIGFkaWV1OyBhbmQga2VlcCB0aGlzIGhvbHkga2lzcy4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIHNodXQgdGhlIGRvb3IhIGFuZCB3aGVuIHRob3UgaGFzdCBkb25lIHNvLAogICAgQ29tZSB3ZWVwIHdpdGggbWU7IHBhc3QgaG9wZSwgcGFzdCBjdXJlLCBwYXN0IGhlbHAhCgpGUklBUiBMQVVSRU5DRQoKICAgIEFoLCBKdWxpZXQsIEkgYWxyZWFkeSBrbm93IHRoeSBncmllZjsKICAgIEl0IHN0cmFpbnMgbWUgcGFzdCB0aGUgY29tcGFzcyBvZiBteSB3aXRzOgogICAgSSBoZWFyIHRob3UgbXVzdCwgYW5kIG5vdGhpbmcgbWF5IHByb3JvZ3VlIGl0LAogICAgT24gVGh1cnNkYXkgbmV4dCBiZSBtYXJyaWVkIHRvIHRoaXMgY291bnR5LgoKSlVMSUVUCgogICAgVGVsbCBtZSBub3QsIGZyaWFyLCB0aGF0IHRob3UgaGVhcidzdCBvZiB0aGlzLAogICAgVW5sZXNzIHRob3UgdGVsbCBtZSBob3cgSSBtYXkgcHJldmVudCBpdDoKICAgIElmLCBpbiB0aHkgd2lzZG9tLCB0aG91IGNhbnN0IGdpdmUgbm8gaGVscCwKICAgIERvIHRob3UgYnV0IGNhbGwgbXkgcmVzb2x1dGlvbiB3aXNlLAogICAgQW5kIHdpdGggdGhpcyBrbmlmZSBJJ2xsIGhlbHAgaXQgcHJlc2VudGx5LgogICAgR29kIGpvaW4nZCBteSBoZWFydCBhbmQgUm9tZW8ncywgdGhvdSBvdXIgaGFuZHM7CiAgICBBbmQgZXJlIHRoaXMgaGFuZCwgYnkgdGhlZSB0byBSb21lbyBzZWFsJ2QsCiAgICBTaGFsbCBiZSB0aGUgbGFiZWwgdG8gYW5vdGhlciBkZWVkLAogICAgT3IgbXkgdHJ1ZSBoZWFydCB3aXRoIHRyZWFjaGVyb3VzIHJldm9sdAogICAgVHVybiB0byBhbm90aGVyLCB0aGlzIHNoYWxsIHNsYXkgdGhlbSBib3RoOgogICAgVGhlcmVmb3JlLCBvdXQgb2YgdGh5IGxvbmctZXhwZXJpZW5jZWQgdGltZSwKICAgIEdpdmUgbWUgc29tZSBwcmVzZW50IGNvdW5zZWwsIG9yLCBiZWhvbGQsCiAgICAnVHdpeHQgbXkgZXh0cmVtZXMgYW5kIG1lIHRoaXMgYmxvb2R5IGtuaWZlCiAgICBTaGFsbCBwbGF5IHRoZSB1bXBpcmUsIGFyYml0cmF0aW5nIHRoYXQKICAgIFdoaWNoIHRoZSBjb21taXNzaW9uIG9mIHRoeSB5ZWFycyBhbmQgYXJ0CiAgICBDb3VsZCB0byBubyBpc3N1ZSBvZiB0cnVlIGhvbm91ciBicmluZy4KICAgIEJlIG5vdCBzbyBsb25nIHRvIHNwZWFrOyBJIGxvbmcgdG8gZGllLAogICAgSWYgd2hhdCB0aG91IHNwZWFrJ3N0IHNwZWFrIG5vdCBvZiByZW1lZHkuCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvbGQsIGRhdWdodGVyOiBJIGRvIHNweSBhIGtpbmQgb2YgaG9wZSwKICAgIFdoaWNoIGNyYXZlcyBhcyBkZXNwZXJhdGUgYW4gZXhlY3V0aW9uLgogICAgQXMgdGhhdCBpcyBkZXNwZXJhdGUgd2hpY2ggd2Ugd291bGQgcHJldmVudC4KICAgIElmLCByYXRoZXIgdGhhbiB0byBtYXJyeSBDb3VudHkgUGFyaXMsCiAgICBUaG91IGhhc3QgdGhlIHN0cmVuZ3RoIG9mIHdpbGwgdG8gc2xheSB0aHlzZWxmLAogICAgVGhlbiBpcyBpdCBsaWtlbHkgdGhvdSB3aWx0IHVuZGVydGFrZQogICAgQSB0aGluZyBsaWtlIGRlYXRoIHRvIGNoaWRlIGF3YXkgdGhpcyBzaGFtZSwKICAgIFRoYXQgY29wZXN0IHdpdGggZGVhdGggaGltc2VsZiB0byBzY2FwZSBmcm9tIGl0OgogICAgQW5kLCBpZiB0aG91IGRhcmVzdCwgSSdsbCBnaXZlIHRoZWUgcmVtZWR5LgoKSlVMSUVUCgogICAgTywgYmlkIG1lIGxlYXAsIHJhdGhlciB0aGFuIG1hcnJ5IFBhcmlzLAogICAgRnJvbSBvZmYgdGhlIGJhdHRsZW1lbnRzIG9mIHlvbmRlciB0b3dlcjsKICAgIE9yIHdhbGsgaW4gdGhpZXZpc2ggd2F5czsgb3IgYmlkIG1lIGx1cmsKICAgIFdoZXJlIHNlcnBlbnRzIGFyZTsgY2hhaW4gbWUgd2l0aCByb2FyaW5nIGJlYXJzOwogICAgT3Igc2h1dCBtZSBuaWdodGx5IGluIGEgY2hhcm5lbC1ob3VzZSwKICAgIE8nZXItY292ZXInZCBxdWl0ZSB3aXRoIGRlYWQgbWVuJ3MgcmF0dGxpbmcgYm9uZXMsCiAgICBXaXRoIHJlZWt5IHNoYW5rcyBhbmQgeWVsbG93IGNoYXBsZXNzIHNrdWxsczsKICAgIE9yIGJpZCBtZSBnbyBpbnRvIGEgbmV3LW1hZGUgZ3JhdmUKICAgIEFuZCBoaWRlIG1lIHdpdGggYSBkZWFkIG1hbiBpbiBoaXMgc2hyb3VkOwogICAgVGhpbmdzIHRoYXQsIHRvIGhlYXIgdGhlbSB0b2xkLCBoYXZlIG1hZGUgbWUgdHJlbWJsZTsKICAgIEFuZCBJIHdpbGwgZG8gaXQgd2l0aG91dCBmZWFyIG9yIGRvdWJ0LAogICAgVG8gbGl2ZSBhbiB1bnN0YWluJ2Qgd2lmZSB0byBteSBzd2VldCBsb3ZlLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIb2xkLCB0aGVuOyBnbyBob21lLCBiZSBtZXJyeSwgZ2l2ZSBjb25zZW50CiAgICBUbyBtYXJyeSBQYXJpczogV2VkbmVzZGF5IGlzIHRvLW1vcnJvdzoKICAgIFRvLW1vcnJvdyBuaWdodCBsb29rIHRoYXQgdGhvdSBsaWUgYWxvbmU7CiAgICBMZXQgbm90IHRoeSBudXJzZSBsaWUgd2l0aCB0aGVlIGluIHRoeSBjaGFtYmVyOgogICAgVGFrZSB0aG91IHRoaXMgdmlhbCwgYmVpbmcgdGhlbiBpbiBiZWQsCiAgICBBbmQgdGhpcyBkaXN0aWxsZWQgbGlxdW9yIGRyaW5rIHRob3Ugb2ZmOwogICAgV2hlbiBwcmVzZW50bHkgdGhyb3VnaCBhbGwgdGh5IHZlaW5zIHNoYWxsIHJ1bgogICAgQSBjb2xkIGFuZCBkcm93c3kgaHVtb3VyLCBmb3Igbm8gcHVsc2UKICAgIFNoYWxsIGtlZXAgaGlzIG5hdGl2ZSBwcm9ncmVzcywgYnV0IHN1cmNlYXNlOgogICAgTm8gd2FybXRoLCBubyBicmVhdGgsIHNoYWxsIHRlc3RpZnkgdGhvdSBsaXZlc3Q7CiAgICBUaGUgcm9zZXMgaW4gdGh5IGxpcHMgYW5kIGNoZWVrcyBzaGFsbCBmYWRlCiAgICBUbyBwYWx5IGFzaGVzLCB0aHkgZXllcycgd2luZG93cyBmYWxsLAogICAgTGlrZSBkZWF0aCwgd2hlbiBoZSBzaHV0cyB1cCB0aGUgZGF5IG9mIGxpZmU7CiAgICBFYWNoIHBhcnQsIGRlcHJpdmVkIG9mIHN1cHBsZSBnb3Zlcm5tZW50LAogICAgU2hhbGwsIHN0aWZmIGFuZCBzdGFyayBhbmQgY29sZCwgYXBwZWFyIGxpa2UgZGVhdGg6CiAgICBBbmQgaW4gdGhpcyBib3Jyb3cnZCBsaWtlbmVzcyBvZiBzaHJ1bmsgZGVhdGgKICAgIFRob3Ugc2hhbHQgY29udGludWUgdHdvIGFuZCBmb3J0eSBob3VycywKICAgIEFuZCB0aGVuIGF3YWtlIGFzIGZyb20gYSBwbGVhc2FudCBzbGVlcC4KICAgIE5vdywgd2hlbiB0aGUgYnJpZGVncm9vbSBpbiB0aGUgbW9ybmluZyBjb21lcwogICAgVG8gcm91c2UgdGhlZSBmcm9tIHRoeSBiZWQsIHRoZXJlIGFydCB0aG91IGRlYWQ6CiAgICBUaGVuLCBhcyB0aGUgbWFubmVyIG9mIG91ciBjb3VudHJ5IGlzLAogICAgSW4gdGh5IGJlc3Qgcm9iZXMgdW5jb3ZlcidkIG9uIHRoZSBiaWVyCiAgICBUaG91IHNoYWx0IGJlIGJvcm5lIHRvIHRoYXQgc2FtZSBhbmNpZW50IHZhdWx0CiAgICBXaGVyZSBhbGwgdGhlIGtpbmRyZWQgb2YgdGhlIENhcHVsZXRzIGxpZS4KICAgIEluIHRoZSBtZWFuIHRpbWUsIGFnYWluc3QgdGhvdSBzaGFsdCBhd2FrZSwKICAgIFNoYWxsIFJvbWVvIGJ5IG15IGxldHRlcnMga25vdyBvdXIgZHJpZnQsCiAgICBBbmQgaGl0aGVyIHNoYWxsIGhlIGNvbWU6IGFuZCBoZSBhbmQgSQogICAgV2lsbCB3YXRjaCB0aHkgd2FraW5nLCBhbmQgdGhhdCB2ZXJ5IG5pZ2h0CiAgICBTaGFsbCBSb21lbyBiZWFyIHRoZWUgaGVuY2UgdG8gTWFudHVhLgogICAgQW5kIHRoaXMgc2hhbGwgZnJlZSB0aGVlIGZyb20gdGhpcyBwcmVzZW50IHNoYW1lOwogICAgSWYgbm8gaW5jb25zdGFudCB0b3ksIG5vciB3b21hbmlzaCBmZWFyLAogICAgQWJhdGUgdGh5IHZhbG91ciBpbiB0aGUgYWN0aW5nIGl0LgoKSlVMSUVUCgogICAgR2l2ZSBtZSwgZ2l2ZSBtZSEgTywgdGVsbCBub3QgbWUgb2YgZmVhciEKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZDsgZ2V0IHlvdSBnb25lLCBiZSBzdHJvbmcgYW5kIHByb3NwZXJvdXMKICAgIEluIHRoaXMgcmVzb2x2ZTogSSdsbCBzZW5kIGEgZnJpYXIgd2l0aCBzcGVlZAogICAgVG8gTWFudHVhLCB3aXRoIG15IGxldHRlcnMgdG8gdGh5IGxvcmQuCgpKVUxJRVQKCiAgICBMb3ZlIGdpdmUgbWUgc3RyZW5ndGghIGFuZCBzdHJlbmd0aCBzaGFsbCBoZWxwIGFmZm9yZC4KICAgIEZhcmV3ZWxsLCBkZWFyIGZhdGhlciEKCiAgICBFeGV1bnQKClNDRU5FIElJLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIE51cnNlLCBhbmQgdHdvIFNlcnZpbmdtZW4gCgpDQVBVTEVUCgogICAgU28gbWFueSBndWVzdHMgaW52aXRlIGFzIGhlcmUgYXJlIHdyaXQuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGdvIGhpcmUgbWUgdHdlbnR5IGN1bm5pbmcgY29va3MuCgpTZWNvbmQgU2VydmFudAoKICAgIFlvdSBzaGFsbCBoYXZlIG5vbmUgaWxsLCBzaXI7IGZvciBJJ2xsIHRyeSBpZiB0aGV5CiAgICBjYW4gbGljayB0aGVpciBmaW5nZXJzLgoKQ0FQVUxFVAoKICAgIEhvdyBjYW5zdCB0aG91IHRyeSB0aGVtIHNvPwoKU2Vjb25kIFNlcnZhbnQKCiAgICBNYXJyeSwgc2lyLCAndGlzIGFuIGlsbCBjb29rIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBvd24gZmluZ2VyczogdGhlcmVmb3JlIGhlIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBmaW5nZXJzIGdvZXMgbm90IHdpdGggbWUuCgpDQVBVTEVUCgogICAgR28sIGJlIGdvbmUuCgogICAgRXhpdCBTZWNvbmQgU2VydmFudAogICAgV2Ugc2hhbGwgYmUgbXVjaCB1bmZ1cm5pc2hlZCBmb3IgdGhpcyB0aW1lLgogICAgV2hhdCwgaXMgbXkgZGF1Z2h0ZXIgZ29uZSB0byBGcmlhciBMYXVyZW5jZT8KCk51cnNlCgogICAgQXksIGZvcnNvb3RoLgoKQ0FQVUxFVAoKICAgIFdlbGwsIGhlIG1heSBjaGFuY2UgdG8gZG8gc29tZSBnb29kIG9uIGhlcjoKICAgIEEgcGVldmlzaCBzZWxmLXdpbGwnZCBoYXJsb3RyeSBpdCBpcy4KCk51cnNlCgogICAgU2VlIHdoZXJlIHNoZSBjb21lcyBmcm9tIHNocmlmdCB3aXRoIG1lcnJ5IGxvb2suCgogICAgRW50ZXIgSlVMSUVUCgpDQVBVTEVUCgogICAgSG93IG5vdywgbXkgaGVhZHN0cm9uZyEgd2hlcmUgaGF2ZSB5b3UgYmVlbiBnYWRkaW5nPwoKSlVMSUVUCgogICAgV2hlcmUgSSBoYXZlIGxlYXJuJ2QgbWUgdG8gcmVwZW50IHRoZSBzaW4KICAgIE9mIGRpc29iZWRpZW50IG9wcG9zaXRpb24KICAgIFRvIHlvdSBhbmQgeW91ciBiZWhlc3RzLCBhbmQgYW0gZW5qb2luJ2QKICAgIEJ5IGhvbHkgTGF1cmVuY2UgdG8gZmFsbCBwcm9zdHJhdGUgaGVyZSwKICAgIEFuZCBiZWcgeW91ciBwYXJkb246IHBhcmRvbiwgSSBiZXNlZWNoIHlvdSEKICAgIEhlbmNlZm9yd2FyZCBJIGFtIGV2ZXIgcnVsZWQgYnkgeW91LgoKQ0FQVUxFVAoKICAgIFNlbmQgZm9yIHRoZSBjb3VudHk7IGdvIHRlbGwgaGltIG9mIHRoaXM6CiAgICBJJ2xsIGhhdmUgdGhpcyBrbm90IGtuaXQgdXAgdG8tbW9ycm93IG1vcm5pbmcuCgpKVUxJRVQKCiAgICBJIG1ldCB0aGUgeW91dGhmdWwgbG9yZCBhdCBMYXVyZW5jZScgY2VsbDsKICAgIEFuZCBnYXZlIGhpbSB3aGF0IGJlY29tZWQgbG92ZSBJIG1pZ2h0LAogICAgTm90IHN0ZXAgbydlciB0aGUgYm91bmRzIG9mIG1vZGVzdHkuCgpDQVBVTEVUCgogICAgV2h5LCBJIGFtIGdsYWQgb24ndDsgdGhpcyBpcyB3ZWxsOiBzdGFuZCB1cDoKICAgIFRoaXMgaXMgYXMndCBzaG91bGQgYmUuIExldCBtZSBzZWUgdGhlIGNvdW50eTsKICAgIEF5LCBtYXJyeSwgZ28sIEkgc2F5LCBhbmQgZmV0Y2ggaGltIGhpdGhlci4KICAgIE5vdywgYWZvcmUgR29kISB0aGlzIHJldmVyZW5kIGhvbHkgZnJpYXIsCiAgICBPdXIgd2hvbGUgY2l0eSBpcyBtdWNoIGJvdW5kIHRvIGhpbS4KCkpVTElFVAoKICAgIE51cnNlLCB3aWxsIHlvdSBnbyB3aXRoIG1lIGludG8gbXkgY2xvc2V0LAogICAgVG8gaGVscCBtZSBzb3J0IHN1Y2ggbmVlZGZ1bCBvcm5hbWVudHMKICAgIEFzIHlvdSB0aGluayBmaXQgdG8gZnVybmlzaCBtZSB0by1tb3Jyb3cCgpMQURZIENBUFVMRVQKCiAgICBObywgbm90IHRpbGwgVGh1cnNkYXk7IHRoZXJlIGlzIHRpbWUgZW5vdWdoLgoKQ0FQVUxFVAoKICAgIEdvLCBudXJzZSwgZ28gd2l0aCBoZXI6IHdlJ2xsIHRvIGNodXJjaCB0by1tb3Jyb3cuCgogICAgRXhldW50IEpVTElFVCBhbmQgTnVyc2UKCkxBRFkgQ0FQVUxFVAoKICAgIFdlIHNoYWxsIGJlIHNob3J0IGluIG91ciBwcm92aXNpb246CiAgICAnVGlzIG5vdyBuZWFyIG5pZ2h0LgoKQ0FQVUxFVAoKICAgIFR1c2gsIEkgd2lsbCBzdGlyIGFib3V0LAogICAgQW5kIGFsbCB0aGluZ3Mgc2hhbGwgYmUgd2VsbCwgSSB3YXJyYW50IHRoZWUsIHdpZmU6CiAgICBHbyB0aG91IHRvIEp1bGlldCwgaGVscCB0byBkZWNrIHVwIGhlcjsKICAgIEknbGwgbm90IHRvIGJlZCB0by1uaWdodDsgbGV0IG1lIGFsb25lOwogICAgSSdsbCBwbGF5IHRoZSBob3VzZXdpZmUgZm9yIHRoaXMgb25jZS4gV2hhdCwgaG8hCiAgICBUaGV5IGFyZSBhbGwgZm9ydGguIFdlbGwsIEkgd2lsbCB3YWxrIG15c2VsZgogICAgVG8gQ291bnR5IFBhcmlzLCB0byBwcmVwYXJlIGhpbSB1cAogICAgQWdhaW5zdCB0by1tb3Jyb3c6IG15IGhlYXJ0IGlzIHdvbmRyb3VzIGxpZ2h0LAogICAgU2luY2UgdGhpcyBzYW1lIHdheXdhcmQgZ2lybCBpcyBzbyByZWNsYWltJ2QuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEp1bGlldCdzIGNoYW1iZXIuCgogICAgRW50ZXIgSlVMSUVUIGFuZCBOdXJzZSAKCkpVTElFVAoKICAgIEF5LCB0aG9zZSBhdHRpcmVzIGFyZSBiZXN0OiBidXQsIGdlbnRsZSBudXJzZSwKICAgIEkgcHJheSB0aGVlLCBsZWF2ZSBtZSB0byBteSBzZWxmIHRvLW5pZ2h0LAogICAgRm9yIEkgaGF2ZSBuZWVkIG9mIG1hbnkgb3Jpc29ucwogICAgVG8gbW92ZSB0aGUgaGVhdmVucyB0byBzbWlsZSB1cG9uIG15IHN0YXRlLAogICAgV2hpY2gsIHdlbGwgdGhvdSBrbm93J3N0LCBpcyBjcm9zcywgYW5kIGZ1bGwgb2Ygc2luLgoKICAgIEVudGVyIExBRFkgQ0FQVUxFVAoKTEFEWSBDQVBVTEVUCgogICAgV2hhdCwgYXJlIHlvdSBidXN5LCBobz8gbmVlZCB5b3UgbXkgaGVscD8KCkpVTElFVAoKICAgIE5vLCBtYWRhbTsgd2UgaGF2ZSBjdWxsJ2Qgc3VjaCBuZWNlc3NhcmllcwogICAgQXMgYXJlIGJlaG92ZWZ1bCBmb3Igb3VyIHN0YXRlIHRvLW1vcnJvdzoKICAgIFNvIHBsZWFzZSB5b3UsIGxldCBtZSBub3cgYmUgbGVmdCBhbG9uZSwKICAgIEFuZCBsZXQgdGhlIG51cnNlIHRoaXMgbmlnaHQgc2l0IHVwIHdpdGggeW91OwogICAgRm9yLCBJIGFtIHN1cmUsIHlvdSBoYXZlIHlvdXIgaGFuZHMgZnVsbCBhbGwsCiAgICBJbiB0aGlzIHNvIHN1ZGRlbiBidXNpbmVzcy4KCkxBRFkgQ0FQVUxFVAoKICAgIEdvb2QgbmlnaHQ6CiAgICBHZXQgdGhlZSB0byBiZWQsIGFuZCByZXN0OyBmb3IgdGhvdSBoYXN0IG5lZWQuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkpVTElFVAoKICAgIEZhcmV3ZWxsISBHb2Qga25vd3Mgd2hlbiB3ZSBzaGFsbCBtZWV0IGFnYWluLgogICAgSSBoYXZlIGEgZmFpbnQgY29sZCBmZWFyIHRocmlsbHMgdGhyb3VnaCBteSB2ZWlucywKICAgIFRoYXQgYWxtb3N0IGZyZWV6ZXMgdXAgdGhlIGhlYXQgb2YgbGlmZToKICAgIEknbGwgY2FsbCB0aGVtIGJhY2sgYWdhaW4gdG8gY29tZm9ydCBtZToKICAgIE51cnNlISBXaGF0IHNob3VsZCBzaGUgZG8gaGVyZT8KICAgIE15IGRpc21hbCBzY2VuZSBJIG5lZWRzIG11c3QgYWN0IGFsb25lLgogICAgQ29tZSwgdmlhbC4KICAgIFdoYXQgaWYgdGhpcyBtaXh0dXJlIGRvIG5vdCB3b3JrIGF0IGFsbD8KICAgIFNoYWxsIEkgYmUgbWFycmllZCB0aGVuIHRvLW1vcnJvdyBtb3JuaW5nPwogICAgTm8sIG5vOiB0aGlzIHNoYWxsIGZvcmJpZCBpdDogbGllIHRob3UgdGhlcmUuCgogICAgTGF5aW5nIGRvd24gaGVyIGRhZ2dlcgogICAgV2hhdCBpZiBpdCBiZSBhIHBvaXNvbiwgd2hpY2ggdGhlIGZyaWFyCiAgICBTdWJ0bHkgaGF0aCBtaW5pc3RlcidkIHRvIGhhdmUgbWUgZGVhZCwKICAgIExlc3QgaW4gdGhpcyBtYXJyaWFnZSBoZSBzaG91bGQgYmUgZGlzaG9ub3VyJ2QsCiAgICBCZWNhdXNlIGhlIG1hcnJpZWQgbWUgYmVmb3JlIHRvIFJvbWVvPwogICAgSSBmZWFyIGl0IGlzOiBhbmQgeWV0LCBtZXRoaW5rcywgaXQgc2hvdWxkIG5vdCwKICAgIEZvciBoZSBoYXRoIHN0aWxsIGJlZW4gdHJpZWQgYSBob2x5IG1hbi4KICAgIEhvdyBpZiwgd2hlbiBJIGFtIGxhaWQgaW50byB0aGUgdG9tYiwKICAgIEkgd2FrZSBiZWZvcmUgdGhlIHRpbWUgdGhhdCBSb21lbwogICAgQ29tZSB0byByZWRlZW0gbWUIHRoZXJlJ3MgYSBmZWFyZnVsIHBvaW50IQogICAgU2hhbGwgSSBub3QsIHRoZW4sIGJlIHN0aWZsZWQgaW4gdGhlIHZhdWx0LAogICAgVG8gd2hvc2UgZm91bCBtb3V0aCBubyBoZWFsdGhzb21lIGFpciBicmVhdGhlcyBpbiwKICAgIEFuZCB0aGVyZSBkaWUgc3RyYW5nbGVkIGVyZSBteSBSb21lbyBjb21lcz8KICAgIE9yLCBpZiBJIGxpdmUsIGlzIGl0IG5vdCB2ZXJ5IGxpa2UsCiAgICBUaGUgaG9ycmlibGUgY29uY2VpdCBvZiBkZWF0aCBhbmQgbmlnaHQsCiAgICBUb2dldGhlciB3aXRoIHRoZSB0ZXJyb3Igb2YgdGhlIHBsYWNlLC0tCiAgICBBcyBpbiBhIHZhdWx0LCBhbiBhbmNpZW50IHJlY2VwdGFjbGUsCiAgICBXaGVyZSwgZm9yIHRoZXNlIG1hbnkgaHVuZHJlZCB5ZWFycywgdGhlIGJvbmVzCiAgICBPZiBhbGwgbXkgYnVyaWVkIGFuY2VzdG9ycyBhcmUgcGFja2VkOgogICAgV2hlcmUgYmxvb2R5IFR5YmFsdCwgeWV0IGJ1dCBncmVlbiBpbiBlYXJ0aCwKICAgIExpZXMgZmVzdGVyaW5nIGluIGhpcyBzaHJvdWQ7IHdoZXJlLCBhcyB0aGV5IHNheSwKICAgIEF0IHNvbWUgaG91cnMgaW4gdGhlIG5pZ2h0IHNwaXJpdHMgcmVzb3J0Oy0tCiAgICBBbGFjaywgYWxhY2ssIGlzIGl0IG5vdCBsaWtlIHRoYXQgSSwKICAgIFNvIGVhcmx5IHdha2luZywgd2hhdCB3aXRoIGxvYXRoc29tZSBzbWVsbHMsCiAgICBBbmQgc2hyaWVrcyBsaWtlIG1hbmRyYWtlcycgdG9ybiBvdXQgb2YgdGhlIGVhcnRoLAogICAgVGhhdCBsaXZpbmcgbW9ydGFscywgaGVhcmluZyB0aGVtLCBydW4gbWFkOi0tCiAgICBPLCBpZiBJIHdha2UsIHNoYWxsIEkgbm90IGJlIGRpc3RyYXVnaHQsCiAgICBFbnZpcm9uZWQgd2l0aCBhbGwgdGhlc2UgaGlkZW91cyBmZWFycz8KICAgIEFuZCBtYWRseSBwbGF5IHdpdGggbXkgZm9yZWZhdGhlcidzIGpvaW50cz8KICAgIEFuZCBwbHVjayB0aGUgbWFuZ2xlZCBUeWJhbHQgZnJvbSBoaXMgc2hyb3VkPwogICAgQW5kLCBpbiB0aGlzIHJhZ2UsIHdpdGggc29tZSBncmVhdCBraW5zbWFuJ3MgYm9uZSwKICAgIEFzIHdpdGggYSBjbHViLCBkYXNoIG91dCBteSBkZXNwZXJhdGUgYnJhaW5zPwogICAgTywgbG9vayEgbWV0aGlua3MgSSBzZWUgbXkgY291c2luJ3MgZ2hvc3QKICAgIFNlZWtpbmcgb3V0IFJvbWVvLCB0aGF0IGRpZCBzcGl0IGhpcyBib2R5CiAgICBVcG9uIGEgcmFwaWVyJ3MgcG9pbnQ6IHN0YXksIFR5YmFsdCwgc3RheSEKICAgIFJvbWVvLCBJIGNvbWUhIHRoaXMgZG8gSSBkcmluayB0byB0aGVlLgoKICAgIFNoZSBmYWxscyB1cG9uIGhlciBiZWQsIHdpdGhpbiB0aGUgY3VydGFpbnMKClNDRU5FIElWLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgSG9sZCwgdGFrZSB0aGVzZSBrZXlzLCBhbmQgZmV0Y2ggbW9yZSBzcGljZXMsIG51cnNlLgoKTnVyc2UKCiAgICBUaGV5IGNhbGwgZm9yIGRhdGVzIGFuZCBxdWluY2VzIGluIHRoZSBwYXN0cnkuCgogICAgRW50ZXIgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIENvbWUsIHN0aXIsIHN0aXIsIHN0aXIhIHRoZSBzZWNvbmQgY29jayBoYXRoIGNyb3cnZCwKICAgIFRoZSBjdXJmZXctYmVsbCBoYXRoIHJ1bmcsICd0aXMgdGhyZWUgbydjbG9jazoKICAgIExvb2sgdG8gdGhlIGJha2VkIG1lYXRzLCBnb29kIEFuZ2VsaWNhOgogICAgU3BhcmUgbm90IGZvciB0aGUgY29zdC4KCk51cnNlCgogICAgR28sIHlvdSBjb3QtcXVlYW4sIGdvLAogICAgR2V0IHlvdSB0byBiZWQ7IGZhaXRoLCBZb3UnbGwgYmUgc2ljayB0by1tb3Jyb3cKICAgIEZvciB0aGlzIG5pZ2h0J3Mgd2F0Y2hpbmcuCgpDQVBVTEVUCgogICAgTm8sIG5vdCBhIHdoaXQ6IHdoYXQhIEkgaGF2ZSB3YXRjaCdkIGVyZSBub3cKICAgIEFsbCBuaWdodCBmb3IgbGVzc2VyIGNhdXNlLCBhbmQgbmUnZXIgYmVlbiBzaWNrLgoKTEFEWSBDQVBVTEVUCgogICAgQXksIHlvdSBoYXZlIGJlZW4gYSBtb3VzZS1odW50IGluIHlvdXIgdGltZTsKICAgIEJ1dCBJIHdpbGwgd2F0Y2ggeW91IGZyb20gc3VjaCB3YXRjaGluZyBub3cuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBBIGplYWxvdXMgaG9vZCwgYSBqZWFsb3VzIGhvb2QhCgogICAgRW50ZXIgdGhyZWUgb3IgZm91ciBTZXJ2aW5nbWVuLCB3aXRoIHNwaXRzLCBsb2dzLCBhbmQgYmFza2V0cwogICAgTm93LCBmZWxsb3csCiAgICBXaGF0J3MgdGhlcmUCgpGaXJzdCBTZXJ2YW50CgogICAgVGhpbmdzIGZvciB0aGUgY29vaywgc2lyOyBidXQgSSBrbm93IG5vdCB3aGF0LgoKQ0FQVUxFVAoKICAgIE1ha2UgaGFzdGUsIG1ha2UgaGFzdGUuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGZldGNoIGRyaWVyIGxvZ3M6CiAgICBDYWxsIFBldGVyLCBoZSB3aWxsIHNob3cgdGhlZSB3aGVyZSB0aGV5IGFyZS4KClNlY29uZCBTZXJ2YW50CgogICAgSSBoYXZlIGEgaGVhZCwgc2lyLCB0aGF0IHdpbGwgZmluZCBvdXQgbG9ncywKICAgIEFuZCBuZXZlciB0cm91YmxlIFBldGVyIGZvciB0aGUgbWF0dGVyLgoKICAgIEV4aXQKCkNBUFVMRVQKCiAgICBNYXNzLCBhbmQgd2VsbCBzYWlkOyBhIG1lcnJ5IHdob3Jlc29uLCBoYSEKICAgIFRob3Ugc2hhbHQgYmUgbG9nZ2VyLWhlYWQuIEdvb2QgZmFpdGgsICd0aXMgZGF5OgogICAgVGhlIGNvdW50eSB3aWxsIGJlIGhlcmUgd2l0aCBtdXNpYyBzdHJhaWdodCwKICAgIEZvciBzbyBoZSBzYWlkIGhlIHdvdWxkOiBJIGhlYXIgaGltIG5lYXIuCgogICAgTXVzaWMgd2l0aGluCiAgICBOdXJzZSEgV2lmZSEgV2hhdCwgaG8hIFdoYXQsIG51cnNlLCBJIHNheSEKCiAgICBSZS1lbnRlciBOdXJzZQogICAgR28gd2FrZW4gSnVsaWV0LCBnbyBhbmQgdHJpbSBoZXIgdXA7CiAgICBJJ2xsIGdvIGFuZCBjaGF0IHdpdGggUGFyaXM6IGhpZSwgbWFrZSBoYXN0ZSwKICAgIE1ha2UgaGFzdGU7IHRoZSBicmlkZWdyb29tIGhlIGlzIGNvbWUgYWxyZWFkeToKICAgIE1ha2UgaGFzdGUsIEkgc2F5LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gSnVsaWV0J3MgY2hhbWJlci4KCiAgICBFbnRlciBOdXJzZSAKCk51cnNlCgogICAgTWlzdHJlc3MhIHdoYXQsIG1pc3RyZXNzISBKdWxpZXQhIGZhc3QsIEkgd2FycmFudCBoZXIsIHNoZToKICAgIFdoeSwgbGFtYiEgd2h5LCBsYWR5ISBmaWUsIHlvdSBzbHVnLWEtYmVkIQogICAgV2h5LCBsb3ZlLCBJIHNheSEgbWFkYW0hIHN3ZWV0LWhlYXJ0ISB3aHksIGJyaWRlIQogICAgV2hhdCwgbm90IGEgd29yZD8geW91IHRha2UgeW91ciBwZW5ueXdvcnRocyBub3c7CiAgICBTbGVlcCBmb3IgYSB3ZWVrOyBmb3IgdGhlIG5leHQgbmlnaHQsIEkgd2FycmFudCwKICAgIFRoZSBDb3VudHkgUGFyaXMgaGF0aCBzZXQgdXAgaGlzIHJlc3QsCiAgICBUaGF0IHlvdSBzaGFsbCByZXN0IGJ1dCBsaXR0bGUuIEdvZCBmb3JnaXZlIG1lLAogICAgTWFycnksIGFuZCBhbWVuLCBob3cgc291bmQgaXMgc2hlIGFzbGVlcCEKICAgIEkgbXVzdCBuZWVkcyB3YWtlIGhlci4gTWFkYW0sIG1hZGFtLCBtYWRhbSEKICAgIEF5LCBsZXQgdGhlIGNvdW50eSB0YWtlIHlvdSBpbiB5b3VyIGJlZDsKICAgIEhlJ2xsIGZyaWdodCB5b3UgdXAsIGknIGZhaXRoLiBXaWxsIGl0IG5vdCBiZT8KCiAgICBVbmRyYXdzIHRoZSBjdXJ0YWlucwogICAgV2hhdCwgZHJlc3MnZCEgYW5kIGluIHlvdXIgY2xvdGhlcyEgYW5kIGRvd24gYWdhaW4hCiAgICBJIG11c3QgbmVlZHMgd2FrZSB5b3U7IExhZHkhIGxhZHkhIGxhZHkhCiAgICBBbGFzLCBhbGFzISBIZWxwLCBoZWxwISBteSBsYWR5J3MgZGVhZCEKICAgIE8sIHdlbGwtYS1kYXksIHRoYXQgZXZlciBJIHdhcyBib3JuIQogICAgU29tZSBhcXVhIHZpdGFlLCBobyEgTXkgbG9yZCEgbXkgbGFkeSEKCiAgICBFbnRlciBMQURZIENBUFVMRVQKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgaGVyZT8KCk51cnNlCgogICAgTyBsYW1lbnRhYmxlIGRheSEKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgaXMgdGhlIG1hdHRlcj8KCk51cnNlCgogICAgTG9vaywgbG9vayEgTyBoZWF2eSBkYXkhCgpMQURZIENBUFVMRVQKCiAgICBPIG1lLCBPIG1lISBNeSBjaGlsZCwgbXkgb25seSBsaWZlLAogICAgUmV2aXZlLCBsb29rIHVwLCBvciBJIHdpbGwgZGllIHdpdGggdGhlZSEKICAgIEhlbHAsIGhlbHAhIENhbGwgaGVscC4KCiAgICBFbnRlciBDQVBVTEVUCgpDQVBVTEVUCgogICAgRm9yIHNoYW1lLCBicmluZyBKdWxpZXQgZm9ydGg7IGhlciBsb3JkIGlzIGNvbWUuCgpOdXJzZQoKICAgIFNoZSdzIGRlYWQsIGRlY2Vhc2VkLCBzaGUncyBkZWFkOyBhbGFjayB0aGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgQWxhY2sgdGhlIGRheSwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCEKCkNBUFVMRVQKCiAgICBIYSEgbGV0IG1lIHNlZSBoZXI6IG91dCwgYWxhcyEgc2hlJ3MgY29sZDoKICAgIEhlciBibG9vZCBpcyBzZXR0bGVkLCBhbmQgaGVyIGpvaW50cyBhcmUgc3RpZmY7CiAgICBMaWZlIGFuZCB0aGVzZSBsaXBzIGhhdmUgbG9uZyBiZWVuIHNlcGFyYXRlZDoKICAgIERlYXRoIGxpZXMgb24gaGVyIGxpa2UgYW4gdW50aW1lbHkgZnJvc3QKICAgIFVwb24gdGhlIHN3ZWV0ZXN0IGZsb3dlciBvZiBhbGwgdGhlIGZpZWxkLgoKTnVyc2UKCiAgICBPIGxhbWVudGFibGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgTyB3b2Z1bCB0aW1lIQoKQ0FQVUxFVAoKICAgIERlYXRoLCB0aGF0IGhhdGggdGEnZW4gaGVyIGhlbmNlIHRvIG1ha2UgbWUgd2FpbCwKICAgIFRpZXMgdXAgbXkgdG9uZ3VlLCBhbmQgd2lsbCBub3QgbGV0IG1lIHNwZWFrLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUywgd2l0aCBNdXNpY2lhbnMKCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgaXMgdGhlIGJyaWRlIHJlYWR5IHRvIGdvIHRvIGNodXJjaD8KCkNBUFVMRVQKCiAgICBSZWFkeSB0byBnbywgYnV0IG5ldmVyIHRvIHJldHVybi4KICAgIE8gc29uISB0aGUgbmlnaHQgYmVmb3JlIHRoeSB3ZWRkaW5nLWRheQogICAgSGF0aCBEZWF0aCBsYWluIHdpdGggdGh5IHdpZmUuIFRoZXJlIHNoZSBsaWVzLAogICAgRmxvd2VyIGFzIHNoZSB3YXMsIGRlZmxvd2VyZWQgYnkgaGltLgogICAgRGVhdGggaXMgbXkgc29uLWluLWxhdywgRGVhdGggaXMgbXkgaGVpcjsKICAgIE15IGRhdWdodGVyIGhlIGhhdGggd2VkZGVkOiBJIHdpbGwgZGllLAogICAgQW5kIGxlYXZlIGhpbSBhbGw7IGxpZmUsIGxpdmluZywgYWxsIGlzIERlYXRoJ3MuCgpQQVJJUwoKICAgIEhhdmUgSSB0aG91Z2h0IGxvbmcgdG8gc2VlIHRoaXMgbW9ybmluZydzIGZhY2UsCiAgICBBbmQgZG90aCBpdCBnaXZlIG1lIHN1Y2ggYSBzaWdodCBhcyB0aGlzPwoKTEFEWSBDQVBVTEVUCgogICAgQWNjdXJzZWQsIHVuaGFwcHksIHdyZXRjaGVkLCBoYXRlZnVsIGRheSEKICAgIE1vc3QgbWlzZXJhYmxlIGhvdXIgdGhhdCBlJ2VyIHRpbWUgc2F3CiAgICBJbiBsYXN0aW5nIGxhYm91ciBvZiBoaXMgcGlsZ3JpbWFnZSEKICAgIEJ1dCBvbmUsIHBvb3Igb25lLCBvbmUgcG9vciBhbmQgbG92aW5nIGNoaWxkLAogICAgQnV0IG9uZSB0aGluZyB0byByZWpvaWNlIGFuZCBzb2xhY2UgaW4sCiAgICBBbmQgY3J1ZWwgZGVhdGggaGF0aCBjYXRjaCdkIGl0IGZyb20gbXkgc2lnaHQhCgpOdXJzZQoKICAgIE8gd29lISBPIHdvZnVsLCB3b2Z1bCwgd29mdWwgZGF5IQogICAgTW9zdCBsYW1lbnRhYmxlIGRheSwgbW9zdCB3b2Z1bCBkYXksCiAgICBUaGF0IGV2ZXIsIGV2ZXIsIEkgZGlkIHlldCBiZWhvbGQhCiAgICBPIGRheSEgTyBkYXkhIE8gZGF5ISBPIGhhdGVmdWwgZGF5IQogICAgTmV2ZXIgd2FzIHNlZW4gc28gYmxhY2sgYSBkYXkgYXMgdGhpczoKICAgIE8gd29mdWwgZGF5LCBPIHdvZnVsIGRheSEKClBBUklTCgogICAgQmVndWlsZWQsIGRpdm9yY2VkLCB3cm9uZ2VkLCBzcGl0ZWQsIHNsYWluIQogICAgTW9zdCBkZXRlc3RhYmxlIGRlYXRoLCBieSB0aGVlIGJlZ3VpbCdkLAogICAgQnkgY3J1ZWwgY3J1ZWwgdGhlZSBxdWl0ZSBvdmVydGhyb3duIQogICAgTyBsb3ZlISBPIGxpZmUhIG5vdCBsaWZlLCBidXQgbG92ZSBpbiBkZWF0aCEKCkNBUFVMRVQKCiAgICBEZXNwaXNlZCwgZGlzdHJlc3NlZCwgaGF0ZWQsIG1hcnR5cidkLCBraWxsJ2QhCiAgICBVbmNvbWZvcnRhYmxlIHRpbWUsIHdoeSBjYW1lc3QgdGhvdSBub3cKICAgIFRvIG11cmRlciwgbXVyZGVyIG91ciBzb2xlbW5pdHkCiAgICBPIGNoaWxkISBPIGNoaWxkISBteSBzb3VsLCBhbmQgbm90IG15IGNoaWxkIQogICAgRGVhZCBhcnQgdGhvdSEgQWxhY2shIG15IGNoaWxkIGlzIGRlYWQ7CiAgICBBbmQgd2l0aCBteSBjaGlsZCBteSBqb3lzIGFyZSBidXJpZWQuCgpGUklBUiBMQVVSRU5DRQoKICAgIFBlYWNlLCBobywgZm9yIHNoYW1lISBjb25mdXNpb24ncyBjdXJlIGxpdmVzIG5vdAogICAgSW4gdGhlc2UgY29uZnVzaW9ucy4gSGVhdmVuIGFuZCB5b3Vyc2VsZgogICAgSGFkIHBhcnQgaW4gdGhpcyBmYWlyIG1haWQ7IG5vdyBoZWF2ZW4gaGF0aCBhbGwsCiAgICBBbmQgYWxsIHRoZSBiZXR0ZXIgaXMgaXQgZm9yIHRoZSBtYWlkOgogICAgWW91ciBwYXJ0IGluIGhlciB5b3UgY291bGQgbm90IGtlZXAgZnJvbSBkZWF0aCwKICAgIEJ1dCBoZWF2ZW4ga2VlcHMgaGlzIHBhcnQgaW4gZXRlcm5hbCBsaWZlLgogICAgVGhlIG1vc3QgeW91IHNvdWdodCB3YXMgaGVyIHByb21vdGlvbjsKICAgIEZvciAndHdhcyB5b3VyIGhlYXZlbiBzaGUgc2hvdWxkIGJlIGFkdmFuY2VkOgogICAgQW5kIHdlZXAgeWUgbm93LCBzZWVpbmcgc2hlIGlzIGFkdmFuY2VkCiAgICBBYm92ZSB0aGUgY2xvdWRzLCBhcyBoaWdoIGFzIGhlYXZlbiBpdHNlbGYCiAgICBPLCBpbiB0aGlzIGxvdmUsIHlvdSBsb3ZlIHlvdXIgY2hpbGQgc28gaWxsLAogICAgVGhhdCB5b3UgcnVuIG1hZCwgc2VlaW5nIHRoYXQgc2hlIGlzIHdlbGw6CiAgICBTaGUncyBub3Qgd2VsbCBtYXJyaWVkIHRoYXQgbGl2ZXMgbWFycmllZCBsb25nOwogICAgQnV0IHNoZSdzIGJlc3QgbWFycmllZCB0aGF0IGRpZXMgbWFycmllZCB5b3VuZy4KICAgIERyeSB1cCB5b3VyIHRlYXJzLCBhbmQgc3RpY2sgeW91ciByb3NlbWFyeQogICAgT24gdGhpcyBmYWlyIGNvcnNlOyBhbmQsIGFzIHRoZSBjdXN0b20gaXMsCiAgICBJbiBhbGwgaGVyIGJlc3QgYXJyYXkgYmVhciBoZXIgdG8gY2h1cmNoOgogICAgRm9yIHRob3VnaCBmb25kIG5hdHVyZSBiaWRzIHVzIGFuIGxhbWVudCwKICAgIFlldCBuYXR1cmUncyB0ZWFycyBhcmUgcmVhc29uJ3MgbWVycmltZW50LgoKQ0FQVUxFVAoKICAgIEFsbCB0aGluZ3MgdGhhdCB3ZSBvcmRhaW5lZCBmZXN0aXZhbCwKICAgIFR1cm4gZnJvbSB0aGVpciBvZmZpY2UgdG8gYmxhY2sgZnVuZXJhbDsKICAgIE91ciBpbnN0cnVtZW50cyB0byBtZWxhbmNob2x5IGJlbGxzLAogICAgT3VyIHdlZGRpbmcgY2hlZXIgdG8gYSBzYWQgYnVyaWFsIGZlYXN0LAogICAgT3VyIHNvbGVtbiBoeW1ucyB0byBzdWxsZW4gZGlyZ2VzIGNoYW5nZSwKICAgIE91ciBicmlkYWwgZmxvd2VycyBzZXJ2ZSBmb3IgYSBidXJpZWQgY29yc2UsCiAgICBBbmQgYWxsIHRoaW5ncyBjaGFuZ2UgdGhlbSB0byB0aGUgY29udHJhcnkuCgpGUklBUiBMQVVSRU5DRQoKICAgIFNpciwgZ28geW91IGluOyBhbmQsIG1hZGFtLCBnbyB3aXRoIGhpbTsKICAgIEFuZCBnbywgU2lyIFBhcmlzOyBldmVyeSBvbmUgcHJlcGFyZQogICAgVG8gZm9sbG93IHRoaXMgZmFpciBjb3JzZSB1bnRvIGhlciBncmF2ZToKICAgIFRoZSBoZWF2ZW5zIGRvIGxvdXIgdXBvbiB5b3UgZm9yIHNvbWUgaWxsOwogICAgTW92ZSB0aGVtIG5vIG1vcmUgYnkgY3Jvc3NpbmcgdGhlaXIgaGlnaCB3aWxsLgoKICAgIEV4ZXVudCBDQVBVTEVULCBMQURZIENBUFVMRVQsIFBBUklTLCBhbmQgRlJJQVIgTEFVUkVOQ0UKCkZpcnN0IE11c2ljaWFuCgogICAgRmFpdGgsIHdlIG1heSBwdXQgdXAgb3VyIHBpcGVzLCBhbmQgYmUgZ29uZS4KCk51cnNlCgogICAgSG9uZXN0IGdvb2RmZWxsb3dzLCBhaCwgcHV0IHVwLCBwdXQgdXA7CiAgICBGb3IsIHdlbGwgeW91IGtub3csIHRoaXMgaXMgYSBwaXRpZnVsIGNhc2UuCgogICAgRXhpdAoKRmlyc3QgTXVzaWNpYW4KCiAgICBBeSwgYnkgbXkgdHJvdGgsIHRoZSBjYXNlIG1heSBiZSBhbWVuZGVkLgoKICAgIEVudGVyIFBFVEVSCgpQRVRFUgoKICAgIE11c2ljaWFucywgTywgbXVzaWNpYW5zLCAnSGVhcnQncyBlYXNlLCBIZWFydCdzCiAgICBlYXNlOicgTywgYW4geW91IHdpbGwgaGF2ZSBtZSBsaXZlLCBwbGF5ICdIZWFydCdzIGVhc2UuJwoKRmlyc3QgTXVzaWNpYW4KCiAgICBXaHkgJ0hlYXJ0J3MgZWFzZT8nCgpQRVRFUgoKICAgIE8sIG11c2ljaWFucywgYmVjYXVzZSBteSBoZWFydCBpdHNlbGYgcGxheXMgJ015CiAgICBoZWFydCBpcyBmdWxsIG9mIHdvZTonIE8sIHBsYXkgbWUgc29tZSBtZXJyeSBkdW1wLAogICAgdG8gY29tZm9ydCBtZS4KCkZpcnN0IE11c2ljaWFuCgogICAgTm90IGEgZHVtcCB3ZTsgJ3RpcyBubyB0aW1lIHRvIHBsYXkgbm93LgoKUEVURVIKCiAgICBZb3Ugd2lsbCBub3QsIHRoZW4CgpGaXJzdCBNdXNp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Rocm9uZTsKICAgIEFuZCBhbGwgdGhpcyBkYXkgYW4gdW5hY2N1c3RvbSdkIHNwaXJpdAogICAgTGlmdHMgbWUgYWJvdmUgdGhlIGdyb3VuZCB3aXRoIGNoZWVyZnVsIHRob3VnaHRzLgogICAgSSBkcmVhbXQgbXkgbGFkeSBjYW1lIGFuZCBmb3VuZCBtZSBkZWFkLS0KICAgIFN0cmFuZ2UgZHJlYW0sIHRoYXQgZ2l2ZXMgYSBkZWFkIG1hbiBsZWF2ZQogICAgdG8gdGhpbmshLS0KICAgIEFuZCBicmVhdGhlZCBzdWNoIGxpZmUgd2l0aCBraXNzZXMgaW4gbXkgbGlwcywKICAgIFRoYXQgSSByZXZpdmVkLCBhbmQgd2FzIGFuIGVtcGVyb3IuCiAgICBBaCBtZSEgaG93IHN3ZWV0IGlzIGxvdmUgaXRzZWxmIHBvc3Nlc3MnZCwKICAgIFdoZW4gYnV0IGxvdmUncyBzaGFkb3dzIGFyZSBzbyByaWNoIGluIGpveSEKCiAgICBFbnRlciBCQUxUSEFTQVIsIGJvb3RlZAogICAgTmV3cyBmcm9tIFZlcm9uYSEtLUhvdyBub3csIEJhbHRoYXNhciEKICAgIERvc3QgdGhvdSBub3QgYnJpbmcgbWUgbGV0dGVycyBmcm9tIHRoZSBmcmlhcj8KICAgIEhvdyBkb3RoIG15IGxhZHkIElzIG15IGZhdGhlciB3ZWxsPwogICAgSG93IGZhcmVzIG15IEp1bGlldD8gdGhhdCBJIGFzayBhZ2FpbjsKICAgIEZvciBub3RoaW5nIGNhbiBiZSBpbGwsIGlmIHNoZSBiZSB3ZWxsLgoKQkFMVEhBU0FSCgogICAgVGhlbiBzaGUgaXMgd2VsbCwgYW5kIG5vdGhpbmcgY2FuIGJlIGlsbDoKICAgIEhlciBib2R5IHNsZWVwcyBpbiBDYXBlbCdzIG1vbnVtZW50LAogICAgQW5kIGhlciBpbW1vcnRhbCBwYXJ0IHdpdGggYW5nZWxzIGxpdmVzLgogICAgSSBzYXcgaGVyIGxhaWQgbG93IGluIGhlciBraW5kcmVkJ3MgdmF1bHQsCiAgICBBbmQgcHJlc2VudGx5IHRvb2sgcG9zdCB0byB0ZWxsIGl0IHlvdToKICAgIE8sIHBhcmRvbiBtZSBmb3IgYnJpbmdpbmcgdGhlc2UgaWxsIG5ld3MsCiAgICBTaW5jZSB5b3UgZGlkIGxlYXZlIGl0IGZvciBteSBvZmZpY2UsIHNpci4KClJPTUVPCgogICAgSXMgaXQgZXZlbiBzbz8gdGhlbiBJIGRlZnkgeW91LCBzdGFycyEKICAgIFRob3Uga25vdydzdCBteSBsb2RnaW5nOiBnZXQgbWUgaW5rIGFuZCBwYXBlciwKICAgIEFuZCBoaXJlIHBvc3QtaG9yc2VzOyBJIHdpbGwgaGVuY2UgdG8tbmlnaHQuCgpCQUxUSEFTQVIKCiAgICBJIGRvIGJlc2VlY2ggeW91LCBzaXIsIGhhdmUgcGF0aWVuY2U6CiAgICBZb3VyIGxvb2tzIGFyZSBwYWxlIGFuZCB3aWxkLCBhbmQgZG8gaW1wb3J0CiAgICBTb21lIG1pc2FkdmVudHVyZS4KClJPTUVPCgogICAgVHVzaCwgdGhvdSBhcnQgZGVjZWl2ZWQ6CiAgICBMZWF2ZSBtZSwgYW5kIGRvIHRoZSB0aGluZyBJIGJpZCB0aGVlIGRvLgogICAgSGFzdCB0aG91IG5vIGxldHRlcnMgdG8gbWUgZnJvbSB0aGUgZnJpYXICgpCQUxUSEFTQVIKCiAgICBObywgbXkgZ29vZCBsb3JkLgoKUk9NRU8KCiAgICBObyBtYXR0ZXI6IGdldCB0aGVlIGdvbmUsCiAgICBBbmQgaGlyZSB0aG9zZSBob3JzZXM7IEknbGwgYmUgd2l0aCB0aGVlIHN0cmFpZ2h0LgoKICAgIEV4aXQgQkFMVEhBU0FSCiAgICBXZWxsLCBKdWxpZXQsIEkgd2lsbCBsaWUgd2l0aCB0aGVlIHRvLW5pZ2h0LgogICAgTGV0J3Mgc2VlIGZvciBtZWFuczogTyBtaXNjaGllZiwgdGhvdSBhcnQgc3dpZnQKICAgIFRvIGVudGVyIGluIHRoZSB0aG91Z2h0cyBvZiBkZXNwZXJhdGUgbWVuIQogICAgSSBkbyByZW1lbWJlciBhbiBhcG90aGVjYXJ5LC0tCiAgICBBbmQgaGVyZWFib3V0cyBoZSBkd2VsbHMsLS13aGljaCBsYXRlIEkgbm90ZWQKICAgIEluIHRhdHRlcidkIHdlZWRzLCB3aXRoIG92ZXJ3aGVsbWluZyBicm93cywKICAgIEN1bGxpbmcgb2Ygc2ltcGxlczsgbWVhZ3JlIHdlcmUgaGlzIGxvb2tzLAogICAgU2hhcnAgbWlzZXJ5IGhhZCB3b3JuIGhpbSB0byB0aGUgYm9uZXM6CiAgICBBbmQgaW4gaGlzIG5lZWR5IHNob3AgYSB0b3J0b2lzZSBodW5nLAogICAgQW4gYWxsaWdhdG9yIHN0dWZmJ2QsIGFuZCBvdGhlciBza2lucwogICAgT2YgaWxsLXNoYXBlZCBmaXNoZXM7IGFuZCBhYm91dCBoaXMgc2hlbHZlcwogICAgQSBiZWdnYXJseSBhY2NvdW50IG9mIGVtcHR5IGJveGVzLAogICAgR3JlZW4gZWFydGhlbiBwb3RzLCBibGFkZGVycyBhbmQgbXVzdHkgc2VlZHMsCiAgICBSZW1uYW50cyBvZiBwYWNrdGhyZWFkIGFuZCBvbGQgY2FrZXMgb2Ygcm9zZXMsCiAgICBXZXJlIHRoaW5seSBzY2F0dGVyJ2QsIHRvIG1ha2UgdXAgYSBzaG93LgogICAgTm90aW5nIHRoaXMgcGVudXJ5LCB0byBteXNlbGYgSSBzYWlkCiAgICAnQW4gaWYgYSBtYW4gZGlkIG5lZWQgYSBwb2lzb24gbm93LAogICAgV2hvc2Ugc2FsZSBpcyBwcmVzZW50IGRlYXRoIGluIE1hbnR1YSwKICAgIEhlcmUgbGl2ZXMgYSBjYWl0aWZmIHdyZXRjaCB3b3VsZCBzZWxsIGl0IGhpbS4nCiAgICBPLCB0aGlzIHNhbWUgdGhvdWdodCBkaWQgYnV0IGZvcmVydW4gbXkgbmVlZDsKICAgIEFuZCB0aGlzIHNhbWUgbmVlZHkgbWFuIG11c3Qgc2VsbCBpdCBtZS4KICAgIEFzIEkgcmVtZW1iZXIsIHRoaXMgc2hvdWxkIGJlIHRoZSBob3VzZS4KICAgIEJlaW5nIGhvbGlkYXksIHRoZSBiZWdnYXIncyBzaG9wIGlzIHNodXQuCiAgICBXaGF0LCBobyEgYXBvdGhlY2FyeSEKCiAgICBFbnRlciBBcG90aGVjYXJ5CgpBcG90aGVjYXJ5CgogICAgV2hvIGNhbGxzIHNvIGxvdWQCgpST01FTwoKICAgIENvbWUgaGl0aGVyLCBtYW4uIEkgc2VlIHRoYXQgdGhvdSBhcnQgcG9vcjoKICAgIEhvbGQsIHRoZXJlIGlzIGZvcnR5IGR1Y2F0czogbGV0IG1lIGhhdmUKICAgIEEgZHJhbSBvZiBwb2lzb24sIHN1Y2ggc29vbi1zcGVlZGluZyBnZWFyCiAgICBBcyB3aWxsIGRpc3BlcnNlIGl0c2VsZiB0aHJvdWdoIGFsbCB0aGUgdmVpbnMKICAgIFRoYXQgdGhlIGxpZmUtd2VhcnkgdGFrZXIgbWF5IGZhbGwgZGVhZAogICAgQW5kIHRoYXQgdGhlIHRydW5rIG1heSBiZSBkaXNjaGFyZ2VkIG9mIGJyZWF0aAogICAgQXMgdmlvbGVudGx5IGFzIGhhc3R5IHBvd2RlciBmaXJlZAogICAgRG90aCBodXJyeSBmcm9tIHRoZSBmYXRhbCBjYW5ub24ncyB3b21iLgoKQXBvdGhlY2FyeQoKICAgIFN1Y2ggbW9ydGFsIGRydWdzIEkgaGF2ZTsgYnV0IE1hbnR1YSdzIGxhdwogICAgSXMgZGVhdGggdG8gYW55IGhlIHRoYXQgdXR0ZXJzIHRoZW0uCgpST01FTwoKICAgIEFydCB0aG91IHNvIGJhcmUgYW5kIGZ1bGwgb2Ygd3JldGNoZWRuZXNzLAogICAgQW5kIGZlYXInc3QgdG8gZGllPyBmYW1pbmUgaXMgaW4gdGh5IGNoZWVrcywKICAgIE5lZWQgYW5kIG9wcHJlc3Npb24gc3RhcnZldGggaW4gdGhpbmUgZXllcywKICAgIENvbnRlbXB0IGFuZCBiZWdnYXJ5IGhhbmdzIHVwb24gdGh5IGJhY2s7CiAgICBUaGUgd29ybGQgaXMgbm90IHRoeSBmcmllbmQgbm9yIHRoZSB3b3JsZCdzIGxhdzsKICAgIFRoZSB3b3JsZCBhZmZvcmRzIG5vIGxhdyB0byBtYWtlIHRoZWUgcmljaDsKICAgIFRoZW4gYmUgbm90IHBvb3IsIGJ1dCBicmVhayBpdCwgYW5kIHRha2UgdGhpcy4KCkFwb3RoZWNhcnkKCiAgICBNeSBwb3ZlcnR5LCBidXQgbm90IG15IHdpbGwsIGNvbnNlbnRzLgoKUk9NRU8KCiAgICBJIHBheSB0aHkgcG92ZXJ0eSwgYW5kIG5vdCB0aHkgd2lsbC4KCkFwb3RoZWNhcnkKCiAgICBQdXQgdGhpcyBpbiBhbnkgbGlxdWlkIHRoaW5nIHlvdSB3aWxsLAogICAgQW5kIGRyaW5rIGl0IG9mZjsgYW5kLCBpZiB5b3UgaGFkIHRoZSBzdHJlbmd0aAogICAgT2YgdHdlbnR5IG1lbiwgaXQgd291bGQgZGlzcGF0Y2ggeW91IHN0cmFpZ2h0LgoKUk9NRU8KCiAgICBUaGVyZSBpcyB0aHkgZ29sZCwgd29yc2UgcG9pc29uIHRvIG1lbidzIHNvdWxzLAogICAgRG9pbmcgbW9yZSBtdXJkZXJzIGluIHRoaXMgbG9hdGhzb21lIHdvcmxkLAogICAgVGhhbiB0aGVzZSBwb29yIGNvbXBvdW5kcyB0aGF0IHRob3UgbWF5c3Qgbm90IHNlbGwuCiAgICBJIHNlbGwgdGhlZSBwb2lzb247IHRob3UgaGFzdCBzb2xkIG1lIG5vbmUuCiAgICBGYXJld2VsbDogYnV5IGZvb2QsIGFuZCBnZXQgdGh5c2VsZiBpbiBmbGVzaC4KICAgIENvbWUsIGNvcmRpYWwgYW5kIG5vdCBwb2lzb24sIGdvIHdpdGggbWUKICAgIFRvIEp1bGlldCdzIGdyYXZlOyBmb3IgdGhlcmUgbXVzdCBJIHVzZSB0aGVlLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBKT0hOIAoKRlJJQVIgSk9ITgoKICAgIEhvbHkgRnJhbmNpc2NhbiBmcmlhciEgYnJvdGhlciwgaG8hCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UKCkZSSUFSIExBVVJFTkNFCgogICAgVGhpcyBzYW1lIHNob3VsZCBiZSB0aGUgdm9pY2Ugb2YgRnJpYXIgSm9obi4KICAgIFdlbGNvbWUgZnJvbSBNYW50dWE6IHdoYXQgc2F5cyBSb21lbz8KICAgIE9yLCBpZiBoaXMgbWluZCBiZSB3cml0LCBnaXZlIG1lIGhpcyBsZXR0ZXIuCgpGUklBUiBKT0hOCgogICAgR29pbmcgdG8gZmluZCBhIGJhcmUtZm9vdCBicm90aGVyIG91dAogICAgT25lIG9mIG91ciBvcmRlciwgdG8gYXNzb2NpYXRlIG1lLAogICAgSGVyZSBpbiB0aGlzIGNpdHkgdmlzaXRpbmcgdGhlIHNpY2ssCiAgICBBbmQgZmluZGluZyBoaW0sIHRoZSBzZWFyY2hlcnMgb2YgdGhlIHRvd24sCiAgICBTdXNwZWN0aW5nIHRoYXQgd2UgYm90aCB3ZXJlIGluIGEgaG91c2UKICAgIFdoZXJlIHRoZSBpbmZlY3Rpb3VzIHBlc3RpbGVuY2UgZGlkIHJlaWduLAogICAgU2VhbCdkIHVwIHRoZSBkb29ycywgYW5kIHdvdWxkIG5vdCBsZXQgdXMgZm9ydGg7CiAgICBTbyB0aGF0IG15IHNwZWVkIHRvIE1hbnR1YSB0aGVyZSB3YXMgc3RheSdkLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXaG8gYmFyZSBteSBsZXR0ZXIsIHRoZW4sIHRvIFJvbWVvPwoKRlJJQVIgSk9ITgoKICAgIEkgY291bGQgbm90IHNlbmQgaXQsLS1oZXJlIGl0IGlzIGFnYWluLC0tCiAgICBOb3IgZ2V0IGEgbWVzc2VuZ2VyIHRvIGJyaW5nIGl0IHRoZWUsCiAgICBTbyBmZWFyZnVsIHdlcmUgdGhleSBvZiBpbmZlY3Rpb24uCgpGUklBUiBMQVVSRU5DRQoKICAgIFVuaGFwcHkgZm9ydHVuZSEgYnkgbXkgYnJvdGhlcmhvb2QsCiAgICBUaGUgbGV0dGVyIHdhcyBub3QgbmljZSBidXQgZnVsbCBvZiBjaGFyZ2UKICAgIE9mIGRlYXIgaW1wb3J0LCBhbmQgdGhlIG5lZ2xlY3RpbmcgaXQKICAgIE1heSBkbyBtdWNoIGRhbmdlci4gRnJpYXIgSm9obiwgZ28gaGVuY2U7CiAgICBHZXQgbWUgYW4gaXJvbiBjcm93LCBhbmQgYnJpbmcgaXQgc3RyYWlnaHQKICAgIFVudG8gbXkgY2VsbC4KCkZSSUFSIEpPSE4KCiAgICBCcm90aGVyLCBJJ2xsIGdvIGFuZCBicmluZyBpdCB0aGVlLgoKICAgIEV4aXQKCkZSSUFSIExBVVJFTkNFCgogICAgTm93IG11c3QgSSB0byB0aGUgbW9udW1lbnQgYWxvbmU7CiAgICBXaXRoaW4gdGhyZWUgaG91cnMgd2lsbCBmYWlyIEp1bGlldCB3YWtlOgogICAgU2hlIHdpbGwgYmVzaHJldyBtZSBtdWNoIHRoYXQgUm9tZW8KICAgIEhhdGggaGFkIG5vIG5vdGljZSBvZiB0aGVzZSBhY2NpZGVudHM7CiAgICBCdXQgSSB3aWxsIHdyaXRlIGFnYWluIHRvIE1hbnR1YSwKICAgIEFuZCBrZWVwIGhlciBhdCBteSBjZWxsIHRpbGwgUm9tZW8gY29tZTsKICAgIFBvb3IgbGl2aW5nIGNvcnNlLCBjbG9zZWQgaW4gYSBkZWFkIG1hbidzIHRvbWIhCgogICAgRXhpdAoKU0NFTkUgSUlJLiBBIGNodXJjaHlhcmQ7IGluIGl0IGEgdG9tYiBiZWxvbmdpbmcgdG8gdGhlIENhcHVsZXRzLgoKICAgIEVudGVyIFBBUklTLCBhbmQgaGlzIFBhZ2UgYmVhcmluZyBmbG93ZXJzIGFuZCBhIHRvcmNoIAoKUEFSSVMKCiAgICBHaXZlIG1lIHRoeSB0b3JjaCwgYm95OiBoZW5jZSwgYW5kIHN0YW5kIGFsb29mOgogICAgWWV0IHB1dCBpdCBvdXQsIGZvciBJIHdvdWxkIG5vdCBiZSBzZWVuLgogICAgVW5kZXIgeW9uZCB5ZXctdHJlZXMgbGF5IHRoZWUgYWxsIGFsb25nLAogICAgSG9sZGluZyB0aGluZSBlYXIgY2xvc2UgdG8gdGhlIGhvbGxvdyBncm91bmQ7CiAgICBTbyBzaGFsbCBubyBmb290IHVwb24gdGhlIGNodXJjaHlhcmQgdHJlYWQsCiAgICBCZWluZyBsb29zZSwgdW5maXJtLCB3aXRoIGRpZ2dpbmcgdXAgb2YgZ3JhdmVzLAogICAgQnV0IHRob3Ugc2hhbHQgaGVhciBpdDogd2hpc3RsZSB0aGVuIHRvIG1lLAogICAgQXMgc2lnbmFsIHRoYXQgdGhvdSBoZWFyJ3N0IHNvbWV0aGluZyBhcHByb2FjaC4KICAgIEdpdmUgbWUgdGhvc2UgZmxvd2Vycy4gRG8gYXMgSSBiaWQgdGhlZSwgZ28uCgpQQUdFCgogICAgW0FzaWRlXSBJIGFtIGFsbW9zdCBhZnJhaWQgdG8gc3RhbmQgYWxvbmUKICAgIEhlcmUgaW4gdGhlIGNodXJjaHlhcmQ7IHlldCBJIHdpbGwgYWR2ZW50dXJlLgoKICAgIFJldGlyZXMKClBBUklTCgogICAgU3dlZXQgZmxvd2VyLCB3aXRoIGZsb3dlcnMgdGh5IGJyaWRhbCBiZWQgSSBzdHJldywtLQogICAgTyB3b2UhIHRoeSBjYW5vcHkgaXMgZHVzdCBhbmQgc3RvbmVzOy0tCiAgICBXaGljaCB3aXRoIHN3ZWV0IHdhdGVyIG5pZ2h0bHkgSSB3aWxsIGRldywKICAgIE9yLCB3YW50aW5nIHRoYXQsIHdpdGggdGVhcnMgZGlzdGlsbCdkIGJ5IG1vYW5zOgogICAgVGhlIG9ic2VxdWllcyB0aGF0IEkgZm9yIHRoZWUgd2lsbCBrZWVwCiAgICBOaWdodGx5IHNoYWxsIGJlIHRvIHN0cmV3IHRoeSBncmF2ZSBhbmQgd2VlcC4KCiAgICBUaGUgUGFnZSB3aGlzdGxlcwogICAgVGhlIGJveSBnaXZlcyB3YXJuaW5nIHNvbWV0aGluZyBkb3RoIGFwcHJvYWNoLgogICAgV2hhdCBjdXJzZWQgZm9vdCB3YW5kZXJzIHRoaXMgd2F5IHRvLW5pZ2h0LAogICAgVG8gY3Jvc3MgbXkgb2JzZXF1aWVzIGFuZCB0cnVlIGxvdmUncyByaXRlPwogICAgV2hhdCB3aXRoIGEgdG9yY2ghIG11ZmZsZSBtZSwgbmlnaHQsIGF3aGlsZS4KCiAgICBSZXRpcmVzCgogICAgRW50ZXIgUk9NRU8gYW5kIEJBTFRIQVNBUiwgd2l0aCBhIHRvcmNoLCBtYXR0b2NrLCAmIGMKClJPTUVPCgogICAgR2l2ZSBtZSB0aGF0IG1hdHRvY2sgYW5kIHRoZSB3cmVuY2hpbmcgaXJvbi4KICAgIEhvbGQsIHRha2UgdGhpcyBsZXR0ZXI7IGVhcmx5IGluIHRoZSBtb3JuaW5nCiAgICBTZWUgdGhvdSBkZWxpdmVyIGl0IHRvIG15IGxvcmQgYW5kIGZhdGhlci4KICAgIEdpdmUgbWUgdGhlIGxpZ2h0OiB1cG9uIHRoeSBsaWZlLCBJIGNoYXJnZSB0aGVlLAogICAgV2hhdGUnZXIgdGhvdSBoZWFyJ3N0IG9yIHNlZXN0LCBzdGFuZCBhbGwgYWxvb2YsCiAgICBBbmQgZG8gbm90IGludGVycnVwdCBtZSBpbiBteSBjb3Vyc2UuCiAgICBXaHkgSSBkZXNjZW5kIGludG8gdGhpcyBiZWQgb2YgZGVhdGgsCiAgICBJcyBwYXJ0bHkgdG8gYmVob2xkIG15IGxhZHkncyBmYWNlOwogICAgQnV0IGNoaWVmbHkgdG8gdGFrZSB0aGVuY2UgZnJvbSBoZXIgZGVhZCBmaW5nZXIKICAgIEEgcHJlY2lvdXMgcmluZywgYSByaW5nIHRoYXQgSSBtdXN0IHVzZQogICAgSW4gZGVhciBlbXBsb3ltZW50OiB0aGVyZWZvcmUgaGVuY2UsIGJlIGdvbmU6CiAgICBCdXQgaWYgdGhvdSwgamVhbG91cywgZG9zdCByZXR1cm4gdG8gcHJ5CiAgICBJbiB3aGF0IEkgZnVydGhlciBzaGFsbCBpbnRlbmQgdG8gZG8sCiAgICBCeSBoZWF2ZW4sIEkgd2lsbCB0ZWFyIHRoZWUgam9pbnQgYnkgam9pbnQKICAgIEFuZCBzdHJldyB0aGlzIGh1bmdyeSBjaHVyY2h5YXJkIHdpdGggdGh5IGxpbWJzOgogICAgVGhlIHRpbWUgYW5kIG15IGludGVudHMgYXJlIHNhdmFnZS13aWxkLAogICAgTW9yZSBmaWVyY2UgYW5kIG1vcmUgaW5leG9yYWJsZSBmYXIKICAgIFRoYW4gZW1wdHkgdGlnZXJzIG9yIHRoZSByb2FyaW5nIHNlYS4KCkJBTFRIQVNBUgoKICAgIEkgd2lsbCBiZSBnb25lLCBzaXIsIGFuZCBub3QgdHJvdWJsZSB5b3UuCgpST01FTwoKICAgIFNvIHNoYWx0IHRob3Ugc2hvdyBtZSBmcmllbmRzaGlwLiBUYWtlIHRob3UgdGhhdDoKICAgIExpdmUsIGFuZCBiZSBwcm9zcGVyb3VzOiBhbmQgZmFyZXdlbGwsIGdvb2QgZmVsbG93LgoKQkFMVEhBU0FSCgogICAgW0FzaWRlXSBGb3IgYWxsIHRoaXMgc2FtZSwgSSdsbCBoaWRlIG1lIGhlcmVhYm91dDoKICAgIEhpcyBsb29rcyBJIGZlYXIsIGFuZCBoaXMgaW50ZW50cyBJIGRvdWJ0LgoKICAgIFJldGlyZXMKClJPTUVPCgogICAgVGhvdSBkZXRlc3RhYmxlIG1hdywgdGhvdSB3b21iIG9mIGRlYXRoLAogICAgR29yZ2VkIHdpdGggdGhlIGRlYXJlc3QgbW9yc2VsIG9mIHRoZSBlYXJ0aCwKICAgIFRodXMgSSBlbmZvcmNlIHRoeSByb3R0ZW4gamF3cyB0byBvcGVuLAogICAgQW5kLCBpbiBkZXNwaXRlLCBJJ2xsIGNyYW0gdGhlZSB3aXRoIG1vcmUgZm9vZCEKCiAgICBPcGVucyB0aGUgdG9tYgoKUEFSSVMKCiAgICBUaGlzIGlzIHRoYXQgYmFuaXNoJ2QgaGF1Z2h0eSBNb250YWd1ZSwKICAgIFRoYXQgbXVyZGVyJ2QgbXkgbG92ZSdzIGNvdXNpbiwgd2l0aCB3aGljaCBncmllZiwKICAgIEl0IGlzIHN1cHBvc2VkLCB0aGUgZmFpciBjcmVhdHVyZSBkaWVkOwogICAgQW5kIGhlcmUgaXMgY29tZSB0byBkbyBzb21lIHZpbGxhbm91cyBzaGFtZQogICAgVG8gdGhlIGRlYWQgYm9kaWVzOiBJIHdpbGwgYXBwcmVoZW5kIGhpbS4KCiAgICBDb21lcyBmb3J3YXJkCiAgICBTdG9wIHRoeSB1bmhhbGxvdydkIHRvaWwsIHZpbGUgTW9udGFndWUhCiAgICBDYW4gdmVuZ2VhbmNlIGJlIHB1cnN1ZWQgZnVydGhlciB0aGFuIGRlYXRoPwogICAgQ29uZGVtbmVkIHZpbGxhaW4sIEkgZG8gYXBwcmVoZW5kIHRoZWU6CiAgICBPYmV5LCBhbmQgZ28gd2l0aCBtZTsgZm9yIHRob3UgbXVzdCBkaWUuCgpST01FTwoKICAgIEkgbXVzdCBpbmRlZWQ7IGFuZCB0aGVyZWZvcmUgY2FtZSBJIGhpdGhlci4KICAgIEdvb2QgZ2VudGxlIHlvdXRoLCB0ZW1wdCBub3QgYSBkZXNwZXJhdGUgbWFuOwogICAgRmx5IGhlbmNlLCBhbmQgbGVhdmUgbWU6IHRoaW5rIHVwb24gdGhlc2UgZ29uZTsKICAgIExldCB0aGVtIGFmZnJpZ2h0IHRoZWUuIEkgYmVzZWVjaCB0aGVlLCB5b3V0aCwKICAgIFB1dCBub3QgYW5vdGhlciBzaW4gdXBvbiBteSBoZWFkLAogICAgQnkgdXJnaW5nIG1lIHRvIGZ1cnk6IE8sIGJlIGdvbmUhCiAgICBCeSBoZWF2ZW4sIEkgbG92ZSB0aGVlIGJldHRlciB0aGFuIG15c2VsZjsKICAgIEZvciBJIGNvbWUgaGl0aGVyIGFybSdkIGFnYWluc3QgbXlzZWxmOgogICAgU3RheSBub3QsIGJlIGdvbmU7IGxpdmUsIGFuZCBoZXJlYWZ0ZXIgc2F5LAogICAgQSBtYWRtYW4ncyBtZXJjeSBiYWRlIHRoZWUgcnVuIGF3YXkuCgpQQVJJUwoKICAgIEkgZG8gZGVmeSB0aHkgY29uanVyYXRpb25zLAogICAgQW5kIGFwcHJlaGVuZCB0aGVlIGZvciBhIGZlbG9uIGhlcmUuCgpST01FTwoKICAgIFdpbHQgdGhvdSBwcm92b2tlIG1lPyB0aGVuIGhhdmUgYXQgdGhlZSwgYm95IQoKICAgIFRoZXkgZmlnaHQKClBBR0UKCiAgICBPIExvcmQsIHRoZXkgZmlnaHQhIEkgd2lsbCBnbyBjYWxsIHRoZSB3YXRjaC4KCiAgICBFeGl0CgpQQVJJUwoKICAgIE8sIEkgYW0gc2xhaW4hCgogICAgRmFsbHMKICAgIElmIHRob3UgYmUgbWVyY2lmdWwsCiAgICBPcGVuIHRoZSB0b21iLCBsYXkgbWUgd2l0aCBKdWxpZXQuCgogICAgRGllcwoKUk9NRU8KCiAgICBJbiBmYWl0aCwgSSB3aWxsLiBMZXQgbWUgcGVydXNlIHRoaXMgZmFjZS4KICAgIE1lcmN1dGlvJ3Mga2luc21hbiwgbm9ibGUgQ291bnR5IFBhcmlzIQogICAgV2hhdCBzYWlkIG15IG1hbiwgd2hlbiBteSBiZXRvc3NlZCBzb3VsCiAgICBEaWQgbm90IGF0dGVuZCBoaW0gYXMgd2Ugcm9kZT8gSSB0aGluawogICAgSGUgdG9sZCBtZSBQYXJpcyBzaG91bGQgaGF2ZSBtYXJyaWVkIEp1bGlldDoKICAgIFNhaWQgaGUgbm90IHNvPyBvciBkaWQgSSBkcmVhbSBpdCBzbz8KICAgIE9yIGFtIEkgbWFkLCBoZWFyaW5nIGhpbSB0YWxrIG9mIEp1bGlldCwKICAgIFRvIHRoaW5rIGl0IHdhcyBzbz8gTywgZ2l2ZSBtZSB0aHkgaGFuZCwKICAgIE9uZSB3cml0IHdpdGggbWUgaW4gc291ciBtaXNmb3J0dW5lJ3MgYm9vayEKICAgIEknbGwgYnVyeSB0aGVlIGluIGEgdHJpdW1waGFudCBncmF2ZTsKICAgIEEgZ3JhdmUIE8gbm8hIGEgbGFudGVybiwgc2xhdWdodGVyJ2QgeW91dGgsCiAgICBGb3IgaGVyZSBsaWVzIEp1bGlldCwgYW5kIGhlciBiZWF1dHkgbWFrZXMKICAgIFRoaXMgdmF1bHQgYSBmZWFzdGluZyBwcmVzZW5jZSBmdWxsIG9mIGxpZ2h0LgogICAgRGVhdGgsIGxpZSB0aG91IHRoZXJlLCBieSBhIGRlYWQgbWFuIGludGVycidkLgoKICAgIExheWluZyBQQVJJUyBpbiB0aGUgdG9tYgogICAgSG93IG9mdCB3aGVuIG1lbiBhcmUgYXQgdGhlIHBvaW50IG9mIGRlYXRoCiAgICBIYXZlIHRoZXkgYmVlbiBtZXJyeSEgd2hpY2ggdGhlaXIga2VlcGVycyBjYWxsCiAgICBBIGxpZ2h0bmluZyBiZWZvcmUgZGVhdGg6IE8sIGhvdyBtYXkgSQogICAgQ2FsbCB0aGlzIGEgbGlnaHRuaW5nPyBPIG15IGxvdmUhIG15IHdpZmUhCiAgICBEZWF0aCwgdGhhdCBoYXRoIHN1Y2snZCB0aGUgaG9uZXkgb2YgdGh5IGJyZWF0aCwKICAgIEhhdGggaGFkIG5vIHBvd2VyIHlldCB1cG9uIHRoeSBiZWF1dHk6CiAgICBUaG91IGFydCBub3QgY29ucXVlcidkOyBiZWF1dHkncyBlbnNpZ24geWV0CiAgICBJcyBjcmltc29uIGluIHRoeSBsaXBzIGFuZCBpbiB0aHkgY2hlZWtzLAogICAgQW5kIGRlYXRoJ3MgcGFsZSBmbGFnIGlzIG5vdCBhZHZhbmNlZCB0aGVyZS4KICAgIFR5YmFsdCwgbGllc3QgdGhvdSB0aGVyZSBpbiB0aHkgYmxvb2R5IHNoZWV0PwogICAgTywgd2hhdCBtb3JlIGZhdm91ciBjYW4gSSBkbyB0byB0aGVlLAogICAgVGhhbiB3aXRoIHRoYXQgaGFuZCB0aGF0IGN1dCB0aHkgeW91dGggaW4gdHdhaW4KICAgIFRvIHN1bmRlciBoaXMgdGhhdCB3YXMgdGhpbmUgZW5lbXkCiAgICBGb3JnaXZlIG1lLCBjb3VzaW4hIEFoLCBkZWFyIEp1bGlldCwKICAgIFdoeSBhcnQgdGhvdSB5ZXQgc28gZmFpcj8gc2hhbGwgSSBiZWxpZXZlCiAgICBUaGF0IHVuc3Vic3RhbnRpYWwgZGVhdGggaXMgYW1vcm91cywKICAgIEFuZCB0aGF0IHRoZSBsZWFuIGFiaG9ycmVkIG1vbnN0ZXIga2VlcHMKICAgIFRoZWUgaGVyZSBpbiBkYXJrIHRvIGJlIGhpcyBwYXJhbW91cj8KICAgIEZvciBmZWFyIG9mIHRoYXQsIEkgc3RpbGwgd2lsbCBzdGF5IHdpdGggdGhlZTsKICAgIEFuZCBuZXZlciBmcm9tIHRoaXMgcGFsYWNlIG9mIGRpbSBuaWdodAogICAgRGVwYXJ0IGFnYWluOiBoZXJlLCBoZXJlIHdpbGwgSSByZW1haW4KICAgIFdpdGggd29ybXMgdGhhdCBhcmUgdGh5IGNoYW1iZXItbWFpZHM7IE8sIGhlcmUKICAgIFdpbGwgSSBzZXQgdXAgbXkgZXZlcmxhc3RpbmcgcmVzdCwKICAgIEFuZCBzaGFrZSB0aGUgeW9rZSBvZiBpbmF1c3BpY2lvdXMgc3RhcnMKICAgIEZyb20gdGhpcyB3b3JsZC13ZWFyaWVkIGZsZXNoLiBFeWVzLCBsb29rIHlvdXIgbGFzdCEKICAgIEFybXMsIHRha2UgeW91ciBsYXN0IGVtYnJhY2UhIGFuZCwgbGlwcywgTyB5b3UKICAgIFRoZSBkb29ycyBvZiBicmVhdGgsIHNlYWwgd2l0aCBhIHJpZ2h0ZW91cyBraXNzCiAgICBBIGRhdGVsZXNzIGJhcmdhaW4gdG8gZW5ncm9zc2luZyBkZWF0aCEKICAgIENvbWUsIGJpdHRlciBjb25kdWN0LCBjb21lLCB1bnNhdm91cnkgZ3VpZGUhCiAgICBUaG91IGRlc3BlcmF0ZSBwaWxvdCwgbm93IGF0IG9uY2UgcnVuIG9uCiAgICBUaGUgZGFzaGluZyByb2NrcyB0aHkgc2VhLXNpY2sgd2VhcnkgYmFyayEKICAgIEhlcmUncyB0byBteSBsb3ZlIQoKICAgIERyaW5rcwogICAgTyB0cnVlIGFwb3RoZWNhcnkhCiAgICBUaHkgZHJ1Z3MgYXJlIHF1aWNrLiBUaHVzIHdpdGggYSBraXNzIEkgZGllLgoKICAgIERpZXMKCiAgICBFbnRlciwgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgY2h1cmNoeWFyZCwgRlJJQVIgTEFVUkVOQ0UsIHdpdGggYSBsYW50ZXJuLCBjcm93LCBhbmQgc3BhZGUKCkZSSUFSIExBVVJFTkNFCgogICAgU2FpbnQgRnJhbmNpcyBiZSBteSBzcGVlZCEgaG93IG9mdCB0by1uaWdodAogICAgSGF2ZSBteSBvbGQgZmVldCBzdHVtYmxlZCBhdCBncmF2ZXMhIFdobydzIHRoZXJlPwoKQkFMVEhBU0FSCgogICAgSGVyZSdzIG9uZSwgYSBmcmllbmQsIGFuZCBvbmUgdGhhdCBrbm93cyB5b3Ugd2VsbC4KCkZSSUFSIExBVVJFTkNFCgogICAgQmxpc3MgYmUgdXBvbiB5b3UhIFRlbGwgbWUsIGdvb2QgbXkgZnJpZW5kLAogICAgV2hhdCB0b3JjaCBpcyB5b25kLCB0aGF0IHZhaW5seSBsZW5kcyBoaXMgbGlnaHQKICAgIFRvIGdydWJzIGFuZCBleWVsZXNzIHNrdWxscz8gYXMgSSBkaXNjZXJuLAogICAgSXQgYnVybmV0aCBpbiB0aGUgQ2FwZWwncyBtb251bWVudC4KCkJBTFRIQVNBUgoKICAgIEl0IGRvdGggc28sIGhvbHkgc2lyOyBhbmQgdGhlcmUncyBteSBtYXN0ZXIsCiAgICBPbmUgdGhhdCB5b3UgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2hvIGlzIGl0PwoKQkFMVEhBU0FSCgogICAgUm9tZW8uCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvdyBsb25nIGhhdGggaGUgYmVlbiB0aGVyZT8KCkJBTFRIQVNBUgoKICAgIEZ1bGwgaGFsZiBhbiBob3VyLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHbyB3aXRoIG1lIHRvIHRoZSB2YXVsdC4KCkJBTFRIQVNBUgoKICAgIEkgZGFyZSBub3QsIHNpcgogICAgTXkgbWFzdGVyIGtub3dzIG5vdCBidXQgSSBhbSB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CwgYm95OiB3aGljaCB3YXkCgpKVUxJRVQKCiAgICBZZWEsIG5vaXNlPyB0aGVuIEknbGwgYmUgYnJpZWYuIE8gaGFwcHkgZGFnZ2VyIQoKICAgIFNuYXRjaGluZyBST01FTydzIGRhZ2dlcgogICAgVGhpcyBpcyB0aHkgc2hlYXRoOwoKICAgIFN0YWJzIGhlcnNlbGYKICAgIHRoZXJlIHJ1c3QsIGFuZCBsZXQgbWUgZGllLgoKICAgIEZhbGxzIG9uIFJPTUVPJ3MgYm9keSwgYW5kIGRpZXMKCiAgICBFbnRlciBXYXRjaCwgd2l0aCB0aGUgUGFnZSBvZiBQQVJJUwoKUEFHRQoKICAgIFRoaXMgaXMgdGhlIHBsYWNlOyB0aGVyZSwgd2hlcmUgdGhlIHRvcmNoIGRvdGggYnVybi4KCkZpcnN0IFdhdGNobWFuCgogICAgVGhlIGdyb3VuZCBpcyBibG9vZHk7IHNlYXJjaCBhYm91dCB0aGUgY2h1cmNoeWFyZDoKICAgIEdvLCBzb21lIG9mIHlvdSwgd2hvZSdlciB5b3UgZmluZCBhdHRhY2guCiAgICBQaXRpZnVsIHNpZ2h0ISBoZXJlIGxpZXMgdGhlIGNvdW50eSBzbGFpbiwKICAgIEFuZCBKdWxpZXQgYmxlZWRpbmcsIHdhcm0sIGFuZCBuZXdseSBkZWFkLAogICAgV2hvIGhlcmUgaGF0aCBsYWluIHRoZXNlIHR3byBkYXlzIGJ1cmllZC4KICAgIEdvLCB0ZWxsIHRoZSBwcmluY2U6IHJ1biB0byB0aGUgQ2FwdWxldHM6CiAgICBSYWlzZSB1cCB0aGUgTW9udGFndWVzOiBzb21lIG90aGVycyBzZWFyY2g6CiAgICBXZSBzZWUgdGhlIGdyb3VuZCB3aGVyZW9uIHRoZXNlIHdvZXMgZG8gbGllOwogICAgQnV0IHRoZSB0cnVlIGdyb3VuZCBvZiBhbGwgdGhlc2UgcGl0ZW91cyB3b2VzCiAgICBXZSBjYW5ub3Qgd2l0aG91dCBjaXJjdW1zdGFuY2UgZGVzY3J5LgoKICAgIFJlLWVudGVyIHNvbWUgb2YgdGhlIFdhdGNoLCB3aXRoIEJBTFRIQVNBUgoKU2Vjb25kIFdhdGNobWFuCgogICAgSGVyZSdzIFJvbWVvJ3MgbWFuOyB3ZSBmb3VuZCBoaW0gaW4gdGhlIGNodXJjaHlhcmQuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhvbGQgaGltIGluIHNhZmV0eSwgdGlsbCB0aGUgcHJpbmNlIGNvbWUgaGl0aGVyLgoKICAgIFJlLWVudGVyIG90aGVycyBvZiB0aGUgV2F0Y2gsIHdpdGggRlJJQVIgTEFVUkVOQ0UKClRoaXJkIFdhdGNobWFuCgogICAgSGVyZSBpcyBhIGZyaWFyLCB0aGF0IHRyZW1ibGVzLCBzaWdocyBhbmQgd2VlcHM6CiAgICBXZSB0b29rIHRoaXMgbWF0dG9jayBhbmQgdGhpcyBzcGFkZSBmcm9tIGhpbSwKICAgIEFzIGhlIHdhcyBjb21pbmcgZnJvbSB0aGlzIGNodXJjaHlhcmQgc2lkZS4KCkZpcnN0IFdhdGNobWFuCgogICAgQSBncmVhdCBzdXNwaWNpb246IHN0YXkgdGhlIGZyaWFyIHRvby4KCiAgICBFbnRlciB0aGUgUFJJTkNFIGFuZCBBdHRlbmRhbnRzCgpQUklOQ0UKCiAgICBXaGF0IG1pc2FkdmVudHVyZSBpcyBzbyBlYXJseSB1cCwKICAgIFRoYXQgY2FsbHMgb3VyIHBlcnNvbiBmcm9tIG91ciBtb3JuaW5nJ3MgcmVzdD8KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIGFuZCBvdGhlcnMKCkNBUFVMRVQKCiAgICBXaGF0IHNob3VsZCBpdCBiZSwgdGhhdCB0aGV5IHNvIHNocmllayBhYnJvYWQCgpMQURZIENBUFVMRVQKCiAgICBUaGUgcGVvcGxlIGluIHRoZSBzdHJlZXQgY3J5IFJvbWVvLAogICAgU29tZSBKdWxpZXQsIGFuZCBzb21lIFBhcmlzOyBhbmQgYWxsIHJ1biwKICAgIFdpdGggb3BlbiBvdXRjcnkgdG93YXJkIG91ciBtb251bWVudC4KClBSSU5DRQoKICAgIFdoYXQgZmVhciBpcyB0aGlzIHdoaWNoIHN0YXJ0bGVzIGluIG91ciBlYXJzPwoKRmlyc3QgV2F0Y2htYW4KCiAgICBTb3ZlcmVpZ24sIGhlcmUgbGllcyB0aGUgQ291bnR5IFBhcmlzIHNsYWluOwogICAgQW5kIFJvbWVvIGRlYWQ7IGFuZCBKdWxpZXQsIGRlYWQgYmVmb3JlLAogICAgV2FybSBhbmQgbmV3IGtpbGwnZC4KClBSSU5DRQoKICAgIFNlYXJjaCwgc2VlaywgYW5kIGtub3cgaG93IHRoaXMgZm91bCBtdXJkZXIgY29tZXMuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhlcmUgaXMgYSBmcmlhciwgYW5kIHNsYXVnaHRlcidkIFJvbWVvJ3MgbWFuOwogICAgV2l0aCBpbnN0cnVtZW50cyB1cG9uIHRoZW0sIGZpdCB0byBvcGVuCiAgICBUaGVzZSBkZWFkIG1lbidzIHRvbWJzLgoKQ0FQVUxFVAoKICAgIE8gaGVhdmVucyEgTyB3aWZlLCBsb29rIGhvdyBvdXIgZGF1Z2h0ZXIgYmxlZWRzIQogICAgVGhpcyBkYWdnZXIgaGF0aCBtaXN0YSdlbi0tZm9yLCBsbywgaGlzIGhvdXNlCiAgICBJcyBlbXB0eSBvbiB0aGUgYmFjayBvZiBNb250YWd1ZSwtLQogICAgQW5kIGl0IG1pcy1zaGVhdGhlZCBpbiBteSBkYXVnaHRlcidzIGJvc29tIQoKTEFEWSBDQVBVTEVUCgogICAgTyBtZSEgdGhpcyBzaWdodCBvZiBkZWF0aCBpcyBhcyBhIGJlbGwsCiAgICBUaGF0IHdhcm5zIG15IG9sZCBhZ2UgdG8gYSBzZXB1bGNocmUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIG90aGVycwoKUFJJTkNFCgogICAgQ29tZSwgTW9udGFndWU7IGZvciB0aG91IGFydCBlYXJseSB1cCwKICAgIFRvIHNlZSB0aHkgc29uIGFuZCBoZWlyIG1vcmUgZWFybHkgZG93bi4KCk1PTlRBR1VFCgogICAgQWxhcywgbXkgbGllZ2UsIG15IHdpZmUgaXMgZGVhZCB0by1uaWdodDsKICAgIEdyaWVmIG9mIG15IHNvbidzIGV4aWxlIGhhdGggc3RvcHAnZCBoZXIgYnJlYXRoOgogICAgV2hhdCBmdXJ0aGVyIHdvZSBjb25zcGlyZXMgYWdhaW5zdCBtaW5lIGFnZT8KClBSSU5DRQoKICAgIExvb2ssIGFuZCB0aG91IHNoYWx0IHNlZS4KCk1PTlRBR1VFCgogICAgTyB0aG91IHVudGF1Z2h0ISB3aGF0IG1hbm5lcnMgaXMgaW4gdGhpcz8KICAgIFRvIHByZXNzIGJlZm9yZSB0aHkgZmF0aGVyIHRvIGEgZ3JhdmUCgpQUklOQ0UKCiAgICBTZWFsIHVwIHRoZSBtb3V0aCBvZiBvdXRyYWdlIGZvciBhIHdoaWxlLAogICAgVGlsbCB3ZSBjYW4gY2xlYXIgdGhlc2UgYW1iaWd1aXRpZXMsCiAgICBBbmQga25vdyB0aGVpciBzcHJpbmcsIHRoZWlyIGhlYWQsIHRoZWlyCiAgICB0cnVlIGRlc2NlbnQ7CiAgICBBbmQgdGhlbiB3aWxsIEkgYmUgZ2VuZXJhbCBvZiB5b3VyIHdvZXMsCiAgICBBbmQgbGVhZCB5b3UgZXZlbiB0byBkZWF0aDogbWVhbnRpbWUgZm9yYmVhciwKICAgIEFuZCBsZXQgbWlzY2hhbmNlIGJlIHNsYXZlIHRvIHBhdGllbmNlLgogICAgQnJpbmcgZm9ydGggdGhlIHBhcnRpZXMgb2Ygc3VzcGljaW9uLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJIGFtIHRoZSBncmVhdGVzdCwgYWJsZSB0byBkbyBsZWFzdCwKICAgIFlldCBtb3N0IHN1c3BlY3RlZCwgYXMgdGhlIHRpbWUgYW5kIHBsYWNlCiAgICBEb3RoIG1ha2UgYWdhaW5zdCBtZSBvZiB0aGlzIGRpcmVmdWwgbXVyZGVyOwogICAgQW5kIGhlcmUgSSBzdGFuZCwgYm90aCB0byBpbXBlYWNoIGFuZCBwdXJnZQogICAgTXlzZWxmIGNvbmRlbW5lZCBhbmQgbXlzZWxmIGV4Y3VzZWQuCgpQUklOQ0UKCiAgICBUaGVuIHNheSBhdCBvbmNlIHdoYXQgdGhvdSBkb3N0IGtub3cgaW4gdGhpcy4KCkZSSUFSIExBVVJFTkNFCgogICAgSSB3aWxsIGJlIGJyaWVmLCBmb3IgbXkgc2hvcnQgZGF0ZSBvZiBicmVhdGgKICAgIElzIG5vdCBzbyBsb25nIGFzIGlzIGEgdGVkaW91cyB0YWxlLgogICAgUm9tZW8sIHRoZXJlIGRlYWQsIHdhcyBodXNiYW5kIHRvIHRoYXQgSnVsaWV0OwogICAgQW5kIHNoZSwgdGhlcmUgZGVhZCwgdGhhdCBSb21lbydzIGZhaXRoZnVsIHdpZmU6CiAgICBJIG1hcnJpZWQgdGhlbTsgYW5kIHRoZWlyIHN0b2wnbiBtYXJyaWFnZS1kYXkKICAgIFdhcyBUeWJhbHQncyBkb29tcy1kYXksIHdob3NlIHVudGltZWx5IGRlYXRoCiAgICBCYW5pc2gnZCB0aGUgbmV3LW1hZGUgYnJpZGVncm9vbSBmcm9tIHRoZSBjaXR5LAogICAgRm9yIHdob20sIGFuZCBub3QgZm9yIFR5YmFsdCwgSnVsaWV0IHBpbmVkLgogICAgWW91LCB0byByZW1vdmUgdGhhdCBzaWVnZSBvZiBncmllZiBmcm9tIGhlciwKICAgIEJldHJvdGgnZCBhbmQgd291bGQgaGF2ZSBtYXJyaWVkIGhlciBwZXJmb3JjZQogICAgVG8gQ291bnR5IFBhcmlzOiB0aGVuIGNvbWVzIHNoZSB0byBtZSwKICAgIEFuZCwgd2l0aCB3aWxkIGxvb2tzLCBiaWQgbWUgZGV2aXNlIHNvbWUgbWVhbgogICAgVG8gcmlkIGhlciBmcm9tIHRoaXMgc2Vjb25kIG1hcnJpYWdlLAogICAgT3IgaW4gbXkgY2VsbCB0aGVyZSB3b3VsZCBzaGUga2lsbCBoZXJzZWxmLgogICAgVGhlbiBnYXZlIEkgaGVyLCBzbyB0dXRvcidkIGJ5IG15IGFydCwKICAgIEEgc2xlZXBpbmcgcG90aW9uOyB3aGljaCBzbyB0b29rIGVmZmVjdAogICAgQXMgSSBpbnRlbmRlZCwgZm9yIGl0IHdyb3VnaHQgb24gaGVyCiAgICBUaGUgZm9ybSBvZiBkZWF0aDogbWVhbnRpbWUgSSB3cml0IHRvIFJvbWVvLAogICAgVGhhdCBoZSBzaG91bGQgaGl0aGVyIGNvbWUgYXMgdGhpcyBkaXJlIG5pZ2h0LAogICAgVG8gaGVscCB0byB0YWtlIGhlciBmcm9tIGhlciBib3Jyb3cnZCBncmF2ZSwKICAgIEJlaW5nIHRoZSB0aW1lIHRoZSBwb3Rpb24ncyBmb3JjZSBzaG91bGQgY2Vhc2UuCiAgICBCdXQgaGUgd2hpY2ggYm9yZSBteSBsZXR0ZXIsIEZyaWFyIEpvaG4sCiAgICBXYXMgc3RheSdkIGJ5IGFjY2lkZW50LCBhbmQgeWVzdGVybmlnaHQKICAgIFJldHVybidkIG15IGxldHRlciBiYWNrLiBUaGVuIGFsbCBhbG9uZQogICAgQXQgdGhlIHByZWZpeGVkIGhvdXIgb2YgaGVyIHdha2luZywKICAgIENhbWUgSSB0byB0YWtlIGhlciBmcm9tIGhlciBraW5kcmVkJ3MgdmF1bHQ7CiAgICBNZWFuaW5nIHRvIGtlZXAgaGVyIGNsb3NlbHkgYXQgbXkgY2VsbCwKICAgIFRpbGwgSSBjb252ZW5pZW50bHkgY291bGQgc2VuZCB0byBSb21lbzoKICAgIEJ1dCB3aGVuIEkgY2FtZSwgc29tZSBtaW51dGUgZXJlIHRoZSB0aW1lCiAgICBPZiBoZXIgYXdha2luZywgaGVyZSB1bnRpbWVseSBsYXkKICAgIFRoZSBub2JsZSBQYXJpcyBhbmQgdHJ1ZSBSb21lbyBkZWFkLgogICAgU2hlIHdha2VzOyBhbmQgSSBlbnRyZWF0ZWQgaGVyIGNvbWUgZm9ydGgsCiAgICBBbmQgYmVhciB0aGlzIHdvcmsgb2YgaGVhdmVuIHdpdGggcGF0aWVuY2U6CiAgICBCdXQgdGhlbiBhIG5vaXNlIGRpZCBzY2FyZSBtZSBmcm9tIHRoZSB0b21iOwogICAgQW5kIHNoZSwgdG9vIGRlc3BlcmF0ZSwgd291bGQgbm90IGdvIHdpdGggbWUsCiAgICBCdXQsIGFzIGl0IHNlZW1zLCBkaWQgdmlvbGVuY2Ugb24gaGVyc2VsZi4KICAgIEFsbCB0aGlzIEkga25vdzsgYW5kIHRvIHRoZSBtYXJyaWFnZQogICAgSGVyIG51cnNlIGlzIHByaXZ5OiBhbmQsIGlmIGF1Z2h0IGluIHRoaXMKICAgIE1pc2NhcnJpZWQgYnkgbXkgZmF1bHQsIGxldCBteSBvbGQgbGlmZQogICAgQmUgc2FjcmlmaWNlZCwgc29tZSBob3VyIGJlZm9yZSBoaXMgdGltZSwKICAgIFVudG8gdGhlIHJpZ291ciBvZiBzZXZlcmVzdCBsYXcuCgpQUklOQ0UKCiAgICBXZSBzdGlsbCBoYXZlIGtub3duIHRoZWUgZm9yIGEgaG9seSBtYW4uCiAgICBXaGVyZSdzIFJvbWVvJ3MgbWFuPyB3aGF0IGNhbiBoZSBzYXkgaW4gdGhpcz8KCkJBTFRIQVNBUgoKICAgIEkgYnJvdWdodCBteSBtYXN0ZXIgbmV3cyBvZiBKdWxpZXQncyBkZWF0aDsKICAgIEFuZCB0aGVuIGluIHBvc3QgaGUgY2FtZSBmcm9tIE1hbnR1YQogICAgVG8gdGhpcyBzYW1lIHBsYWNlLCB0byB0aGlzIHNhbWUgbW9udW1lbnQuCiAgICBUaGlzIGxldHRlciBoZSBlYXJseSBiaWQgbWUgZ2l2ZSBoaXMgZmF0aGVyLAogICAgQW5kIHRocmVhdGVuZWQgbWUgd2l0aCBkZWF0aCwgZ29pbmcgaW4gdGhlIHZhdWx0LAogICAgSSBkZXBhcnRlZCBub3QgYW5kIGxlZnQgaGltIHRoZXJlLgoKUFJJTkNFCgogICAgR2l2ZSBtZSB0aGUgbGV0dGVyOyBJIHdpbGwgbG9vayBvbiBpdC4KICAgIFdoZXJlIGlzIHRoZSBjb3VudHkncyBwYWdlLCB0aGF0IHJhaXNlZCB0aGUgd2F0Y2gCiAgICBTaXJyYWgsIHdoYXQgbWFkZSB5b3VyIG1hc3RlciBpbiB0aGlzIHBsYWNlPwoKUEFHRQoKICAgIEhlIGNhbWUgd2l0aCBmbG93ZXJzIHRvIHN0cmV3IGhpcyBsYWR5J3MgZ3JhdmU7CiAgICBBbmQgYmlkIG1lIHN0YW5kIGFsb29mLCBhbmQgc28gSSBkaWQ6CiAgICBBbm9uIGNvbWVzIG9uZSB3aXRoIGxpZ2h0IHRvIG9wZSB0aGUgdG9tYjsKICAgIEFuZCBieSBhbmQgYnkgbXkgbWFzdGVyIGRyZXcgb24gaGltOwogICAgQW5kIHRoZW4gSSByYW4gYXdheSB0byBjYWxsIHRoZSB3YXRjaC4KClBSSU5DRQoKICAgIFRoaXMgbGV0dGVyIGRvdGggbWFrZSBnb29kIHRoZSBmcmlhcidzIHdvcmRzLAogICAgVGhlaXIgY291cnNlIG9mIGxvdmUsIHRoZSB0aWRpbmdzIG9mIGhlciBkZWF0aDoKICAgIEFuZCBoZXJlIGhlIHdyaXRlcyB0aGF0IGhlIGRpZCBidXkgYSBwb2lzb24KICAgIE9mIGEgcG9vciAncG90aGVjYXJ5LCBhbmQgdGhlcmV3aXRoYWwKICAgIENhbWUgdG8gdGhpcyB2YXVsdCB0byBkaWUsIGFuZCBsaWUgd2l0aCBKdWxpZXQuCiAgICBXaGVyZSBiZSB0aGVzZSBlbmVtaWVzPyBDYXB1bGV0ISBNb250YWd1ZSEKICAgIFNlZSwgd2hhdCBhIHNjb3VyZ2UgaXMgbGFpZCB1cG9uIHlvdXIgaGF0ZSwKICAgIFRoYXQgaGVhdmVuIGZpbmRzIG1lYW5zIHRvIGtpbGwgeW91ciBqb3lzIHdpdGggbG92ZS4KICAgIEFuZCBJIGZvciB3aW5raW5nIGF0IHlvdXIgZGlzY29yZHMgdG9vCiAgICBIYXZlIGxvc3QgYSBicmFjZSBvZiBraW5zbWVuOiBhbGwgYXJlIHB1bmlzaCdkLgoKQ0FQVUxFVAoKICAgIE8gYnJvdGhlciBNb250YWd1ZSwgZ2l2ZSBtZSB0aHkgaGFuZDoKICAgIFRoaXMgaXMgbXkgZGF1Z2h0ZXIncyBqb2ludHVyZSwgZm9yIG5vIG1vcmUKICAgIENhbiBJIGRlbWFuZC4KCk1PTlRBR1VFCgogICAgQnV0IEkgY2FuIGdpdmUgdGhlZSBtb3JlOgogICAgRm9yIEkgd2lsbCByYWlzZSBoZXIgc3RhdHVlIGluIHB1cmUgZ29sZDsKICAgIFRoYXQgd2hpbGUgVmVyb25hIGJ5IHRoYXQgbmFtZSBpcyBrbm93biwKICAgIFRoZXJlIHNoYWxsIG5vIGZpZ3VyZSBhdCBzdWNoIHJhdGUgYmUgc2V0CiAgICBBcyB0aGF0IG9mIHRydWUgYW5kIGZhaXRoZnVsIEp1bGlldC4KCkNBUFVMRVQKCiAgICBBcyByaWNoIHNoYWxsIFJvbWVvJ3MgYnkgaGlzIGxhZHkncyBsaWU7CiAgICBQb29yIHNhY3JpZmljZXMgb2Ygb3VyIGVubWl0eSEKClBSSU5DRQoKICAgIEEgZ2xvb21pbmcgcGVhY2UgdGhpcyBtb3JuaW5nIHdpdGggaXQgYnJpbmdzOwogICAgVGhlIHN1biwgZm9yIHNvcnJvdywgd2lsbCBub3Qgc2hvdyBoaXMgaGVhZDoKICAgIEdvIGhlbmNlLCB0byBoYXZlIG1vcmUgdGFsayBvZiB0aGVzZSBzYWQgdGhpbmdzOwogICAgU29tZSBzaGFsbCBiZSBwYXJkb24nZCwgYW5kIHNvbWUgcHVuaXNoZWQ6CiAgICBGb3IgbmV2ZXIgd2FzIGEgc3Rvcnkgb2YgbW9yZSB3b2UKICAgIFRoYW4gdGhpcyBvZiBKdWxpZXQgYW5kIGhlciBSb21lby4KCiAgICBFeGV1bnQK

Chuck Cartledge
Chuck Cartledge
Chuck Cartledge

httpantonio-ferraroeupnword-clouds-in-r-packages-wordcloud2-and-tmrm(list=ls())library(wordcloud2)library(NLP)library(tm)library(RCurl) Necessary steps 1 Use imagesgooglecom to find an outline of the shape to fill (tmpusapng) 2 Use gimp to fill the outline with black 3 Use a command like wordcloud2(TDMasDF size = 20 figPath=tmpusapng backgroundColor = white fontFamily=Loma) to populate shape 4 Result is a web page with javascript embedded to create image and allow mouse overs Clean corpuscleanCorpus lt- function(corpus) corpustmp lt- tm_map(corpus removePunctuation) corpustmp lt- tm_map(corpustmpstripWhitespace) corpustmp lt- tm_map(corpustmptolower) corpustmp lt- tm_map(corpustmp PlainTextDocument) corpustmp lt- tm_map(corpustmpremoveWords stopwords(english)) return(corpustmp) Build TDMgenerateTDM lt- function(path) sdir lt-path scor lt-Corpus(DirSource(directory = sdir encoding= UTF-8)) scorcl lt- cleanCorpus(scor) stdm lt- TermDocumentMatrix(scorcl) stdminitData lt- function(path) if (direxists(path) == FALSE) If the directory does not exist create and populate with dummy data dummyDataFile lt- romeoAndJulietbase64 fileName lt- sprintf(sdummyDatatxt path) print(sprintf(Creating and populating the file s with dummy data fileName)) dircreate(path recursive = TRUE) write(base64( paste( readLines(dummyDataFile) collapse=) encode=FALSE) file=fileName) main lt- function() options(stringsAsFactors = FALSE) The working directory pathName lt- Text initData(pathName) Get the Term Document Matrix TDM lt- generateTDM(pathName) Do I need a matrix or a DF We will see TDMasMatrix lt- asmatrix(TDM) TDMasDFlt-dataframe(TDMasMatrix) TDMasDF$words lt-rownames(TDMasDF) Column headers colnames(TDMasDF) lt- c(freq word) TDMasDFlt-TDMasDF[ c(word freq)] TDMasDF lt- TDMasDF[order(TDMasDF$freqdecreasing=TRUE)] The results a lt- wordcloud2(TDMasDF size = 03 shape=star backgroundColor = black fontFamily=Loma) print(a) a lt- letterCloud(TDMasDF word=USA size = 03 fontFamily=Loma backgroundColor = black) print(a) a lt- wordcloud2(TDMasDF size = 13 figPath=heartpng backgroundColor = white fontFamily=Loma color=red) print(a) TDMasDF$freq lt- log(TDMasDF$freq) a lt- wordcloud2(TDMasDF size = 12 figPath=usapng backgroundColor = white shuffle=FALSE minRotation = 0 maxRotation = 2pi) print(a) print(The program has ended)main()

Chuck Cartledge
Page 9: Creating Shaped Wordclouds Using R - clc-ent.comThe wordcloud2 function behaves slightly di erently than most of the other R plot func-tions that I’ve used. The result from both

(a) A heart

(b) The letters ldquoUSArdquo

(c) A star

(d) The USA

Figure 6 A collection of sample word clouds These images were created with the attachedR script

8

A Misc files

The files used to create all these figures are attached to this report They are

1 romeoAndJulietbase64 ndash default text used to demonstrate the software

2 heartpng ndash a heart shape with a hole

3 usapng ndash an outline of the continental United States

4 wordCloudR ndash an R script to demonstrate making word clouds

9

ClJvbWVvIGFuZCBKdWxpZXQKU2hha2VzcGVhcmUgaG9tZXBhZ2UgfCBSb21lbyBhbmQgSnVsaWV0IHwgRW50aXJlIHBsYXkKQUNUIEkKUFJPTE9HVUUKCiAgICBUd28gaG91c2Vob2xkcywgYm90aCBhbGlrZSBpbiBkaWduaXR5LAogICAgSW4gZmFpciBWZXJvbmEsIHdoZXJlIHdlIGxheSBvdXIgc2NlbmUsCiAgICBGcm9tIGFuY2llbnQgZ3J1ZGdlIGJyZWFrIHRvIG5ldyBtdXRpbnksCiAgICBXaGVyZSBjaXZpbCBibG9vZCBtYWtlcyBjaXZpbCBoYW5kcyB1bmNsZWFuLgogICAgRnJvbSBmb3J0aCB0aGUgZmF0YWwgbG9pbnMgb2YgdGhlc2UgdHdvIGZvZXMKICAgIEEgcGFpciBvZiBzdGFyLWNyb3NzJ2QgbG92ZXJzIHRha2UgdGhlaXIgbGlmZTsKICAgIFdob3NlIG1pc2FkdmVudHVyZWQgcGl0ZW91cyBvdmVydGhyb3dzCiAgICBEbyB3aXRoIHRoZWlyIGRlYXRoIGJ1cnkgdGhlaXIgcGFyZW50cycgc3RyaWZlLgogICAgVGhlIGZlYXJmdWwgcGFzc2FnZSBvZiB0aGVpciBkZWF0aC1tYXJrJ2QgbG92ZSwKICAgIEFuZCB0aGUgY29udGludWFuY2Ugb2YgdGhlaXIgcGFyZW50cycgcmFnZSwKICAgIFdoaWNoLCBidXQgdGhlaXIgY2hpbGRyZW4ncyBlbmQsIG5vdWdodCBjb3VsZCByZW1vdmUsCiAgICBJcyBub3cgdGhlIHR3byBob3VycycgdHJhZmZpYyBvZiBvdXIgc3RhZ2U7CiAgICBUaGUgd2hpY2ggaWYgeW91IHdpdGggcGF0aWVudCBlYXJzIGF0dGVuZCwKICAgIFdoYXQgaGVyZSBzaGFsbCBtaXNzLCBvdXIgdG9pbCBzaGFsbCBzdHJpdmUgdG8gbWVuZC4KClNDRU5FIEkuIFZlcm9uYS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgU0FNUFNPTiBhbmQgR1JFR09SWSwgb2YgdGhlIGhvdXNlIG9mIENhcHVsZXQsIGFybWVkIHdpdGggc3dvcmRzIGFuZCBidWNrbGVycyAKClNBTVBTT04KCiAgICBHcmVnb3J5LCBvJyBteSB3b3JkLCB3ZSdsbCBub3QgY2FycnkgY29hbHMuCgpHUkVHT1JZCgogICAgTm8sIGZvciB0aGVuIHdlIHNob3VsZCBiZSBjb2xsaWVycy4KClNBTVBTT04KCiAgICBJIG1lYW4sIGFuIHdlIGJlIGluIGNob2xlciwgd2UnbGwgZHJhdy4KCkdSRUdPUlkKCiAgICBBeSwgd2hpbGUgeW91IGxpdmUsIGRyYXcgeW91ciBuZWNrIG91dCBvJyB0aGUgY29sbGFyLgoKU0FNUFNPTgoKICAgIEkgc3RyaWtlIHF1aWNrbHksIGJlaW5nIG1vdmVkLgoKR1JFR09SWQoKICAgIEJ1dCB0aG91IGFydCBub3QgcXVpY2tseSBtb3ZlZCB0byBzdHJpa2UuCgpTQU1QU09OCgogICAgQSBkb2cgb2YgdGhlIGhvdXNlIG9mIE1vbnRhZ3VlIG1vdmVzIG1lLgoKR1JFR09SWQoKICAgIFRvIG1vdmUgaXMgdG8gc3RpcjsgYW5kIHRvIGJlIHZhbGlhbnQgaXMgdG8gc3RhbmQ6CiAgICB0aGVyZWZvcmUsIGlmIHRob3UgYXJ0IG1vdmVkLCB0aG91IHJ1bm4nc3QgYXdheS4KClNBTVBTT04KCiAgICBBIGRvZyBvZiB0aGF0IGhvdXNlIHNoYWxsIG1vdmUgbWUgdG8gc3RhbmQ6IEkgd2lsbAogICAgdGFrZSB0aGUgd2FsbCBvZiBhbnkgbWFuIG9yIG1haWQgb2YgTW9udGFndWUncy4KCkdSRUdPUlkKCiAgICBUaGF0IHNob3dzIHRoZWUgYSB3ZWFrIHNsYXZlOyBmb3IgdGhlIHdlYWtlc3QgZ29lcwogICAgdG8gdGhlIHdhbGwuCgpTQU1QU09OCgogICAgVHJ1ZTsgYW5kIHRoZXJlZm9yZSB3b21lbiwgYmVpbmcgdGhlIHdlYWtlciB2ZXNzZWxzLAogICAgYXJlIGV2ZXIgdGhydXN0IHRvIHRoZSB3YWxsOiB0aGVyZWZvcmUgSSB3aWxsIHB1c2gKICAgIE1vbnRhZ3VlJ3MgbWVuIGZyb20gdGhlIHdhbGwsIGFuZCB0aHJ1c3QgaGlzIG1haWRzCiAgICB0byB0aGUgd2FsbC4KCkdSRUdPUlkKCiAgICBUaGUgcXVhcnJlbCBpcyBiZXR3ZWVuIG91ciBtYXN0ZXJzIGFuZCB1cyB0aGVpciBtZW4uCgpTQU1QU09OCgogICAgJ1RpcyBhbGwgb25lLCBJIHdpbGwgc2hvdyBteXNlbGYgYSB0eXJhbnQ6IHdoZW4gSQogICAgaGF2ZSBmb3VnaHQgd2l0aCB0aGUgbWVuLCBJIHdpbGwgYmUgY3J1ZWwgd2l0aCB0aGUKICAgIG1haWRzLCBhbmQgY3V0IG9mZiB0aGVpciBoZWFkcy4KCkdSRUdPUlkKCiAgICBUaGUgaGVhZHMgb2YgdGhlIG1haWRzPwoKU0FNUFNPTgoKICAgIEF5LCB0aGUgaGVhZHMgb2YgdGhlIG1haWRzLCBvciB0aGVpciBtYWlkZW5oZWFkczsKICAgIHRha2UgaXQgaW4gd2hhdCBzZW5zZSB0aG91IHdpbHQuCgpHUkVHT1JZCgogICAgVGhleSBtdXN0IHRha2UgaXQgaW4gc2Vuc2UgdGhhdCBmZWVsIGl0LgoKU0FNUFNPTgoKICAgIE1lIHRoZXkgc2hhbGwgZmVlbCB3aGlsZSBJIGFtIGFibGUgdG8gc3RhbmQ6IGFuZAogICAgJ3RpcyBrbm93biBJIGFtIGEgcHJldHR5IHBpZWNlIG9mIGZsZXNoLgoKR1JFR09SWQoKICAgICdUaXMgd2VsbCB0aG91IGFydCBub3QgZmlzaDsgaWYgdGhvdSBoYWRzdCwgdGhvdQogICAgaGFkc3QgYmVlbiBwb29yIEpvaG4uIERyYXcgdGh5IHRvb2whIGhlcmUgY29tZXMKICAgIHR3byBvZiB0aGUgaG91c2Ugb2YgdGhlIE1vbnRhZ3Vlcy4KClNBTVBTT04KCiAgICBNeSBuYWtlZCB3ZWFwb24gaXMgb3V0OiBxdWFycmVsLCBJIHdpbGwgYmFjayB0aGVlLgoKR1JFR09SWQoKICAgIEhvdyEgdHVybiB0aHkgYmFjayBhbmQgcnVuPwoKU0FNUFNPTgoKICAgIEZlYXIgbWUgbm90LgoKR1JFR09SWQoKICAgIE5vLCBtYXJyeTsgSSBmZWFyIHRoZWUhCgpTQU1QU09OCgogICAgTGV0IHVzIHRha2UgdGhlIGxhdyBvZiBvdXIgc2lkZXM7IGxldCB0aGVtIGJlZ2luLgoKR1JFR09SWQoKICAgIEkgd2lsbCBmcm93biBhcyBJIHBhc3MgYnksIGFuZCBsZXQgdGhlbSB0YWtlIGl0IGFzCiAgICB0aGV5IGxpc3QuCgpTQU1QU09OCgogICAgTmF5LCBhcyB0aGV5IGRhcmUuIEkgd2lsbCBiaXRlIG15IHRodW1iIGF0IHRoZW07CiAgICB3aGljaCBpcyBhIGRpc2dyYWNlIHRvIHRoZW0sIGlmIHRoZXkgYmVhciBpdC4KCiAgICBFbnRlciBBQlJBSEFNIGFuZCBCQUxUSEFTQVIKCkFCUkFIQU0KCiAgICBEbyB5b3UgYml0ZSB5b3VyIHRodW1iIGF0IHVzLCBzaXICgpTQU1QU09OCgogICAgSSBkbyBiaXRlIG15IHRodW1iLCBzaXIuCgpBQlJBSEFNCgogICAgRG8geW91IGJpdGUgeW91ciB0aHVtYiBhdCB1cywgc2lyPwoKU0FNUFNPTgoKICAgIFtBc2lkZSB0byBHUkVHT1JZXSBJcyB0aGUgbGF3IG9mIG91ciBzaWRlLCBpZiBJIHNheQogICAgYXkCgpHUkVHT1JZCgogICAgTm8uCgpTQU1QU09OCgogICAgTm8sIHNpciwgSSBkbyBub3QgYml0ZSBteSB0aHVtYiBhdCB5b3UsIHNpciwgYnV0IEkKICAgIGJpdGUgbXkgdGh1bWIsIHNpci4KCkdSRUdPUlkKCiAgICBEbyB5b3UgcXVhcnJlbCwgc2lyPwoKQUJSQUhBTQoKICAgIFF1YXJyZWwgc2lyISBubywgc2lyLgoKU0FNUFNPTgoKICAgIElmIHlvdSBkbywgc2lyLCBJIGFtIGZvciB5b3U6IEkgc2VydmUgYXMgZ29vZCBhIG1hbiBhcyB5b3UuCgpBQlJBSEFNCgogICAgTm8gYmV0dGVyLgoKU0FNUFNPTgoKICAgIFdlbGwsIHNpci4KCkdSRUdPUlkKCiAgICBTYXkgJ2JldHRlcjonIGhlcmUgY29tZXMgb25lIG9mIG15IG1hc3RlcidzIGtpbnNtZW4uCgpTQU1QU09OCgogICAgWWVzLCBiZXR0ZXIsIHNpci4KCkFCUkFIQU0KCiAgICBZb3UgbGllLgoKU0FNUFNPTgoKICAgIERyYXcsIGlmIHlvdSBiZSBtZW4uIEdyZWdvcnksIHJlbWVtYmVyIHRoeSBzd2FzaGluZyBibG93LgoKICAgIFRoZXkgZmlnaHQKCiAgICBFbnRlciBCRU5WT0xJTwoKQkVOVk9MSU8KCiAgICBQYXJ0LCBmb29scyEKICAgIFB1dCB1cCB5b3VyIHN3b3JkczsgeW91IGtub3cgbm90IHdoYXQgeW91IGRvLgoKICAgIEJlYXRzIGRvd24gdGhlaXIgc3dvcmRzCgogICAgRW50ZXIgVFlCQUxUCgpUWUJBTFQKCiAgICBXaGF0LCBhcnQgdGhvdSBkcmF3biBhbW9uZyB0aGVzZSBoZWFydGxlc3MgaGluZHMCiAgICBUdXJuIHRoZWUsIEJlbnZvbGlvLCBsb29rIHVwb24gdGh5IGRlYXRoLgoKQkVOVk9MSU8KCiAgICBJIGRvIGJ1dCBrZWVwIHRoZSBwZWFjZTogcHV0IHVwIHRoeSBzd29yZCwKICAgIE9yIG1hbmFnZSBpdCB0byBwYXJ0IHRoZXNlIG1lbiB3aXRoIG1lLgoKVFlCQUxUCgogICAgV2hhdCwgZHJhd24sIGFuZCB0YWxrIG9mIHBlYWNlISBJIGhhdGUgdGhlIHdvcmQsCiAgICBBcyBJIGhhdGUgaGVsbCwgYWxsIE1vbnRhZ3VlcywgYW5kIHRoZWU6CiAgICBIYXZlIGF0IHRoZWUsIGNvd2FyZCEKCiAgICBUaGV5IGZpZ2h0CgogICAgRW50ZXIsIHNldmVyYWwgb2YgYm90aCBob3VzZXMsIHdobyBqb2luIHRoZSBmcmF5OyB0aGVuIGVudGVyIENpdGl6ZW5zLCB3aXRoIGNsdWJzCgpGaXJzdCBDaXRpemVuCgogICAgQ2x1YnMsIGJpbGxzLCBhbmQgcGFydGlzYW5zISBzdHJpa2UhIGJlYXQgdGhlbSBkb3duIQogICAgRG93biB3aXRoIHRoZSBDYXB1bGV0cyEgZG93biB3aXRoIHRoZSBNb250YWd1ZXMhCgogICAgRW50ZXIgQ0FQVUxFVCBpbiBoaXMgZ293biwgYW5kIExBRFkgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgdGhpcz8gR2l2ZSBtZSBteSBsb25nIHN3b3JkLCBobyEKCkxBRFkgQ0FQVUxFVAoKICAgIEEgY3J1dGNoLCBhIGNydXRjaCEgd2h5IGNhbGwgeW91IGZvciBhIHN3b3JkPwoKQ0FQVUxFVAoKICAgIE15IHN3b3JkLCBJIHNheSEgT2xkIE1vbnRhZ3VlIGlzIGNvbWUsCiAgICBBbmQgZmxvdXJpc2hlcyBoaXMgYmxhZGUgaW4gc3BpdGUgb2YgbWUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIExBRFkgTU9OVEFHVUUKCk1PTlRBR1VFCgogICAgVGhvdSB2aWxsYWluIENhcHVsZXQsLS1Ib2xkIG1lIG5vdCwgbGV0IG1lIGdvLgoKTEFEWSBNT05UQUdVRQoKICAgIFRob3Ugc2hhbHQgbm90IHN0aXIgYSBmb290IHRvIHNlZWsgYSBmb2UuCgogICAgRW50ZXIgUFJJTkNFLCB3aXRoIEF0dGVuZGFudHMKClBSSU5DRQoKICAgIFJlYmVsbGlvdXMgc3ViamVjdHMsIGVuZW1pZXMgdG8gcGVhY2UsCiAgICBQcm9mYW5lcnMgb2YgdGhpcyBuZWlnaGJvdXItc3RhaW5lZCBzdGVlbCwtLQogICAgV2lsbCB0aGV5IG5vdCBoZWFyPyBXaGF0LCBobyEgeW91IG1lbiwgeW91IGJlYXN0cywKICAgIFRoYXQgcXVlbmNoIHRoZSBmaXJlIG9mIHlvdXIgcGVybmljaW91cyByYWdlCiAgICBXaXRoIHB1cnBsZSBmb3VudGFpbnMgaXNzdWluZyBmcm9tIHlvdXIgdmVpbnMsCiAgICBPbiBwYWluIG9mIHRvcnR1cmUsIGZyb20gdGhvc2UgYmxvb2R5IGhhbmRzCiAgICBUaHJvdyB5b3VyIG1pc3RlbXBlcidkIHdlYXBvbnMgdG8gdGhlIGdyb3VuZCwKICAgIEFuZCBoZWFyIHRoZSBzZW50ZW5jZSBvZiB5b3VyIG1vdmVkIHByaW5jZS4KICAgIFRocmVlIGNpdmlsIGJyYXdscywgYnJlZCBvZiBhbiBhaXJ5IHdvcmQsCiAgICBCeSB0aGVlLCBvbGQgQ2FwdWxldCwgYW5kIE1vbnRhZ3VlLAogICAgSGF2ZSB0aHJpY2UgZGlzdHVyYidkIHRoZSBxdWlldCBvZiBvdXIgc3RyZWV0cywKICAgIEFuZCBtYWRlIFZlcm9uYSdzIGFuY2llbnQgY2l0aXplbnMKICAgIENhc3QgYnkgdGhlaXIgZ3JhdmUgYmVzZWVtaW5nIG9ybmFtZW50cywKICAgIFRvIHdpZWxkIG9sZCBwYXJ0aXNhbnMsIGluIGhhbmRzIGFzIG9sZCwKICAgIENhbmtlcidkIHdpdGggcGVhY2UsIHRvIHBhcnQgeW91ciBjYW5rZXInZCBoYXRlOgogICAgSWYgZXZlciB5b3UgZGlzdHVyYiBvdXIgc3RyZWV0cyBhZ2FpbiwKICAgIFlvdXIgbGl2ZXMgc2hhbGwgcGF5IHRoZSBmb3JmZWl0IG9mIHRoZSBwZWFjZS4KICAgIEZvciB0aGlzIHRpbWUsIGFsbCB0aGUgcmVzdCBkZXBhcnQgYXdheToKICAgIFlvdSBDYXB1bGV0OyBzaGFsbCBnbyBhbG9uZyB3aXRoIG1lOgogICAgQW5kLCBNb250YWd1ZSwgY29tZSB5b3UgdGhpcyBhZnRlcm5vb24sCiAgICBUbyBrbm93IG91ciBmdXJ0aGVyIHBsZWFzdXJlIGluIHRoaXMgY2FzZSwKICAgIFRvIG9sZCBGcmVlLXRvd24sIG91ciBjb21tb24ganVkZ21lbnQtcGxhY2UuCiAgICBPbmNlIG1vcmUsIG9uIHBhaW4gb2YgZGVhdGgsIGFsbCBtZW4gZGVwYXJ0LgoKICAgIEV4ZXVudCBhbGwgYnV0IE1PTlRBR1VFLCBMQURZIE1PTlRBR1VFLCBhbmQgQkVOVk9MSU8KCk1PTlRBR1VFCgogICAgV2hvIHNldCB0aGlzIGFuY2llbnQgcXVhcnJlbCBuZXcgYWJyb2FjaD8KICAgIFNwZWFrLCBuZXBoZXcsIHdlcmUgeW91IGJ5IHdoZW4gaXQgYmVnYW4CgpCRU5WT0xJTwoKICAgIEhlcmUgd2VyZSB0aGUgc2VydmFudHMgb2YgeW91ciBhZHZlcnNhcnksCiAgICBBbmQgeW91cnMsIGNsb3NlIGZpZ2h0aW5nIGVyZSBJIGRpZCBhcHByb2FjaDoKICAgIEkgZHJldyB0byBwYXJ0IHRoZW06IGluIHRoZSBpbnN0YW50IGNhbWUKICAgIFRoZSBmaWVyeSBUeWJhbHQsIHdpdGggaGlzIHN3b3JkIHByZXBhcmVkLAogICAgV2hpY2gsIGFzIGhlIGJyZWF0aGVkIGRlZmlhbmNlIHRvIG15IGVhcnMsCiAgICBIZSBzd3VuZyBhYm91dCBoaXMgaGVhZCBhbmQgY3V0IHRoZSB3aW5kcywKICAgIFdobyBub3RoaW5nIGh1cnQgd2l0aGFsIGhpc3MnZCBoaW0gaW4gc2Nvcm46CiAgICBXaGlsZSB3ZSB3ZXJlIGludGVyY2hhbmdpbmcgdGhydXN0cyBhbmQgYmxvd3MsCiAgICBDYW1lIG1vcmUgYW5kIG1vcmUgYW5kIGZvdWdodCBvbiBwYXJ0IGFuZCBwYXJ0LAogICAgVGlsbCB0aGUgcHJpbmNlIGNhbWUsIHdobyBwYXJ0ZWQgZWl0aGVyIHBhcnQuCgpMQURZIE1PTlRBR1VFCgogICAgTywgd2hlcmUgaXMgUm9tZW8IHNhdyB5b3UgaGltIHRvLWRheT8KICAgIFJpZ2h0IGdsYWQgSSBhbSBoZSB3YXMgbm90IGF0IHRoaXMgZnJheS4KCkJFTlZPTElPCgogICAgTWFkYW0sIGFuIGhvdXIgYmVmb3JlIHRoZSB3b3JzaGlwcCdkIHN1bgogICAgUGVlcidkIGZvcnRoIHRoZSBnb2xkZW4gd2luZG93IG9mIHRoZSBlYXN0LAogICAgQSB0cm91YmxlZCBtaW5kIGRyYXZlIG1lIHRvIHdhbGsgYWJyb2FkOwogICAgV2hlcmUsIHVuZGVybmVhdGggdGhlIGdyb3ZlIG9mIHN5Y2Ftb3JlCiAgICBUaGF0IHdlc3R3YXJkIHJvb3RldGggZnJvbSB0aGUgY2l0eSdzIHNpZGUsCiAgICBTbyBlYXJseSB3YWxraW5nIGRpZCBJIHNlZSB5b3VyIHNvbjoKICAgIFRvd2FyZHMgaGltIEkgbWFkZSwgYnV0IGhlIHdhcyB3YXJlIG9mIG1lCiAgICBBbmQgc3RvbGUgaW50byB0aGUgY292ZXJ0IG9mIHRoZSB3b29kOgogICAgSSwgbWVhc3VyaW5nIGhpcyBhZmZlY3Rpb25zIGJ5IG15IG93biwKICAgIFRoYXQgbW9zdCBhcmUgYnVzaWVkIHdoZW4gdGhleSdyZSBtb3N0IGFsb25lLAogICAgUHVyc3VlZCBteSBodW1vdXIgbm90IHB1cnN1aW5nIGhpcywKICAgIEFuZCBnbGFkbHkgc2h1bm4nZCB3aG8gZ2xhZGx5IGZsZWQgZnJvbSBtZS4KCk1PTlRBR1VFCgogICAgTWFueSBhIG1vcm5pbmcgaGF0aCBoZSB0aGVyZSBiZWVuIHNlZW4sCiAgICBXaXRoIHRlYXJzIGF1Z21lbnRpbmcgdGhlIGZyZXNoIG1vcm5pbmcgZGV3LgogICAgQWRkaW5nIHRvIGNsb3VkcyBtb3JlIGNsb3VkcyB3aXRoIGhpcyBkZWVwIHNpZ2hzOwogICAgQnV0IGFsbCBzbyBzb29uIGFzIHRoZSBhbGwtY2hlZXJpbmcgc3VuCiAgICBTaG91bGQgaW4gdGhlIGZ1cnRoZXN0IGVhc3QgYmVnaW4gdG8gZHJhdwogICAgVGhlIHNoYWR5IGN1cnRhaW5zIGZyb20gQXVyb3JhJ3MgYmVkLAogICAgQXdheSBmcm9tIHRoZSBsaWdodCBzdGVhbHMgaG9tZSBteSBoZWF2eSBzb24sCiAgICBBbmQgcHJpdmF0ZSBpbiBoaXMgY2hhbWJlciBwZW5zIGhpbXNlbGYsCiAgICBTaHV0cyB1cCBoaXMgd2luZG93cywgbG9ja3MgZmFyIGRheWxpZ2h0IG91dAogICAgQW5kIG1ha2VzIGhpbXNlbGYgYW4gYXJ0aWZpY2lhbCBuaWdodDoKICAgIEJsYWNrIGFuZCBwb3J0ZW50b3VzIG11c3QgdGhpcyBodW1vdXIgcHJvdmUsCiAgICBVbmxlc3MgZ29vZCBjb3Vuc2VsIG1heSB0aGUgY2F1c2UgcmVtb3ZlLgoKQkVOVk9MSU8KCiAgICBNeSBub2JsZSB1bmNsZSwgZG8geW91IGtub3cgdGhlIGNhdXNlPwoKTU9OVEFHVUUKCiAgICBJIG5laXRoZXIga25vdyBpdCBub3IgY2FuIGxlYXJuIG9mIGhpbS4KCkJFTlZPTElPCgogICAgSGF2ZSB5b3UgaW1wb3J0dW5lZCBoaW0gYnkgYW55IG1lYW5zPwoKTU9OVEFHVUUKCiAgICBCb3RoIGJ5IG15c2VsZiBhbmQgbWFueSBvdGhlciBmcmllbmRzOgogICAgQnV0IGhlLCBoaXMgb3duIGFmZmVjdGlvbnMnIGNvdW5zZWxsb3IsCiAgICBJcyB0byBoaW1zZWxmLS1JIHdpb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UVPCgogICAgR29vZCBoZWFydCwgYXQgd2hhdD8KCkJFTlZPTElPCgogICAgQXQgdGh5IGdvb2QgaGVhcnQncyBvcHByZXNzaW9uLgoKUk9NRU8KCiAgICBXaHksIHN1Y2ggaXMgbG92ZSdzIHRyYW5zZ3Jlc3Npb24uCiAgICBHcmllZnMgb2YgbWluZSBvd24gbGllIGhlYXZ5IGluIG15IGJyZWFzdCwKICAgIFdoaWNoIHRob3Ugd2lsdCBwcm9wYWdhdGUsIHRvIGhhdmUgaXQgcHJlc3QKICAgIFdpdGggbW9yZSBvZiB0aGluZTogdGhpcyBsb3ZlIHRoYXQgdGhvdSBoYXN0IHNob3duCiAgICBEb3RoIGFkZCBtb3JlIGdyaWVmIHRvIHRvbyBtdWNoIG9mIG1pbmUgb3duLgogICAgTG92ZSBpcyBhIHNtb2tlIHJhaXNlZCB3aXRoIHRoZSBmdW1lIG9mIHNpZ2hzOwogICAgQmVpbmcgcHVyZ2VkLCBhIGZpcmUgc3BhcmtsaW5nIGluIGxvdmVycycgZXllczsKICAgIEJlaW5nIHZleCdkIGEgc2VhIG5vdXJpc2gnZCB3aXRoIGxvdmVycycgdGVhcnM6CiAgICBXaGF0IGlzIGl0IGVsc2UIGEgbWFkbmVzcyBtb3N0IGRpc2NyZWV0LAogICAgQSBjaG9raW5nIGdhbGwgYW5kIGEgcHJlc2VydmluZyBzd2VldC4KICAgIEZhcmV3ZWxsLCBteSBjb3ouCgpCRU5WT0xJTwoKICAgIFNvZnQhIEkgd2lsbCBnbyBhbG9uZzsKICAgIEFuIGlmIHlvdSBsZWF2ZSBtZSBzbywgeW91IGRvIG1lIHdyb25nLgoKUk9NRU8KCiAgICBUdXQsIEkgaGF2ZSBsb3N0IG15c2VsZjsgSSBhbSBub3QgaGVyZTsKICAgIFRoaXMgaXMgbm90IFJvbWVvLCBoZSdzIHNvbWUgb3RoZXIgd2hlcmUuCgpCRU5WT0xJTwoKICAgIFRlbGwgbWUgaW4gc2FkbmVzcywgd2hvIGlzIHRoYXQgeW91IGxvdmUuCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIEkgZ3JvYW4gYW5kIHRlbGwgdGhlZT8KCkJFTlZPTElPCgogICAgR3JvYW4hIHdoeSwgbm8uCiAgICBCdXQgc2FkbHkgdGVsbCBtZSB3aG8uCgpST01FTwoKICAgIEJpZCBhIHNpY2sgbWFuIGluIHNhZG5lc3MgbWFrZSBoaXMgd2lsbDoKICAgIEFoLCB3b3JkIGlsbCB1cmdlZCB0byBvbmUgdGhhdCBpcyBzbyBpbGwhCiAgICBJbiBzYWRuZXNzLCBjb3VzaW4sIEkgZG8gbG92ZSBhIHdvbWFuLgoKQkVOVk9MSU8KCiAgICBJIGFpbSdkIHNvIG5lYXIsIHdoZW4gSSBzdXBwb3NlZCB5b3UgbG92ZWQuCgpST01FTwoKICAgIEEgcmlnaHQgZ29vZCBtYXJrLW1hbiEgQW5kIHNoZSdzIGZhaXIgSSBsb3ZlLgoKQkVOVk9MSU8KCiAgICBBIHJpZ2h0IGZhaXIgbWFyaywgZmFpciBjb3osIGlzIHNvb25lc3QgaGl0LgoKUk9NRU8KCiAgICBXZWxsLCBpbiB0aGF0IGhpdCB5b3UgbWlzczogc2hlJ2xsIG5vdCBiZSBoaXQKICAgIFdpdGggQ3VwaWQncyBhcnJvdzsgc2hlIGhhdGggRGlhbidzIHdpdDsKICAgIEFuZCwgaW4gc3Ryb25nIHByb29mIG9mIGNoYXN0aXR5IHdlbGwgYXJtJ2QsCiAgICBGcm9tIGxvdmUncyB3ZWFrIGNoaWxkaXNoIGJvdyBzaGUgbGl2ZXMgdW5oYXJtJ2QuCiAgICBTaGUgd2lsbCBub3Qgc3RheSB0aGUgc2llZ2Ugb2YgbG92aW5nIHRlcm1zLAogICAgTm9yIGJpZGUgdGhlIGVuY291bnRlciBvZiBhc3NhaWxpbmcgZXllcywKICAgIE5vciBvcGUgaGVyIGxhcCB0byBzYWludC1zZWR1Y2luZyBnb2xkOgogICAgTywgc2hlIGlzIHJpY2ggaW4gYmVhdXR5LCBvbmx5IHBvb3IsCiAgICBUaGF0IHdoZW4gc2hlIGRpZXMgd2l0aCBiZWF1dHkgZGllcyBoZXIgc3RvcmUuCgpCRU5WT0xJTwoKICAgIFRoZW4gc2hlIGhhdGggc3dvcm4gdGhhdCBzaGUgd2lsbCBzdGlsbCBsaXZlIGNoYXN0ZT8KClJPTUVPCgogICAgU2hlIGhhdGgsIGFuZCBpbiB0aGF0IHNwYXJpbmcgbWFrZXMgaHVnZSB3YXN0ZSwKICAgIEZvciBiZWF1dHkgc3RhcnZlZCB3aXRoIGhlciBzZXZlcml0eQogICAgQ3V0cyBiZWF1dHkgb2ZmIGZyb20gYWxsIHBvc3Rlcml0eS4KICAgIFNoZSBpcyB0b28gZmFpciwgdG9vIHdpc2UsIHdpc2VseSB0b28gZmFpciwKICAgIFRvIG1lcml0IGJsaXNzIGJ5IG1ha2luZyBtZSBkZXNwYWlyOgogICAgU2hlIGhhdGggZm9yc3dvcm4gdG8gbG92ZSwgYW5kIGluIHRoYXQgdm93CiAgICBEbyBJIGxpdmUgZGVhZCB0aGF0IGxpdmUgdG8gdGVsbCBpdCBub3cuCgpCRU5WT0xJTwoKICAgIEJlIHJ1bGVkIGJ5IG1lLCBmb3JnZXQgdG8gdGhpbmsgb2YgaGVyLgoKUk9NRU8KCiAgICBPLCB0ZWFjaCBtZSBob3cgSSBzaG91bGQgZm9yZ2V0IHRvIHRoaW5rLgoKQkVOVk9MSU8KCiAgICBCeSBnaXZpbmcgbGliZXJ0eSB1bnRvIHRoaW5lIGV5ZXM7CiAgICBFeGFtaW5lIG90aGVyIGJlYXV0aWVzLgoKUk9NRU8KCiAgICAnVGlzIHRoZSB3YXkKICAgIFRvIGNhbGwgaGVycyBleHF1aXNpdGUsIGluIHF1ZXN0aW9uIG1vcmU6CiAgICBUaGVzZSBoYXBweSBtYXNrcyB0aGF0IGtpc3MgZmFpciBsYWRpZXMnIGJyb3dzCiAgICBCZWluZyBibGFjayBwdXQgdXMgaW4gbWluZCB0aGV5IGhpZGUgdGhlIGZhaXI7CiAgICBIZSB0aGF0IGlzIHN0cnVja2VuIGJsaW5kIGNhbm5vdCBmb3JnZXQKICAgIFRoZSBwcmVjaW91cyB0cmVhc3VyZSBvZiBoaXMgZXllc2lnaHQgbG9zdDoKICAgIFNob3cgbWUgYSBtaXN0cmVzcyB0aGF0IGlzIHBhc3NpbmcgZmFpciwKICAgIFdoYXQgZG90aCBoZXIgYmVhdXR5IHNlcnZlLCBidXQgYXMgYSBub3RlCiAgICBXaGVyZSBJIG1heSByZWFkIHdobyBwYXNzJ2QgdGhhdCBwYXNzaW5nIGZhaXICiAgICBGYXJld2VsbDogdGhvdSBjYW5zdCBub3QgdGVhY2ggbWUgdG8gZm9yZ2V0LgoKQkVOVk9MSU8KCiAgICBJJ2xsIHBheSB0aGF0IGRvY3RyaW5lLCBvciBlbHNlIGRpZSBpbiBkZWJ0LgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEEgc3RyZWV0LgoKICAgIEVudGVyIENBUFVMRVQsIFBBUklTLCBhbmQgU2VydmFudCAKCkNBUFVMRVQKCiAgICBCdXQgTW9udGFndWUgaXMgYm91bmQgYXMgd2VsbCBhcyBJLAogICAgSW4gcGVuYWx0eSBhbGlrZTsgYW5kICd0aXMgbm90IGhhcmQsIEkgdGhpbmssCiAgICBGb3IgbWVuIHNvIG9sZCBhcyB3ZSB0byBrZWVwIHRoZSBwZWFjZS4KClBBUklTCgogICAgT2YgaG9ub3VyYWJsZSByZWNrb25pbmcgYXJlIHlvdSBib3RoOwogICAgQW5kIHBpdHkgJ3RpcyB5b3UgbGl2ZWQgYXQgb2RkcyBzbyBsb25nLgogICAgQnV0IG5vdywgbXkgbG9yZCwgd2hhdCBzYXkgeW91IHRvIG15IHN1aXQCgpDQVBVTEVUCgogICAgQnV0IHNheWluZyBvJ2VyIHdoYXQgSSBoYXZlIHNhaWQgYmVmb3JlOgogICAgTXkgY2hpbGQgaXMgeWV0IGEgc3RyYW5nZXIgaW4gdGhlIHdvcmxkOwogICAgU2hlIGhhdGggbm90IHNlZW4gdGhlIGNoYW5nZSBvZiBmb3VydGVlbiB5ZWFycywKICAgIExldCB0d28gbW9yZSBzdW1tZXJzIHdpdGhlciBpbiB0aGVpciBwcmlkZSwKICAgIEVyZSB3ZSBtYXkgdGhpbmsgaGVyIHJpcGUgdG8gYmUgYSBicmlkZS4KClBBUklTCgogICAgWW91bmdlciB0aGFuIHNoZSBhcmUgaGFwcHkgbW90aGVycyBtYWRlLgoKQ0FQVUxFVAoKICAgIEFuZCB0b28gc29vbiBtYXJyJ2QgYXJlIHRob3NlIHNvIGVhcmx5IG1hZGUuCiAgICBUaGUgZWFydGggaGF0aCBzd2FsbG93J2QgYWxsIG15IGhvcGVzIGJ1dCBzaGUsCiAgICBTaGUgaXMgdGhlIGhvcGVmdWwgbGFkeSBvZiBteSBlYXJ0aDoKICAgIEJ1dCB3b28gaGVyLCBnZW50bGUgUGFyaXMsIGdldCBoZXIgaGVhcnQsCiAgICBNeSB3aWxsIHRvIGhlciBjb25zZW50IGlzIGJ1dCBhIHBhcnQ7CiAgICBBbiBzaGUgYWdyZWUsIHdpdGhpbiBoZXIgc2NvcGUgb2YgY2hvaWNlCiAgICBMaWVzIG15IGNvbnNlbnQgYW5kIGZhaXIgYWNjb3JkaW5nIHZvaWNlLgogICAgVGhpcyBuaWdodCBJIGhvbGQgYW4gb2xkIGFjY3VzdG9tJ2QgZmVhc3QsCiAgICBXaGVyZXRvIEkgaGF2ZSBpbnZpdGVkIG1hbnkgYSBndWVzdCwKICAgIFN1Y2ggYXMgSSBsb3ZlOyBhbmQgeW91LCBhbW9uZyB0aGUgc3RvcmUsCiAgICBPbmUgbW9yZSwgbW9zdCB3ZWxjb21lLCBtYWtlcyBteSBudW1iZXIgbW9yZS4KICAgIEF0IG15IHBvb3IgaG91c2UgbG9vayB0byBiZWhvbGQgdGhpcyBuaWdodAogICAgRWFydGgtdHJlYWRpbmcgc3RhcnMgdGhhdCBtYWtlIGRhcmsgaGVhdmVuIGxpZ2h0OgogICAgU3VjaCBjb21mb3J0IGFzIGRvIGx1c3R5IHlvdW5nIG1lbiBmZWVsCiAgICBXaGVuIHdlbGwtYXBwYXJlbGwnZCBBcHJpbCBvbiB0aGUgaGVlbAogICAgT2YgbGltcGluZyB3aW50ZXIgdHJlYWRzLCBldmVuIHN1Y2ggZGVsaWdodAogICAgQW1vbmcgZnJlc2ggZmVtYWxlIGJ1ZHMgc2hhbGwgeW91IHRoaXMgbmlnaHQKICAgIEluaGVyaXQgYXQgbXkgaG91c2U7IGhlYXIgYWxsLCBhbGwgc2VlLAogICAgQW5kIGxpa2UgaGVyIG1vc3Qgd2hvc2UgbWVyaXQgbW9zdCBzaGFsbCBiZToKICAgIFdoaWNoIG9uIG1vcmUgdmlldywgb2YgbWFueSBtaW5lIGJlaW5nIG9uZQogICAgTWF5IHN0YW5kIGluIG51bWJlciwgdGhvdWdoIGluIHJlY2tvbmluZyBub25lLAogICAgQ29tZSwgZ28gd2l0aCBtZS4KCiAgICBUbyBTZXJ2YW50LCBnaXZpbmcgYSBwYXBlcgogICAgR28sIHNpcnJhaCwgdHJ1ZGdlIGFib3V0CiAgICBUaHJvdWdoIGZhaXIgVmVyb25hOyBmaW5kIHRob3NlIHBlcnNvbnMgb3V0CiAgICBXaG9zZSBuYW1lcyBhcmUgd3JpdHRlbiB0aGVyZSwgYW5kIHRvIHRoZW0gc2F5LAogICAgTXkgaG91c2UgYW5kIHdlbGNvbWUgb24gdGhlaXIgcGxlYXN1cmUgc3RheS4KCiAgICBFeGV1bnQgQ0FQVUxFVCBhbmQgUEFSSVMKClNlcnZhbnQKCiAgICBGaW5kIHRoZW0gb3V0IHdob3NlIG5hbWVzIGFyZSB3cml0dGVuIGhlcmUhIEl0IGlzCiAgICB3cml0dGVuLCB0aGF0IHRoZSBzaG9lbWFrZXIgc2hvdWxkIG1lZGRsZSB3aXRoIGhpcwogICAgeWFyZCwgYW5kIHRoZSB0YWlsb3Igd2l0aCBoaXMgbGFzdCwgdGhlIGZpc2hlciB3aXRoCiAgICBoaXMgcGVuY2lsLCBhbmQgdGhlIHBhaW50ZXIgd2l0aCBoaXMgbmV0czsgYnV0IEkgYW0KICAgIHNlbnQgdG8gZmluZCB0aG9zZSBwZXJzb25zIHdob3NlIG5hbWVzIGFyZSBoZXJlCiAgICB3cml0LCBhbmQgY2FuIG5ldmVyIGZpbmQgd2hhdCBuYW1lcyB0aGUgd3JpdGluZwogICAgcGVyc29uIGhhdGggaGVyZSB3cml0LiBJIG11c3QgdG8gdGhlIGxlYXJuZWQuLS1JbiBnb29kIHRpbWUuCgogICAgRW50ZXIgQkVOVk9MSU8gYW5kIFJPTUVPCgpCRU5WT0xJTwoKICAgIFR1dCwgbWFuLCBvbmUgZmlyZSBidXJucyBvdXQgYW5vdGhlcidzIGJ1cm5pbmcsCiAgICBPbmUgcGFpbiBpcyBsZXNzZW4nZCBieSBhbm90aGVyJ3MgYW5ndWlzaDsKICAgIFR1cm4gZ2lkZHksIGFuZCBiZSBob2xwIGJ5IGJhY2t3YXJkIHR1cm5pbmc7CiAgICBPbmUgZGVzcGVyYXRlIGdyaWVmIGN1cmVzIHdpdGggYW5vdGhlcidzIGxhbmd1aXNoOgogICAgVGFrZSB0aG91IHNvbWUgbmV3IGluZmVjdGlvbiB0byB0aHkgZXllLAogICAgQW5kIHRoZSByYW5rIHBvaXNvbiBvZiB0aGUgb2xkIHdpbGwgZGllLgoKUk9NRU8KCiAgICBZb3VyIHBsYWludGFpbi1sZWFmIGlzIGV4Y2VsbGVudCBmb3IgdGhhdC4KCkJFTlZPTElPCgogICAgRm9yIHdoYXQsIEkgcHJheSB0aGVlPwoKUk9NRU8KCiAgICBGb3IgeW91ciBicm9rZW4gc2hpbi4KCkJFTlZPTElPCgogICAgV2h5LCBSb21lbywgYXJ0IHRob3UgbWFkPwoKUk9NRU8KCiAgICBOb3QgbWFkLCBidXQgYm91bmQgbW9yZSB0aGFuIGEgbWFkLW1hbiBpczsKICAgIFNodXQgdXAgaW4gcHJpc29uLCBrZXB0IHdpdGhvdXQgbXkgZm9vZCwKICAgIFdoaXBwJ2QgYW5kIHRvcm1lbnRlZCBhbmQtLUdvZC1kZW4sIGdvb2QgZmVsbG93LgoKU2VydmFudAoKICAgIEdvZCBnaScgZ29kLWRlbi4gSSBwcmF5LCBzaXIsIGNhbiB5b3UgcmVhZD8KClJPTUVPCgogICAgQXksIG1pbmUgb3duIGZvcnR1bmUgaW4gbXkgbWlzZXJ5LgoKU2VydmFudAoKICAgIFBlcmhhcHMgeW91IGhhdmUgbGVhcm5lZCBpdCB3aXRob3V0IGJvb2s6IGJ1dCwgSQogICAgcHJheSwgY2FuIHlvdSByZWFkIGFueSB0aGluZyB5b3Ugc2VlPwoKUk9NRU8KCiAgICBBeSwgaWYgSSBrbm93IHRoZSBsZXR0ZXJzIGFuZCB0aGUgbGFuZ3VhZ2UuCgpTZXJ2YW50CgogICAgWWUgc2F5IGhvbmVzdGx5OiByZXN0IHlvdSBtZXJyeSEKClJPTUVPCgogICAgU3RheSwgZmVsbG93OyBJIGNhbiByZWFkLgoKICAgIFJlYWRzCiAgICAnU2lnbmlvciBNYXJ0aW5vIGFuZCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOwogICAgQ291bnR5IEFuc2VsbWUgYW5kIGhpcyBiZWF1dGVvdXMgc2lzdGVyczsgdGhlIGxhZHkKICAgIHdpZG93IG9mIFZpdHJhdmlvOyBTaWduaW9yIFBsYWNlbnRpbyBhbmQgaGlzIGxvdmVseQogICAgbmllY2VzOyBNZXJjdXRpbyBhbmQgaGlzIGJyb3RoZXIgVmFsZW50aW5lOyBtaW5lCiAgICB1bmNsZSBDYXB1bGV0LCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOyBteSBmYWlyIG5pZWNlCiAgICBSb3NhbGluZTsgTGl2aWE7IFNpZ25pb3IgVmFsZW50aW8gYW5kIGhpcyBjb3VzaW4KICAgIFR5YmFsdCwgTHVjaW8gYW5kIHRoZSBsaXZlbHkgSGVsZW5hLicgQSBmYWlyCiAgICBhc3NlbWJseTogd2hpdGhlciBzaG91bGQgdGhleSBjb21lPwoKU2VydmFudAoKICAgIFVwLgoKUk9NRU8KCiAgICBXaGl0aGVyPwoKU2VydmFudAoKICAgIFRvIHN1cHBlcjsgdG8gb3VyIGhvdXNlLgoKUk9NRU8KCiAgICBXaG9zZSBob3VzZT8KClNlcnZhbnQKCiAgICBNeSBtYXN0ZXIncy4KClJPTUVPCgogICAgSW5kZWVkLCBJIHNob3VsZCBoYXZlIGFzaydkIHlvdSB0aGF0IGJlZm9yZS4KClNlcnZhbnQKCiAgICBOb3cgSSdsbCB0ZWxsIHlvdSB3aXRob3V0IGFza2luZzogbXkgbWFzdGVyIGlzIHRoZQogICAgZ3JlYXQgcmljaCBDYXB1bGV0OyBhbmQgaWYgeW91IGJlIG5vdCBvZiB0aGUgaG91c2UKICAgIG9mIE1vbnRhZ3VlcywgSSBwcmF5LCBjb21lIGFuZCBjcnVzaCBhIGN1cCBvZiB3aW5lLgogICAgUmVzdCB5b3UgbWVycnkhCgogICAgRXhpdAoKQkVOVk9MSU8KCiAgICBBdCB0aGlzIHNhbWUgYW5jaWVudCBmZWFzdCBvZiBDYXB1bGV0J3MKICAgIFN1cHMgdGhlIGZhaXIgUm9zYWxpbmUgd2hvbSB0aG91IHNvIGxvdmVzdCwKICAgIFdpdGggYWxsIHRoZSBhZG1pcmVkIGJlYXV0aWVzIG9mIFZlcm9uYToKICAgIEdvIHRoaXRoZXI7IGFuZCwgd2l0aCB1bmF0dGFpbnRlZCBleWUsCiAgICBDb21wYXJlIGhlciBmYWNlIHdpdGggc29tZSB0aGF0IEkgc2hhbGwgc2hvdywKICAgIEFuZCBJIHdpbGwgbWFrZSB0aGVlIHRoaW5rIHRoeSBzd2FuIGEgY3Jvdy4KClJPTUVPCgogICAgV2hlbiB0aGUgZGV2b3V0IHJlbGlnaW9uIG9mIG1pbmUgZXllCiAgICBNYWludGFpbnMgc3VjaCBmYWxzZWhvb2QsIHRoZW4gdHVybiB0ZWFycyB0byBmaXJlczsKICAgIEFuZCB0aGVzZSwgd2hvIG9mdGVuIGRyb3duJ2QgY291bGQgbmV2ZXIgZGllLAogICAgVHJhbnNwYXJlbnQgaGVyZXRpY3MsIGJlIGJ1cm50IGZvciBsaWFycyEKICAgIE9uZSBmYWlyZXIgdGhhbiBteSBsb3ZlISB0aGUgYWxsLXNlZWluZyBzdW4KICAgIE5lJ2VyIHNhdyBoZXIgbWF0Y2ggc2luY2UgZmlyc3QgdGhlIHdvcmxkIGJlZ3VuLgoKQkVOVk9MSU8KCiAgICBUdXQsIHlvdSBzYXcgaGVyIGZhaXIsIG5vbmUgZWxzZSBiZWluZyBieSwKICAgIEhlcnNlbGYgcG9pc2VkIHdpdGggaGVyc2VsZiBpbiBlaXRoZXIgZXllOgogICAgQnV0IGluIHRoYXQgY3J5c3RhbCBzY2FsZXMgbGV0IHRoZXJlIGJlIHdlaWdoJ2QKICAgIFlvdXIgbGFkeSdzIGxvdmUgYWdhaW5zdCBzb21lIG90aGVyIG1haWQKICAgIFRoYXQgSSB3aWxsIHNob3cgeW91IHNoaW5pbmcgYXQgdGhpcyBmZWFzdCwKICAgIEFuZCBzaGUgc2hhbGwgc2NhbnQgc2hvdyB3ZWxsIHRoYXQgbm93IHNob3dzIGJlc3QuCgpST01FTwoKICAgIEknbGwgZ28gYWxvbmcsIG5vIHN1Y2ggc2lnaHQgdG8gYmUgc2hvd24sCiAgICBCdXQgdG8gcmVqb2ljZSBpbiBzcGxlbmRvciBvZiBtaW5lIG93bi4KCiAgICBFeGV1bnQKClNDRU5FIElJSS4gQSByb29tIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgTnVyc2UsIHdoZXJlJ3MgbXkgZGF1Z2h0ZXIIGNhbGwgaGVyIGZvcnRoIHRvIG1lLgoKTnVyc2UKCiAgICBOb3csIGJ5IG15IG1haWRlbmhlYWQsIGF0IHR3ZWx2ZSB5ZWFyIG9sZCwKICAgIEkgYmFkZSBoZXIgY29tZS4gV2hhdCwgbGFtYiEgd2hhdCwgbGFkeWJpcmQhCiAgICBHb2QgZm9yYmlkISBXaGVyZSdzIHRoaXMgZ2lybD8gV2hhdCwgSnVsaWV0IQoKICAgIEVudGVyIEpVTElFVAoKSlVMSUVUCgogICAgSG93IG5vdyEgd2hvIGNhbGxzPwoKTnVyc2UKCiAgICBZb3VyIG1vdGhlci4KCkpVTElFVAoKICAgIE1hZGFtLCBJIGFtIGhlcmUuCiAgICBXaGF0IGlzIHlvdXIgd2lsbD8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoaXMgaXMgdGhlIG1hdHRlcjotLU51cnNlLCBnaXZlIGxlYXZlIGF3aGlsZSwKICAgIFdlIG11c3QgdGFsayBpbiBzZWNyZXQ6LS1udXJzZSwgY29tZSBiYWNrIGFnYWluOwogICAgSSBoYXZlIHJlbWVtYmVyJ2QgbWUsIHRob3UncyBoZWFyIG91ciBjb3Vuc2VsLgogICAgVGhvdSBrbm93J3N0IG15IGRhdWdodGVyJ3Mgb2YgYSBwcmV0dHkgYWdlLgoKTnVyc2UKCiAgICBGYWl0aCwgSSBjYW4gdGVsbCBoZXIgYWdlIHVudG8gYW4gaG91ci4KCkxBRFkgQ0FQVUxFVAoKICAgIFNoZSdzIG5vdCBmb3VydGVlbi4KCk51cnNlCgogICAgSSdsbCBsYXkgZm91cnRlZW4gb2YgbXkgdGVldGgsLS0KICAgIEFuZCB5ZXQsIHRvIG15IHRlZXRoIGJlIGl0IHNwb2tlbiwgSSBoYXZlIGJ1dCBmb3VyLS0KICAgIFNoZSBpcyBub3QgZm91cnRlZW4uIEhvdyBsb25nIGlzIGl0IG5vdwogICAgVG8gTGFtbWFzLXRpZGUCgpMQURZIENBUFVMRVQKCiAgICBBIGZvcnRuaWdodCBhbmQgb2RkIGRheXMuCgpOdXJzZQoKICAgIEV2ZW4gb3Igb2RkLCBvZiBhbGwgZGF5cyBpbiB0aGUgeWVhciwKICAgIENvbWUgTGFtbWFzLWV2ZSBhdCBuaWdodCBzaGFsbCBzaGUgYmUgZm91cnRlZW4uCiAgICBTdXNhbiBhbmQgc2hlLS1Hb2QgcmVzdCBhbGwgQ2hyaXN0aWFuIHNvdWxzIS0tCiAgICBXZXJlIG9mIGFuIGFnZTogd2VsbCwgU3VzYW4gaXMgd2l0aCBHb2Q7CiAgICBTaGUgd2FzIHRvbyBnb29kIGZvciBtZTogYnV0LCBhcyBJIHNhaWQsCiAgICBPbiBMYW1tYXMtZXZlIGF0IG5pZ2h0IHNoYWxsIHNoZSBiZSBmb3VydGVlbjsKICAgIFRoYXQgc2hhbGwgc2hlLCBtYXJyeTsgSSByZW1lbWJlciBpdCB3ZWxsLgogICAgJ1RpcyBzaW5jZSB0aGUgZWFydGhxdWFrZSBub3cgZWxldmVuIHllYXJzOwogICAgQW5kIHNoZSB3YXMgd2VhbidkLC0tSSBuZXZlciBzaGFsbCBmb3JnZXQgaXQsLS0KICAgIE9mIGFsbCB0aGUgZGF5cyBvZiB0aGUgeWVhciwgdXBvbiB0aGF0IGRheToKICAgIEZvciBJIGhhZCB0aGVuIGxhaWQgd29ybXdvb2QgdG8gbXkgZHVnLAogICAgU2l0dGluZyBpbiB0aGUgc3VuIHVuZGVyIHRoZSBkb3ZlLWhvdXNlIHdhbGw7CiAgICBNeSBsb3JkIGFuZCB5b3Ugd2VyZSB0aGVuIGF0IE1hbnR1YTotLQogICAgTmF5LCBJIGRvIGJlYXIgYSBicmFpbjotLWJ1dCwgYXMgSSBzYWlkLAogICAgV2hlbiBpdCBkaWQgdGFzdGUgdGhlIHdvcm13b29kIG9uIHRoZSBuaXBwbGUKICAgIE9mIG15IGR1ZyBhbmQgZmVsdCBpdCBiaXR0ZXIsIHByZXR0eSBmb29sLAogICAgVG8gc2VlIGl0IHRldGNoeSBhbmQgZmFsbCBvdXQgd2l0aCB0aGUgZHVnIQogICAgU2hha2UgcXVvdGggdGhlIGRvdmUtaG91c2U6ICd0d2FzIG5vIG5lZWQsIEkgdHJvdywKICAgIFRvIGJpZCBtZSB0cnVkZ2U6CiAgICBBbmQgc2luY2UgdGhhdCB0aW1lIGl0IGlzIGVsZXZlbiB5ZWFyczsKICAgIEZvciB0aGVuIHNoZSBjb3VsZCBzdGFuZCBhbG9uZTsgbmF5LCBieSB0aGUgcm9vZCwKICAgIFNoZSBjb3VsZCBoYXZlIHJ1biBhbmQgd2FkZGxlZCBhbGwgYWJvdXQ7CiAgICBGb3IgZXZlbiB0aGUgZGF5IGJlZm9yZSwgc2hlIGJyb2tlIGhlciBicm93OgogICAgQW5kIHRoZW4gbXkgaHVzYmFuZC0tR29kIGJlIHdpdGggaGlzIHNvdWwhCiAgICBBJyB3YXMgYSBtZXJyeSBtYW4tLXRvb2sgdXAgdGhlIGNoaWxkOgogICAgJ1llYSwnIHF1b3RoIGhlLCAnZG9zdCB0aG91IGZhbGwgdXBvbiB0aHkgZmFjZT8KICAgIFRob3Ugd2lsdCBmYWxsIGJhY2t3YXJkIHdoZW4gdGhvdSBoYXN0IG1vcmUgd2l0OwogICAgV2lsdCB0aG91IG5vdCwgSnVsZT8nIGFuZCwgYnkgbXkgaG9saWRhbWUsCiAgICBUaGUgcHJldHR5IHdyZXRjaCBsZWZ0IGNyeWluZyBhbmQgc2FpZCAnQXkuJwogICAgVG8gc2VlLCBub3csIGhvdyBhIGplc3Qgc2hhbGwgY29tZSBhYm91dCEKICAgIEkgd2FycmFudCwgYW4gSSBzaG91bGQgbGl2ZSBhIHRob3VzYW5kIHllYXJzLAogICAgSSBuZXZlciBzaG91bGQgZm9yZ2V0IGl0OiAnV2lsdCB0aG91IG5vdCwgSnVsZT8nIHF1b3RoIGhlOwogICAgQW5kLCBwcmV0dHkgZm9vbCwgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKTEFEWSBDQVBVTEVUCgogICAgRW5vdWdoIG9mIHRoaXM7IEkgcHJheSB0aGVlLCBob2xkIHRoeSBwZWFjZS4KCk51cnNlCgogICAgWWVzLCBtYWRhbTogeWV0IEkgY2Fubm90IGNob29zZSBidXQgbGF1Z2gsCiAgICBUbyB0aGluayBpdCBzaG91bGQgbGVhdmUgY3J5aW5nIGFuZCBzYXkgJ0F5LicKICAgIEFuZCB5ZXQsIEkgd2FycmFudCwgaXQgaGFkIHVwb24gaXRzIGJyb3cKICAgIEEgYnVtcCBhcyBiaWcgYXMgYSB5b3VuZyBjb2NrZXJlbCdzIHN0b25lOwogICAgQSBwYXJsb3VzIGtub2NrOyBhbmQgaXQgY3JpZWQgYml0dGVybHk6CiAgICAnWWVhLCcgcXVvdGggbXkgaHVzYmFuZCwnZmFsbCdzdCB1cG9uIHRoeSBmYWNlPwogICAgVGhvdSB3aWx0IGZhbGwgYmFja3dhcmQgd2hlbiB0aG91IGNvbWVzdCB0byBhZ2U7CiAgICBXaWx0IHRob3Ugbm90LCBKdWxlPycgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKSlVMSUVUCgogICAgQW5kIHN0aW50IHRob3UgdG9vLCBJIHByYXkgdGhlZSwgbnVyc2UsIHNheSBJLgoKTnVyc2UKCiAgICBQZWFjZSwgSSBoYXZlIGRvbmUuIEdvZCBtYXJrIHRoZWUgdG8gaGlzIGdyYWNlIQogICAgVGhvdSB3YXN0IHRoZSBwcmV0dGllc3QgYmFiZSB0aGF0IGUnZXIgSSBudXJzZWQ6CiAgICBBbiBJIG1pZ2h0IGxpdmUgdG8gc2VlIHRoZWUgbWFycmllZCBvbmNlLAogICAgSSBoYXZlIG15IHdpc2guCgpMQURZIENBUFVMRVQKCiAgICBNYXJyeSwgdGhhdCAnbWFycnknIGlzIHRoZSB2ZXJ5IHRoZW1lCiAgICBJIGNhbWUgdG8gdGFsayBvZi4gVGVsbCBtZSwgZGF1Z2h0ZXIgSnVsaWV0LAogICAgSG93IHN0YW5kcyB5b3VyIGRpc3Bvc2l0aW9uIHRvIGJlIG1hcnJpZWQCgpKVUxJRVQKCiAgICBJdCBpcyBhbiBob25vdXIgdGhhdCBJIGRyZWFtIG5vdCBvZi4KCk51cnNlCgogICAgQW4gaG9ub3VyISB3ZXJlIG5vdCBJIHRoaW5lIG9ubHkgbnVyc2UsCiAgICBJIHdvdWxkIHNheSB0aG91IGhhZHN0IHN1Y2snZCB3aXNkb20gZnJvbSB0aHkgdGVhdC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHRoaW5rIG9mIG1hcnJpYWdlIG5vdzsgeW91bmdlciB0aGFuIHlvdSwKICAgIEhlcmUgaW4gVmVyb25hLCBsYWRpZXMgb2YgZXN0ZWVtLAogICAgQXJlIG1hZGUgYWxyZWFkeSBtb3RoZXJzOiBieSBteSBjb3VudCwKICAgIEkgd2FzIHlvdXIgbW90aGVyIG11Y2ggdXBvbiB0aGVzZSB5ZWFycwogICAgVGhhdCB5b3UgYXJlIG5vdyBhIG1haWQuIFRodXMgdGhlbiBpbiBicmllZjoKICAgIFRoZSB2YWxpYW50IFBhcmlzIHNlZWtzIHlvdSBmb3IgaGlzIGxvdmUuCgpOdXJzZQoKICAgIEEgbWFuLCB5b3VuZyBsYWR5ISBsYWR5LCBzdWNoIGEgbWFuCiAgICBBcyBhbGwgdGhlIHdvcmxkLS13aHksIGhlJ3MgYSBtYW4gb2Ygd2F4LgoKTEFEWSBDQVBVTEVUCgogICAgVmVyb25hJ3Mgc3VtbWVyIGhhdGggbm90IHN1Y2ggYSBmbG93ZXIuCgpOdXJzZQoKICAgIE5heSwgaGUncyBhIGZsb3dlcjsgaW4gZmFpdGgsIGEgdmVyeSBmbG93ZXIuCgpMQURZIENBUFVMRVQKCiAgICBXaGF0IHNheSB5b3UIGNhbiB5b3UgbG92ZSB0aGUgZ2VudGxlbWFuPwogICAgVGhpcyBuaWdodCB5b3Ugc2hhbGwgYmVob2xkIGhpbSBhdCBvdXIgZmVhc3Q7CiAgICBSZWFkIG8nZXIgdGhlIHZvbHVtZSBvZiB5b3VuZyBQYXJpcycgZmFjZSwKICAgIEFuZCBmaW5kIGRlbGlnaHQgd3JpdCB0aGVyZSB3aXRoIGJlYXV0eSdzIHBlbjsKICAgIEV4YW1pbmUgZXZlcnkgbWFycmllZCBsaW5lYW1lbnQsCiAgICBBbmQgc2VlIGhvdyBvbmUgYW5vdGhlciBsZW5kcyBjb250ZW50CiAgICBBbmQgd2hhdCBvYnNjdXJlZCBpbiB0aGlzIGZhaXIgdm9sdW1lIGxpZXMKICAgIEZpbmQgd3JpdHRlbiBpbiB0aGUgbWFyZ2VudCBvZiBoaXMgZXllcy4KICAgIFRoaXMgcHJlY2lvdXMgYm9vayBvZiBsb3ZlLCB0aGlzIHVuYm91bmQgbG92ZXIsCiAgICBUbyBiZWF1dGlmeSBoaW0sIG9ubHkgbGFja3MgYSBjb3ZlcjoKICAgIFRoZSBmaXNoIGxpdmVzIGluIHRoZSBzZWEsIGFuZCAndGlzIG11Y2ggcHJpZGUKICAgIEZvciBmYWlyIHdpdGhvdXQgdGhlIGZhaXIgd2l0aGluIHRvIGhpZGU6CiAgICBUaGF0IGJvb2sgaW4gbWFueSdzIGV5ZXMgZG90aCBzaGFyZSB0aGUgZ2xvcnksCiAgICBUaGF0IGluIGdvbGQgY2xhc3BzIGxvY2tzIGluIHRoZSBnb2xkZW4gc3Rvcnk7CiAgICBTbyBzaGFsbCB5b3Ugc2hhcmUgYWxsIHRoYXQgaGUgZG90aCBwb3NzZXNzLAogICAgQnkgaGF2aW5nIGhpbSwgbWFraW5nIHlvdXJzZWxmIG5vIGxlc3MuCgpOdXJzZQoKICAgIE5vIGxlc3MhIG5heSwgYmlnZ2VyOyB3b21lbiBncm93IGJ5IG1lbi4KCkxBRFkgQ0FQVUxFVAoKICAgIFNwZWFrIGJyaWVmbHksIGNhbiB5b3UgbGlrZSBvZiBQYXJpcycgbG92ZT8KCkpVTElFVAoKICAgIEknbGwgbG9vayB0byBsaWtlLCBpZiBsb29raW5nIGxpa2luZyBtb3ZlOgogICAgQnV0IG5vIG1vcmUgZGVlcCB3aWxsIEkgZW5kYXJ0IG1pbmUgZXllCiAgICBUaGFuIHlvdXIgY29uc2VudCBnaXZlcyBzdHJlbmd0aCB0byBtYWtlIGl0IGZseS4KCiAgICBFbnRlciBhIFNlcnZhbnQKClNlcnZhbnQKCiAgICBNYWRhbSwgdGhlIGd1ZXN0cyBhcmUgY29tZSwgc3VwcGVyIHNlcnZlZCB1cCwgeW91CiAgICBjYWxsZWQsIG15IHlvdW5nIGxhZHkgYXNrZWQgZm9yLCB0aGUgbnVyc2UgY3Vyc2VkIGluCiAgICB0aGUgcGFudHJ5LCBhbmQgZXZlcnkgdGhpbmcgaW4gZXh0cmVtaXR5LiBJIG11c3QKICAgIGhlbmNlIHRvIHdhaXQ7IEkgYmVzZWVjaCB5b3UsIGZvbGxvdyBzdHJhaWdodC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlIGZvbGxvdyB0aGVlLgoKICAgIEV4aXQgU2VydmFudAogICAgSnVsaWV0LCB0aGUgY291bnR5IHN0YXlzLgoKTnVyc2UKCiAgICBHbywgZ2lybCwgc2VlayBoYXBweSBuaWdodHMgdG8gaGFwcHkgZGF5cy4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBST01FTywgTUVSQ1VUSU8sIEJFTlZPTElPLCB3aXRoIGZpdmUgb3Igc2l4IE1hc2tlcnMsIFRvcmNoLWJlYXJlcnMsIGFuZCBvdGhlcnMgCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIHRoaXMgc3BlZWNoIGJlIHNwb2tlIGZvciBvdXIgZXhjdXNlPwogICAgT3Igc2hhbGwgd2Ugb24gd2l0aG91dCBhIGFwb2xvZ3kCgpCRU5WT0xJTwoKICAgIFRoZSBkYXRlIGlzIG91dCBvZiBzdWNoIHByb2xpeGl0eToKICAgIFdlJ2xsIGhhdmUgbm8gQ3VwaWQgaG9vZHdpbmsnZCB3aXRoIGEgc2NhcmYsCiAgICBCZWFyaW5nIGEgVGFydGFyJ3MgcGFpbnRlZCBib3cgb2YgbGF0aCwKICAgIFNjYXJpbmcgdGhlIGxhZGllcyBsaWtlIGEgY3Jvdy1rZWVwZXI7CiAgICBOb3Igbm8gd2l0aG91dC1ib29rIHByb2xvZ3VlLCBmYWludGx5IHNwb2tlCiAgICBBZnRlciB0aGUgcHJvbXB0ZXIsIGZvciBvdXIgZW50cmFuY2U6CiAgICBCdXQgbGV0IHRoZW0gbWVhc3VyZSB1cyBieSB3aGF0IHRoZXkgd2lsbDsKICAgIFdlJ2xsIG1lYXN1cmUgdGhlbSBhIG1lYXN1cmUsIGFuZCBiZSBnb25lLgoKUk9NRU8KCiAgICBHaXZlIG1lIGEgdG9yY2g6IEkgYW0gbm90IGZvciB0aGlzIGFtYmxpbmc7CiAgICBCZWluZyBidXQgaGVhdnksIEkgd2lsbCBiZWFyIHRoZSBsaWdodC4KCk1FUkNVVElPCgogICAgTmF5LCBnZW50bGUgUm9tZW8sIHdlIG11c3QgaGF2ZSB5b3UgZGFuY2UuCgpST01FTwoKICAgIE5vdCBJLCBiZWxpZXZlIG1lOiB5b3UgaGF2ZSBkYW5jaW5nIHNob2VzCiAgICBXaXRoIG5pbWJsZSBzb2xlczogSSBoYXZlIGEgc291bCBvZiBsZWFkCiAgICBTbyBzdGFrZXMgbWUgdG8gdGhlIGdyb3VuZCBJIGNhbm5vdCBtb3ZlLgoKTUVSQ1VUSU8KCiAgICBZb3UgYXJlIGEgbG92ZXI7IGJvcnJvdyBDdXBpZCdzIHdpbmdzLAogICAgQW5kIHNvYXIgd2l0aCB0aGVtIGFib3ZlIGEgY29tbW9uIGJvdW5kLgoKUk9NRU8KCiAgICBJIGFtIHRvbyBzb3JlIGVucGllcmNlZCB3aXRoIGhpcyBzaGFmdAogICAgVG8gc29hciB3aXRoIGhpcyBsaWdodCBmZWF0aGVycywgYW5kIHNvIGJvdW5kLAogICAgSSBjYW5ub3QgYm91bmQgYSBwaXRjaCBhYm92ZSBkdWxsIHdvZToKICAgIFVuZGVyIGxvdmUncyBoZWF2eSBidXJkZW4gZG8gSSBzaW5rLgoKTUVSQ1VUSU8KCiAgICBBbmQsIHRvIHNpbmsgaW4gaXQsIHNob3VsZCB5b3UgYnVyZGVuIGxvdmU7CiAgICBUb28gZ3JlYXQgb3BwcmVzc2lvbiBmb3IgYSB0ZW5kZXIgdGhpbmcuCgpST01FTwoKICAgIElzIGxvdmUgYSB0ZW5kZXIgdGhpbmcIGl0IGlzIHRvbyByb3VnaCwKICAgIFRvbyBydWRlLCB0b28gYm9pc3Rlcm91cywgYW5kIGl0IHByaWNrcyBsaWtlIHRob3JuLgoKTUVSQ1VUSU8KCiAgICBJZiBsb3ZlIGJlIHJvdWdoIHdpdGggeW91LCBiZSByb3VnaCB3aXRoIGxvdmU7CiAgICBQcmljayBsb3ZlIGZvciBwcmlja2luZywgYW5kIHlvdSBiZWF0IGxvdmUgZG93bi4KICAgIEdpdmUgbWUgYSBjYXNlIHRvIHB1dCBteSB2aXNhZ2UgaW46CiAgICBBIHZpc29yIGZvciBhIHZpc29yISB3aGF0IGNhcmUgSQogICAgV2hhdCBjdXJpb3VzIGV5ZSBkb3RoIHF1b3RlIGRlZm9ybWl0aWVzPwogICAgSGVyZSBhcmUgdGhlIGJlZXRsZSBicm93cyBzaGFsbCBibHVzaCBmb3IgbWUuCgpCRU5WT0xJTwoKICAgIENvbWUsIGtub2NrIGFuZCBlbnRlcjsgYW5kIG5vIHNvb25lciBpbiwKICAgIEJ1dCBldmVyeSBtYW4gYmV0YWtlIGhpbSB0byBoaXMgbGVncy4KClJPTUVPCgogICAgQSB0b3JjaCBmb3IgbWU6IGxldCB3YW50b25zIGxpZ2h0IG9mIGhlYXJ0CiAgICBUaWNrbGUgdGhlIHNlbnNlbGVzcyBydXNoZXMgd2l0aCB0aGVpciBoZWVscywKICAgIEZvciBJIGFtIHByb3ZlcmInZCB3aXRoIGEgZ3JhbmRzaXJlIHBocmFzZTsKICAgIEknbGwgYmUgYSBjYW5kbGUtaG9sZGVyLCBhbmQgbG9vayBvbi4KICAgIFRoZSBnYW1lIHdhcyBuZSdlciBzbyBmYWlyLCBhbmQgSSBhbSBkb25lLgoKTUVSQ1VUSU8KCiAgICBUdXQsIGR1bidzIHRoZSBtb3VzZSwgdGhlIGNvbnN0YWJsZSdzIG93biB3b3JkOgogICAgSWYgdGhvdSBhcnQgZHVuLCB3ZSdsbCBkcmF3IHRoZWUgZnJvbSB0aGUgbWlyZQogICAgT2YgdGhpcyBzaXItcmV2ZXJlbmNlIGxvdmUsIHdoZXJlaW4gdGhvdSBzdGljaydzdAogICAgVXAgdG8gdGhlIGVhcnMuIENvbWUsIHdlIGJ1cm4gZGF5bGlnaHQsIGhvIQoKUk9NRU8KCiAgICBOYXksIHRoYXQncyBub3Qgc28uCgpNRVJDVVRJTwoKICAgIEkgbWVhbiwgc2lyLCBpbiBkZWxheQogICAgV2Ugd2FzdGUgb3VyIGxpZ2h0cyBpbiB2YWluLCBsaWtlIGxhbXBzIGJ5IGRheS4KICAgIFRha2Ugb3VyIGdvb2QgbWVhbmluZywgZm9yIG91ciBqdWRnbWVudCBzaXRzCiAgICBGaXZlIHRpbWVzIGluIHRoYXQgZXJlIG9uY2UgaW4gb3VyIGZpdmUgd2l0cy4KClJPTUVPCgogICAgQW5kIHdlIG1lYW4gd2VsbCBpbiBnb2luZyB0byB0aGlzIG1hc2s7CiAgICBCdXQgJ3RpcyBubyB3aXQgdG8gZ28uCgpNRVJDVVRJTwoKICAgIFdoeSwgbWF5IG9uZSBhc2sCgpST01FTwoKICAgIEkgZHJlYW0nZCBhIGRyZWFtIHRvLW5pZ2h0LgoKTUVSQ1VUSU8KCiAgICBBbmQgc28gZGlkIEkuCgpST01FTwoKICAgIFdlbGwsIHdoYXQgd2FzIHlvdXJzPwoKTUVSQ1VUSU8KCiAgICBUaGF0IGRyZWFtZXJzIG9mdGVuIGxpZS4KClJPTUVPCgogICAgSW4gYmVkIGFzbGVlcCwgd2hpbGUgdGhleSBkbyBkcmVhbSB0aGluZ3MgdHJ1ZS4KCk1FUkNVVElPCgogICAgTywgdGhlbiwgSSBzZWUgUXVlZW4gTWFiIGhhdGggYmVlbiB3aXRoIHlvdS4KICAgIFNoZSBpcyB0aGUgZmFpcmllcycgbWlkd2lmZSwgYW5kIHNoZSBjb21lcwogICAgSW4gc2hhcGUgbm8gYmlnZ2VyIHRoYW4gYW4gYWdhdGUtc3RvbmUKICAgIE9uIHRoZSBmb3JlLWZpbmdlciBvZiBhbiBhbGRlcm1hbiwKICAgIERyYXduIHdpdGggYSB0ZWFtIG9mIGxpdHRsZSBhdG9taWVzCiAgICBBdGh3YXJ0IG1lbidzIG5vc2VzIGFzIHRoZXkgbGllIGFzbGVlcDsKICAgIEhlciB3YWdvbi1zcG9rZXMgbWFkZSBvZiBsb25nIHNwaWRlcnMnIGxlZ3MsCiAgICBUaGUgY292ZXIgb2YgdGhlIHdpbmdzIG9mIGdyYXNzaG9wcGVycywKICAgIFRoZSB0cmFjZXMgb2YgdGhlIHNtYWxsZXN0IHNwaWRlcidzIHdlYiwKICAgIFRoZSBjb2xsYXJzIG9mIHRoZSBtb29uc2hpbmUncyB3YXRlcnkgYmVhbXMsCiAgICBIZXIgd2hpcCBvZiBjcmlja2V0J3MgYm9uZSwgdGhlIGxhc2ggb2YgZmlsbSwKICAgIEhlciB3YWdvbmVyIGEgc21hbGwgZ3JleS1jb2F0ZWQgZ25hdCwKICAgIE5vdCBzbyBiaWcgYXMgYSByb3VuZCBsaXR0bGUgd29ybQogICAgUHJpY2snZCBmcm9tIHRoZSBsYXp5IGZpbmdlciBvZiBhIG1haWQ7CiAgICBIZXIgY2hhcmlvdCBpcyBhbiBlbXB0eSBoYXplbC1udXQKICAgIE1hZGUgYnkgdGhlIGpvaW5lciBzcXVpcnJlbCBvciBvbGQgZ3J1YiwKICAgIFRpbWUgb3V0IG8nIG1pbmQgdGhlIGZhaXJpZXMnIGNvYWNobWFrZXJzLgogICAgQW5kIGluIHRoaXMgc3RhdGUgc2hlIGdhbGxvcHMgbmlnaHQgYnkgbmlnaHQKICAgIFRocm91Z2ggbG92ZXJzJyBicmFpbnMsIGFuZCB0aGVuIHRoZXkgZHJlYW0gb2YgbG92ZTsKICAgIE8nZXIgY291cnRpZXJzJyBrbmVlcywgdGhhdCBkcmVhbSBvbiBjb3VydCdzaWVzIHN0cmFpZ2h0LAogICAgTydlciBsYXd5ZXJzJyBmaW5nZXJzLCB3aG8gc3RyYWlnaHQgZHJlYW0gb24gZmVlcywKICAgIE8nZXIgbGFkaWVzICcgbGlwcywgd2hvIHN0cmFpZ2h0IG9uIGtpc3NlcyBkcmVhbSwKICAgIFdoaWNoIG9mdCB0aGUgYW5ncnkgTWFiIHdpdGggYmxpc3RlcnMgcGxhZ3VlcywKICAgIEJlY2F1c2UgdGhlaXIgYnJlYXRocyB3aXRoIHN3ZWV0bWVhdHMgdGFpbnRlZCBhcmU6CiAgICBTb21ldGltZSBzaGUgZ2FsbG9wcyBvJ2VyIGEgY291cnRpZXIncyBub3NlLAogICAgQW5kIHRoZW4gZHJlYW1zIGhlIG9mIHNtZWxsaW5nIG91dCBhIHN1aXQ7CiAgICBBbmQgc29tZXRpbWUgY29tZXMgc2hlIHdpdGggYSB0aXRoZS1waWcncyB0YWlsCiAgICBUaWNrbGluZyBhIHBhcnNvbidzIG5vc2UgYXMgYScgbGllcyBhc2xlZXAsCiAgICBUaGVuIGRyZWFtcywgaGUgb2YgYW5vdGhlciBiZW5lZmljZToKICAgIFNvbWV0aW1lIHNoZSBkcml2ZXRoIG8nZXIgYSBzb2xkaWVyJ3MgbmVjaywKICAgIEFuZCB0aGVuIGRyZWFtcyBoZSBvZiBjdXR0aW5nIGZvcmVpZ24gdGhyb2F0cywKICAgIE9mIGJyZWFjaGVzLCBhbWJ1c2NhZG9lcywgU3BhbmlzaCBibGFkZXMsCiAgICBPZiBoZWFsdGhzIGZpdmUtZmF0aG9tIGRlZXA7IGFuZCB0aGVuIGFub24KICAgIERydW1zIGluIGhpcyBlYXIsIGF0IHdoaWNoIGhlIHN0YXJ0cyBhbmQgd2FrZXMsCiAgICBBbmQgYmVpbmcgdGh1cyBmcmlnaHRlZCBzd2VhcnMgYSBwcmF5ZXIgb3IgdHdvCiAgICBBbmQgc2xlZXBzIGFnYWluLiBUaGlzIGlzIHRoYXQgdmVyeSBNYWIKICAgIFRoYXQgcGxhdHMgdGhlIG1hbmVzIG9mIGhvcnNlcyBpbiB0aGUgbmlnaHQsCiAgICBBbmQgYmFrZXMgdGhlIGVsZmxvY2tzIGluIGZvdWwgc2x1dHRpc2ggaGFpcnMsCiAgICBXaGljaCBvbmNlIHVudGFuZ2xlZCwgbXVjaCBtaXNmb3J0dW5lIGJvZGVzOgogICAgVGhpcyBpcyB0aGUgaGFnLCB3aGVuIG1haWRzIGxpZSBvbiB0aGVpciBiYWNrcywKICAgIFRoYXQgcHJlc3NlcyB0aGVtIGFuZCBsZWFybnMgdGhlbSBmaXJzdCB0byBiZWFyLAogICAgTWFraW5nIHRoZW0gd29tZW4gb2YgZ29vZCBjYXJyaWFnZToKICAgIFRoaXMgaXMgc2hlLS0KClJPTUVPCgogICAgUGVhY2UsIHBlYWNlLCBNZXJjdXRpbywgcGVhY2UhCiAgICBUaG91IHRhbGsnc3Qgb2Ygbm90aGluZy4KCk1FUkNVVElPCgogICAgVHJ1ZSwgSSB0YWxrIG9mIGRyZWFtcywKICAgIFdoaWNoIGFyZSB0aGUgY2hpbGRyZW4gb2YgYW4gaWRsZSBicmFpbiwKICAgIEJlZ290IG9mIG5vdGhpbmcgYnV0IHZhaW4gZmFudGFzeSwKICAgIFdoaWNoIGlzIGFzIHRoaW4gb2Ygc3Vic3RhbmNlIGFzIHRoZSBhaXIKICAgIEFuZCBtb3JlIGluY29uc3RhbnQgdGhhbiB0aGUgd2luZCwgd2hvIHdvb2VzCiAgICBFdmVuIG5vdyB0aGUgZnJvemVuIGJvc29tIG9mIHRoZSBub3J0aCwKICAgIEFuZCwgYmVpbmcgYW5nZXInZCwgcHVmZnMgYXdheSBmcm9tIHRoZW5jZSwKICAgIFR1cm5pbmcgaGlzIGZhY2UgdG8gdGhlIGRldy1kcm9wcGluZyBzb3V0aC4KCkJFTlZPTElPCgogICAgVGhpcyB3aW5kLCB5b3UgdGFsayBvZiwgYmxvd3MgdXMgZnJvbSBvdXJzZWx2ZXM7CiAgICBTdXBwZXIgaXMgZG9uZSwgYW5kIHdlIHNoYWxsIGNvbWUgdG9vIGxhdGUuCgpST01FTwoKICAgIEkgZmVhciwgdG9vIGVhcmx5OiBmb3IgbXkgbWluZCBtaXNnaXZlcwogICAgU29tZSBjb25zZXF1ZW5jZSB5ZXQgaGFuZ2luZyBpbiB0aGUgc3RhcnMKICAgIFNoYWxsIGJpdHRlcmx5IGJlZ2luIGhpcyBmZWFyZnVsIGRhdGUKICAgIFdpdGggdGhpcyBuaWdodCdzIHJldmVscyBhbmQgZXhwaXJlIHRoZSB0ZXJtCiAgICBPZiBhIGRlc3Bpc2VkIGxpZmUgY2xvc2VkIGluIG15IGJyZWFzdAogICAgQnkgc29tZSB2aWxlIGZvcmZlaXQgb2YgdW50aW1lbHkgZGVhdGguCiAgICBCdXQgSGUsIHRoYXQgaGF0aCB0aGUgc3RlZXJhZ2Ugb2YgbXkgY291cnNlLAogICAgRGlyZWN0IG15IHNhaWwhIE9uLCBsdXN0eSBnZW50bGVtZW4uCgpCRU5WT0xJTwoKICAgIFN0cmlrZSwgZHJ1bS4KCiAgICBFeGV1bnQKClNDRU5FIFYuIEEgaGFsbCBpbiBDYXB1bGV0J3MgaG91c2UuCgogICAgTXVzaWNpYW5zIHdhaXRpbmcuIEVudGVyIFNlcnZpbmdtZW4gd2l0aCBuYXBraW5zIAoKRmlyc3QgU2VydmFudAoKICAgIFdoZXJlJ3MgUG90cGFuLCB0aGF0IGhlIGhlbHBzIG5vdCB0byB0YWtlIGF3YXkIEhlCiAgICBzaGlmdCBhIHRyZW5jaGVyPyBoZSBzY3JhcGUgYSB0cmVuY2hlciEKClNlY29uZCBTZXJ2YW50CgogICAgV2hlbiBnb29kIG1hbm5lcnMgc2hhbGwgbGllIGFsbCBpbiBvbmUgb3IgdHdvIG1lbidzCiAgICBoYW5kcyBhbmQgdGhleSB1bndhc2hlZCB0b28sICd0aXMgYSBmb3VsIHRoaW5nLgoKRmlyc3QgU2VydmFudAoKICAgIEF3YXkgd2l0aCB0aGUgam9pbnQtc3Rvb2xzLCByZW1vdmUgdGhlCiAgICBjb3VydC1jdXBib2FyZCwgbG9vayB0byB0aGUgcGxhdGUuIEdvb2QgdGhvdSwgc2F2ZQogICAgbWUgYSBwaWVjZSBvZiBtYXJjaHBhbmU7IGFuZCwgYXMgdGhvdSBsb3Zlc3QgbWUsIGxldAogICAgdGhlIHBvcnRlciBsZXQgaW4gU3VzYW4gR3JpbmRzdG9uZSBhbmQgTmVsbC4KICAgIEFudG9ueSwgYW5kIFBvdHBhbiEKClNlY29uZCBTZXJ2YW50CgogICAgQXksIGJveSwgcmVhZHkuCgpGaXJzdCBTZXJ2YW50CgogICAgWW91IGFyZSBsb29rZWQgZm9yIGFuZCBjYWxsZWQgZm9yLCBhc2tlZCBmb3IgYW5kCiAgICBzb3VnaHQgZm9yLCBpbiB0aGUgZ3JlYXQgY2hhbWJlci4KClNlY29uZCBTZXJ2YW50CgogICAgV2UgY2Fubm90IGJlIGhlcmUgYW5kIHRoZXJlIHRvby4gQ2hlZXJseSwgYm95czsgYmUKICAgIGJyaXNrIGF3aGlsZSwgYW5kIHRoZSBsb25nZXIgbGl2ZXIgdGFrZSBhbGwuCgogICAgRW50ZXIgQ0FQVUxFVCwgd2l0aCBKVUxJRVQgYW5kIG90aGVycyBvZiBoaXMgaG91c2UsIG1lZXRpbmcgdGhlIEd1ZXN0cyBhbmQgTWFza2VycwoKQ0FQVUxFVAoKICAgIFdlbGNvbWUsIGdlbnRsZW1lbiEgbGFkaWVzIHRoYXQgaGF2ZSB0aGVpciB0b2VzCiAgICBVbnBsYWd1ZWQgd2l0aCBjb3JucyB3aWxsIGhhdmUgYSBib3V0IHdpdGggeW91LgogICAgQWggaGEsIG15IG1pc3RyZXNzZXMhIHdoaWNoIG9mIHlvdSBhbGwKICAgIFdpbGwgbm93IGRlbnkgdG8gZGFuY2UIHNoZSB0aGF0IG1ha2VzIGRhaW50eSwKICAgIFNoZSwgSSdsbCBzd2VhciwgaGF0aCBjb3JuczsgYW0gSSBjb21lIG5lYXIgeWUgbm93PwogICAgV2VsY29tZSwgZ2VudGxlbWVuISBJIGhhdmUgc2VlbiB0aGUgZGF5CiAgICBUaGF0IEkgaGF2ZSB3b3JuIGEgdmlzb3IgYW5kIGNvdWxkIHRlbGwKICAgIEEgd2hpc3BlcmluZyB0YWxlIGluIGEgZmFpciBsYWR5J3MgZWFyLAogICAgU3VjaCBhcyB3b3VsZCBwbGVhc2U6ICd0aXMgZ29uZSwgJ3RpcyBnb25lLCAndGlzIGdvbmU6CiAgICBZb3UgYXJlIHdlbGNvbWUsIGdlbnRsZW1lbiEgY29tZSwgbXVzaWNpYW5zLCBwbGF5LgogICAgQSBoYWxsLCBhIGhhbGwhIGdpdmUgcm9vbSEgYW5kIGZvb3QgaXQsIGdpcmxzLgoKICAgIE11c2ljIHBsYXlzLCBhbmQgdGhleSBkYW5jZQogICAgTW9yZSBsaWdodCwgeW91IGtuYXZlczsgYW5kIHR1cm4gdGhlIHRhYmxlcyB1cCwKICAgIEFuZCBxdWVuY2ggdGhlIGZpcmUsIHRoZSByb29tIGlzIGdyb3duIHRvbyBob3QuCiAgICBBaCwgc2lycmFoLCB0aGlzIHVubG9vaydkLWZvciBzcG9ydCBjb21lcyB3ZWxsLgogICAgTmF5LCBzaXQsIG5heSwgc2l0LCBnb29kIGNvdXNpbiBDYXB1bGV0OwogICAgRm9yIHlvdSBhbmQgSSBhcmUgcGFzdCBvdXIgZGFuY2luZyBkYXlzOgogICAgSG93IGxvbmcgaXMndCBub3cgc2luY2UgbGFzdCB5b3Vyc2VsZiBhbmQgSQogICAgV2VyZSBpbiBhIG1hc2sCgpTZWNvbmQgQ2FwdWxldAoKICAgIEJ5J3IgbGFkeSwgdGhpcnR5IHllYXJzLgoKQ0FQVUxFVAoKICAgIFdoYXQsIG1hbiEgJ3RpcyBub3Qgc28gbXVjaCwgJ3RpcyBub3Qgc28gbXVjaDoKICAgICdUaXMgc2luY2UgdGhlIG51cHRpYWxzIG9mIEx1Y2VudGlvLAogICAgQ29tZSBwZW50ZWNvc3QgYXMgcXVpY2tseSBhcyBpdCB3aWxsLAogICAgU29tZSBmaXZlIGFuZCB0d2VudHkgeWVhcnM7IGFuZCB0aGVuIHdlIG1hc2snZC4KClNlY29uZCBDYXB1bGV0CgogICAgJ1RpcyBtb3JlLCAndGlzIG1vcmUsIGhpcyBzb24gaXMgZWxkZXIsIHNpcjsKICAgIEhpcyBzb24gaXMgdGhpcnR5LgoKQ0FQVUxFVAoKICAgIFdpbGwgeW91IHRlbGwgbWUgdGhhdD8KICAgIEhpcyBzb24gd2FzIGJ1dCBhIHdhcmQgdHdvIHllYXJzIGFnby4KClJPTUVPCgogICAgW1RvIGEgU2VydmluZ21hbl0gV2hhdCBsYWR5IGlzIHRoYXQsIHdoaWNoIGRvdGgKICAgIGVucmljaCB0aGUgaGFuZAogICAgT2YgeW9uZGVyIGtuaWdodD8KClNlcnZhbnQKCiAgICBJIGtub3cgbm90LCBzaXIuCgpST01FTwoKICAgIE8sIHNoZSBkb3RoIHRlYWNoIHRoZSB0b3JjaGVzIHRvIGJ1cm4gYnJpZ2h0IQogICAgSXQgc2VlbXMgc2hlIGhhbmdzIHVwb24gdGhlIGNoZWVrIG9mIG5pZ2h0CiAgICBMaWtlIGEgcmljaCBqZXdlbCBpbiBhbiBFdGhpb3BlJ3MgZWFyOwogICAgQmVhdXR5IHRvbyByaWNoIGZvciB1c2UsIGZvciBlYXJ0aCB0b28gZGVhciEKICAgIFNvIHNob3dzIGEgc25vd3kgZG92ZSB0cm9vcGluZyB3aXRoIGNyb3dzLAogICAgQXMgeW9uZGVyIGxhZHkgbydlciBoZXIgZmVsbG93cyBzaG93cy4KICAgIFRoZSBtZWFzdXJlIGRvbmUsIEknbGwgd2F0Y2ggaGVyIHBsYWNlIG9mIHN0YW5kLAogICAgQW5kLCB0b3VjaGluZyBoZXJzLCBtYWtlIGJsZXNzZWQgbXkgcnVkZSBoYW5kLgogICAgRGlkIG15IGhlYXJ0IGxvdmUgdGlsbCBub3cIGZvcnN3ZWFyIGl0LCBzaWdodCEKICAgIEZvciBJIG5lJ2VyIHNhdyB0cnVlIGJlYXV0eSB0aWxsIHRoaXMgbmlnaHQuCgpUWUJBTFQKCiAgICBUaGlzLCBieSBoaXMgdm9pY2UsIHNob3VsZCBiZSBhIE1vbnRhZ3VlLgogICAgRmV0Y2ggbWUgbXkgcmFwaWVyLCBib3kuIFdoYXQgZGFyZXMgdGhlIHNsYXZlCiAgICBDb21lIGhpdGhlciwgY292ZXInZCB3aXRoIGFuIGFudGljIGZhY2UsCiAgICBUbyBmbGVlciBhbmQgc2Nvcm4gYXQgb3VyIHNvbGVtbml0eT8KICAgIE5vdywgYnkgdGhlIHN0b2NrIGFuZCBob25vdXIgb2YgbXkga2luLAogICAgVG8gc3RyaWtlIGhpbSBkZWFkLCBJIGhvbGQgaXQgbm90IGEgc2luLgoKQ0FQVUxFVAoKICAgIFdoeSwgaG93IG5vdywga2luc21hbiEgd2hlcmVmb3JlIHN0b3JtIHlvdSBzbz8KClRZQkFMVAoKICAgIFVuY2xlLCB0aGlzIGlzIGEgTW9udGFndWUsIG91ciBmb2UsCiAgICBBIHZpbGxhaW4gdGhhdCBpcyBoaXRoZXIgY29tZSBpbiBzcGl0ZSwKICAgIFRvIHNjb3JuIGF0IG91ciBzb2xlbW5pdHkgdGhpcyBuaWdodC4KCkNBUFVMRVQKCiAgICBZb3VuZyBSb21lbyBpcyBpdD8KClRZQkFMVAoKICAgICdUaXMgaGUsIHRoYXQgdmlsbGFpbiBSb21lby4KCkNBUFVMRVQKCiAgICBDb250ZW50IHRoZWUsIGdlbnRsZSBjb3osIGxldCBoaW0gYWxvbmU7CiAgICBIZSBiZWFycyBoaW0gbGlrZSBhIHBvcnRseSBnZW50bGVtYW47CiAgICBBbmQsIHRvIHNheSB0cnV0aCwgVmVyb25hIGJyYWdzIG9mIGhpbQogICAgVG8gYmUgYSB2aXJ0dW91cyBhbmQgd2VsbC1nb3Zlcm4nZCB5b3V0aDoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd2VhbHRoIG9mIGFsbCB0aGUgdG93bgogICAgSGVyZSBpbiBteSBob3VzZSBkbyBoaW0gZGlzcGFyYWdlbWVudDoKICAgIFRoZXJlZm9yZSBiZSBwYXRpZW50LCB0YWtlIG5vIG5vdGUgb2YgaGltOgogICAgSXQgaXMgbXkgd2lsbCwgdGhlIHdoaWNoIGlmIHRob3UgcmVzcGVjdCwKICAgIFNob3cgYSBmYWlyIHByZXNlbmNlIGFuZCBwdXQgb2ZmIHRoZXNlIGZyb3ducywKICAgIEFuZCBpbGwtYmVzZWVtaW5nIHNlbWJsYW5jZSBmb3IgYSBmZWFzdC4KClRZQkFMVAoKICAgIEl0IGZpdHMsIHdoZW4gc3VjaCBhIHZpbGxhaW4gaXMgYSBndWVzdDoKICAgIEknbGwgbm90IGVuZHVyZSBoaW0uCgpDQVBVTEVUCgogICAgSGUgc2hhbGwgYmUgZW5kdXJlZDoKICAgIFdoYXQsIGdvb2RtYW4gYm95ISBJIHNheSwgaGUgc2hhbGw6IGdvIHRvOwogICAgQW0gSSB0aGUgbWFzdGVyIGhlcmUsIG9yIHlvdT8gZ28gdG8uCiAgICBZb3UnbGwgbm90IGVuZHVyZSBoaW0hIEdvZCBzaGFsbCBtZW5kIG15IHNvdWwhCiAgICBZb3UnbGwgbWFrZSBhIG11dGlueSBhbW9uZyBteSBndWVzdHMhCiAgICBZb3Ugd2lsbCBzZXQgY29jay1hLWhvb3AhIHlvdSdsbCBiZSB0aGUgbWFuIQoKVFlCQUxUCgogICAgV2h5LCB1bmNsZSwgJ3RpcyBhIHNoYW1lLgoKQ0FQVUxFVAoKICAgIEdvIHRvLCBnbyB0bzsKICAgIFlvdSBhcmUgYSBzYXVjeSBib3k6IGlzJ3Qgc28sIGluZGVlZD8KICAgIFRoaXMgdHJpY2sgbWF5IGNoYW5jZSB0byBzY2F0aGUgeW91LCBJIGtub3cgd2hhdDoKICAgIFlvdSBtdXN0IGNvbnRyYXJ5IG1lISBtYXJyeSwgJ3RpcyB0aW1lLgogICAgV2VsbCBzYWlkLCBteSBoZWFydHMhIFlvdSBhcmUgYSBwcmluY294OyBnbzoKICAgIEJlIHF1aWV0LCBvci0tTW9yZSBsaWdodCwgbW9yZSBsaWdodCEgRm9yIHNoYW1lIQogICAgSSdsbCBtYWtlIHlvdSBxdWlldC4gV2hhdCwgY2hlZXJseSwgbXkgaGVhcnRzIQoKVFlCQUxUCgogICAgUGF0aWVuY2UgcGVyZm9yY2Ugd2l0aCB3aWxmdWwgY2hvbGVyIG1lZXRpbmcKICAgIE1ha2VzIG15IGZsZXNoIHRyZW1ibGUgaW4gdGhlaXIgZGlmZmVyZW50IGdyZWV0aW5nLgogICAgSSB3aWxsIHdpdGhkcmF3OiBidXQgdGhpcyBpbnRydXNpb24gc2hhbGwKICAgIE5vdyBzZWVtaW5nIHN3ZWV0IGNvbnZlcnQgdG8gYml0dGVyIGdhbGwuCgogICAgRXhpdAoKUk9NRU8KCiAgICBbVG8gSlVMSUVUXSBJZiBJIHByb2ZhbmUgd2l0aCBteSB1bndvcnRoaWVzdCBoYW5kCiAgICBUaGlzIGhvbHkgc2hyaW5lLCB0aGUgZ2VudGxlIGZpbmUgaXMgdGhpczoKICAgIE15IGxpcHMsIHR3byBibHVzaGluZyBwaWxncmltcywgcmVhZHkgc3RhbmQKICAgIFRvIHNtb290aCB0aGF0IHJvdWdoIHRvdWNoIHdpdGggYSB0ZW5kZXIga2lzcy4KCkpVTElFVAoKICAgIEdvb2QgcGlsZ3JpbSwgeW91IGRvIHdyb25nIHlvdXIgaGFuZCB0b28gbXVjaCwKICAgIFdoaWNoIG1hbm5lcmx5IGRldm90aW9uIHNob3dzIGluIHRoaXM7CiAgICBGb3Igc2FpbnRzIGhhdmUgaGFuZHMgdGhhdCBwaWxncmltcycgaGFuZHMgZG8gdG91Y2gsCiAgICBBbmQgcGFsbSB0byBwYWxtIGlzIGhvbHkgcGFsbWVycycga2lzcy4KClJPTUVPCgogICAgSGF2ZSBub3Qgc2FpbnRzIGxpcHMsIGFuZCBob2x5IHBhbG1lcnMgdG9vPwoKSlVMSUVUCgogICAgQXksIHBpbGdyaW0sIGxpcHMgdGhhdCB0aGV5IG11c3QgdXNlIGluIHByYXllci4KClJPTUVPCgogICAgTywgdGhlbiwgZGVhciBzYWludCwgbGV0IGxpcHMgZG8gd2hhdCBoYW5kcyBkbzsKICAgIFRoZXkgcHJheSwgZ3JhbnQgdGhvdSwgbGVzdCBmYWl0aCB0dXJuIHRvIGRlc3BhaXIuCgpKVUxJRVQKCiAgICBTYWludHMgZG8gbm90IG1vdmUsIHRob3VnaCBncmFudCBmb3IgcHJheWVycycgc2FrZS4KClJPTUVPCgogICAgVGhlbiBtb3ZlIG5vdCwgd2hpbGUgbXkgcHJheWVyJ3MgZWZmZWN0IEkgdGFrZS4KICAgIFRodXMgZnJvbSBteSBsaXBzLCBieSB5b3VycywgbXkgc2luIGlzIHB1cmdlZC4KCkpVTElFVAoKICAgIFRoZW4gaGF2ZSBteSBsaXBzIHRoZSBzaW4gdGhhdCB0aGV5IGhhdmUgdG9vay4KClJPTUVPCgogICAgU2luIGZyb20gdGh5IGxpcHMIE8gdHJlc3Bhc3Mgc3dlZXRseSB1cmdlZCEKICAgIEdpdmUgbWUgbXkgc2luIGFnYWluLgoKSlVMSUVUCgogICAgWW91IGtpc3MgYnkgdGhlIGJvb2suCgpOdXJzZQoKICAgIE1hZGFtLCB5b3VyIG1vdGhlciBjcmF2ZXMgYSB3b3JkIHdpdGggeW91LgoKUk9NRU8KCiAgICBXaGF0IGlzIGhlciBtb3RoZXICgpOdXJzZQoKICAgIE1hcnJ5LCBiYWNoZWxvciwKICAgIEhlciBtb3RoZXIgaXMgdGhlIGxhZHkgb2YgdGhlIGhvdXNlLAogICAgQW5kIGEgZ29vZCBsYWR5LCBhbmQgYSB3aXNlIGFuZCB2aXJ0dW91cwogICAgSSBudXJzZWQgaGVyIGRhdWdodGVyLCB0aGF0IHlvdSB0YWxrJ2Qgd2l0aGFsOwogICAgSSB0ZWxsIHlvdSwgaGUgdGhhdCBjYW4gbGF5IGhvbGQgb2YgaGVyCiAgICBTaGFsbCBoYXZlIHRoZSBjaGlua3MuCgpST01FTwoKICAgIElzIHNoZSBhIENhcHVsZXQCiAgICBPIGRlYXIgYWNjb3VudCEgbXkgbGlmZSBpcyBteSBmb2UncyBkZWJ0LgoKQkVOVk9MSU8KCiAgICBBd2F5LCBiZWdvbmU7IHRoZSBzcG9ydCBpcyBhdCB0aGUgYmVzdC4KClJPTUVPCgogICAgQXksIHNvIEkgZmVhcjsgdGhlIG1vcmUgaXMgbXkgdW5yZXN0LgoKQ0FQVUxFVAoKICAgIE5heSwgZ2VudGxlbWVuLCBwcmVwYXJlIG5vdCB0byBiZSBnb25lOwogICAgV2UgaGF2ZSBhIHRyaWZsaW5nIGZvb2xpc2ggYmFucXVldCB0b3dhcmRzLgogICAgSXMgaXQgZSdlbiBzbz8gd2h5LCB0aGVuLCBJIHRoYW5rIHlvdSBhbGwKICAgIEkgdGhhbmsgeW91LCBob25lc3QgZ2VudGxlbWVuOyBnb29kIG5pZ2h0LgogICAgTW9yZSB0b3JjaGVzIGhlcmUhIENvbWUgb24gdGhlbiwgbGV0J3MgdG8gYmVkLgogICAgQWgsIHNpcnJhaCwgYnkgbXkgZmF5LCBpdCB3YXhlcyBsYXRlOgogICAgSSdsbCB0byBteSByZXN0LgoKICAgIEV4ZXVudCBhbGwgYnV0IEpVTElFVCBhbmQgTnVyc2UKCkpVTElFVAoKICAgIENvbWUgaGl0aGVyLCBudXJzZS4gV2hhdCBpcyB5b25kIGdlbnRsZW1hbj8KCk51cnNlCgogICAgVGhlIHNvbiBhbmQgaGVpciBvZiBvbGQgVGliZXJpby4KCkpVTElFVAoKICAgIFdoYXQncyBoZSB0aGF0IG5vdyBpcyBnb2luZyBvdXQgb2YgZG9vcj8KCk51cnNlCgogICAgTWFycnksIHRoYXQsIEkgdGhpbmssIGJlIHlvdW5nIFBldHJ1Y2lvLgoKSlVMSUVUCgogICAgV2hhdCdzIGhlIHRoYXQgZm9sbG93cyB0aGVyZSwgdGhhdCB3b3VsZCBub3QgZGFuY2UCgpOdXJzZQoKICAgIEkga25vdyBub3QuCgpKVUxJRVQKCiAgICBHbyBhc2sgaGlzIG5hbWU6IGlmIGhlIGJlIG1hcnJpZWQuCiAgICBNeSBncmF2ZSBpcyBsaWtlIHRvIGJlIG15IHdlZGRpbmcgYmVkLgoKTnVyc2UKCiAgICBIaXMgbmFtZSBpcyBSb21lbywgYW5kIGEgTW9udGFndWU7CiAgICBUaGUgb25seSBzb24gb2YgeW91ciBncmVhdCBlbmVteS4KCkpVTElFVAoKICAgIE15IG9ubHkgbG92ZSBzcHJ1bmcgZnJvbSBteSBvbmx5IGhhdGUhCiAgICBUb28gZWFybHkgc2VlbiB1bmtub3duLCBhbmQga25vd24gdG9vIGxhdGUhCiAgICBQcm9kaWdpb3VzIGJpcnRoIG9mIGxvdmUgaXQgaXMgdG8gbWUsCiAgICBUaGF0IEkgbXVzdCBsb3ZlIGEgbG9hdGhlZCBlbmVteS4KCk51cnNlCgogICAgV2hhdCdzIHRoaXMIHdoYXQncyB0aGlzPwoKSlVMSUVUCgogICAgQSByaHltZSBJIGxlYXJuJ2QgZXZlbiBub3cKICAgIE9mIG9uZSBJIGRhbmNlZCB3aXRoYWwuCgogICAgT25lIGNhbGxzIHdpdGhpbiAnSnVsaWV0LicKCk51cnNlCgogICAgQW5vbiwgYW5vbiEKICAgIENvbWUsIGxldCdzIGF3YXk7IHRoZSBzdHJhbmdlcnMgYWxsIGFyZSBnb25lLgoKICAgIEV4ZXVudAoKQUNUIElJClBST0xPR1VFCgogICAgRW50ZXIgQ2hvcnVzIAoKQ2hvcnVzCgogICAgTm93IG9sZCBkZXNpcmUgZG90aCBpbiBoaXMgZGVhdGgtYmVkIGxpZSwKICAgIEFuZCB5b3VuZyBhZmZlY3Rpb24gZ2FwZXMgdG8gYmUgaGlzIGhlaXI7CiAgICBUaGF0IGZhaXIgZm9yIHdoaWNoIGxvdmUgZ3JvYW4nZCBmb3IgYW5kIHdvdWxkIGRpZSwKICAgIFdpdGggdGVuZGVyIEp1bGlldCBtYXRjaCdkLCBpcyBub3cgbm90IGZhaXIuCiAgICBOb3cgUm9tZW8gaXMgYmVsb3ZlZCBhbmQgbG92ZXMgYWdhaW4sCiAgICBBbGlrZSBiZXR3aXRjaGVkIGJ5IHRoZSBjaGFybSBvZiBsb29rcywKICAgIEJ1dCB0byBoaXMgZm9lIHN1cHBvc2VkIGhlIG11c3QgY29tcGxhaW4sCiAgICBBbmQgc2hlIHN0ZWFsIGxvdmUncyBzd2VldCBiYWl0IGZyb20gZmVhcmZ1bCBob29rczoKICAgIEJlaW5nIGhlbGQgYSBmb2UsIGhlIG1heSBub3QgaGF2ZSBhY2Nlc3MKICAgIFRvIGJyZWF0aGUgc3VjaCB2b3dzIGFzIGxvdmVycyB1c2UgdG8gc3dlYXI7CiAgICBBbmQgc2hlIGFzIG11Y2ggaW4gbG92ZSwgaGVyIG1lYW5zIG11Y2ggbGVzcwogICAgVG8gbWVldCBoZXIgbmV3LWJlbG92ZWQgYW55IHdoZXJlOgogICAgQnV0IHBhc3Npb24gbGVuZHMgdGhlbSBwb3dlciwgdGltZSBtZWFucywgdG8gbWVldAogICAgVGVtcGVyaW5nIGV4dHJlbWl0aWVzIHdpdGggZXh0cmVtZSBzd2VldC4KCiAgICBFeGl0CgpTQ0VORSBJLiBBIGxhbmUgYnkgdGhlIHdhbGwgb2YgQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gCgpST01FTwoKICAgIENhbiBJIGdvIGZvcndhcmQgd2hlbiBteSBoZWFydCBpcyBoZXJlPwogICAgVHVybiBiYWNrLCBkdWxsIGVhcnRoLCBhbmQgZmluZCB0aHkgY2VudHJlIG91dC4KCiAgICBIZSBjbGltYnMgdGhlIHdhbGwsIGFuZCBsZWFwcyBkb3duIHdpdGhpbiBpdAoKICAgIEVudGVyIEJFTlZPTElPIGFuZCBNRVJDVVRJTwoKQkVOVk9MSU8KCiAgICBSb21lbyEgbXkgY291c2luIFJvbWVvIQoKTUVSQ1VUSU8KCiAgICBIZSBpcyB3aXNlOwogICAgQW5kLCBvbiBteSBsaWUsIGhhdGggc3RvbCduIGhpbSBob21lIHRvIGJlZC4KCkJFTlZPTElPCgogICAgSGUgcmFuIHRoaXMgd2F5LCBhbmQgbGVhcCdkIHRoaXMgb3JjaGFyZCB3YWxsOgogICAgQ2FsbCwgZ29vZCBNZXJjdXRpby4KCk1FUkNVVElPCgogICAgTmF5LCBJJ2xsIGNvbmp1cmUgdG9vLgogICAgUm9tZW8hIGh1bW91cnMhIG1hZG1hbiEgcGFzc2lvbiEgbG92ZXIhCiAgICBBcHBlYXIgdGhvdSBpbiB0aGUgbGlrZW5lc3Mgb2YgYSBzaWdoOgogICAgU3BlYWsgYnV0IG9uZSByaHltZSwgYW5kIEkgYW0gc2F0aXNmaWVkOwogICAgQ3J5IGJ1dCAnQXkgbWUhJyBwcm9ub3VuY2UgYnV0ICdsb3ZlJyBhbmQgJ2RvdmU7JwogICAgU3BlYWsgdG8gbXkgZ29zc2lwIFZlbnVzIG9uZSBmYWlyIHdvcmQsCiAgICBPbmUgbmljay1uYW1lIGZvciBoZXIgcHVyYmxpbmQgc29uIGFuZCBoZWlyLAogICAgWW91bmcgQWRhbSBDdXBpZCwgaGUgdGhhdCBzaG90IHNvIHRyaW0sCiAgICBXaGVuIEtpbmcgQ29waGV0dWEgbG92ZWQgdGhlIGJlZ2dhci1tYWlkIQogICAgSGUgaGVhcmV0aCBub3QsIGhlIHN0aXJyZXRoIG5vdCwgaGUgbW92ZXRoIG5vdDsKICAgIFRoZSBhcGUgaXMgZGVhZCwgYW5kIEkgbXVzdCBjb25qdXJlIGhpbS4KICAgIEkgY29uanVyZSB0aGVlIGJ5IFJvc2FsaW5lJ3MgYnJpZ2h0IGV5ZXMsCiAgICBCeSBoZXIgaGlnaCBmb3JlaGVhZCBhbmQgaGVyIHNjYXJsZXQgbGlwLAogICAgQnkgaGVyIGZpbmUgZm9vdCwgc3RyYWlnaHQgbGVnIGFuZCBxdWl2ZXJpbmcgdGhpZ2gKICAgIEFuZCB0aGUgZGVtZXNuZXMgdGhhdCB0aGVyZSBhZGphY2VudCBsaWUsCiAgICBUaGF0IGluIHRoeSBsaWtlbmVzcyB0aG91IGFwcGVhciB0byB1cyEKCkJFTlZPTElPCgogICAgQW5kIGlmIGhlIGhlYXIgdGhlZSwgdGhvdSB3aWx0IGFuZ2VyIGhpbS4KCk1FUkNVVElPCgogICAgVGhpcyBjYW5ub3QgYW5nZXIgaGltOiAndHdvdWxkIGFuZ2VyIGhpbQogICAgVG8gcmFpc2UgYSBzcGlyaXQgaW4gaGlzIG1pc3RyZXNzJyBjaXJjbGUKICAgIE9mIHNvbWUgc3RyYW5nZSBuYXR1cmUsIGxldHRpbmcgaXQgdGhlcmUgc3RhbmQKICAgIFRpbGwgc2hlIGhhZCBsYWlkIGl0IGFuZCBjb25qdXJlZCBpdCBkb3duOwogICAgVGhhdCB3ZXJlIHNvbWUgc3BpdGU6IG15IGludm9jYXRpb24KICAgIElzIGZhaXIgYW5kIGhvbmVzdCwgYW5kIGluIGhpcyBtaXN0cmVzIHMnIG5hbWUKICAgIEkgY29uanVyZSBvbmx5IGJ1dCB0byByYWlzZSB1cCBoaW0uCgpCRU5WT0xJTwoKICAgIENvbWUsIGhlIGhhdGggaGlkIGhpbXNlbGYgYW1vbmcgdGhlc2UgdHJlZXMsCiAgICBUbyBiZSBjb25zb3J0ZWQgd2l0aCB0aGUgaHVtb3JvdXMgbmlnaHQ6CiAgICBCbGluZCBpcyBoaXMgbG92ZSBhbmQgYmVzdCBiZWZpdHMgdGhlIGRhcmsuCgpNRVJDVVRJTwoKICAgIElmIGxvdmUgYmUgYmxpbmQsIGxvdmUgY2Fubm90IGhpdCB0aGUgbWFyay4KICAgIE5vdyB3aWxsIGhlIHNpdCB1bmRlciBhIG1lZGxhciB0cmVlLAogICAgQW5kIHdpc2ggaGlzIG1pc3RyZXNzIHdlcmUgdGhhdCBraW5kIG9mIGZydWl0CiAgICBBcyBtYWlkcyBjYWxsIG1lZGxhcnMsIHdoZW4gdGhleSBsYXVnaCBhbG9uZS4KICAgIFJvbWVvLCB0aGF0IHNoZSB3ZXJlLCBPLCB0aGF0IHNoZSB3ZXJlCiAgICBBbiBvcGVuIGV0IGNhZXRlcmEsIHRob3UgYSBwb3BlcmluIHBlYXIhCiAgICBSb21lbywgZ29vZCBuaWdodDogSSdsbCB0byBteSB0cnVja2xlLWJlZDsKICAgIFRoaXMgZmllbGQtYmVkIGlzIHRvbyBjb2xkIGZvciBtZSB0byBzbGVlcDoKICAgIENvbWUsIHNoYWxsIHdlIGdvPwoKQkVOVk9MSU8KCiAgICBHbywgdGhlbjsgZm9yICd0aXMgaW4gdmFpbgogICAgVG8gc2VlayBoaW0gaGVyZSB0aGF0IG1lYW5zIG5vdCB0byBiZSBmb3VuZC4KCiAgICBFeGV1bnQKClNDRU5FIElJLiBDYXB1bGV0J3Mgb3JjaGFyZC4KCiAgICBFbnRlciBST01FTyAKClJPTUVPCgogICAgSGUgamVzdHMgYXQgc2NhcnMgdGhhdCBuZXZlciBmZWx0IGEgd291bmQuCgogICAgSlVMSUVUIGFwcGVhcnMgYWJvdmUgYXQgYSB3aW5kb3cKICAgIEJ1dCwgc29mdCEgd2hhdCBsaWdodCB0aHJvdWdoIHlvbmRlciB3aW5kb3cgYnJlYWtzPwogICAgSXQgaXMgdGhlIGVhc3QsIGFuZCBKdWxpZXQgaXMgdGhlIHN1bi4KICAgIEFyaXNlLCBmYWlyIHN1biwgYW5kIGtpbGwgdGhlIGVudmlvdXMgbW9vbiwKICAgIFdobyBpcyBhbHJlYWR5IHNpY2sgYW5kIHBhbGUgd2l0aCBncmllZiwKICAgIFRoYXQgdGhvdSBoZXIgbWFpZCBhcnQgZmFyIG1vcmUgZmFpciB0aGFuIHNoZToKICAgIEJlIG5vdCBoZXIgbWFpZCwgc2luY2Ugc2hlIGlzIGVudmlvdXM7CiAgICBIZXIgdmVzdGFsIGxpdmVyeSBpcyBidXQgc2ljayBhbmQgZ3JlZW4KICAgIEFuZCBub25lIGJ1dCBmb29scyBkbyB3ZWFyIGl0OyBjYXN0IGl0IG9mZi4KICAgIEl0IGlzIG15IGxhZHksIE8sIGl0IGlzIG15IGxvdmUhCiAgICBPLCB0aGF0IHNoZSBrbmV3IHNoZSB3ZXJlIQogICAgU2hlIHNwZWFrcyB5ZXQgc2hlIHNheXMgbm90aGluZzogd2hhdCBvZiB0aGF0PwogICAgSGVyIGV5ZSBkaXNjb3Vyc2VzOyBJIHdpbGwgYW5zd2VyIGl0LgogICAgSSBhbSB0b28gYm9sZCwgJ3RpcyBub3QgdG8gbWUgc2hlIHNwZWFrczoKICAgIFR3byBvZiB0aGUgZmFpcmVzdCBzdGFycyBpbiBhbGwgdGhlIGhlYXZlbiwKICAgIEhhdmluZyBzb21lIGJ1c2luZXNzLCBkbyBlbnRyZWF0IGhlciBleWVzCiAgICBUbyB0d2lua2xlIGluIHRoZWlyIHNwaGVyZXMgdGlsbCB0aGV5IHJldHVybi4KICAgIFdoYXQgaWYgaGVyIGV5ZXMgd2VyZSB0aGVyZSwgdGhleSBpbiBoZXIgaGVhZD8KICAgIFRoZSBicmlnaHRuZXNzIG9mIGhlciBjaGVlayB3b3VsZCBzaGFtZSB0aG9zZSBzdGFycywKICAgIEFzIGRheWxpZ2h0IGRvdGggYSBsYW1wOyBoZXIgZXllcyBpbiBoZWF2ZW4KICAgIFdvdWxkIHRocm91Z2ggdGhlIGFpcnkgcmVnaW9uIHN0cmVhbSBzbyBicmlnaHQKICAgIFRoYXQgYmlyZHMgd291bGQgc2luZyBhbmQgdGhpbmsgaXQgd2VyZSBub3QgbmlnaHQuCiAgICBTZWUsIGhvdyBzaGUgbGVhbnMgaGVyIGNoZWVrIHVwb24gaGVyIGhhbmQhCiAgICBPLCB0aGF0IEkgd2VyZSBhIGdsb3ZlIHVwb24gdGhhdCBoYW5kLAogICAgVGhhdCBJIG1pZ2h0IHRvdWNoIHRoYXQgY2hlZWshCgpKVUxJRVQKCiAgICBBeSBtZSEKClJPTUVPCgogICAgU2hlIHNwZWFrczoKICAgIE8sIHNwZWFrIGFnYWluLCBicmlnaHQgYW5nZWwhIGZvciB0aG91IGFydAogICAgQXMgZ2xvcmlvdXMgdG8gdGhpcyBuaWdodCwgYmVpbmcgbydlciBteSBoZWFkCiAgICBBcyBpcyBhIHdpbmdlZCBtZXNzZW5nZXIgb2YgaGVhdmVuCiAgICBVbnRvIHRoZSB3aGl0ZS11cHR1cm5lZCB3b25kZXJpbmcgZXllcwogICAgT2YgbW9ydGFscyB0aGF0IGZhbGwgYmFjayB0byBnYXplIG9uIGhpbQogICAgV2hlbiBoZSBiZXN0cmlkZXMgdGhlIGxhenktcGFjaW5nIGNsb3VkcwogICAgQW5kIHNhaWxzIHVwb24gdGhlIGJvc29tIG9mIHRoZSBhaXIuCgpKVUxJRVQKCiAgICBPIFJvbWVvLCBSb21lbyEgd2hlcmVmb3JlIGFydCB0aG91IFJvbWVvPwogICAgRGVueSB0aHkgZmF0aGVyIGFuZCByZWZ1c2UgdGh5IG5hbWU7CiAgICBPciwgaWYgdGhvdSB3aWx0IG5vdCwgYmUgYnV0IHN3b3JuIG15IGxvdmUsCiAgICBBbmQgSSdsbCBubyBsb25nZXIgYmUgYSBDYXB1bGV0LgoKUk9NRU8KCiAgICBbQXNpZGVdIFNoYWxsIEkgaGVhciBtb3JlLCBvciBzaGFsbCBJIHNwZWFrIGF0IHRoaXMCgpKVUxJRVQKCiAgICAnVGlzIGJ1dCB0aHkgbmFtZSB0aGF0IGlzIG15IGVuZW15OwogICAgVGhvdSBhcnQgdGh5c2VsZiwgdGhvdWdoIG5vdCBhIE1vbnRhZ3VlLgogICAgV2hhdCdzIE1vbnRhZ3VlPyBpdCBpcyBub3IgaGFuZCwgbm9yIGZvb3QsCiAgICBOb3IgYXJtLCBub3IgZmFjZSwgbm9yIGFueSBvdGhlciBwYXJ0CiAgICBCZWxvbmdpbmcgdG8gYSBtYW4uIE8sIGJlIHNvbWUgb3RoZXIgbmFtZSEKICAgIFdoYXQncyBpbiBhIG5hbWUIHRoYXQgd2hpY2ggd2UgY2FsbCBhIHJvc2UKICAgIEJ5IGFueSBvdGhlciBuYW1lIHdvdWxkIHNtZWxsIGFzIHN3ZWV0OwogICAgU28gUm9tZW8gd291bGQsIHdlcmUgaGUgbm90IFJvbWVvIGNhbGwnZCwKICAgIFJldGFpbiB0aGF0IGRlYXIgcGVyZmVjdGlvbiB3aGljaCBoZSBvd2VzCiAgICBXaXRob3V0IHRoYXQgdGl0bGUuIFJvbWVvLCBkb2ZmIHRoeSBuYW1lLAogICAgQW5kIGZvciB0aGF0IG5hbWUgd2hpY2ggaXMgbm8gcGFydCBvZiB0aGVlCiAgICBUYWtlIGFsbCBteXNlbGYuCgpST01FTwoKICAgIEkgdGFrZSB0aGVlIGF0IHRoeSB3b3JkOgogICAgQ2FsbCBtZSBidXQgbG92ZSwgYW5kIEknbGwgYmUgbmV3IGJhcHRpemVkOwogICAgSGVuY2Vmb3J0aCBJIG5ldmVyIHdpbGwgYmUgUm9tZW8uCgpKVUxJRVQKCiAgICBXaGF0IG1hbiBhcnQgdGhvdSB0aGF0IHRodXMgYmVzY3JlZW4nZCBpbiBuaWdodAogICAgU28gc3R1bWJsZXN0IG9uIG15IGNvdW5zZWwCgpST01FTwoKICAgIEJ5IGEgbmFtZQogICAgSSBrbm93IG5vdCBob3cgdG8gdGVsbCB0aGVlIHdobyBJIGFtOgogICAgTXkgbmFtZSwgZGVhciBzYWludCwgaXMgaGF0ZWZ1bCB0byBteXNlbGYsCiAgICBCZWNhdXNlIGl0IGlzIGFuIGVuZW15IHRvIHRoZWU7CiAgICBIYWQgSSBpdCB3cml0dGVuLCBJIHdvdWxkIHRlYXIgdGhlIHdvcmQuCgpKVUxJRVQKCiAgICBNeSBlYXJzIGhhdmUgbm90IHlldCBkcnVuayBhIGh1bmRyZWQgd29yZHMKICAgIE9mIHRoYXQgdG9uZ3VlJ3MgdXR0ZXJhbmNlLCB5ZXQgSSBrbm93IHRoZSBzb3VuZDoKICAgIEFydCB0aG91IG5vdCBSb21lbyBhbmQgYSBNb250YWd1ZT8KClJPTUVPCgogICAgTmVpdGhlciwgZmFpciBzYWludCwgaWYgZWl0aGVyIHRoZWUgZGlzbGlrZS4KCkpVTElFVAoKICAgIEhvdyBjYW1lc3QgdGhvdSBoaXRoZXIsIHRlbGwgbWUsIGFuZCB3aGVyZWZvcmUCiAgICBUaGUgb3JjaGFyZCB3YWxscyBhcmUgaGlnaCBhbmQgaGFyZCB0byBjbGltYiwKICAgIEFuZCB0aGUgcGxhY2UgZGVhdGgsIGNvbnNpZGVyaW5nIHdobyB0aG91IGFydCwKICAgIElmIGFueSBvZiBteSBraW5zbWVuIGZpbmQgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBXaXRoIGxvdmUncyBsaWdodCB3aW5ncyBkaWQgSSBvJ2VyLXBlcmNoIHRoZXNlIHdhbGxzOwogICAgRm9yIHN0b255IGxpbWl0cyBjYW5ub3QgaG9sZCBsb3ZlIG91dCwKICAgIEFuZCB3aGF0IGxvdmUgY2FuIGRvIHRoYXQgZGFyZXMgbG92ZSBhdHRlbXB0OwogICAgVGhlcmVmb3JlIHRoeSBraW5zbWVuIGFyZSBubyBsZXQgdG8gbWUuCgpKVUxJRVQKCiAgICBJZiB0aGV5IGRvIHNlZSB0aGVlLCB0aGV5IHdpbGwgbXVyZGVyIHRoZWUuCgpST01FTwoKICAgIEFsYWNrLCB0aGVyZSBsaWVzIG1vcmUgcGVyaWwgaW4gdGhpbmUgZXllCiAgICBUaGFuIHR3ZW50eSBvZiB0aGVpciBzd29yZHM6IGxvb2sgdGhvdSBidXQgc3dlZXQsCiAgICBBbmQgSSBhbSBwcm9vZiBhZ2FpbnN0IHRoZWlyIGVubWl0eS4KCkpVTElFVAoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd29ybGQgdGhleSBzYXcgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBJIGhhdmUgbmlnaHQncyBjbG9hayB0byBoaWRlIG1lIGZyb20gdGhlaXIgc2lnaHQ7CiAgICBBbmQgYnV0IHRob3UgbG92ZSBtZSwgbGV0IHRoZW0gZmluZCBtZSBoZXJlOgogICAgTXkgbGlmZSB3ZXJlIGJldHRlciBlbmRlZCBieSB0aGVpciBoYXRlLAogICAgVGhhbiBkZWF0aCBwcm9yb2d1ZWQsIHdhbnRpbmcgb2YgdGh5IGxvdmUuCgpKVUxJRVQKCiAgICBCeSB3aG9zZSBkaXJlY3Rpb24gZm91bmQnc3QgdGhvdSBvdXQgdGhpcyBwbGFjZT8KClJPTUVPCgogICAgQnkgbG92ZSwgd2hvIGZpcnN0IGRpZCBwcm9tcHQgbWUgdG8gaW5xdWlyZTsKICAgIEhlIGxlbnQgbWUgY291bnNlbCBhbmQgSSBsZW50IGhpbSBleWVzLgogICAgSSBhbSBubyBwaWxvdDsgeWV0LCB3ZXJ0IHRob3UgYXMgZmFyCiAgICBBcyB0aGF0IHZhc3Qgc2hvcmUgd2FzaCdkIHdpdGggdGhlIGZhcnRoZXN0IHNlYSwKICAgIEkgd291bGQgYWR2ZW50dXJlIGZvciBzdWNoIG1lcmNoYW5kaXNlLgoKSlVMSUVUCgogICAgVGhvdSBrbm93J3N0IHRoZSBtYXNrIG9mIG5pZ2h0IGlzIG9uIG15IGZhY2UsCiAgICBFbHNlIHdvdWxkIGEgbWFpZGVuIGJsdXNoIGJlcGFpbnQgbXkgY2hlZWsKICAgIEZvciB0aGF0IHdoaWNoIHRob3UgaGFzdCBoZWFyZCBtZSBzcGVhayB0by1uaWdodAogICAgRmFpbiB3b3VsZCBJIGR3ZWxsIG9uIGZvcm0sIGZhaW4sIGZhaW4gZGVueQogICAgV2hhdCBJIGhhdmUgc3Bva2U6IGJ1dCBmYXJld2VsbCBjb21wbGltZW50IQogICAgRG9zdCB0aG91IGxvdmUgbWUIEkga25vdyB0aG91IHdpbHQgc2F5ICdBeSwnCiAgICBBbmQgSSB3aWxsIHRha2UgdGh5IHdvcmQ6IHlldCBpZiB0aG91IHN3ZWFyJ3N0LAogICAgVGhvdSBtYXlzdCBwcm92ZSBmYWxzZTsgYXQgbG92ZXJzJyBwZXJqdXJpZXMKICAgIFRoZW4gc2F5LCBKb3ZlIGxhdWdocy4gTyBnZW50bGUgUm9tZW8sCiAgICBJZiB0aG91IGRvc3QgbG92ZSwgcHJvbm91bmNlIGl0IGZhaXRoZnVsbHk6CiAgICBPciBpZiB0aG91IHRoaW5rJ3N0IEkgYW0gdG9vIHF1aWNrbHkgd29uLAogICAgSSdsbCBmcm93biBhbmQgYmUgcGVydmVyc2UgYW4gc2F5IHRoZWUgbmF5LAogICAgU28gdGhvdSB3aWx0IHdvbzsgYnV0IGVsc2UsIG5vdCBmb3IgdGhlIHdvcmxkLgogICAgSW4gdHJ1dGgsIGZhaXIgTW9udGFndWUsIEkgYW0gdG9vIGZvbmQsCiAgICBBbmQgdGhlcmVmb3JlIHRob3UgbWF5c3QgdGhpbmsgbXkgJ2hhdmlvciBsaWdodDoKICAgIEJ1dCB0cnVzdCBtZSwgZ2VudGxlbWFuLCBJJ2xsIHByb3ZlIG1vcmUgdHJ1ZQogICAgVGhhbiB0aG9zZSB0aGF0IGhhdmUgbW9yZSBjdW5uaW5nIHRvIGJlIHN0cmFuZ2UuCiAgICBJIHNob3VsZCBoYXZlIGJlZW4gbW9yZSBzdHJhbmdlLCBJIG11c3QgY29uZmVzcywKICAgIEJ1dCB0aGF0IHRob3Ugb3ZlcmhlYXJkJ3N0LCBlcmUgSSB3YXMgd2FyZSwKICAgIE15IHRydWUgbG92ZSdzIHBhc3Npb246IHRoZXJlZm9yZSBwYXJkb24gbWUsCiAgICBBbmQgbm90IGltcHV0ZSB0aGlzIHlpZWxkaW5nIHRvIGxpZ2h0IGxvdmUsCiAgICBXaGljaCB0aGUgZGFyayBuaWdodCBoYXRoIHNvIGRpc2NvdmVyZWQuCgpST01FTwoKICAgIExhZHksIGJ5IHlvbmRlciBibGVzc2VkIG1vb24gSSBzd2VhcgogICAgVGhhdCB0aXBzIHdpdGggc2lsdmVyIGFsbCB0aGVzZSBmcnVpdC10cmVlIHRvcHMtLQoKSlVMSUVUCgogICAgTywgc3dlYXIgbm90IGJ5IHRoZSBtb29uLCB0aGUgaW5jb25zdGFudCBtb29uLAogICAgVGhhdCBtb250aGx5IGNoYW5nZXMgaW4gaGVyIGNpcmNsZWQgb3JiLAogICAgTGVzdCB0aGF0IHRoeSBsb3ZlIHByb3ZlIGxpa2V3aXNlIHZhcmlhYmxlLgoKUk9NRU8KCiAgICBXaGF0IHNoYWxsIEkgc3dlYXIgYnkCgpKVUxJRVQKCiAgICBEbyBub3Qgc3dlYXIgYXQgYWxsOwogICAgT3IsIGlmIHRob3Ugd2lsdCwgc3dlYXIgYnkgdGh5IGdyYWNpb3VzIHNlbGYsCiAgICBXaGljaCBpcyB0aGUgZ29kIG9mIG15IGlkb2xhdHJ5LAogICAgQW5kIEknbGwgYmVsaWV2ZSB0aGVlLgoKUk9NRU8KCiAgICBJZiBteSBoZWFydCdzIGRlYXIgbG92ZS0tCgpKVUxJRVQKCiAgICBXZWxsLCBkbyBub3Qgc3dlYXI6IGFsdGhvdWdoIEkgam95IGluIHRoZWUsCiAgICBJIGhhdmUgbm8gam95IG9mIHRoaXMgY29udHJhY3QgdG8tbmlnaHQ6CiAgICBJdCBpcyB0b28gcmFzaCwgdG9vIHVuYWR2aXNlZCwgdG9vIHN1ZGRlbjsKICAgIFRvbyBsaWtlIHRoZSBsaWdodG5pbmcsIHdoaWNoIGRvdGggY2Vhc2UgdG8gYmUKICAgIEVyZSBvbmUgY2FuIHNheSAnSXQgbGlnaHRlbnMuJyBTd2VldCwgZ29vZCBuaWdodCEKICAgIFRoaXMgYnVkIG9mIGxvdmUsIGJ5IHN1bW1lcidzIHJpcGVuaW5nIGJyZWF0aCwKICAgIE1heSBwcm92ZSBhIGJlYXV0ZW91cyBmbG93ZXIgd2hlbiBuZXh0IHdlIG1lZXQuCiAgICBHb29kIG5pZ2h0LCBnb29kIG5pZ2h0ISBhcyBzd2VldCByZXBvc2UgYW5kIHJlc3QKICAgIENvbWUgdG8gdGh5IGhlYXJ0IGFzIHRoYXQgd2l0aGluIG15IGJyZWFzdCEKClJPTUVPCgogICAgTywgd2lsdCB0aG91IGxlYXZlIG1lIHNvIHVuc2F0aXNmaWVkPwoKSlVMSUVUCgogICAgV2hhdCBzYXRpc2ZhY3Rpb24gY2Fuc3QgdGhvdSBoYXZlIHRvLW5pZ2h0PwoKUk9NRU8KCiAgICBUaGUgZXhjaGFuZ2Ugb2YgdGh5IGxvdmUncyBmYWl0aGZ1bCB2b3cgZm9yIG1pbmUuCgpKVUxJRVQKCiAgICBJIGdhdmUgdGhlZSBtaW5lIGJlZm9yZSB0aG91IGRpZHN0IHJlcXVlc3QgaXQ6CiAgICBBbmQgeWV0IEkgd291bGQgaXQgd2VyZSB0byBnaXZlIGFnYWluLgoKUk9NRU8KCiAgICBXb3VsZHN0IHRob3Ugd2l0aGRyYXcgaXQIGZvciB3aGF0IHB1cnBvc2UsIGxvdmUCgpKVUxJRVQKCiAgICBCdXQgdG8gYmUgZnJhbmssIGFuZCBnaXZlIGl0IHRoZWUgYWdhaW4uCiAgICBBbmQgeWV0IEkgd2lzaCBidXQgZm9yIHRoZSB0aGluZyBJIGhhdmU6CiAgICBNeSBib3VudHkgaXMgYXMgYm91bmRsZXNzIGFzIHRoZSBzZWEsCiAgICBNeSBsb3ZlIGFzIGRlZXA7IHRoZSBtb3JlIEkgZ2l2ZSB0byB0aGVlLAogICAgVGhlIG1vcmUgSSBoYXZlLCBmb3IgYm90aCBhcmUgaW5maW5pdGUuCgogICAgTnVyc2UgY2FsbHMgd2l0aGluCiAgICBJIGhlYXIgc29tZSBub2lzZSB3aXRoaW47IGRlYXIgbG92ZSwgYWRpZXUhCiAgICBBbm9uLCBnb29kIG51cnNlISBTd2VldCBNb250YWd1ZSwgYmUgdHJ1ZS4KICAgIFN0YXkgYnV0IGEgbGl0dGxlLCBJIHdpbGwgY29tZSBhZ2Fpbi4KCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBPIGJsZXNzZWQsIGJsZXNzZWQgbmlnaHQhIEkgYW0gYWZlYXJkLgogICAgQmVpbmcgaW4gbmlnaHQsIGFsbCB0aGlzIGlzIGJ1dCBhIGRyZWFtLAogICAgVG9vIGZsYXR0ZXJpbmctc3dlZXQgdG8gYmUgc3Vic3RhbnRpYWwuCgogICAgUmUtZW50ZXIgSlVMSUVULCBhYm92ZQoKSlVMSUVUCgogICAgVGhyZWUgd29yZHMsIGRlYXIgUm9tZW8sIGFuZCBnb29kIG5pZ2h0IGluZGVlZC4KICAgIElmIHRoYXQgdGh5IGJlbnQgb2YgbG92ZSBiZSBob25vdXJhYmxlLAogICAgVGh5IHB1cnBvc2UgbWFycmlhZ2UsIHNlbmQgbWUgd29yZCB0by1tb3Jyb3csCiAgICBCeSBvbmUgdGhhdCBJJ2xsIHByb2N1cmUgdG8gY29tZSB0byB0aGVlLAogICAgV2hlcmUgYW5kIHdoYXQgdGltZSB0aG91IHdpbHQgcGVyZm9ybSB0aGUgcml0ZTsKICAgIEFuZCBhbGwgbXkgZm9ydHVuZXMgYXQgdGh5IGZvb3QgSSdsbCBsYXkKICAgIEFuZCBmb2xsb3cgdGhlZSBteSBsb3JkIHRocm91Z2hvdXQgdGhlIHdvcmxkLgoKTnVyc2UKCiAgICBbV2l0aGluXSBNYWRhbSEKCkpVTElFVAoKICAgIEkgY29tZSwgYW5vbi4tLUJ1dCBpZiB0aG91IG1lYW4nc3Qgbm90IHdlbGwsCiAgICBJIGRvIGJlc2VlY2ggdGhlZS0tCgpOdXJzZQoKICAgIFtXaXRoaW5dIE1hZGFtIQoKSlVMSUVUCgogICAgQnkgYW5kIGJ5LCBJIGNvbWU6LS0KICAgIFRvIGNlYXNlIHRoeSBzdWl0LCBhbmQgbGVhdmUgbWUgdG8gbXkgZ3JpZWY6CiAgICBUby1tb3Jyb3cgd2lsbCBJIHNlbmQuCgpST01FTwoKICAgIFNvIHRocml2ZSBteSBzb3VsLS0KCkpVTElFVAoKICAgIEEgdGhvdXNhbmQgdGltZXMgZ29vZCBuaWdodCEKCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBBIHRob3VzYW5kIHRpbWVzIHRoZSB3b3JzZSwgdG8gd2FudCB0aHkgbGlnaHQuCiAgICBMb3ZlIGdvZXMgdG93YXJkIGxvdmUsIGFzIHNjaG9vbGJveXMgZnJvbQogICAgdGhlaXIgYm9va3MsCiAgICBCdXQgbG92ZSBmcm9tIGxvdmUsIHRvd2FyZCBzY2hvb2wgd2l0aCBoZWF2eSBsb29rcy4KCiAgICBSZXRpcmluZwoKICAgIFJlLWVudGVyIEpVTElFVCwgYWJvdmUKCkpVTElFVAoKICAgIEhpc3QhIFJvbWVvLCBoaXN0ISBPLCBmb3IgYSBmYWxjb25lcidzIHZvaWNlLAogICAgVG8gbHVyZSB0aGlzIHRhc3NlbC1nZW50bGUgYmFjayBhZ2FpbiEKICAgIEJvbmRhZ2UgaXMgaG9hcnNlLCBhbmQgbWF5IG5vdCBzcGVhayBhbG91ZDsKICAgIEVsc2Ugd291bGQgSSB0ZWFyIHRoZSBjYXZlIHdoZXJlIEVjaG8gbGllcywKICAgIEFuZCBtYWtlIGhlciBhaXJ5IHRvbmd1ZSBtb3JlIGhvYXJzZSB0aGFuIG1pbmUsCiAgICBXaXRoIHJlcGV0aXRpb24gb2YgbXkgUm9tZW8ncyBuYW1lLgoKUk9NRU8KCiAgICBJdCBpcyBteSBzb3VsIHRoYXQgY2FsbHMgdXBvbiBteSBuYW1lOgogICAgSG93IHNpbHZlci1zd2VldCBzb3VuZCBsb3ZlcnMnIHRvbmd1ZXMgYnkgbmlnaHQsCiAgICBMaWtlIHNvZnRlc3QgbXVzaWMgdG8gYXR0ZW5kaW5nIGVhcnMhCgpKVUxJRVQKCiAgICBSb21lbyEKClJPTUVPCgogICAgTXkgZGVhcj8KCkpVTElFVAoKICAgIEF0IHdoYXQgbydjbG9jayB0by1tb3Jyb3cKICAgIFNoYWxsIEkgc2VuZCB0byB0aGVlPwoKUk9NRU8KCiAgICBBdCB0aGUgaG91ciBvZiBuaW5lLgoKSlVMSUVUCgogICAgSSB3aWxsIG5vdCBmYWlsOiAndGlzIHR3ZW50eSB5ZWFycyB0aWxsIHRoZW4uCiAgICBJIGhhdmUgZm9yZ290IHdoeSBJIGRpZCBjYWxsIHRoZWUgYmFjay4KClJPTUVPCgogICAgTGV0IG1lIHN0YW5kIGhlcmUgdGlsbCB0aG91IHJlbWVtYmVyIGl0LgoKSlVMSUVUCgogICAgSSBzaGFsbCBmb3JnZXQsIHRvIGhhdmUgdGhlZSBzdGlsbCBzdGFuZCB0aGVyZSwKICAgIFJlbWVtYmVyaW5nIGhvdyBJIGxvdmUgdGh5IGNvbXBhbnkuCgpST01FTwoKICAgIEFuZCBJJ2xsIHN0aWxsIHN0YXksIHRvIGhhdmUgdGhlZSBzdGlsbCBmb3JnZXQsCiAgICBGb3JnZXR0aW5nIGFueSBvdGhlciBob21lIGJ1dCB0aGlzLgoKSlVMSUVUCgogICAgJ1RpcyBhbG1vc3QgbW9ybmluZzsgSSB3b3VsZCBoYXZlIHRoZWUgZ29uZToKICAgIEFuZCB5ZXQgbm8gZnVydGhlciB0aGFuIGEgd2FudG9uJ3MgYmlyZDsKICAgIFdobyBsZXRzIGl0IGhvcCBhIGxpdHRsZSBmcm9tIGhlciBoYW5kLAogICAgTGlrZSBhIHBvb3IgcHJpc29uZXIgaW4gaGlzIHR3aXN0ZWQgZ3l2ZXMsCiAgICBBbmQgd2l0aCBhIHNpbGsgdGhyZWFkIHBsdWNrcyBpdCBiYWNrIGFnYWluLAogICAgU28gbG92aW5nLWplYWxvdXMgb2YgaGlzIGxpYmVydHkuCgpST01FTwoKICAgIEkgd291bGQgSSB3ZXJlIHRoeSBiaXJkLgoKSlVMSUVUCgogICAgU3dlZXQsIHNvIHdvdWxkIEk6CiAgICBZZXQgSSBzaG91bGQga2lsbCB0aGVlIHdpdGggbXVjaCBjaGVyaXNoaW5nLgogICAgR29vZCBuaWdodCwgZ29vZCBuaWdodCEgcGFydGluZyBpcyBzdWNoCiAgICBzd2VldCBzb3Jyb3csCiAgICBUaGF0IEkgc2hhbGwgc2F5IGdvb2QgbmlnaHQgdGlsbCBpdCBiZSBtb3Jyb3cuCgogICAgRXhpdCBhYm92ZQoKUk9NRU8KCiAgICBTbGVlcCBkd2VsbCB1cG9uIHRoaW5lIGV5ZXMsIHBlYWNlIGluIHRoeSBicmVhc3QhCiAgICBXb3VsZCBJIHdlcmUgc2xlZXAgYW5kIHBlYWNlLCBzbyBzd2VldCB0byByZXN0IQogICAgSGVuY2Ugd2lsbCBJIHRvIG15IGdob3N0bHkgZmF0aGVyJ3MgY2VsbCwKICAgIEhpcyBoZWxwIHRvIGNyYXZlLCBhbmQgbXkgZGVhciBoYXAgdG8gdGVsbC4KCiAgICBFeGl0CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSwgd2l0aCBhIGJhc2tldCAKCkZSSUFSIExBVVJFTkNFCgogICAgVGhlIGdyZXktZXllZCBtb3JuIHNtaWxlcyBvbiB0aGUgZnJvd25pbmcgbmlnaHQsCiAgICBDaGVxdWVyaW5nIHRoZSBlYXN0ZXJuIGNsb3VkcyB3aXRoIHN0cmVha3Mgb2YgbGlnaHQsCiAgICBBbmQgZmxlY2tlZCBkYXJrbmVzcyBsaWtlIGEgZHJ1bmthcmQgcmVlbHMKICAgIEZyb20gZm9ydGggZGF5J3MgcGF0aCBhbmQgVGl0YW4ncyBmaWVyeSB3aGVlbHM6CiAgICBOb3csIGVyZSB0aGUgc3VuIGFkdmFuY2UgaGlzIGJ1cm5pbmcgZXllLAogICAgVGhlIGRheSB0byBjaGVlciBhbmQgbmlnaHQncyBkYW5rIGRldyB0byBkcnksCiAgICBJIG11c3QgdXAtZmlsbCB0aGlzIG9zaWVyIGNhZ2Ugb2Ygb3VycwogICAgV2l0aCBiYWxlZnVsIHdlZWRzIGFuZCBwcmVjaW91cy1qdWljZWQgZmxvd2Vycy4KICAgIFRoZSBlYXJ0aCB0aGF0J3MgbmF0dXJlJ3MgbW90aGVyIGlzIGhlciB0b21iOwogICAgV2hhdCBpcyBoZXIgYnVyeWluZyBncmF2ZSB0aGF0IGlzIGhlciB3b21iLAogICAgQW5kIGZyb20gaGVyIHdvbWIgY2hpbGRyZW4gb2YgZGl2ZXJzIGtpbmQKICAgIFdlIHN1Y2tpbmcgb24gaGVyIG5hdHVyYWwgYm9zb20gZmluZCwKICAgIE1hbnkgZm9yIG1hbnkgdmlydHVlcyBleGNlbGxlbnQsCiAgICBOb25lIGJ1dCBmb3Igc29tZSBhbmQgeWV0IGFsbCBkaWZmZXJlbnQuCiAgICBPLCBtaWNrbGUgaXMgdGhlIHBvd2VyZnVsIGdyYWNlIHRoYXQgbGllcwogICAgSW4gaGVyYnMsIHBsYW50cywgc3RvbmVzLCBhbmQgdGhlaXIgdHJ1ZSBxdWFsaXRpZXM6CiAgICBGb3Igbm91Z2h0IHNvIHZpbGUgdGhhdCBvbiB0aGUgZWFydGggZG90aCBsaXZlCiAgICBCdXQgdG8gdGhlIGVhcnRoIHNvbWUgc3BlY2lhbCBnb29kIGRvdGggZ2l2ZSwKICAgIE5vciBhdWdodCBzbyBnb29kIGJ1dCBzdHJhaW4nZCBmcm9tIHRoYXQgZmFpciB1c2UKICAgIFJldm9sdHMgZnJvbSB0cnVlIGJpcnRoLCBzdHVtYmxpbmcgb24gYWJ1c2U6CiAgICBWaXJ0dWUgaXRzZWxmIHR1cm5zIHZpY2UsIGJlaW5nIG1pc2FwcGxpZWQ7CiAgICBBbmQgdmljZSBzb21ldGltZXMgYnkgYWN0aW9uIGRpZ25pZmllZC4KICAgIFdpdGhpbiB0aGUgaW5mYW50IHJpbmQgb2YgdGhpcyBzbWFsbCBmbG93ZXIKICAgIFBvaXNvbiBoYXRoIHJlc2lkZW5jZSBhbmQgbWVkaWNpbmUgcG93ZXI6CiAgICBGb3IgdGhpcywgYmVpbmcgc21lbHQsIHdpdGggdGhhdCBwYXJ0IGNoZWVycyBlYWNoIHBhcnQ7CiAgICBCZWluZyB0YXN0ZWQsIHNsYXlzIGFsbCBzZW5zZXMgd2l0aCB0aGUgaGVhcnQuCiAgICBUd28gc3VjaCBvcHBvc2VkIGtpbmdzIGVuY2FtcCB0aGVtIHN0aWxsCiAgICBJbiBtYW4gYXMgd2VsbCBhcyBoZXJicywgZ3JhY2UgYW5kIHJ1ZGUgd2lsbDsKICAgIEFuZCB3aGVyZSB0aGUgd29yc2VyIGlzIHByZWRvbWluYW50LAogICAgRnVsbCBzb29uIHRoZSBjYW5rZXIgZGVhdGggZWF0cyB1cCB0aGF0IHBsYW50LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEdvb2QgbW9ycm93LCBmYXRoZXIuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlbmVkaWNpdGUhCiAgICBXaGF0IGVhcmx5IHRvbmd1ZSBzbyBzd2VldCBzYWx1dGV0aCBtZT8KICAgIFlvdW5nIHNvbiwgaXQgYXJndWVzIGEgZGlzdGVtcGVyJ2QgaGVhZAogICAgU28gc29vbiB0byBiaWQgZ29vZCBtb3Jyb3cgdG8gdGh5IGJlZDoKICAgIENhcmUga2VlcHMgaGlzIHdhdGNoIGluIGV2ZXJ5IG9sZCBtYW4ncyBleWUsCiAgICBBbmQgd2hlcmUgY2FyZSBsb2RnZXMsIHNsZWVwIHdpbGwgbmV2ZXIgbGllOwogICAgQnV0IHdoZXJlIHVuYnJ1aXNlZCB5b3V0aCB3aXRoIHVuc3R1ZmYnZCBicmFpbgogICAgRG90aCBjb3VjaCBoaXMgbGltYnMsIHRoZXJlIGdvbGRlbiBzbGVlcCBkb3RoIHJlaWduOgogICAgVGhlcmVmb3JlIHRoeSBlYXJsaW5lc3MgZG90aCBtZSBhc3N1cmUKICAgIFRob3UgYXJ0IHVwLXJvdXNlZCBieSBzb21lIGRpc3RlbXBlcmF0dXJlOwogICAgT3IgaWYgbm90IHNvLCB0aGVuIGhlcmUgSSBoaXQgaXQgcmlnaHQsCiAgICBPdXIgUm9tZW8gaGF0aCBub3QgYmVlbiBpbiBiZWQgdG8tbmlnaHQuCgpST01FTwoKICAgIFRoYXQgbGFzdCBpcyB0cnVlOyB0aGUgc3dlZXRlciByZXN0IHdhcyBtaW5lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHb2QgcGFyZG9uIHNpbiEgd2FzdCB0aG91IHdpdGggUm9zYWxpbmUCgpST01FTwoKICAgIFdpdGggUm9zYWxpbmUsIG15IGdob3N0bHkgZmF0aGVyPyBubzsKICAgIEkgaGF2ZSBmb3Jnb3QgdGhhdCBuYW1lLCBhbmQgdGhhdCBuYW1lJ3Mgd29lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGF0J3MgbXkgZ29vZCBzb246IGJ1dCB3aGVyZSBoYXN0IHRob3UgYmVlbiwgdGhlbj8KClJPTUVPCgogICAgSSdsbCB0ZWxsIHRoZWUsIGVyZSB0aG91IGFzayBpdCBtZSBhZ2Fpbi4KICAgIEkgaGF2ZSBiZWVuIGZlYXN0aW5nIHdpdGggbWluZSBlbmVteSwKICAgIFdoZXJlIG9uIGEgc3VkZGVuIG9uZSBoYXRoIHdvdW5kZWQgbWUsCiAgICBUaGF0J3MgYnkgbWUgd291bmRlZDogYm90aCBvdXIgcmVtZWRpZXMKICAgIFdpdGhpbiB0aHkgaGVscCBhbmQgaG9seSBwaHlzaWMgbGllczoKICAgIEkgYmVhciBubyBoYXRyZWQsIGJsZXNzZWQgbWFuLCBmb3IsIGxvLAogICAgTXkgaW50ZXJjZXNzaW9uIGxpa2V3aXNlIHN0ZWFkcyBteSBmb2UuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlIHBsYWluLCBnb29kIHNvbiwgYW5kIGhvbWVseSBpbiB0aHkgZHJpZnQ7CiAgICBSaWRkbGluZyBjb25mZXNzaW9uIGZpbmRzIGJ1dCByaWRkbGluZyBzaHJpZnQuCgpST01FTwoKICAgIFRoZW4gcGxhaW5seSBrbm93IG15IGhlYXJ0J3MgZGVhciBsb3ZlIGlzIHNldAogICAgT24gdGhlIGZhaXIgZGF1Z2h0ZXIgb2YgcmljaCBDYXB1bGV0OgogICAgQXMgbWluZSBvbiBoZXJzLCBzbyBoZXJzIGlzIHNldCBvbiBtaW5lOwogICAgQW5kIGFsbCBjb21iaW5lZCwgc2F2ZSB3aGF0IHRob3UgbXVzdCBjb21iaW5lCiAgICBCeSBob2x5IG1hcnJpYWdlOiB3aGVuIGFuZCB3aGVyZSBhbmQgaG93CiAgICBXZSBtZXQsIHdlIHdvbydkIGFuZCBtYWRlIGV4Y2hhbmdlIG9mIHZvdywKICAgIEknbGwgdGVsbCB0aGVlIGFzIHdlIHBhc3M7IGJ1dCB0aGlzIEkgcHJheSwKICAgIFRoYXQgdGhvdSBjb25zZW50IHRvIG1hcnJ5IHVzIHRvLWRheS4KCkZSSUFSIExBVVJFTkNFCgogICAgSG9seSBTYWludCBGcmFuY2lzLCB3aGF0IGEgY2hhbmdlIGlzIGhlcmUhCiAgICBJcyBSb3NhbGluZSwgd2hvbSB0aG91IGRpZHN0IGxvdmUgc28gZGVhciwKICAgIFNvIHNvb24gZm9yc2FrZW4IHlvdW5nIG1lbidzIGxvdmUgdGhlbiBsaWVzCiAgICBOb3QgdHJ1bHkgaW4gdGhlaXIgaGVhcnRzLCBidXQgaW4gdGhlaXIgZXllcy4KICAgIEplc3UgTWFyaWEsIHdoYXQgYSBkZWFsIG9mIGJyaW5lCiAgICBIYXRoIHdhc2gnZCB0aHkgc2FsbG93IGNoZWVrcyBmb3IgUm9zYWxpbmUhCiAgICBIb3cgbXVjaCBzYWx0IHdhdGVyIHRocm93biBhd2F5IGluIHdhc3RlLAogICAgVG8gc2Vhc29uIGxvdmUsIHRoYXQgb2YgaXQgZG90aCBub3QgdGFzdGUhCiAgICBUaGUgc3VuIG5vdCB5ZXQgdGh5IHNpZ2hzIGZyb20gaGVhdmVuIGNsZWFycywKICAgIFRoeSBvbGQgZ3JvYW5zIHJpbmcgeWV0IGluIG15IGFuY2llbnQgZWFyczsKICAgIExvLCBoZXJlIHVwb24gdGh5IGNoZWVrIHRoZSBzdGFpbiBkb3RoIHNpdAogICAgT2YgYW4gb2xkIHRlYXIgdGhhdCBpcyBub3Qgd2FzaCdkIG9mZiB5ZXQ6CiAgICBJZiBlJ2VyIHRob3Ugd2FzdCB0aHlzZWxmIGFuZCB0aGVzZSB3b2VzIHRoaW5lLAogICAgVGhvdSBhbmQgdGhlc2Ugd29lcyB3ZXJlIGFsbCBmb3IgUm9zYWxpbmU6CiAgICBBbmQgYXJ0IHRob3UgY2hhbmdlZD8gcHJvbm91bmNlIHRoaXMgc2VudGVuY2UgdGhlbiwKICAgIFdvbWVuIG1heSBmYWxsLCB3aGVuIHRoZXJlJ3Mgbm8gc3RyZW5ndGggaW4gbWVuLgoKUk9NRU8KCiAgICBUaG91IGNoaWQnc3QgbWUgb2Z0IGZvciBsb3ZpbmcgUm9zYWxpbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIEZvciBkb3RpbmcsIG5vdCBmb3IgbG92aW5nLCBwdXBpbCBtaW5lLgoKUk9NRU8KCiAgICBBbmQgYmFkJ3N0IG1lIGJ1cnkgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTm90IGluIGEgZ3JhdmUsCiAgICBUbyBsYXkgb25lIGluLCBhbm90aGVyIG91dCB0byBoYXZlLgoKUk9NRU8KCiAgICBJIHByYXkgdGhlZSwgY2hpZGUgbm90OyBzaGUgd2hvbSBJIGxvdmUgbm93CiAgICBEb3RoIGdyYWNlIGZvciBncmFjZSBhbmQgbG92ZSBmb3IgbG92ZSBhbGxvdzsKICAgIFRoZSBvdGhlciBkaWQgbm90IHNvLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBPLCBzaGUga25ldyB3ZWxsCiAgICBUaHkgbG92ZSBkaWQgcmVhZCBieSByb3RlIGFuZCBjb3VsZCBub3Qgc3BlbGwuCiAgICBCdXQgY29tZSwgeW91bmcgd2F2ZXJlciwgY29tZSwgZ28gd2l0aCBtZSwKICAgIEluIG9uZSByZXNwZWN0IEknbGwgdGh5IGFzc2lzdGFudCBiZTsKICAgIEZvciB0aGlzIGFsbGlhbmNlIG1heSBzbyBoYXBweSBwcm92ZSwKICAgIFRvIHR1cm4geW91ciBob3VzZWhvbGRzJyByYW5jb3VyIHRvIHB1cmUgbG92ZS4KClJPTUVPCgogICAgTywgbGV0IHVzIGhlbmNlOyBJIHN0YW5kIG9uIHN1ZGRlbiBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2lzZWx5IGFuZCBzbG93OyB0aGV5IHN0dW1ibGUgdGhhdCBydW4gZmFzdC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBCRU5WT0xJTyBhbmQgTUVSQ1VUSU8gCgpNRVJDVVRJTwoKICAgIFdoZXJlIHRoZSBkZXZpbCBzaG91bGQgdGhpcyBSb21lbyBiZT8KICAgIENhbWUgaGUgbm90IGhvbWUgdG8tbmlnaHQCgpCRU5WT0xJTwoKICAgIE5vdCB0byBoaXMgZmF0aGVyJ3M7IEkgc3Bva2Ugd2l0aCBoaXMgbWFuLgoKTUVSQ1VUSU8KCiAgICBBaCwgdGhhdCBzYW1lIHBhbGUgaGFyZC1oZWFydGVkIHdlbmNoLCB0aGF0IFJvc2FsaW5lLgogICAgVG9ybWVudHMgaGltIHNvLCB0aGF0IGhlIHdpbGwgc3VyZSBydW4gbWFkLgoKQkVOVk9MSU8KCiAgICBUeWJhbHQsIHRoZSBraW5zbWFuIG9mIG9sZCBDYXB1bGV0LAogICAgSGF0aCBzZW50IGEgbGV0dGVyIHRvIGhpcyBmYXRoZXIncyBob3VzZS4KCk1FUkNVVElPCgogICAgQSBjaGFsbGVuZ2UsIG9uIG15IGxpZmUuCgpCRU5WT0xJTwoKICAgIFJvbWVvIHdpbGwgYW5zd2VyIGl0LgoKTUVSQ1VUSU8KCiAgICBBbnkgbWFuIHRoYXQgY2FuIHdyaXRlIG1heSBhbnN3ZXIgYSBsZXR0ZXIuCgpCRU5WT0xJTwoKICAgIE5heSwgaGUgd2lsbCBhbnN3ZXIgdGhlIGxldHRlcidzIG1hc3RlciwgaG93IGhlCiAgICBkYXJlcywgYmVpbmcgZGFyZWQuCgpNRVJDVVRJTwoKICAgIEFsYXMgcG9vciBSb21lbyEgaGUgaXMgYWxyZWFkeSBkZWFkOyBzdGFiYmVkIHdpdGggYQogICAgd2hpdGUgd2VuY2gncyBibGFjayBleWU7IHNob3QgdGhyb3VnaCB0aGUgZWFyIHdpdGggYQogICAgbG92ZS1zb25nOyB0aGUgdmVyeSBwaW4gb2YgaGlzIGhlYXJ0IGNsZWZ0IHdpdGggdGhlCiAgICBibGluZCBib3ctYm95J3MgYnV0dC1zaGFmdDogYW5kIGlzIGhlIGEgbWFuIHRvCiAgICBlbmNvdW50ZXIgVHliYWx0PwoKQkVOVk9MSU8KCiAgICBXaHksIHdoYXQgaXMgVHliYWx0PwoKTUVSQ1VUSU8KCiAgICBNb3JlIHRoYW4gcHJpbmNlIG9mIGNhdHMsIEkgY2FuIHRlbGwgeW91LiBPLCBoZSBpcwogICAgdGhlIGNvdXJhZ2VvdXMgY2FwdGFpbiBvZiBjb21wbGltZW50cy4gSGUgZmlnaHRzIGFzCiAgICB5b3Ugc2luZyBwcmljay1zb25nLCBrZWVwcyB0aW1lLCBkaXN0YW5jZSwgYW5kCiAgICBwcm9wb3J0aW9uOyByZXN0cyBtZSBoaXMgbWluaW0gcmVzdCwgb25lLCB0d28sIGFuZAogICAgdGhlIHRoaXJkIGluIHlvdXIgYm9zb206IHRoZSB2ZXJ5IGJ1dGNoZXIgb2YgYSBzaWxrCiAgICBidXR0b24sIGEgZHVlbGxpc3QsIGEgZHVlbGxpc3Q7IGEgZ2VudGxlbWFuIG9mIHRoZQogICAgdmVyeSBmaXJzdCBob3VzZSwgb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2F1c2U6CiAgICBhaCwgdGhlIGltbW9ydGFsIHBhc3NhZG8hIHRoZSBwdW50byByZXZlcnNvISB0aGUKICAgIGhhaSEKCkJFTlZPTElPCgogICAgVGhlIHdoYXQCgpNRVJDVVRJTwoKICAgIFRoZSBwb3ggb2Ygc3VjaCBhbnRpYywgbGlzcGluZywgYWZmZWN0aW5nCiAgICBmYW50YXN0aWNvZXM7IHRoZXNlIG5ldyB0dW5lcnMgb2YgYWNjZW50cyEgJ0J5IEplc3UsCiAgICBhIHZlcnkgZ29vZCBibGFkZSEgYSB2ZXJ5IHRhbGwgbWFuISBhIHZlcnkgZ29vZAogICAgd2hvcmUhJyBXaHksIGlzIG5vdCB0aGlzIGEgbGFtZW50YWJsZSB0aGluZywKICAgIGdyYW5kc2lyZSwgdGhhdCB3ZSBzaG91bGQgYmUgdGh1cyBhZmZsaWN0ZWQgd2l0aAogICAgdGhlc2Ugc3RyYW5nZSBmbGllcywgdGhlc2UgZmFzaGlvbi1tb25nZXJzLCB0aGVzZQogICAgcGVyZG9uYS1taSdzLCB3aG8gc3RhbmQgc28gbXVjaCBvbiB0aGUgbmV3IGZvcm0sCiAgICB0aGF0IHRoZXkgY2Fubm90IGF0IGVhc2Ugb24gdGhlIG9sZCBiZW5jaD8gTywgdGhlaXIKICAgIGJvbmVzLCB0aGVpciBib25lcyEKCiAgICBFbnRlciBST01FTwoKQkVOVk9MSU8KCiAgICBIZXJlIGNvbWVzIFJvbWVvLCBoZXJlIGNvbWVzIFJvbWVvLgoKTUVSQ1VUSU8KCiAgICBXaXRob3V0IGhpcyByb2UsIGxpa2UgYSBkcmllZCBoZXJyaW5nOiBmbGVzaCwgZmxlc2gsCiAgICBob3cgYXJ0IHRob3UgZmlzaGlmaWVkISBOb3cgaXMgaGUgZm9yIHRoZSBudW1iZXJzCiAgICB0aGF0IFBldHJhcmNoIGZsb3dlZCBpbjogTGF1cmEgdG8gaGlzIGxhZHkgd2FzIGJ1dCBhCiAgICBraXRjaGVuLXdlbmNoOyBtYXJyeSwgc2hlIGhhZCBhIGJldHRlciBsb3ZlIHRvCiAgICBiZS1yaHltZSBoZXI7IERpZG8gYSBkb3dkeTsgQ2xlb3BhdHJhIGEgZ2lwc3k7CiAgICBIZWxlbiBhbmQgSGVybyBoaWxkaW5ncyBhbmQgaGFybG90czsgVGhpc2JlIGEgZ3JleQogICAgZXllIG9yIHNvLCBidXQgbm90IHRvIHRoZSBwdXJwb3NlLiBTaWduaW9yCiAgICBSb21lbywgYm9uIGpvdXIhIHRoZXJlJ3MgYSBGcmVuY2ggc2FsdXRhdGlvbgogICAgdG8geW91ciBGcmVuY2ggc2xvcC4gWW91IGdhdmUgdXMgdGhlIGNvdW50ZXJmZWl0CiAgICBmYWlybHkgbGFzdCBuaWdodC4KClJPTUVPCgogICAgR29vZCBtb3Jyb3cgdG8geW91IGJvdGguIFdoYXQgY291bnRlcmZlaXQgZGlkIEkgZ2l2ZSB5b3UCgpNRVJDVVRJTwoKICAgIFRoZSBzaGlwLCBzaXIsIHRoZSBzbGlwOyBjYW4geW91IG5vdCBjb25jZWl2ZT8KClJPTUVPCgogICAgUGFyZG9uLCBnb29kIE1lcmN1dGlvLCBteSBidXNpbmVzcyB3YXMgZ3JlYXQ7IGFuZCBpbgogICAgc3VjaCBhIGNhc2UgYXMgbWluZSBhIG1hbiBtYXkgc3RyYWluIGNvdXJ0ZXN5LgoKTUVSQ1VUSU8KCiAgICBUaGF0J3MgYXMgbXVjaCBhcyB0byBzYXksIHN1Y2ggYSBjYXNlIGFzIHlvdXJzCiAgICBjb25zdHJhaW5zIGEgbWFuIHRvIGJvdyBpbiB0aGUgaGFtcy4KClJPTUVPCgogICAgTWVhbmluZywgdG8gY291cnQnc3kuCgpNRVJDVVRJTwoKICAgIFRob3UgaGFzdCBtb3N0IGtpbmRseSBoaXQgaXQuCgpST01FTwoKICAgIEEgbW9zdCBjb3VydGVvdXMgZXhwb3NpdGlvbi4KCk1FUkNVVElPCgogICAgTmF5LCBJIGFtIHRoZSB2ZXJ5IHBpbmsgb2YgY291cnRlc3kuCgpST01FTwoKICAgIFBpbmsgZm9yIGZsb3dlci4KCk1FUkNVVElPCgogICAgUmlnaHQuCgpST01FTwoKICAgIFdoeSwgdGhlbiBpcyBteSBwdW1wIHdlbGwgZmxvd2VyZWQuCgpNRVJDVVRJTwoKICAgIFdlbGwgc2FpZDogZm9sbG93IG1lIHRoaXMgamVzdCBub3cgdGlsbCB0aG91IGhhc3QKICAgIHdvcm4gb3V0IHRoeSBwdW1wLCB0aGF0IHdoZW4gdGhlIHNpbmdsZSBzb2xlIG9mIGl0CiAgICBpcyB3b3JuLCB0aGUgamVzdCBtYXkgcmVtYWluIGFmdGVyIHRoZSB3ZWFyaW5nIHNvbGUgc2luZ3VsYXIuCgpST01FTwoKICAgIE8gc2luZ2xlLXNvbGVkIGplc3QsIHNvbGVseSBzaW5ndWxhciBmb3IgdGhlCiAgICBzaW5nbGVuZXNzLgoKTUVSQ1VUSU8KCiAgICBDb21lIGJldHdlZW4gdXMsIGdvb2QgQmVudm9saW87IG15IHdpdHMgZmFpbnQuCgpST01FTwoKICAgIFN3aXRjaCBhbmQgc3B1cnMsIHN3aXRjaCBhbmQgc3B1cnM7IG9yIEknbGwgY3J5IGEgbWF0Y2guCgpNRVJDVVRJTwoKICAgIE5heSwgaWYgdGh5IHdpdHMgcnVuIHRoZSB3aWxkLWdvb3NlIGNoYXNlLCBJIGhhdmUKICAgIGRvbmUsIGZvciB0aG91IGhhc3QgbW9yZSBvZiB0aGUgd2lsZC1nb29zZSBpbiBvbmUgb2YKICAgIHRoeSB3aXRzIHRoYW4sIEkgYW0gc3VyZSwgSSBoYXZlIGluIG15IHdob2xlIGZpdmU6CiAgICB3YXMgSSB3aXRoIHlvdSB0aGVyZSBmb3IgdGhlIGdvb3NlPwoKUk9NRU8KCiAgICBUaG91IHdhc3QgbmV2ZXIgd2l0aCBtZSBmb3IgYW55IHRoaW5nIHdoZW4gdGhvdSB3YXN0CiAgICBub3QgdGhlcmUgZm9yIHRoZSBnb29zZS4KCk1FUkNVVElPCgogICAgSSB3aWxsIGJpdGUgdGhlZSBieSB0aGUgZWFyIGZvciB0aGF0IGplc3QuCgpST01FTwoKICAgIE5heSwgZ29vZCBnb29zZSwgYml0ZSBub3QuCgpNRVJDVVRJTwoKICAgIFRoeSB3aXQgaXMgYSB2ZXJ5IGJpdHRlciBzd2VldGluZzsgaXQgaXMgYSBtb3N0CiAgICBzaGFycCBzYXVjZS4KClJPTUVPCgogICAgQW5kIGlzIGl0IG5vdCB3ZWxsIHNlcnZlZCBpbiB0byBhIHN3ZWV0IGdvb3NlPwoKTUVSQ1VUSU8KCiAgICBPIGhlcmUncyBhIHdpdCBvZiBjaGV2ZXJpbCwgdGhhdCBzdHJldGNoZXMgZnJvbSBhbgogICAgaW5jaCBuYXJyb3cgdG8gYW4gZWxsIGJyb2FkIQoKUk9NRU8KCiAgICBJIHN0cmV0Y2ggaXQgb3V0IGZvciB0aGF0IHdvcmQgJ2Jyb2FkOycgd2hpY2ggYWRkZWQKICAgIHRvIHRoZSBnb29zZSwgcHJvdmVzIHRoZWUgZmFyIGFuZCB3aWRlIGEgYnJvYWQgZ29vc2UuCgpNRVJDVVRJTwoKICAgIFdoeSwgaXMgbm90IHRoaXMgYmV0dGVyIG5vdyB0aGFuIGdyb2FuaW5nIGZvciBsb3ZlPwogICAgbm93IGFydCB0aG91IHNvY2lhYmxlLCBub3cgYXJ0IHRob3UgUm9tZW87IG5vdyBhcnQKICAgIHRob3Ugd2hhdCB0aG91IGFydCwgYnkgYXJ0IGFzIHdlbGwgYXMgYnkgbmF0dXJlOgogICAgZm9yIHRoaXMgZHJpdmVsbGluZyBsb3ZlIGlzIGxpa2UgYSBncmVhdCBuYXR1cmFsLAogICAgdGhhdCBydW5zIGxvbGxpbmcgdXAgYW5kIGRvd24gdG8gaGlkZSBoaXMgYmF1YmxlIGluIGEgaG9sZS4KCkJFTlZPTElPCgogICAgU3RvcCB0aGVyZSwgc3RvcCB0aGVyZS4KCk1FUkNVVElPCgogICAgVGhvdSBkZXNpcmVzdCBtZSB0byBzdG9wIGluIG15IHRhbGUgYWdhaW5zdCB0aGUgaGFpci4KCkJFTlZPTElPCgogICAgVGhvdSB3b3VsZHN0IGVsc2UgaGF2ZSBtYWRlIHRoeSB0YWxlIGxhcmdlLgoKTUVSQ1VUSU8KCiAgICBPLCB0aG91IGFydCBkZWNlaXZlZDsgSSB3b3VsZCBoYXZlIG1hZGUgaXQgc2hvcnQ6CiAgICBmb3IgSSB3YXMgY29tZSB0byB0aGUgd2hvbGUgZGVwdGggb2YgbXkgdGFsZTsgYW5kCiAgICBtZWFudCwgaW5kZWVkLCB0byBvY2N1cHkgdGhlIGFyZ3VtZW50IG5vIGxvbmdlci4KClJPTUVPCgogICAgSGVyZSdzIGdvb2RseSBnZWFyIQoKICAgIEVudGVyIE51cnNlIGFuZCBQRVRFUgoKTUVSQ1VUSU8KCiAgICBBIHNhaWwsIGEgc2FpbCEKCkJFTlZPTElPCgogICAgVHdvLCB0d287IGEgc2hpcnQgYW5kIGEgc21vY2suCgpOdXJzZQoKICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBNeSBmYW4sIFBldGVyLgoKTUVSQ1VUSU8KCiAgICBHb29kIFBldGVyLCB0byBoaWRlIGhlciBmYWNlOyBmb3IgaGVyIGZhbidzIHRoZQogICAgZmFpcmVyIGZhY2UuCgpOdXJzZQoKICAgIEdvZCB5ZSBnb29kIG1vcnJvdywgZ2VudGxlbWVuLgoKTUVSQ1VUSU8KCiAgICBHb2QgeWUgZ29vZCBkZW4sIGZhaXIgZ2VudGxld29tYW4uCgpOdXJzZQoKICAgIElzIGl0IGdvb2QgZGVuPwoKTUVSQ1VUSU8KCiAgICAnVGlzIG5vIGxlc3MsIEkgdGVsbCB5b3UsIGZvciB0aGUgYmF3ZHkgaGFuZCBvZiB0aGUKICAgIGRpYWwgaXMgbm93IHVwb24gdGhlIHByaWNrIG9mIG5vb24uCgpOdXJzZQoKICAgIE91dCB1cG9uIHlvdSEgd2hhdCBhIG1hbiBhcmUgeW91IQoKUk9NRU8KCiAgICBPbmUsIGdlbnRsZXdvbWFuLCB0aGF0IEdvZCBoYXRoIG1hZGUgZm9yIGhpbXNlbGYgdG8KICAgIG1hci4KCk51cnNlCgogICAgQnkgbXkgdHJvdGgsIGl0IGlzIHdlbGwgc2FpZDsgJ2ZvciBoaW1zZWxmIHRvIG1hciwnCiAgICBxdW90aCBhJz8gR2VudGxlbWVuLCBjYW4gYW55IG9mIHlvdSB0ZWxsIG1lIHdoZXJlIEkKICAgIG1heSBmaW5kIHRoZSB5b3VuZyBSb21lbz8KClJPTUVPCgogICAgSSBjYW4gdGVsbCB5b3U7IGJ1dCB5b3VuZyBSb21lbyB3aWxsIGJlIG9sZGVyIHdoZW4KICAgIHlvdSBoYXZlIGZvdW5kIGhpbSB0aGFuIGhlIHdhcyB3aGVuIHlvdSBzb3VnaHQgaGltOgogICAgSSBhbSB0aGUgeW91bmdlc3Qgb2YgdGhhdCBuYW1lLCBmb3IgZmF1bHQgb2YgYSB3b3JzZS4KCk51cnNlCgogICAgWW91IHNheSB3ZWxsLgoKTUVSQ1VUSU8KCiAgICBZZWEsIGlzIHRoZSB3b3JzdCB3ZWxsPyB2ZXJ5IHdlbGwgdG9vaywgaScgZmFpdGg7CiAgICB3aXNlbHksIHdpc2VseS4KCk51cnNlCgogICAgaWYgeW91IGJlIGhlLCBzaXIsIEkgZGVzaXJlIHNvbWUgY29uZmlkZW5jZSB3aXRoCiAgICB5b3UuCgpCRU5WT0xJTwoKICAgIFNoZSB3aWxsIGluZGl0ZSBoaW0gdG8gc29tZSBzdXBwZXIuCgpNRVJDVVRJTwoKICAgIEEgYmF3ZCwgYSBiYXdkLCBhIGJhd2QhIHNvIGhvIQoKUk9NRU8KCiAgICBXaGF0IGhhc3QgdGhvdSBmb3VuZD8KCk1FUkNVVElPCgogICAgTm8gaGFyZSwgc2lyOyB1bmxlc3MgYSBoYXJlLCBzaXIsIGluIGEgbGVudGVuIHBpZSwKICAgIHRoYXQgaXMgc29tZXRoaW5nIHN0YWxlIGFuZCBob2FyIGVyZSBpdCBiZSBzcGVudC4KCiAgICBTaW5ncwogICAgQW4gb2xkIGhhcmUgaG9hciwKICAgIEFuZCBhbiBvbGQgaGFyZSBob2FyLAogICAgSXMgdmVyeSBnb29kIG1lYXQgaW4gbGVudAogICAgQnV0IGEgaGFyZSB0aGF0IGlzIGhvYXIKICAgIElzIHRvbyBtdWNoIGZvciBhIHNjb3JlLAogICAgV2hlbiBpdCBob2FycyBlcmUgaXQgYmUgc3BlbnQuCiAgICBSb21lbywgd2lsbCB5b3UgY29tZSB0byB5b3VyIGZhdGhlcidzPyB3ZSdsbAogICAgdG8gZGlubmVyLCB0aGl0aGVyLgoKUk9NRU8KCiAgICBJIHdpbGwgZm9sbG93IHlvdS4KCk1FUkNVVElPCgogICAgRmFyZXdlbGwsIGFuY2llbnQgbGFkeTsgZmFyZXdlbGwsCgogICAgU2luZ2luZwogICAgJ2xhZHksIGxhZHksIGxhZHkuJwoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KCk51cnNlCgogICAgTWFycnksIGZhcmV3ZWxsISBJIHByYXkgeW91LCBzaXIsIHdoYXQgc2F1Y3kKICAgIG1lcmNoYW50IHdhcyB0aGlzLCB0aGF0IHdhcyBzbyBmdWxsIG9mIGhpcyByb3BlcnkCgpST01FTwoKICAgIEEgZ2VudGxlbWFuLCBudXJzZSwgdGhhdCBsb3ZlcyB0byBoZWFyIGhpbXNlbGYgdGFsaywKICAgIGFuZCB3aWxsIHNwZWFrIG1vcmUgaW4gYSBtaW51dGUgdGhhbiBoZSB3aWxsIHN0YW5kCiAgICB0byBpbiBhIG1vbnRoLgoKTnVyc2UKCiAgICBBbiBhJyBzcGVhayBhbnkgdGhpbmcgYWdhaW5zdCBtZSwgSSdsbCB0YWtlIGhpbQogICAgZG93biwgYW4gYScgd2VyZSBsdXN0aWVyIHRoYW4gaGUgaXMsIGFuZCB0d2VudHkgc3VjaAogICAgSmFja3M7IGFuZCBpZiBJIGNhbm5vdCwgSSdsbCBmaW5kIHRob3NlIHRoYXQgc2hhbGwuCiAgICBTY3Vydnkga25hdmUhIEkgYW0gbm9uZSBvZiBoaXMgZmxpcnQtZ2lsbHM7IEkgYW0KICAgIG5vbmUgb2YgaGlzIHNrYWlucy1tYXRlcy4gQW5kIHRob3UgbXVzdCBzdGFuZCBieQogICAgdG9vLCBhbmQgc3VmZmVyIGV2ZXJ5IGtuYXZlIHRvIHVzZSBtZSBhdCBoaXMgcGxlYXN1cmUCgpQRVRFUgoKICAgIEkgc2F3IG5vIG1hbiB1c2UgeW91IGEgcGxlYXN1cmU7IGlmIEkgaGFkLCBteSB3ZWFwb24KICAgIHNob3VsZCBxdWlja2x5IGhhdmUgYmVlbiBvdXQsIEkgd2FycmFudCB5b3U6IEkgZGFyZQogICAgZHJhdyBhcyBzb29uIGFzIGFub3RoZXIgbWFuLCBpZiBJIHNlZSBvY2Nhc2lvbiBpbiBhCiAgICBnb29kIHF1YXJyZWwsIGFuZCB0aGUgbGF3IG9uIG15IHNpZGUuCgpOdXJzZQoKICAgIE5vdywgYWZvcmUgR29kLCBJIGFtIHNvIHZleGVkLCB0aGF0IGV2ZXJ5IHBhcnQgYWJvdXQKICAgIG1lIHF1aXZlcnMuIFNjdXJ2eSBrbmF2ZSEgUHJheSB5b3UsIHNpciwgYSB3b3JkOgogICAgYW5kIGFzIEkgdG9sZCB5b3UsIG15IHlvdW5nIGxhZHkgYmFkZSBtZSBpbnF1aXJlIHlvdQogICAgb3V0OyB3aGF0IHNoZSBiYWRlIG1lIHNheSwgSSB3aWxsIGtlZXAgdG8gbXlzZWxmOgogICAgYnV0IGZpcnN0IGxldCBtZSB0ZWxsIHllLCBpZiB5ZSBzaG91bGQgbGVhZCBoZXIgaW50bwogICAgYSBmb29sJ3MgcGFyYWRpc2UsIGFzIHRoZXkgc2F5LCBpdCB3ZXJlIGEgdmVyeSBncm9zcwogICAga2luZCBvZiBiZWhhdmlvciwgYXMgdGhleSBzYXk6IGZvciB0aGUgZ2VudGxld29tYW4KICAgIGlzIHlvdW5nOyBhbmQsIHRoZXJlZm9yZSwgaWYgeW91IHNob3VsZCBkZWFsIGRvdWJsZQogICAgd2l0aCBoZXIsIHRydWx5IGl0IHdlcmUgYW4gaWxsIHRoaW5nIHRvIGJlIG9mZmVyZWQKICAgIHRvIGFueSBnZW50bGV3b21hbiwgYW5kIHZlcnkgd2VhayBkZWFsaW5nLgoKUk9NRU8KCiAgICBOdXJzZSwgY29tbWVuZCBtZSB0byB0aHkgbGFkeSBhbmQgbWlzdHJlc3MuIEkKICAgIHByb3Rlc3QgdW50byB0aGVlLS0KCk51cnNlCgogICAgR29vZCBoZWFydCwgYW5kLCBpJyBmYWl0aCwgSSB3aWxsIHRlbGwgaGVyIGFzIG11Y2g6CiAgICBMb3JkLCBMb3JkLCBzaGUgd2lsbCBiZSBhIGpveWZ1bCB3b21hbi4KClJPTUVPCgogICAgV2hhdCB3aWx0IHRob3UgdGVsbCBoZXIsIG51cnNlPyB0aG91IGRvc3Qgbm90IG1hcmsgbWUuCgpOdXJzZQoKICAgIEkgd2lsbCB0ZWxsIGhlciwgc2lyLCB0aGF0IHlvdSBkbyBwcm90ZXN0OyB3aGljaCwgYXMKICAgIEkgdGFrZSBpdCwgaXMgYSBnZW50bGVtYW5saWtlIG9mZmVyLgoKUk9NRU8KCiAgICBCaWQgaGVyIGRldmlzZQogICAgU29tZSBtZWFucyB0byBjb21lIHRvIHNocmlmdCB0aGlzIGFmdGVybm9vbjsKICAgIEFuZCB0aGVyZSBzaGUgc2hhbGwgYXQgRnJpYXIgTGF1cmVuY2UnIGNlbGwKICAgIEJlIHNocml2ZWQgYW5kIG1hcnJpZWQuIEhlcmUgaXMgZm9yIHRoeSBwYWlucy4KCk51cnNlCgogICAgTm8gdHJ1bHkgc2lyOyBub3QgYSBwZW5ueS4KClJPTUVPCgogICAgR28gdG87IEkgc2F5IHlvdSBzaGFsbC4KCk51cnNlCgogICAgVGhpcyBhZnRlcm5vb24sIHNpcj8gd2VsbCwgc2hlIHNoYWxsIGJlIHRoZXJlLgoKUk9NRU8KCiAgICBBbmQgc3RheSwgZ29vZCBudXJzZSwgYmVoaW5kIHRoZSBhYmJleSB3YWxsOgogICAgV2l0aGluIHRoaXMgaG91ciBteSBtYW4gc2hhbGwgYmUgd2l0aCB0aGVlCiAgICBBbmQgYnJpbmcgdGhlZSBjb3JkcyBtYWRlIGxpa2UgYSB0YWNrbGVkIHN0YWlyOwogICAgV2hpY2ggdG8gdGhlIGhpZ2ggdG9wLWdhbGxhbnQgb2YgbXkgam95CiAgICBNdXN0IGJlIG15IGNvbnZveSBpbiB0aGUgc2VjcmV0IG5pZ2h0LgogICAgRmFyZXdlbGw7IGJlIHRydXN0eSwgYW5kIEknbGwgcXVpdCB0aHkgcGFpbnM6CiAgICBGYXJld2VsbDsgY29tbWVuZCBtZSB0byB0aHkgbWlzdHJlc3MuCgpOdXJzZQoKICAgIE5vdyBHb2QgaW4gaGVhdmVuIGJsZXNzIHRoZWUhIEhhcmsgeW91LCBzaXIuCgpST01FTwoKICAgIFdoYXQgc2F5J3N0IHRob3UsIG15IGRlYXIgbnVyc2UCgpOdXJzZQoKICAgIElzIHlvdXIgbWFuIHNlY3JldD8gRGlkIHlvdSBuZSdlciBoZWFyIHNheSwKICAgIFR3byBtYXkga2VlcCBjb3Vuc2VsLCBwdXR0aW5nIG9uZSBhd2F5PwoKUk9NRU8KCiAgICBJIHdhcnJhbnQgdGhlZSwgbXkgbWFuJ3MgYXMgdHJ1ZSBhcyBzdGVlbC4KCk5VUlNFCgogICAgV2VsbCwgc2lyOyBteSBtaXN0cmVzcyBpcyB0aGUgc3dlZXRlc3QgbGFkeS0tTG9yZCwKICAgIExvcmQhIHdoZW4gJ3R3YXMgYSBsaXR0bGUgcHJhdGluZyB0aGluZzotLU8sIHRoZXJlCiAgICBpcyBhIG5vYmxlbWFuIGluIHRvd24sIG9uZSBQYXJpcywgdGhhdCB3b3VsZCBmYWluCiAgICBsYXkga25pZmUgYWJvYXJkOyBidXQgc2hlLCBnb29kIHNvdWwsIGhhZCBhcyBsaWVmCiAgICBzZWUgYSB0b2FkLCBhIHZlcnkgdG9hZCwgYXMgc2VlIGhpbS4gSSBhbmdlciBoZXIKICAgIHNvbWV0aW1lcyBhbmQgdGVsbCBoZXIgdGhhdCBQYXJpcyBpcyB0aGUgcHJvcGVyZXIKICAgIG1hbjsgYnV0LCBJJ2xsIHdhcnJhbnQgeW91LCB3aGVuIEkgc2F5IHNvLCBzaGUgbG9va3MKICAgIGFzIHBhbGUgYXMgYW55IGNsb3V0IGluIHRoZSB2ZXJzYWwgd29ybGQuIERvdGggbm90CiAgICByb3NlbWFyeSBhbmQgUm9tZW8gYmVnaW4gYm90aCB3aXRoIGEgbGV0dGVyPwoKUk9NRU8KCiAgICBBeSwgbnVyc2U7IHdoYXQgb2YgdGhhdD8gYm90aCB3aXRoIGFuIFIuCgpOdXJzZQoKICAgIEFoLiBtb2NrZXIhIHRoYXQncyB0aGUgZG9nJ3MgbmFtZTsgUiBpcyBmb3IKICAgIHRoZS0tTm87IEkga25vdyBpdCBiZWdpbnMgd2l0aCBzb21lIG90aGVyCiAgICBsZXR0ZXI6LS1hbmQgc2hlIGhhdGggdGhlIHByZXR0aWVzdCBzZW50ZW50aW91cyBvZgogICAgaXQsIG9mIHlvdSBhbmQgcm9zZW1hcnksIHRoYXQgaXQgd291bGQgZG8geW91IGdvb2QKICAgIHRvIGhlYXIgaXQuCgpST01FTwoKICAgIENvbW1lbmQgbWUgdG8gdGh5IGxhZHkuCgpOdXJzZQoKICAgIEF5LCBhIHRob3VzYW5kIHRpbWVzLgoKICAgIEV4aXQgUm9tZW8KICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBQZXRlciwgdGFrZSBteSBmYW4sIGFuZCBnbyBiZWZvcmUgYW5kIGFwYWNlLgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgSlVMSUVUIAoKSlVMSUVUCgogICAgVGhlIGNsb2NrIHN0cnVjayBuaW5lIHdoZW4gSSBkaWQgc2VuZCB0aGUgbnVyc2U7CiAgICBJbiBoYWxmIGFuIGhvdXIgc2hlIHByb21pc2VkIHRvIHJldHVybi4KICAgIFBlcmNoYW5jZSBzaGUgY2Fubm90IG1lZXQgaGltOiB0aGF0J3Mgbm90IHNvLgogICAgTywgc2hlIGlzIGxhbWUhIGxvdmUncyBoZXJhbGRzIHNob3VsZCBiZSB0aG91Z2h0cywKICAgIFdoaWNoIHRlbiB0aW1lcyBmYXN0ZXIgZ2xpZGUgdGhhbiB0aGUgc3VuJ3MgYmVhbXMsCiAgICBEcml2aW5nIGJhY2sgc2hhZG93cyBvdmVyIGxvdXJpbmcgaGlsbHM6CiAgICBUaGVyZWZvcmUgZG8gbmltYmxlLXBpbmlvbidkIGRvdmVzIGRyYXcgbG92ZSwKICAgIEFuZCB0aGVyZWZvcmUgaGF0aCB0aGUgd2luZC1zd2lmdCBDdXBpZCB3aW5ncy4KICAgIE5vdyBpcyB0aGUgc3VuIHVwb24gdGhlIGhpZ2htb3N0IGhpbGwKICAgIE9mIHRoaXMgZGF5J3Mgam91cm5leSwgYW5kIGZyb20gbmluZSB0aWxsIHR3ZWx2ZQogICAgSXMgdGhyZWUgbG9uZyBob3VycywgeWV0IHNoZSBpcyBub3QgY29tZS4KICAgIEhhZCBzaGUgYWZmZWN0aW9ucyBhbmQgd2FybSB5b3V0aGZ1bCBibG9vZCwKICAgIFNoZSB3b3VsZCBiZSBhcyBzd2lmdCBpbiBtb3Rpb24gYXMgYSBiYWxsOwogICAgTXkgd29yZHMgd291bGQgYmFuZHkgaGVyIHRvIG15IHN3ZWV0IGxvdmUsCiAgICBBbmQgaGlzIHRvIG1lOgogICAgQnV0IG9sZCBmb2xrcywgbWFueSBmZWlnbiBhcyB0aGV5IHdlcmUgZGVhZDsKICAgIFVud2llbGR5LCBzbG93LCBoZWF2eSBhbmQgcGFsZSBhcyBsZWFkLgogICAgTyBHb2QsIHNoZSBjb21lcyEKCiAgICBFbnRlciBOdXJzZSBhbmQgUEVURVIKICAgIE8gaG9uZXkgbnVyc2UsIHdoYXQgbmV3cz8KICAgIEhhc3QgdGhvdSBtZXQgd2l0aCBoaW0IFNlbmQgdGh5IG1hbiBhd2F5LgoKTnVyc2UKCiAgICBQZXRlciwgc3RheSBhdCB0aGUgZ2F0ZS4KCiAgICBFeGl0IFBFVEVSCgpKVUxJRVQKCiAgICBOb3csIGdvb2Qgc3dlZXQgbnVyc2UsLS1PIExvcmQsIHdoeSBsb29rJ3N0IHRob3Ugc2FkPwogICAgVGhvdWdoIG5ld3MgYmUgc2FkLCB5ZXQgdGVsbCB0aGVtIG1lcnJpbHk7CiAgICBJZiBnb29kLCB0aG91IHNoYW1lc3QgdGhlIG11c2ljIG9mIHN3ZWV0IG5ld3MKICAgIEJ5IHBsYXlpbmcgaXQgdG8gbWUgd2l0aCBzbyBzb3VyIGEgZmFjZS4KCk51cnNlCgogICAgSSBhbSBhLXdlYXJ5LCBnaXZlIG1lIGxlYXZlIGF3aGlsZToKICAgIEZpZSwgaG93IG15IGJvbmVzIGFjaGUhIHdoYXQgYSBqYXVudCBoYXZlIEkgaGFkIQoKSlVMSUVUCgogICAgSSB3b3VsZCB0aG91IGhhZHN0IG15IGJvbmVzLCBhbmQgSSB0aHkgbmV3czoKICAgIE5heSwgY29tZSwgSSBwcmF5IHRoZWUsIHNwZWFrOyBnb29kLCBnb29kIG51cnNlLCBzcGVhay4KCk51cnNlCgogICAgSmVzdSwgd2hhdCBoYXN0ZT8gY2FuIHlvdSBub3Qgc3RheSBhd2hpbGUCiAgICBEbyB5b3Ugbm90IHNlZSB0aGF0IEkgYW0gb3V0IG9mIGJyZWF0aD8KCkpVTElFVAoKICAgIEhvdyBhcnQgdGhvdSBvdXQgb2YgYnJlYXRoLCB3aGVuIHRob3UgaGFzdCBicmVhdGgKICAgIFRvIHNheSB0byBtZSB0aGF0IHRob3UgYXJ0IG91dCBvZiBicmVhdGgCiAgICBUaGUgZXhjdXNlIHRoYXQgdGhvdSBkb3N0IG1ha2UgaW4gdGhpcyBkZWxheQogICAgSXMgbG9uZ2VyIHRoYW4gdGhlIHRhbGUgdGhvdSBkb3N0IGV4Y3VzZS4KICAgIElzIHRoeSBuZXdzIGdvb2QsIG9yIGJhZD8gYW5zd2VyIHRvIHRoYXQ7CiAgICBTYXkgZWl0aGVyLCBhbmQgSSdsbCBzdGF5IHRoZSBjaXJjdW1zdGFuY2U6CiAgICBMZXQgbWUgYmUgc2F0aXNmaWVkLCBpcyd0IGdvb2Qgb3IgYmFkPwoKTnVyc2UKCiAgICBXZWxsLCB5b3UgaGF2ZSBtYWRlIGEgc2ltcGxlIGNob2ljZTsgeW91IGtub3cgbm90CiAgICBob3cgdG8gY2hvb3NlIGEgbWFuOiBSb21lbyEgbm8sIG5vdCBoZTsgdGhvdWdoIGhpcwogICAgZmFjZSBiZSBiZXR0ZXIgdGhhbiBhbnkgbWFuJ3MsIHlldCBoaXMgbGVnIGV4Y2VscwogICAgYWxsIG1lbidzOyBhbmQgZm9yIGEgaGFuZCwgYW5kIGEgZm9vdCwgYW5kIGEgYm9keSwKICAgIHRob3VnaCB0aGV5IGJlIG5vdCB0byBiZSB0YWxrZWQgb24sIHlldCB0aGV5IGFyZQogICAgcGFzdCBjb21wYXJlOiBoZSBpcyBub3QgdGhlIGZsb3dlciBvZiBjb3VydGVzeSwKICAgIGJ1dCwgSSdsbCB3YXJyYW50IGhpbSwgYXMgZ2VudGxlIGFzIGEgbGFtYi4gR28gdGh5CiAgICB3YXlzLCB3ZW5jaDsgc2VydmUgR29kLiBXaGF0LCBoYXZlIHlvdSBkaW5lZCBhdCBob21lPwoKSlVMSUVUCgogICAgTm8sIG5vOiBidXQgYWxsIHRoaXMgZGlkIEkga25vdyBiZWZvcmUuCiAgICBXaGF0IHNheXMgaGUgb2Ygb3VyIG1hcnJpYWdlPyB3aGF0IG9mIHRoYXQCgpOdXJzZQoKICAgIExvcmQsIGhvdyBteSBoZWFkIGFjaGVzISB3aGF0IGEgaGVhZCBoYXZlIEkhCiAgICBJdCBiZWF0cyBhcyBpdCB3b3VsZCBmYWxsIGluIHR3ZW50eSBwaWVjZXMuCiAgICBNeSBiYWNrIG8nIHQnIG90aGVyIHNpZGUsLS1PLCBteSBiYWNrLCBteSBiYWNrIQogICAgQmVzaHJldyB5b3VyIGhlYXJ0IGZvciBzZW5kaW5nIG1lIGFib3V0LAogICAgVG8gY2F0Y2ggbXkgZGVhdGggd2l0aCBqYXVudGluZyB1cCBhbmQgZG93biEKCkpVTElFVAoKICAgIEknIGZhaXRoLCBJIGFtIHNvcnJ5IHRoYXQgdGhvdSBhcnQgbm90IHdlbGwuCiAgICBTd2VldCwgc3dlZXQsIHN3ZWV0IG51cnNlLCB0ZWxsIG1lLCB3aGF0IHNheXMgbXkgbG92ZT8KCk51cnNlCgogICAgWW91ciBsb3ZlIHNheXMsIGxpa2UgYW4gaG9uZXN0IGdlbnRsZW1hbiwgYW5kIGEKICAgIGNvdXJ0ZW91cywgYW5kIGEga2luZCwgYW5kIGEgaGFuZHNvbWUsIGFuZCwgSQogICAgd2FycmFudCwgYSB2aXJ0dW91cywtLVdoZXJlIGlzIHlvdXIgbW90aGVyPwoKSlVMSUVUCgogICAgV2hlcmUgaXMgbXkgbW90aGVyISB3aHksIHNoZSBpcyB3aXRoaW47CiAgICBXaGVyZSBzaG91bGQgc2hlIGJlPyBIb3cgb2RkbHkgdGhvdSByZXBsaWVzdCEKICAgICdZb3VyIGxvdmUgc2F5cywgbGlrZSBhbiBob25lc3QgZ2VudGxlbWFuLAogICAgV2hlcmUgaXMgeW91ciBtb3RoZXIJwoKTnVyc2UKCiAgICBPIEdvZCdzIGxhZHkgZGVhciEKICAgIEFyZSB5b3Ugc28gaG90PyBtYXJyeSwgY29tZSB1cCwgSSB0cm93OwogICAgSXMgdGhpcyB0aGUgcG91bHRpY2UgZm9yIG15IGFjaGluZyBib25lcz8KICAgIEhlbmNlZm9yd2FyZCBkbyB5b3VyIG1lc3NhZ2VzIHlvdXJzZWxmLgoKSlVMSUVUCgogICAgSGVyZSdzIHN1Y2ggYSBjb2lsISBjb21lLCB3aGF0IHNheXMgUm9tZW8CgpOdXJzZQoKICAgIEhhdmUgeW91IGdvdCBsZWF2ZSB0byBnbyB0byBzaHJpZnQgdG8tZGF5PwoKSlVMSUVUCgogICAgSSBoYXZlLgoKTnVyc2UKCiAgICBUaGVuIGhpZSB5b3UgaGVuY2UgdG8gRnJpYXIgTGF1cmVuY2UnIGNlbGw7CiAgICBUaGVyZSBzdGF5cyBhIGh1c2JhbmQgdG8gbWFrZSB5b3UgYSB3aWZlOgogICAgTm93IGNvbWVzIHRoZSB3YW50b24gYmxvb2QgdXAgaW4geW91ciBjaGVla3MsCiAgICBUaGV5J2xsIGJlIGluIHNjYXJsZXQgc3RyYWlnaHQgYXQgYW55IG5ld3MuCiAgICBIaWUgeW91IHRvIGNodXJjaDsgSSBtdXN0IGFub3RoZXIgd2F5LAogICAgVG8gZmV0Y2ggYSBsYWRkZXIsIGJ5IHRoZSB3aGljaCB5b3VyIGxvdmUKICAgIE11c3QgY2xpbWIgYSBiaXJkJ3MgbmVzdCBzb29uIHdoZW4gaXQgaXMgZGFyazoKICAgIEkgYW0gdGhlIGRydWRnZSBhbmQgdG9pbCBpbiB5b3VyIGRlbGlnaHQsCiAgICBCdXQgeW91IHNoYWxsIGJlYXIgdGhlIGJ1cmRlbiBzb29uIGF0IG5pZ2h0LgogICAgR287IEknbGwgdG8gZGlubmVyOiBoaWUgeW91IHRvIHRoZSBjZWxsLgoKSlVMSUVUCgogICAgSGllIHRvIGhpZ2ggZm9ydHVuZSEgSG9uZXN0IG51cnNlLCBmYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIFZJLiBGcmlhciBMYXVyZW5jZSdzIGNlbGwuCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UgYW5kIFJPTUVPIAoKRlJJQVIgTEFVUkVOQ0UKCiAgICBTbyBzbWlsZSB0aGUgaGVhdmVucyB1cG9uIHRoaXMgaG9seSBhY3QsCiAgICBUaGF0IGFmdGVyIGhvdXJzIHdpdGggc29ycm93IGNoaWRlIHVzIG5vdCEKClJPTUVPCgogICAgQW1lbiwgYW1lbiEgYnV0IGNvbWUgd2hhdCBzb3Jyb3cgY2FuLAogICAgSXQgY2Fubm90IGNvdW50ZXJ2YWlsIHRoZSBleGNoYW5nZSBvZiBqb3kKICAgIFRoYXQgb25lIHNob3J0IG1pbnV0ZSBnaXZlcyBtZSBpbiBoZXIgc2lnaHQ6CiAgICBEbyB0aG91IGJ1dCBjbG9zZSBvdXIgaGFuZHMgd2l0aCBob2x5IHdvcmRzLAogICAgVGhlbiBsb3ZlLWRldm91cmluZyBkZWF0aCBkbyB3aGF0IGhlIGRhcmU7CiAgICBJdCBpcyBlbm91Z2ggSSBtYXkgYnV0IGNhbGwgaGVyIG1pbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFRoZXNlIHZpb2xlbnQgZGVsaWdodHMgaGF2ZSB2aW9sZW50IGVuZHMKICAgIEFuZCBpbiB0aGVpciB0cml1bXBoIGRpZSwgbGlrZSBmaXJlIGFuZCBwb3dkZXIsCiAgICBXaGljaCBhcyB0aGV5IGtpc3MgY29uc3VtZTogdGhlIHN3ZWV0ZXN0IGhvbmV5CiAgICBJcyBsb2F0aHNvbWUgaW4gaGlzIG93biBkZWxpY2lvdXNuZXNzCiAgICBBbmQgaW4gdGhlIHRhc3RlIGNvbmZvdW5kcyB0aGUgYXBwZXRpdGU6CiAgICBUaGVyZWZvcmUgbG92ZSBtb2RlcmF0ZWx5OyBsb25nIGxvdmUgZG90aCBzbzsKICAgIFRvbyBzd2lmdCBhcnJpdmVzIGFzIHRhcmR5IGFzIHRvbyBzbG93LgoKICAgIEVudGVyIEpVTElFVAogICAgSGVyZSBjb21lcyB0aGUgbGFkeTogTywgc28gbGlnaHQgYSBmb290CiAgICBXaWxsIG5lJ2VyIHdlYXIgb3V0IHRoZSBldmVybGFzdGluZyBmbGludDoKICAgIEEgbG92ZXIgbWF5IGJlc3RyaWRlIHRoZSBnb3NzYW1lcgogICAgVGhhdCBpZGxlcyBpbiB0aGUgd2FudG9uIHN1bW1lciBhaXIsCiAgICBBbmQgeWV0IG5vdCBmYWxsOyBzbyBsaWdodCBpcyB2YW5pdHkuCgpKVUxJRVQKCiAgICBHb29kIGV2ZW4gdG8gbXkgZ2hvc3RseSBjb25mZXNzb3IuCgpGUklBUiBMQVVSRU5DRQoKICAgIFJvbWVvIHNoYWxsIHRoYW5rIHRoZWUsIGRhdWdodGVyLCBmb3IgdXMgYm90aC4KCkpVTElFVAoKICAgIEFzIG11Y2ggdG8gaGltLCBlbHNlIGlzIGhpcyB0aGFua3MgdG9vIG11Y2guCgpST01FTwoKICAgIEFoLCBKdWxpZXQsIGlmIHRoZSBtZWFzdXJlIG9mIHRoeSBqb3kKICAgIEJlIGhlYXAnZCBsaWtlIG1pbmUgYW5kIHRoYXQgdGh5IHNraWxsIGJlIG1vcmUKICAgIFRvIGJsYXpvbiBpdCwgdGhlbiBzd2VldGVuIHdpdGggdGh5IGJyZWF0aAogICAgVGhpcyBuZWlnaGJvdXIgYWlyLCBhbmQgbGV0IHJpY2ggbXVzaWMncyB0b25ndWUKICAgIFVuZm9sZCB0aGUgaW1hZ2luZWQgaGFwcGluZXNzIHRoYXQgYm90aAogICAgUmVjZWl2ZSBpbiBlaXRoZXIgYnkgdGhpcyBkZWFyIGVuY291bnRlci4KCkpVTElFVAoKICAgIENvbmNlaXQsIG1vcmUgcmljaCBpbiBtYXR0ZXIgdGhhbiBpbiB3b3JkcywKICAgIEJyYWdzIG9mIGhpcyBzdWJzdGFuY2UsIG5vdCBvZiBvcm5hbWVudDoKICAgIFRoZXkgYXJlIGJ1dCBiZWdnYXJzIHRoYXQgY2FuIGNvdW50IHRoZWlyIHdvcnRoOwogICAgQnV0IG15IHRydWUgbG92ZSBpcyBncm93biB0byBzdWNoIGV4Y2VzcwogICAgSSBjYW5ub3Qgc3VtIHVwIHN1bSBvZiBoYWxmIG15IHdlYWx0aC4KCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgY29tZSB3aXRoIG1lLCBhbmQgd2Ugd2lsbCBtYWtlIHNob3J0IHdvcms7CiAgICBGb3IsIGJ5IHlvdXIgbGVhdmVzLCB5b3Ugc2hhbGwgbm90IHN0YXkgYWxvbmUKICAgIFRpbGwgaG9seSBjaHVyY2ggaW5jb3Jwb3JhdGUgdHdvIGluIG9uZS4KCiAgICBFeGV1bnQKCkFDVCBJSUkKU0NFTkUgSS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgTUVSQ1VUSU8sIEJFTlZPTElPLCBQYWdlLCBhbmQgU2VydmFudHMgCgpCRU5WT0xJTwoKICAgIEkgcHJheSB0aGVlLCBnb29kIE1lcmN1dGlvLCBsZXQncyByZXRpcmU6CiAgICBUaGUgZGF5IGlzIGhvdCwgdGhlIENhcHVsZXRzIGFicm9hZCwKICAgIEFuZCwgaWYgd2UgbWVldCwgd2Ugc2hhbGwgbm90IHNjYXBlIGEgYnJhd2w7CiAgICBGb3Igbm93LCB0aGVzZSBob3QgZGF5cywgaXMgdGhlIG1hZCBibG9vZCBzdGlycmluZy4KCk1FUkNVVElPCgogICAgVGhvdSBhcnQgbGlrZSBvbmUgb2YgdGhvc2UgZmVsbG93cyB0aGF0IHdoZW4gaGUKICAgIGVudGVycyB0aGUgY29uZmluZXMgb2YgYSB0YXZlcm4gY2xhcHMgbWUgaGlzIHN3b3JkCiAgICB1cG9uIHRoZSB0YWJsZSBhbmQgc2F5cyAnR29kIHNlbmQgbWUgbm8gbmVlZCBvZgogICAgdGhlZSEnIGFuZCBieSB0aGUgb3BlcmF0aW9uIG9mIHRoZSBzZWNvbmQgY3VwIGRyYXdzCiAgICBpdCBvbiB0aGUgZHJhd2VyLCB3aGVuIGluZGVlZCB0aGVyZSBpcyBubyBuZWVkLgoKQkVOVk9MSU8KCiAgICBBbSBJIGxpa2Ugc3VjaCBhIGZlbGxvdz8KCk1FUkNVVElPCgogICAgQ29tZSwgY29tZSwgdGhvdSBhcnQgYXMgaG90IGEgSmFjayBpbiB0aHkgbW9vZCBhcwogICAgYW55IGluIEl0YWx5LCBhbmQgYXMgc29vbiBtb3ZlZCB0byBiZSBtb29keSwgYW5kIGFzCiAgICBzb29uIG1vb2R5IHRvIGJlIG1vdmVkLgoKQkVOVk9MSU8KCiAgICBBbmQgd2hhdCB0bz8KCk1FUkNVVElPCgogICAgTmF5LCBhbiB0aGVyZSB3ZXJlIHR3byBzdWNoLCB3ZSBzaG91bGQgaGF2ZSBub25lCiAgICBzaG9ydGx5LCBmb3Igb25lIHdvdWxkIGtpbGwgdGhlIG90aGVyLiBUaG91ISB3aHksCiAgICB0aG91IHdpbHQgcXVhcnJlbCB3aXRoIGEgbWFuIHRoYXQgaGF0aCBhIGhhaXIgbW9yZSwKICAgIG9yIGEgaGFpciBsZXNzLCBpbiBoaXMgYmVhcmQsIHRoYW4gdGhvdSBoYXN0OiB0aG91CiAgICB3aWx0IHF1YXJyZWwgd2l0aCBhIG1hbiBmb3IgY3JhY2tpbmcgbnV0cywgaGF2aW5nIG5vCiAgICBvdGhlciByZWFzb24gYnV0IGJlY2F1c2UgdGhvdSBoYXN0IGhhemVsIGV5ZXM6IHdoYXQKICAgIGV5ZSBidXQgc3VjaCBhbiBleWUgd291bGQgc3B5IG91dCBzdWNoIGEgcXVhcnJlbD8KICAgIFRoeSBoZWFkIGlzIGFzIGZ1biBvZiBxdWFycmVscyBhcyBhbiBlZ2cgaXMgZnVsbCBvZgogICAgbWVhdCwgYW5kIHlldCB0aHkgaGVhZCBoYXRoIGJlZW4gYmVhdGVuIGFzIGFkZGxlIGFzCiAgICBhbiBlZ2cgZm9yIHF1YXJyZWxsaW5nOiB0aG91IGhhc3QgcXVhcnJlbGxlZCB3aXRoIGEKICAgIG1hbiBmb3IgY291Z2hpbmcgaW4gdGhlIHN0cmVldCwgYmVjYXVzZSBoZSBoYXRoCiAgICB3YWtlbmVkIHRoeSBkb2cgdGhhdCBoYXRoIGxhaW4gYXNsZWVwIGluIHRoZSBzdW46CiAgICBkaWRzdCB0aG91IG5vdCBmYWxsIG91dCB3aXRoIGEgdGFpbG9yIGZvciB3ZWFyaW5nCiAgICBoaXMgbmV3IGRvdWJsZXQgYmVmb3JlIEVhc3Rlcj8gd2l0aCBhbm90aGVyLCBmb3IKICAgIHR5aW5nIGhpcyBuZXcgc2hvZXMgd2l0aCBvbGQgcmliYW5kPyBhbmQgeWV0IHRob3UKICAgIHdpbHQgdHV0b3IgbWUgZnJvbSBxdWFycmVsbGluZyEKCkJFTlZPTElPCgogICAgQW4gSSB3ZXJlIHNvIGFwdCB0byBxdWFycmVsIGFzIHRob3UgYXJ0LCBhbnkgbWFuCiAgICBzaG91bGQgYnV5IHRoZSBmZWUtc2ltcGxlIG9mIG15IGxpZmUgZm9yIGFuIGhvdXIgYW5kIGEgcXVhcnRlci4KCk1FUkNVVElPCgogICAgVGhlIGZlZS1zaW1wbGUhIE8gc2ltcGxlIQoKQkVOVk9MSU8KCiAgICBCeSBteSBoZWFkLCBoZXJlIGNvbWUgdGhlIENhcHVsZXRzLgoKTUVSQ1VUSU8KCiAgICBCeSBteSBoZWVsLCBJIGNhcmUgbm90LgoKICAgIEVudGVyIFRZQkFMVCBhbmQgb3RoZXJzCgpUWUJBTFQKCiAgICBGb2xsb3cgbWUgY2xvc2UsIGZvciBJIHdpbGwgc3BlYWsgdG8gdGhlbS4KICAgIEdlbnRsZW1lbiwgZ29vZCBkZW46IGEgd29yZCB3aXRoIG9uZSBvZiB5b3UuCgpNRVJDVVRJTwoKICAgIEFuZCBidXQgb25lIHdvcmQgd2l0aCBvbmUgb2YgdXMIGNvdXBsZSBpdCB3aXRoCiAgICBzb21ldGhpbmc7IG1ha2UgaXQgYSB3b3JkIGFuZCBhIGJsb3cuCgpUWUJBTFQKCiAgICBZb3Ugc2hhbGwgZmluZCBtZSBhcHQgZW5vdWdoIHRvIHRoYXQsIHNpciwgYW4geW91CiAgICB3aWxsIGdpdmUgbWUgb2NjYXNpb24uCgpNRVJDVVRJTwoKICAgIENvdWxkIHlvdSBub3QgdGFrZSBzb21lIG9jY2FzaW9uIHdpdGhvdXQgZ2l2aW5nPwoKVFlCQUxUCgogICAgTWVyY3V0aW8sIHRob3UgY29uc29ydCdzdCB3aXRoIFJvbWVvLC0tCgpNRVJDVVRJTwoKICAgIENvbnNvcnQhIHdoYXQsIGRvc3QgdGhvdSBtYWtlIHVzIG1pbnN0cmVscz8gYW4KICAgIHRob3UgbWFrZSBtaW5zdHJlbHMgb2YgdXMsIGxvb2sgdG8gaGVhciBub3RoaW5nIGJ1dAogICAgZGlzY29yZHM6IGhlcmUncyBteSBmaWRkbGVzdGljazsgaGVyZSdzIHRoYXQgc2hhbGwKICAgIG1ha2UgeW91IGRhbmNlLiAnWm91bmRzLCBjb25zb3J0IQoKQkVOVk9MSU8KCiAgICBXZSB0YWxrIGhlcmUgaW4gdGhlIHB1YmxpYyBoYXVudCBvZiBtZW46CiAgICBFaXRoZXIgd2l0aGRyYXcgdW50byBzb21lIHByaXZhdGUgcGxhY2UsCiAgICBBbmQgcmVhc29uIGNvbGRseSBvZiB5b3VyIGdyaWV2YW5jZXMsCiAgICBPciBlbHNlIGRlcGFydDsgaGVyZSBhbGwgZXllcyBnYXplIG9uIHVzLgoKTUVSQ1VUSU8KCiAgICBNZW4ncyBleWVzIHdlcmUgbWFkZSB0byBsb29rLCBhbmQgbGV0IHRoZW0gZ2F6ZTsKICAgIEkgd2lsbCBub3QgYnVkZ2UgZm9yIG5vIG1hbidzIHBsZWFzdXJlLCBJLgoKICAgIEVudGVyIFJPTUVPCgpUWUJBTFQKCiAgICBXZWxsLCBwZWFjZSBiZSB3aXRoIHlvdSwgc2lyOiBoZXJlIGNvbWVzIG15IG1hbi4KCk1FUkNVVElPCgogICAgQnV0IEknbGwgYmUgaGFuZ2VkLCBzaXIsIGlmIGhlIHdlYXIgeW91ciBsaXZlcnk6CiAgICBNYXJyeSwgZ28gYmVmb3JlIHRvIGZpZWxkLCBoZSdsbCBiZSB5b3VyIGZvbGxvd2VyOwogICAgWW91ciB3b3JzaGlwIGluIHRoYXQgc2Vuc2UgbWF5IGNhbGwgaGltICdtYW4uJwoKVFlCQUxUCgogICAgUm9tZW8sIHRoZSBoYXRlIEkgYmVhciB0aGVlIGNhbiBhZmZvcmQKICAgIE5vIGJldHRlciB0ZXJtIHRoYW4gdGhpcywtLXRob3UgYXJ0IGEgdmlsbGFpbi4KClJPTUVPCgogICAgVHliYWx0LCB0aGUgcmVhc29uIHRoYXQgSSBoYXZlIHRvIGxvdmUgdGhlZQogICAgRG90aCBtdWNoIGV4Y3VzZSB0aGUgYXBwZXJ0YWluaW5nIHJhZ2UKICAgIFRvIHN1Y2ggYSBncmVldGluZzogdmlsbGFpbiBhbSBJIG5vbmU7CiAgICBUaGVyZWZvcmUgZmFyZXdlbGw7IEkgc2VlIHRob3Uga25vdydzdCBtZSBub3QuCgpUWUJBTFQKCiAgICBCb3ksIHRoaXMgc2hhbGwgbm90IGV4Y3VzZSB0aGUgaW5qdXJpZXMKICAgIFRoYXQgdGhvdSBoYXN0IGRvbmUgbWU7IHRoZXJlZm9yZSB0dXJuIGFuZCBkcmF3LgoKUk9NRU8KCiAgICBJIGRvIHByb3Rlc3QsIEkgbmV2ZXIgaW5qdXJlZCB0aGVlLAogICAgQnV0IGxvdmUgdGhlZSBiZXR0ZXIgdGhhbiB0aG91IGNhbnN0IGRldmlzZSwKICAgIFRpbGwgdGhvdSBzaGFsdCBrbm93IHRoZSByZWFzb24gb2YgbXkgbG92ZToKICAgIEFuZCBzbywgZ29vZCBDYXB1bGV0LC0td2hpY2ggbmFtZSBJIHRlbmRlcgogICAgQXMgZGVhcmx5IGFzIG15IG93biwtLWJlIHNhdGlzZmllZC4KCk1FUkNVVElPCgogICAgTyBjYWxtLCBkaXNob25vdXJhYmxlLCB2aWxlIHN1Ym1pc3Npb24hCiAgICBBbGxhIHN0b2NjYXRhIGNhcnJpZXMgaXQgYXdheS4KCiAgICBEcmF3cwogICAgVHliYWx0LCB5b3UgcmF0LWNhdGNoZXIsIHdpbGwgeW91IHdhbGsCgpUWUJBTFQKCiAgICBXaGF0IHdvdWxkc3QgdGhvdSBoYXZlIHdpdGggbWUCgpNRVJDVVRJTwoKICAgIEdvb2Qga2luZyBvZiBjYXRzLCBub3RoaW5nIGJ1dCBvbmUgb2YgeW91ciBuaW5lCiAgICBsaXZlczsgdGhhdCBJIG1lYW4gdG8gbWFrZSBib2xkIHdpdGhhbCwgYW5kIGFzIHlvdQogICAgc2hhbGwgdXNlIG1lIGhlcmVhZnRlciwgZHJ5YmVhdCB0aGUgcmVzdCBvZiB0aGUKICAgIGVpZ2h0LiBXaWxsIHlvdSBwbHVjayB5b3VyIHN3b3JkIG91dCBvZiBoaXMgcGl0Y2hlcgogICAgYnkgdGhlIGVhcnMIG1ha2UgaGFzdGUsIGxlc3QgbWluZSBiZSBhYm91dCB5b3VyCiAgICBlYXJzIGVyZSBpdCBiZSBvdXQuCgpUWUJBTFQKCiAgICBJIGFtIGZvciB5b3UuCgogICAgRHJhd2luZwoKUk9NRU8KCiAgICBHZW50bGUgTWVyY3V0aW8sIHB1dCB0aHkgcmFwaWVyIHVwLgoKTUVSQ1VUSU8KCiAgICBDb21lLCBzaXIsIHlvdXIgcGFzc2Fkby4KCiAgICBUaGV5IGZpZ2h0CgpST01FTwoKICAgIERyYXcsIEJlbnZvbGlvOyBiZWF0IGRvd24gdGhlaXIgd2VhcG9ucy4KICAgIEdlbnRsZW1lbiwgZm9yIHNoYW1lLCBmb3JiZWFyIHRoaXMgb3V0cmFnZSEKICAgIFR5YmFsdCwgTWVyY3V0aW8sIHRoZSBwcmluY2UgZXhwcmVzc2x5IGhhdGgKICAgIEZvcmJpZGRlbiBiYW5keWluZyBpbiBWZXJvbmEgc3RyZWV0czoKICAgIEhvbGQsIFR5YmFsdCEgZ29vZCBNZXJjdXRpbyEKCiAgICBUWUJBTFQgdW5kZXIgUk9NRU8ncyBhcm0gc3RhYnMgTUVSQ1VUSU8sIGFuZCBmbGllcyB3aXRoIGhpcyBmb2xsb3dlcnMKCk1FUkNVVElPCgogICAgSSBhbSBodXJ0LgogICAgQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEgSSBhbSBzcGVkLgogICAgSXMgaGUgZ29uZSwgYW5kIGhhdGggbm90aGluZz8KCkJFTlZPTElPCgogICAgV2hhdCwgYXJ0IHRob3UgaHVydD8KCk1FUkNVVElPCgogICAgQXksIGF5LCBhIHNjcmF0Y2gsIGEgc2NyYXRjaDsgbWFycnksICd0aXMgZW5vdWdoLgogICAgV2hlcmUgaXMgbXkgcGFnZT8gR28sIHZpbGxhaW4sIGZldGNoIGEgc3VyZ2Vvbi4KCiAgICBFeGl0IFBhZ2UKClJPTUVPCgogICAgQ291cmFnZSwgbWFuOyB0aGUgaHVydCBjYW5ub3QgYmUgbXVjaC4KCk1FUkNVVElPCgogICAgTm8sICd0aXMgbm90IHNvIGRlZXAgYXMgYSB3ZWxsLCBub3Igc28gd2lkZSBhcyBhCiAgICBjaHVyY2gtZG9vcjsgYnV0ICd0aXMgZW5vdWdoLCd0d2lsbCBzZXJ2ZTogYXNrIGZvcgogICAgbWUgdG8tbW9ycm93LCBhbmQgeW91IHNoYWxsIGZpbmQgbWUgYSBncmF2ZSBtYW4uIEkKICAgIGFtIHBlcHBlcmVkLCBJIHdhcnJhbnQsIGZvciB0aGlzIHdvcmxkLiBBIHBsYWd1ZSBvJwogICAgYm90aCB5b3VyIGhvdXNlcyEgJ1pvdW5kcywgYSBkb2csIGEgcmF0LCBhIG1vdXNlLCBhCiAgICBjYXQsIHRvIHNjcmF0Y2ggYSBtYW4gdG8gZGVhdGghIGEgYnJhZ2dhcnQsIGEKICAgIHJvZ3VlLCBhIHZpbGxhaW4sIHRoYXQgZmlnaHRzIGJ5IHRoZSBib29rIG9mCiAgICBhcml0aG1ldGljISBXaHkgdGhlIGRldmlsIGNhbWUgeW91IGJldHdlZW4gdXMIEkKICAgIHdhcyBodXJ0IHVuZGVyIHlvdXIgYXJtLgoKUk9NRU8KCiAgICBJIHRob3VnaHQgYWxsIGZvciB0aGUgYmVzdC4KCk1FUkNVVElPCgogICAgSGVscCBtZSBpbnRvIHNvbWUgaG91c2UsIEJlbnZvbGlvLAogICAgT3IgSSBzaGFsbCBmYWludC4gQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEKICAgIFRoZXkgaGF2ZSBtYWRlIHdvcm1zJyBtZWF0IG9mIG1lOiBJIGhhdmUgaXQsCiAgICBBbmQgc291bmRseSB0b286IHlvdXIgaG91c2VzIQoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KClJPTUVPCgogICAgVGhpcyBnZW50bGVtYW4sIHRoZSBwcmluY2UncyBuZWFyIGFsbHksCiAgICBNeSB2ZXJ5IGZyaWVuZCwgaGF0aCBnb3QgaGlzIG1vcnRhbCBodXJ0CiAgICBJbiBteSBiZWhhbGY7IG15IHJlcHV0YXRpb24gc3RhaW4nZAogICAgV2l0aCBUeWJhbHQncyBzbGFuZGVyLC0tVHliYWx0LCB0aGF0IGFuIGhvdXIKICAgIEhhdGggYmVlbiBteSBraW5zbWFuISBPIHN3ZWV0IEp1bGlldCwKICAgIFRoeSBiZWF1dHkgaGF0aCBtYWRlIG1lIGVmZmVtaW5hdGUKICAgIEFuZCBpbiBteSB0ZW1wZXIgc29mdGVuJ2QgdmFsb3VyJ3Mgc3RlZWwhCgogICAgUmUtZW50ZXIgQkVOVk9MSU8KCkJFTlZPTElPCgogICAgTyBSb21lbywgUm9tZW8sIGJyYXZlIE1lcmN1dGlvJ3MgZGVhZCEKICAgIFRoYXQgZ2FsbGFudCBzcGlyaXQgaGF0aCBhc3BpcmVkIHRoZSBjbG91ZHMsCiAgICBXaGljaCB0b28gdW50aW1lbHkgaGVyZSBkaWQgc2Nvcm4gdGhlIGVhcnRoLgoKUk9NRU8KCiAgICBUaGlzIGRheSdzIGJsYWNrIGZhdGUgb24gbW9yZSBkYXlzIGRvdGggZGVwZW5kOwogICAgVGhpcyBidXQgYmVnaW5zIHRoZSB3b2UsIG90aGVycyBtdXN0IGVuZC4KCkJFTlZPTElPCgogICAgSGVyZSBjb21lcyB0aGUgZnVyaW91cyBUeWJhbHQgYmFjayBhZ2Fpbi4KClJPTUVPCgogICAgQWxpdmUsIGluIHRyaXVtcGghIGFuZCBNZXJjdXRpbyBzbGFpbiEKICAgIEF3YXkgdG8gaGVhdmVuLCByZXNwZWN0aXZlIGxlbml0eSwKICAgIEFuZCBmaXJlLWV5ZWQgZnVyeSBiZSBteSBjb25kdWN0IG5vdyEKCiAgICBSZS1lbnRlciBUWUJBTFQKICAgIE5vdywgVHliYWx0LCB0YWtlIHRoZSB2aWxsYWluIGJhY2sgYWdhaW4sCiAgICBUaGF0IGxhdGUgdGhvdSBnYXZlc3QgbWU7IGZvciBNZXJjdXRpbydzIHNvdWwKICAgIElzIGJ1dCBhIGxpdHRsZSB3YXkgYWJvdmUgb3VyIGhlYWRzLAogICAgU3RheWluZyBmb3IgdGhpbmUgdG8ga2VlcCBoaW0gY29tcGFueToKICAgIEVpdGhlciB0aG91LCBvciBJLCBvciBib3RoLCBtdXN0IGdvIHdpdGggaGltLgoKVFlCQUxUCgogICAgVGhvdSwgd3JldGNoZWQgYm95LCB0aGF0IGRpZHN0IGNvbnNvcnQgaGltIGhlcmUsCiAgICBTaGFsdCB3aXRoIGhpbSBoZW5jZS4KClJPTUVPCgogICAgVGhpcyBzaGFsbCBkZXRlcm1pbmUgdGhhdC4KCiAgICBUaGV5IGZpZ2h0OyBUWUJBTFQgZmFsbHMKCkJFTlZPTElPCgogICAgUm9tZW8sIGF3YXksIGJlIGdvbmUhCiAgICBUaGUgY2l0aXplbnMgYXJlIHVwLCBhbmQgVHliYWx0IHNsYWluLgogICAgU3RhbmQgbm90IGFtYXplZDogdGhlIHByaW5jZSB3aWxsIGRvb20gdGhlZSBkZWF0aCwKICAgIElmIHRob3UgYXJ0IHRha2VuOiBoZW5jZSwgYmUgZ29uZSwgYXdheSEKClJPTUVPCgogICAgTywgSSBhbSBmb3J0dW5lJ3MgZm9vbCEKCkJFTlZPTElPCgogICAgV2h5IGRvc3QgdGhvdSBzdGF5PwoKICAgIEV4aXQgUk9NRU8KCiAgICBFbnRlciBDaXRpemVucywgJiBjCgpGaXJzdCBDaXRpemVuCgogICAgV2hpY2ggd2F5IHJhbiBoZSB0aGF0IGtpbGwnZCBNZXJjdXRpbz8KICAgIFR5YmFsdCwgdGhhdCBtdXJkZXJlciwgd2hpY2ggd2F5IHJhbiBoZT8KCkJFTlZPTElPCgogICAgVGhlcmUgbGllcyB0aGF0IFR5YmFsdC4KCkZpcnN0IENpdGl6ZW4KCiAgICBVcCwgc2lyLCBnbyB3aXRoIG1lOwogICAgSSBjaGFyZ2UgdGhlZSBpbiB0aGUgcHJpbmNlcyBuYW1lLCBvYmV5LgoKICAgIEVudGVyIFByaW5jZSwgYXR0ZW5kZWQ7IE1PTlRBR1VFLCBDQVBVTEVULCB0aGVpciBXaXZlcywgYW5kIG90aGVycwoKUFJJTkNFCgogICAgV2hlcmUgYXJlIHRoZSB2aWxlIGJlZ2lubmVycyBvZiB0aGlzIGZyYXkCgpCRU5WT0xJTwoKICAgIE8gbm9ibGUgcHJpbmNlLCBJIGNhbiBkaXNjb3ZlciBhbGwKICAgIFRoZSB1bmx1Y2t5IG1hbmFnZSBvZiB0aGlzIGZhdGFsIGJyYXdsOgogICAgVGhlcmUgbGllcyB0aGUgbWFuLCBzbGFpbiBieSB5b3VuZyBSb21lbywKICAgIFRoYXQgc2xldyB0aHkga2luc21hbiwgYnJhdmUgTWVyY3V0aW8uCgpMQURZIENBUFVMRVQKCiAgICBUeWJhbHQsIG15IGNvdXNpbiEgTyBteSBicm90aGVyJ3MgY2hpbGQhCiAgICBPIHByaW5jZSEgTyBjb3VzaW4hIGh1c2JhbmQhIE8sIHRoZSBibG9vZCBpcyBzcGlsdAogICAgTyBteSBkZWFyIGtpbnNtYW4hIFByaW5jZSwgYXMgdGhvdSBhcnQgdHJ1ZSwKICAgIEZvciBibG9vZCBvZiBvdXJzLCBzaGVkIGJsb29kIG9mIE1vbnRhZ3VlLgogICAgTyBjb3VzaW4sIGNvdXNpbiEKClBSSU5DRQoKICAgIEJlbnZvbGlvLCB3aG8gYmVnYW4gdGhpcyBibG9vZHkgZnJheT8KCkJFTlZPTElPCgogICAgVHliYWx0LCBoZXJlIHNsYWluLCB3aG9tIFJvbWVvJ3MgaGFuZCBkaWQgc2xheTsKICAgIFJvbWVvIHRoYXQgc3Bva2UgaGltIGZhaXIsIGJhZGUgaGltIGJldGhpbmsKICAgIEhvdyBuaWNlIHRoZSBxdWFycmVsIHdhcywgYW5kIHVyZ2VkIHdpdGhhbAogICAgWW91ciBoaWdoIGRpc3BsZWFzdXJlOiBhbGwgdGhpcyB1dHRlcmVkCiAgICBXaXRoIGdlbnRsZSBicmVhdGgsIGNhbG0gbG9vaywga25lZXMgaHVtYmx5IGJvdydkLAogICAgQ291bGQgbm90IHRha2UgdHJ1Y2Ugd2l0aCB0aGUgdW5ydWx5IHNwbGVlbgogICAgT2YgVHliYWx0IGRlYWYgdG8gcGVhY2UsIGJ1dCB0aGF0IGhlIHRpbHRzCiAgICBXaXRoIHBpZXJjaW5nIHN0ZWVsIGF0IGJvbGQgTWVyY3V0aW8ncyBicmVhc3QsCiAgICBXaG8gYWxsIGFzIGhvdCwgdHVybnMgZGVhZGx5IHBvaW50IHRvIHBvaW50LAogICAgQW5kLCB3aXRoIGEgbWFydGlhbCBzY29ybiwgd2l0aCBvbmUgaGFuZCBiZWF0cwogICAgQ29sZCBkZWF0aCBhc2lkZSwgYW5kIHdpdGggdGhlIG90aGVyIHNlbmRzCiAgICBJdCBiYWNrIHRvIFR5YmFsdCwgd2hvc2UgZGV4dGVyaXR5LAogICAgUmV0b3J0cyBpdDogUm9tZW8gaGUgY3JpZXMgYWxvdWQsCiAgICAnSG9sZCwgZnJpZW5kcyEgZnJpZW5kcywgcGFydCEnIGFuZCwgc3dpZnRlciB0aGFuCiAgICBoaXMgdG9uZ3VlLAogICAgSGlzIGFnaWxlIGFybSBiZWF0cyBkb3duIHRoZWlyIGZhdGFsIHBvaW50cywKICAgIEFuZCAndHdpeHQgdGhlbSBydXNoZXM7IHVuZGVybmVhdGggd2hvc2UgYXJtCiAgICBBbiBlbnZpb3VzIHRocnVzdCBmcm9tIFR5YmFsdCBoaXQgdGhlIGxpZmUKICAgIE9mIHN0b3V0IE1lcmN1dGlvLCBhbmQgdGhlbiBUeWJhbHQgZmxlZDsKICAgIEJ1dCBieSBhbmQgYnkgY29tZXMgYmFjayB0byBSb21lbywKICAgIFdobyBoYWQgYnV0IG5ld2x5IGVudGVydGFpbidkIHJldmVuZ2UsCiAgICBBbmQgdG8gJ3QgdGhleSBnbyBsaWtlIGxpZ2h0bmluZywgZm9yLCBlcmUgSQogICAgQ291bGQgZHJhdyB0byBwYXJ0IHRoZW0sIHdhcyBzdG91dCBUeWJhbHQgc2xhaW4uCiAgICBBbmQsIGFzIGhlIGZlbGwsIGRpZCBSb21lbyB0dXJuIGFuZCBmbHkuCiAgICBUaGlzIGlzIHRoZSB0cnV0aCwgb3IgbGV0IEJlbnZvbGlvIGRpZS4KCkxBRFkgQ0FQVUxFVAoKICAgIEhlIGlzIGEga2luc21hbiB0byB0aGUgTW9udGFndWU7CiAgICBBZmZlY3Rpb24gbWFrZXMgaGltIGZhbHNlOyBoZSBzcGVha3Mgbm90IHRydWU6CiAgICBTb21lIHR3ZW50eSBvZiB0aGVtIGZvdWdodCBpbiB0aGlzIGJsYWNrIHN0cmlmZSwKICAgIEFuZCBhbGwgdGhvc2UgdHdlbnR5IGNvdWxkIGJ1dCBraWxsIG9uZSBsaWZlLgogICAgSSBiZWcgZm9yIGp1c3RpY2UsIHdoaWNoIHRob3UsIHByaW5jZSwgbXVzdCBnaXZlOwogICAgUm9tZW8gc2xldyBUeWJhbHQsIFJvbWVvIG11c3Qgbm90IGxpdmUuCgpQUklOQ0UKCiAgICBSb21lbyBzbGV3IGhpbSwgaGUgc2xldyBNZXJjdXRpbzsKICAgIFdobyBub3cgdGhlIHByaWNlIG9mIGhpcyBkZWFyIGJsb29kIGRvdGggb3dlPwoKTU9OVEFHVUUKCiAgICBOb3QgUm9tZW8sIHByaW5jZSwgaGUgd2FzIE1lcmN1dGlvJ3MgZnJpZW5kOwogICAgSGlzIGZhdWx0IGNvbmNsdWRlcyBidXQgd2hhdCB0aGUgbGF3IHNob3VsZCBlbmQsCiAgICBUaGUgbGlmZSBvZiBUeWJhbHQuCgpQUklOQ0UKCiAgICBBbmQgZm9yIHRoYXQgb2ZmZW5jZQogICAgSW1tZWRpYXRlbHkgd2UgZG8gZXhpbGUgaGltIGhlbmNlOgogICAgSSBoYXZlIGFuIGludGVyZXN0IGluIHlvdXIgaGF0ZSdzIHByb2NlZWRpbmcsCiAgICBNeSBibG9vZCBmb3IgeW91ciBydWRlIGJyYXdscyBkb3RoIGxpZSBhLWJsZWVkaW5nOwogICAgQnV0IEknbGwgYW1lcmNlIHlvdSB3aXRoIHNvIHN0cm9uZyBhIGZpbmUKICAgIFRoYXQgeW91IHNoYWxsIGFsbCByZXBlbnQgdGhlIGxvc3Mgb2YgbWluZToKICAgIEkgd2lsbCBiZSBkZWFmIHRvIHBsZWFkaW5nIGFuZCBleGN1c2VzOwogICAgTm9yIHRlYXJzIG5vciBwcmF5ZXJzIHNoYWxsIHB1cmNoYXNlIG91dCBhYnVzZXM6CiAgICBUaGVyZWZvcmUgdXNlIG5vbmU6IGxldCBSb21lbyBoZW5jZSBpbiBoYXN0ZSwKICAgIEVsc2UsIHdoZW4gaGUncyBmb3VuZCwgdGhhdCBob3VyIGlzIGhpcyBsYXN0LgogICAgQmVhciBoZW5jZSB0aGlzIGJvZHkgYW5kIGF0dGVuZCBvdXIgd2lsbDoKICAgIE1lcmN5IGJ1dCBtdXJkZXJzLCBwYXJkb25pbmcgdGhvc2UgdGhhdCBraWxsLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIENhcHVsZXQncyBvcmNoYXJkLgoKICAgIEVudGVyIEpVTElFVCAKCkpVTElFVAoKICAgIEdhbGxvcCBhcGFjZSwgeW91IGZpZXJ5LWZvb3RlZCBzdGVlZHMsCiAgICBUb3dhcmRzIFBob2VidXMnIGxvZGdpbmc6IHN1Y2ggYSB3YWdvbmVyCiAgICBBcyBQaGFldGhvbiB3b3VsZCB3aGlwIHlvdSB0byB0aGUgd2VzdCwKICAgIEFuZCBicmluZyBpbiBjbG91ZHkgbmlnaHQgaW1tZWRpYXRlbHkuCiAgICBTcHJlYWQgdGh5IGNsb3NlIGN1cnRhaW4sIGxvdmUtcGVyZm9ybWluZyBuaWdodCwKICAgIFRoYXQgcnVuYXdheSdzIGV5ZXMgbWF5IHdpbmsgYW5kIFJvbWVvCiAgICBMZWFwIHRvIHRoZXNlIGFybXMsIHVudGFsaydkIG9mIGFuZCB1bnNlZW4uCiAgICBMb3ZlcnMgY2FuIHNlZSB0byBkbyB0aGVpciBhbW9yb3VzIHJpdGVzCiAgICBCeSB0aGVpciBvd24gYmVhdXRpZXM7IG9yLCBpZiBsb3ZlIGJlIGJsaW5kLAogICAgSXQgYmVzdCBhZ3JlZXMgd2l0aCBuaWdodC4gQ29tZSwgY2l2aWwgbmlnaHQsCiAgICBUaG91IHNvYmVyLXN1aXRlZCBtYXRyb24sIGFsbCBpbiBibGFjaywKICAgIEFuZCBsZWFybiBtZSBob3cgdG8gbG9zZSBhIHdpbm5pbmcgbWF0Y2gsCiAgICBQbGF5J2QgZm9yIGEgcGFpciBvZiBzdGFpbmxlc3MgbWFpZGVuaG9vZHM6CiAgICBIb29kIG15IHVubWFubidkIGJsb29kLCBiYXRpbmcgaW4gbXkgY2hlZWtzLAogICAgV2l0aCB0aHkgYmxhY2sgbWFudGxlOyB0aWxsIHN0cmFuZ2UgbG92ZSwgZ3Jvd24gYm9sZCwKICAgIFRoaW5rIHRydWUgbG92ZSBhY3RlZCBzaW1wbGUgbW9kZXN0eS4KICAgIENvbWUsIG5pZ2h0OyBjb21lLCBSb21lbzsgY29tZSwgdGhvdSBkYXkgaW4gbmlnaHQ7CiAgICBGb3IgdGhvdSB3aWx0IGxpZSB1cG9uIHRoZSB3aW5ncyBvZiBuaWdodAogICAgV2hpdGVyIHRoYW4gbmV3IHNub3cgb24gYSByYXZlbidzIGJhY2suCiAgICBDb21lLCBnZW50bGUgbmlnaHQsIGNvbWUsIGxvdmluZywgYmxhY2stYnJvdydkIG5pZ2h0LAogICAgR2l2ZSBtZSBteSBSb21lbzsgYW5kLCB3aGVuIGhlIHNoYWxsIGRpZSwKICAgIFRha2UgaGltIGFuZCBjdXQgaGltIG91dCBpbiBsaXR0bGUgc3RhcnMsCiAgICBBbmQgaGUgd2lsbCBtYWtlIHRoZSBmYWNlIG9mIGhlYXZlbiBzbyBmaW5lCiAgICBUaGF0IGFsbCB0aGUgd29ybGQgd2lsbCBiZSBpbiBsb3ZlIHdpdGggbmlnaHQKICAgIEFuZCBwYXkgbm8gd29yc2hpcCB0byB0aGUgZ2FyaXNoIHN1bi4KICAgIE8sIEkgaGF2ZSBib3VnaHQgdGhlIG1hbnNpb24gb2YgYSBsb3ZlLAogICAgQnV0IG5vdCBwb3NzZXNzJ2QgaXQsIGFuZCwgdGhvdWdoIEkgYW0gc29sZCwKICAgIE5vdCB5ZXQgZW5qb3knZDogc28gdGVkaW91cyBpcyB0aGlzIGRheQogICAgQXMgaXMgdGhlIG5pZ2h0IGJlZm9yZSBzb21lIGZlc3RpdmFsCiAgICBUbyBhbiBpbXBhdGllbnQgY2hpbGQgdGhhdCBoYXRoIG5ldyByb2JlcwogICAgQW5kIG1heSBub3Qgd2VhciB0aGVtLiBPLCBoZXJlIGNvbWVzIG15IG51cnNlLAogICAgQW5kIHNoZSBicmluZ3MgbmV3czsgYW5kIGV2ZXJ5IHRvbmd1ZSB0aGF0IHNwZWFrcwogICAgQnV0IFJvbWVvJ3MgbmFtZSBzcGVha3MgaGVhdmVubHkgZWxvcXVlbmNlLgoKICAgIEVudGVyIE51cnNlLCB3aXRoIGNvcmRzCiAgICBOb3csIG51cnNlLCB3aGF0IG5ld3MIFdoYXQgaGFzdCB0aG91IHRoZXJlPyB0aGUgY29yZHMKICAgIFRoYXQgUm9tZW8gYmlkIHRoZWUgZmV0Y2gCgpOdXJzZQoKICAgIEF5LCBheSwgdGhlIGNvcmRzLgoKICAgIFRocm93cyB0aGVtIGRvd24KCkpVTElFVAoKICAgIEF5IG1lISB3aGF0IG5ld3MIHdoeSBkb3N0IHRob3Ugd3JpbmcgdGh5IGhhbmRzPwoKTnVyc2UKCiAgICBBaCwgd2VsbC1hLWRheSEgaGUncyBkZWFkLCBoZSdzIGRlYWQsIGhlJ3MgZGVhZCEKICAgIFdlIGFyZSB1bmRvbmUsIGxhZHksIHdlIGFyZSB1bmRvbmUhCiAgICBBbGFjayB0aGUgZGF5ISBoZSdzIGdvbmUsIGhlJ3Mga2lsbCdkLCBoZSdzIGRlYWQhCgpKVUxJRVQKCiAgICBDYW4gaGVhdmVuIGJlIHNvIGVudmlvdXMCgpOdXJzZQoKICAgIFJvbWVvIGNhbiwKICAgIFRob3VnaCBoZWF2ZW4gY2Fubm90OiBPIFJvbWVvLCBSb21lbyEKICAgIFdobyBldmVyIHdvdWxkIGhhdmUgdGhvdWdodCBpdD8gUm9tZW8hCgpKVUxJRVQKCiAgICBXaGF0IGRldmlsIGFydCB0aG91LCB0aGF0IGRvc3QgdG9ybWVudCBtZSB0aHVzPwogICAgVGhpcyB0b3J0dXJlIHNob3VsZCBiZSByb2FyJ2QgaW4gZGlzbWFsIGhlbGwuCiAgICBIYXRoIFJvbWVvIHNsYWluIGhpbXNlbGYIHNheSB0aG91IGJ1dCAnSSwnCiAgICBBbmQgdGhhdCBiYXJlIHZvd2VsICdJJyBzaGFsbCBwb2lzb24gbW9yZQogICAgVGhhbiB0aGUgZGVhdGgtZGFydGluZyBleWUgb2YgY29ja2F0cmljZToKICAgIEkgYW0gbm90IEksIGlmIHRoZXJlIGJlIHN1Y2ggYW4gSTsKICAgIE9yIHRob3NlIGV5ZXMgc2h1dCwgdGhhdCBtYWtlIHRoZWUgYW5zd2VyICdJLicKICAgIElmIGhlIGJlIHNsYWluLCBzYXkgJ0knOyBvciBpZiBub3QsIG5vOgogICAgQnJpZWYgc291bmRzIGRldGVybWluZSBvZiBteSB3ZWFsIG9yIHdvZS4KCk51cnNlCgogICAgSSBzYXcgdGhlIHdvdW5kLCBJIHNhdyBpdCB3aXRoIG1pbmUgZXllcywtLQogICAgR29kIHNhdmUgdGhlIG1hcmshLS1oZXJlIG9uIGhpcyBtYW5seSBicmVhc3Q6CiAgICBBIHBpdGVvdXMgY29yc2UsIGEgYmxvb2R5IHBpdGVvdXMgY29yc2U7CiAgICBQYWxlLCBwYWxlIGFzIGFzaGVzLCBhbGwgYmVkYXViJ2QgaW4gYmxvb2QsCiAgICBBbGwgaW4gZ29yZS1ibG9vZDsgSSBzd291bmRlZCBhdCB0aGUgc2lnaHQuCgpKVUxJRVQKCiAgICBPLCBicmVhaywgbXkgaGVhcnQhIHBvb3IgYmFua3J1cHQsIGJyZWFrIGF0IG9uY2UhCiAgICBUbyBwcmlzb24sIGV5ZXMsIG5lJ2VyIGxvb2sgb24gbGliZXJ0eSEKICAgIFZpbGUgZWFydGgsIHRvIGVhcnRoIHJlc2lnbjsgZW5kIG1vdGlvbiBoZXJlOwogICAgQW5kIHRob3UgYW5kIFJvbWVvIHByZXNzIG9uZSBoZWF2eSBiaWVyIQoKTnVyc2UKCiAgICBPIFR5YmFsdCwgVHliYWx0LCB0aGUgYmVzdCBmcmllbmQgSSBoYWQhCiAgICBPIGNvdXJ0ZW91cyBUeWJhbHQhIGhvbmVzdCBnZW50bGVtYW4hCiAgICBUaGF0IGV2ZXIgSSBzaG91bGQgbGl2ZSB0byBzZWUgdGhlZSBkZWFkIQoKSlVMSUVUCgogICAgV2hhdCBzdG9ybSBpcyB0aGlzIHRoYXQgYmxvd3Mgc28gY29udHJhcnkCiAgICBJcyBSb21lbyBzbGF1Z2h0ZXInZCwgYW5kIGlzIFR5YmFsdCBkZWFkPwogICAgTXkgZGVhci1sb3ZlZCBjb3VzaW4sIGFuZCBteSBkZWFyZXIgbG9yZD8KICAgIFRoZW4sIGRyZWFkZnVsIHRydW1wZXQsIHNvdW5kIHRoZSBnZW5lcmFsIGRvb20hCiAgICBGb3Igd2hvIGlzIGxpdmluZywgaWYgdGhvc2UgdHdvIGFyZSBnb25lPwoKTnVyc2UKCiAgICBUeWJhbHQgaXMgZ29uZSwgYW5kIFJvbWVvIGJhbmlzaGVkOwogICAgUm9tZW8gdGhhdCBraWxsJ2QgaGltLCBoZSBpcyBiYW5pc2hlZC4KCkpVTElFVAoKICAgIE8gR29kISBkaWQgUm9tZW8ncyBoYW5kIHNoZWQgVHliYWx0J3MgYmxvb2QCgpOdXJzZQoKICAgIEl0IGRpZCwgaXQgZGlkOyBhbGFzIHRoZSBkYXksIGl0IGRpZCEKCkpVTElFVAoKICAgIE8gc2VycGVudCBoZWFydCwgaGlkIHdpdGggYSBmbG93ZXJpbmcgZmFjZSEKICAgIERpZCBldmVyIGRyYWdvbiBrZWVwIHNvIGZhaXIgYSBjYXZlPwogICAgQmVhdXRpZnVsIHR5cmFudCEgZmllbmQgYW5nZWxpY2FsIQogICAgRG92ZS1mZWF0aGVyJ2QgcmF2ZW4hIHdvbHZpc2gtcmF2ZW5pbmcgbGFtYiEKICAgIERlc3Bpc2VkIHN1YnN0YW5jZSBvZiBkaXZpbmVzdCBzaG93IQogICAgSnVzdCBvcHBvc2l0ZSB0byB3aGF0IHRob3UganVzdGx5IHNlZW0nc3QsCiAgICBBIGRhbW5lZCBzYWludCwgYW4gaG9ub3VyYWJsZSB2aWxsYWluIQogICAgTyBuYXR1cmUsIHdoYXQgaGFkc3QgdGhvdSB0byBkbyBpbiBoZWxsLAogICAgV2hlbiB0aG91IGRpZHN0IGJvd2VyIHRoZSBzcGlyaXQgb2YgYSBmaWVuZAogICAgSW4gbW9yYWwgcGFyYWRpc2Ugb2Ygc3VjaCBzd2VldCBmbGVzaD8KICAgIFdhcyBldmVyIGJvb2sgY29udGFpbmluZyBzdWNoIHZpbGUgbWF0dGVyCiAgICBTbyBmYWlybHkgYm91bmQIE8gdGhhdCBkZWNlaXQgc2hvdWxkIGR3ZWxsCiAgICBJbiBzdWNoIGEgZ29yZ2VvdXMgcGFsYWNlIQoKTnVyc2UKCiAgICBUaGVyZSdzIG5vIHRydXN0LAogICAgTm8gZmFpdGgsIG5vIGhvbmVzdHkgaW4gbWVuOyBhbGwgcGVyanVyZWQsCiAgICBBbGwgZm9yc3dvcm4sIGFsbCBuYXVnaHQsIGFsbCBkaXNzZW1ibGVycy4KICAgIEFoLCB3aGVyZSdzIG15IG1hbj8gZ2l2ZSBtZSBzb21lIGFxdWEgdml0YWU6CiAgICBUaGVzZSBncmllZnMsIHRoZXNlIHdvZXMsIHRoZXNlIHNvcnJvd3MgbWFrZSBtZSBvbGQuCiAgICBTaGFtZSBjb21lIHRvIFJvbWVvIQoKSlVMSUVUCgogICAgQmxpc3RlcidkIGJlIHRoeSB0b25ndWUKICAgIEZvciBzdWNoIGEgd2lzaCEgaGUgd2FzIG5vdCBib3JuIHRvIHNoYW1lOgogICAgVXBvbiBoaXMgYnJvdyBzaGFtZSBpcyBhc2hhbWVkIHRvIHNpdDsKICAgIEZvciAndGlzIGEgdGhyb25lIHdoZXJlIGhvbm91ciBtYXkgYmUgY3Jvd24nZAogICAgU29sZSBtb25hcmNoIG9mIHRoZSB1bml2ZXJzYWwgZWFydGguCiAgICBPLCB3aGF0IGEgYmVhc3Qgd2FzIEkgdG8gY2hpZGUgYXQgaGltIQoKTnVyc2UKCiAgICBXaWxsIHlvdSBzcGVhayB3ZWxsIG9mIGhpbSB0aGF0IGtpbGwnZCB5b3VyIGNvdXNpbj8KCkpVTElFVAoKICAgIFNoYWxsIEkgc3BlYWsgaWxsIG9mIGhpbSB0aGF0IGlzIG15IGh1c2JhbmQCiAgICBBaCwgcG9vciBteSBsb3JkLCB3aGF0IHRvbmd1ZSBzaGFsbCBzbW9vdGggdGh5IG5hbWUsCiAgICBXaGVuIEksIHRoeSB0aHJlZS1ob3VycyB3aWZlLCBoYXZlIG1hbmdsZWQgaXQCiAgICBCdXQsIHdoZXJlZm9yZSwgdmlsbGFpbiwgZGlkc3QgdGhvdSBraWxsIG15IGNvdXNpbj8KICAgIFRoYXQgdmlsbGFpbiBjb3VzaW4gd291bGQgaGF2ZSBraWxsJ2QgbXkgaHVzYmFuZDoKICAgIEJhY2ssIGZvb2xpc2ggdGVhcnMsIGJhY2sgdG8geW91ciBuYXRpdmUgc3ByaW5nOwogICAgWW91ciB0cmlidXRhcnkgZHJvcHMgYmVsb25nIHRvIHdvZSwKICAgIFdoaWNoIHlvdSwgbWlzdGFraW5nLCBvZmZlciB1cCB0byBqb3kuCiAgICBNeSBodXNiYW5kIGxpdmVzLCB0aGF0IFR5YmFsdCB3b3VsZCBoYXZlIHNsYWluOwogICAgQW5kIFR5YmFsdCdzIGRlYWQsIHRoYXQgd291bGQgaGF2ZSBzbGFpbiBteSBodXNiYW5kOgogICAgQWxsIHRoaXMgaXMgY29tZm9ydDsgd2hlcmVmb3JlIHdlZXAgSSB0aGVuPwogICAgU29tZSB3b3JkIHRoZXJlIHdhcywgd29yc2VyIHRoYW4gVHliYWx0J3MgZGVhdGgsCiAgICBUaGF0IG11cmRlcidkIG1lOiBJIHdvdWxkIGZvcmdldCBpdCBmYWluOwogICAgQnV0LCBPLCBpdCBwcmVzc2VzIHRvIG15IG1lbW9yeSwKICAgIExpa2UgZGFtbmVkIGd1aWx0eSBkZWVkcyB0byBzaW5uZXJzJyBtaW5kczoKICAgICdUeWJhbHQgaXMgZGVhZCwgYW5kIFJvbWVvLS1iYW5pc2hlZDsnCiAgICBUaGF0ICdiYW5pc2hlZCwnIHRoYXQgb25lIHdvcmQgJ2JhbmlzaGVkLCcKICAgIEhhdGggc2xhaW4gdGVuIHRob3VzYW5kIFR5YmFsdHMuIFR5YmFsdCdzIGRlYXRoCiAgICBXYXMgd29lIGVub3VnaCwgaWYgaXQgaGFkIGVuZGVkIHRoZXJlOgogICAgT3IsIGlmIHNvdXIgd29lIGRlbGlnaHRzIGluIGZlbGxvd3NoaXAKICAgIEFuZCBuZWVkbHkgd2lsbCBiZSByYW5rJ2Qgd2l0aCBvdGhlciBncmllZnMsCiAgICBXaHkgZm9sbG93J2Qgbm90LCB3aGVuIHNoZSBzYWlkICdUeWJhbHQncyBkZWFkLCcKICAgIFRoeSBmYXRoZXIsIG9yIHRoeSBtb3RoZXIsIG5heSwgb3IgYm90aCwKICAgIFdoaWNoIG1vZGVybiBsYW1lbnRhdGlvbnMgbWlnaHQgaGF2ZSBtb3ZlZD8KICAgIEJ1dCB3aXRoIGEgcmVhci13YXJkIGZvbGxvd2luZyBUeWJhbHQncyBkZWF0aCwKICAgICdSb21lbyBpcyBiYW5pc2hlZCwnIHRvIHNwZWFrIHRoYXQgd29yZCwKICAgIElzIGZhdGhlciwgbW90aGVyLCBUeWJhbHQsIFJvbWVvLCBKdWxpZXQsCiAgICBBbGwgc2xhaW4sIGFsbCBkZWFkLiAnUm9tZW8gaXMgYmFuaXNoZWQhJwogICAgVGhlcmUgaXMgbm8gZW5kLCBubyBsaW1pdCwgbWVhc3VyZSwgYm91bmQsCiAgICBJbiB0aGF0IHdvcmQncyBkZWF0aDsgbm8gd29yZHMgY2FuIHRoYXQgd29lIHNvdW5kLgogICAgV2hlcmUgaXMgbXkgZmF0aGVyLCBhbmQgbXkgbW90aGVyLCBudXJzZT8KCk51cnNlCgogICAgV2VlcGluZyBhbmQgd2FpbGluZyBvdmVyIFR5YmFsdCdzIGNvcnNlOgogICAgV2lsbCB5b3UgZ28gdG8gdGhlbT8gSSB3aWxsIGJyaW5nIHlvdSB0aGl0aGVyLgoKSlVMSUVUCgogICAgV2FzaCB0aGV5IGhpcyB3b3VuZHMgd2l0aCB0ZWFyczogbWluZSBzaGFsbCBiZSBzcGVudCwKICAgIFdoZW4gdGhlaXJzIGFyZSBkcnksIGZvciBSb21lbydzIGJhbmlzaG1lbnQuCiAgICBUYWtlIHVwIHRob3NlIGNvcmRzOiBwb29yIHJvcGVzLCB5b3UgYXJlIGJlZ3VpbGVkLAogICAgQm90aCB5b3UgYW5kIEk7IGZvciBSb21lbyBpcyBleGlsZWQ6CiAgICBIZSBtYWRlIHlvdSBmb3IgYSBoaWdod2F5IHRvIG15IGJlZDsKICAgIEJ1dCBJLCBhIG1haWQsIGRpZSBtYWlkZW4td2lkb3dlZC4KICAgIENvbWUsIGNvcmRzLCBjb21lLCBudXJzZTsgSSdsbCB0byBteSB3ZWRkaW5nLWJlZDsKICAgIEFuZCBkZWF0aCwgbm90IFJvbWVvLCB0YWtlIG15IG1haWRlbmhlYWQhCgpOdXJzZQoKICAgIEhpZSB0byB5b3VyIGNoYW1iZXI6IEknbGwgZmluZCBSb21lbwogICAgVG8gY29tZm9ydCB5b3U6IEkgd290IHdlbGwgd2hlcmUgaGUgaXMuCiAgICBIYXJrIHllLCB5b3VyIFJvbWVvIHdpbGwgYmUgaGVyZSBhdCBuaWdodDoKICAgIEknbGwgdG8gaGltOyBoZSBpcyBoaWQgYXQgTGF1cmVuY2UnIGNlbGwuCgpKVUxJRVQKCiAgICBPLCBmaW5kIGhpbSEgZ2l2ZSB0aGlzIHJpbmcgdG8gbXkgdHJ1ZSBrbmlnaHQsCiAgICBBbmQgYmlkIGhpbSBjb21lIHRvIHRha2UgaGlzIGxhc3QgZmFyZXdlbGwuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSAKCkZSSUFSIExBVVJFTkNFCgogICAgUm9tZW8sIGNvbWUgZm9ydGg7IGNvbWUgZm9ydGgsIHRob3UgZmVhcmZ1bCBtYW46CiAgICBBZmZsaWN0aW9uIGlzIGVuYW1vdXInZCBvZiB0aHkgcGFydHMsCiAgICBBbmQgdGhvdSBhcnQgd2VkZGVkIHRvIGNhbGFtaXR5LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEZhdGhlciwgd2hhdCBuZXdzPyB3aGF0IGlzIHRoZSBwcmluY2UncyBkb29tPwogICAgV2hhdCBzb3Jyb3cgY3JhdmVzIGFjcXVhaW50YW5jZSBhdCBteSBoYW5kLAogICAgVGhhdCBJIHlldCBrbm93IG5vdD8KCkZSSUFSIExBVVJFTkNFCgogICAgVG9vIGZhbWlsaWFyCiAgICBJcyBteSBkZWFyIHNvbiB3aXRoIHN1Y2ggc291ciBjb21wYW55OgogICAgSSBicmluZyB0aGVlIHRpZGluZ3Mgb2YgdGhlIHByaW5jZSdzIGRvb20uCgpST01FTwoKICAgIFdoYXQgbGVzcyB0aGFuIGRvb21zLWRheSBpcyB0aGUgcHJpbmNlJ3MgZG9vbT8KCkZSSUFSIExBVVJFTkNFCgogICAgQSBnZW50bGVyIGp1ZGdtZW50IHZhbmlzaCdkIGZyb20gaGlzIGxpcHMsCiAgICBOb3QgYm9keSdzIGRlYXRoLCBidXQgYm9keSdzIGJhbmlzaG1lbnQuCgpST01FTwoKICAgIEhhLCBiYW5pc2htZW50ISBiZSBtZXJjaWZ1bCwgc2F5ICdkZWF0aDsnCiAgICBGb3IgZXhpbGUgaGF0aCBtb3JlIHRlcnJvciBpbiBoaXMgbG9vaywKICAgIE11Y2ggbW9yZSB0aGFuIGRlYXRoOiBkbyBub3Qgc2F5ICdiYW5pc2htZW50LicKCkZSSUFSIExBVVJFTkNFCgogICAgSGVuY2UgZnJvbSBWZXJvbmEgYXJ0IHRob3UgYmFuaXNoZWQ6CiAgICBCZSBwYXRpZW50LCBmb3IgdGhlIHdvcmxkIGlzIGJyb2FkIGFuZCB3aWRlLgoKUk9NRU8KCiAgICBUaGVyZSBpcyBubyB3b3JsZCB3aXRob3V0IFZlcm9uYSB3YWxscywKICAgIEJ1dCBwdXJnYXRvcnksIHRvcnR1cmUsIGhlbGwgaXRzZWxmLgogICAgSGVuY2UtYmFuaXNoZWQgaXMgYmFuaXNoJ2QgZnJvbSB0aGUgd29ybGQsCiAgICBBbmQgd29ybGQncyBleGlsZSBpcyBkZWF0aDogdGhlbiBiYW5pc2hlZCwKICAgIElzIGRlYXRoIG1pcy10ZXJtJ2Q6IGNhbGxpbmcgZGVhdGggYmFuaXNobWVudCwKICAgIFRob3UgY3V0dCdzdCBteSBoZWFkIG9mZiB3aXRoIGEgZ29sZGVuIGF4ZSwKICAgIEFuZCBzbWlsZXN0IHVwb24gdGhlIHN0cm9rZSB0aGF0IG11cmRlcnMgbWUuCgpGUklBUiBMQVVSRU5DRQoKICAgIE8gZGVhZGx5IHNpbiEgTyBydWRlIHVudGhhbmtmdWxuZXNzIQogICAgVGh5IGZhdWx0IG91ciBsYXcgY2FsbHMgZGVhdGg7IGJ1dCB0aGUga2luZCBwcmluY2UsCiAgICBUYWtpbmcgdGh5IHBhcnQsIGhhdGggcnVzaCdkIGFzaWRlIHRoZSBsYXcsCiAgICBBbmQgdHVybidkIHRoYXQgYmxhY2sgd29yZCBkZWF0aCB0byBiYW5pc2htZW50OgogICAgVGhpcyBpcyBkZWFyIG1lcmN5LCBhbmQgdGhvdSBzZWVzdCBpdCBub3QuCgpST01FTwoKICAgICdUaXMgdG9ydHVyZSwgYW5kIG5vdCBtZXJjeTogaGVhdmVuIGlzIGhlcmUsCiAgICBXaGVyZSBKdWxpZXQgbGl2ZXM7IGFuZCBldmVyeSBjYXQgYW5kIGRvZwogICAgQW5kIGxpdHRsZSBtb3VzZSwgZXZlcnkgdW53b3J0aHkgdGhpbmcsCiAgICBMaXZlIGhlcmUgaW4gaGVhdmVuIGFuZCBtYXkgbG9vayBvbiBoZXI7CiAgICBCdXQgUm9tZW8gbWF5IG5vdDogbW9yZSB2YWxpZGl0eSwKICAgIE1vcmUgaG9ub3VyYWJsZSBzdGF0ZSwgbW9yZSBjb3VydHNoaXAgbGl2ZXMKICAgIEluIGNhcnJpb24tZmxpZXMgdGhhbiBSb21lbzogdGhleSBteSBzZWl6ZQogICAgT24gdGhlIHdoaXRlIHdvbmRlciBvZiBkZWFyIEp1bGlldCdzIGhhbmQKICAgIEFuZCBzdGVhbCBpbW1vcnRhbCBibGVzc2luZyBmcm9tIGhlciBsaXBzLAogICAgV2hvIGV2ZW4gaW4gcHVyZSBhbmQgdmVzdGFsIG1vZGVzdHksCiAgICBTdGlsbCBibHVzaCwgYXMgdGhpbmtpbmcgdGhlaXIgb3duIGtpc3NlcyBzaW47CiAgICBCdXQgUm9tZW8gbWF5IG5vdDsgaGUgaXMgYmFuaXNoZWQ6CiAgICBGbGllcyBtYXkgZG8gdGhpcywgYnV0IEkgZnJvbSB0aGlzIG11c3QgZmx5OgogICAgVGhleSBhcmUgZnJlZSBtZW4sIGJ1dCBJIGFtIGJhbmlzaGVkLgogICAgQW5kIHNheSdzdCB0aG91IHlldCB0aGF0IGV4aWxlIGlzIG5vdCBkZWF0aD8KICAgIEhhZHN0IHRob3Ugbm8gcG9pc29uIG1peCdkLCBubyBzaGFycC1ncm91bmQga25pZmUsCiAgICBObyBzdWRkZW4gbWVhbiBvZiBkZWF0aCwgdGhvdWdoIG5lJ2VyIHNvIG1lYW4sCiAgICBCdXQgJ2JhbmlzaGVkJyB0byBraWxsIG1lPy0tJ2JhbmlzaGVkJz8KICAgIE8gZnJpYXIsIHRoZSBkYW1uZWQgdXNlIHRoYXQgd29yZCBpbiBoZWxsOwogICAgSG93bGluZ3MgYXR0ZW5kIGl0OiBob3cgaGFzdCB0aG91IHRoZSBoZWFydCwKICAgIEJlaW5nIGEgZGl2aW5lLCBhIGdob3N0bHkgY29uZmVzc29yLAogICAgQSBzaW4tYWJzb2x2ZXIsIGFuZCBteSBmcmllbmQgcHJvZmVzcydkLAogICAgVG8gbWFuZ2xlIG1lIHdpdGggdGhhdCB3b3JkICdiYW5pc2hlZCcCgpGUklBUiBMQVVSRU5DRQoKICAgIFRob3UgZm9uZCBtYWQgbWFuLCBoZWFyIG1lIGJ1dCBzcGVhayBhIHdvcmQuCgpST01FTwoKICAgIE8sIHRob3Ugd2lsdCBzcGVhayBhZ2FpbiBvZiBiYW5pc2htZW50LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJJ2xsIGdpdmUgdGhlZSBhcm1vdXIgdG8ga2VlcCBvZmYgdGhhdCB3b3JkOgogICAgQWR2ZXJzaXR5J3Mgc3dlZXQgbWlsaywgcGhpbG9zb3BoeSwKICAgIFRvIGNvbWZvcnQgdGhlZSwgdGhvdWdoIHRob3UgYXJ0IGJhbmlzaGVkLgoKUk9NRU8KCiAgICBZZXQgJ2JhbmlzaGVkJz8gSGFuZyB1cCBwaGlsb3NvcGh5IQogICAgVW5sZXNzIHBoaWxvc29waHkgY2FuIG1ha2UgYSBKdWxpZXQsCiAgICBEaXNwbGFudCBhIHRvd24sIHJldmVyc2UgYSBwcmluY2UncyBkb29tLAogICAgSXQgaGVscHMgbm90LCBpdCBwcmV2YWlscyBub3Q6IHRhbGsgbm8gbW9yZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTywgdGhlbiBJIHNlZSB0aGF0IG1hZG1lbiBoYXZlIG5vIGVhcnMuCgpST01FTwoKICAgIEhvdyBzaG91bGQgdGhleSwgd2hlbiB0aGF0IHdpc2UgbWVuIGhhdmUgbm8gZXllcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTGV0IG1lIGRpc3B1dGUgd2l0aCB0aGVlIG9mIHRoeSBlc3RhdGUuCgpST01FTwoKICAgIFRob3UgY2Fuc3Qgbm90IHNwZWFrIG9mIHRoYXQgdGhvdSBkb3N0IG5vdCBmZWVsOgogICAgV2VydCB0aG91IGFzIHlvdW5nIGFzIEksIEp1bGlldCB0aHkgbG92ZSwKICAgIEFuIGhvdXIgYnV0IG1hcnJpZWQsIFR5YmFsdCBtdXJkZXJlZCwKICAgIERvdGluZyBsaWtlIG1lIGFuZCBsaWtlIG1lIGJhbmlzaGVkLAogICAgVGhlbiBtaWdodHN0IHRob3Ugc3BlYWssIHRoZW4gbWlnaHRzdCB0aG91IHRlYXIgdGh5IGhhaXIsCiAgICBBbmQgZmFsbCB1cG9uIHRoZSBncm91bmQsIGFzIEkgZG8gbm93LAogICAgVGFraW5nIHRoZSBtZWFzdXJlIG9mIGFuIHVubWFkZSBncmF2ZS4KCiAgICBLbm9ja2luZyB3aXRoaW4KCkZSSUFSIExBVVJFTkNFCgogICAgQXJpc2U7IG9uZSBrbm9ja3M7IGdvb2QgUm9tZW8sIGhpZGUgdGh5c2VsZi4KClJPTUVPCgogICAgTm90IEk7IHVubGVzcyB0aGUgYnJlYXRoIG9mIGhlYXJ0c2ljayBncm9hbnMsCiAgICBNaXN0LWxpa2UsIGluZm9sZCBtZSBmcm9tIHRoZSBzZWFyY2ggb2YgZXllcy4KCiAgICBLbm9ja2luZwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIYXJrLCBob3cgdGhleSBrbm9jayEgV2hvJ3MgdGhlcmUIFJvbWVvLCBhcmlzZTsKICAgIFRob3Ugd2lsdCBiZSB0YWtlbi4gU3RheSBhd2hpbGUhIFN0YW5kIHVwOwoKICAgIEtub2NraW5nCiAgICBSdW4gdG8gbXkgc3R1ZHkuIEJ5IGFuZCBieSEgR29kJ3Mgd2lsbCwKICAgIFdoYXQgc2ltcGxlbmVzcyBpcyB0aGlzISBJIGNvbWUsIEkgY29tZSEKCiAgICBLbm9ja2luZwogICAgV2hvIGtub2NrcyBzbyBoYXJkPyB3aGVuY2UgY29tZSB5b3UIHdoYXQncyB5b3VyIHdpbGwCgpOdXJzZQoKICAgIFtXaXRoaW5dIExldCBtZSBjb21lIGluLCBhbmQgeW91IHNoYWxsIGtub3cKICAgIG15IGVycmFuZDsKICAgIEkgY29tZSBmcm9tIExhZHkgSnVsaWV0LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXZWxjb21lLCB0aGVuLgoKICAgIEVudGVyIE51cnNlCgpOdXJzZQoKICAgIE8gaG9seSBmcmlhciwgTywgdGVsbCBtZSwgaG9seSBmcmlhciwKICAgIFdoZXJlIGlzIG15IGxhZHkncyBsb3JkLCB3aGVyZSdzIFJvbWVvPwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGVyZSBvbiB0aGUgZ3JvdW5kLCB3aXRoIGhpcyBvd24gdGVhcnMgbWFkZSBkcnVuay4KCk51cnNlCgogICAgTywgaGUgaXMgZXZlbiBpbiBteSBtaXN0cmVzcycgY2FzZSwKICAgIEp1c3QgaW4gaGVyIGNhc2UhIE8gd29mdWwgc3ltcGF0aHkhCiAgICBQaXRlb3VzIHByZWRpY2FtZW50ISBFdmVuIHNvIGxpZXMgc2hlLAogICAgQmx1YmJlcmluZyBhbmQgd2VlcGluZywgd2VlcGluZyBhbmQgYmx1YmJlcmluZy4KICAgIFN0YW5kIHVwLCBzdGFuZCB1cDsgc3RhbmQsIGFuZCB5b3UgYmUgYSBtYW46CiAgICBGb3IgSnVsaWV0J3Mgc2FrZSwgZm9yIGhlciBzYWtlLCByaXNlIGFuZCBzdGFuZDsKICAgIFdoeSBzaG91bGQgeW91IGZhbGwgaW50byBzbyBkZWVwIGFuIE8CgpST01FTwoKICAgIE51cnNlIQoKTnVyc2UKCiAgICBBaCBzaXIhIGFoIHNpciEgV2VsbCwgZGVhdGgncyB0aGUgZW5kIG9mIGFsbC4KClJPTUVPCgogICAgU3Bha2VzdCB0aG91IG9mIEp1bGlldD8gaG93IGlzIGl0IHdpdGggaGVyPwogICAgRG90aCBzaGUgbm90IHRoaW5rIG1lIGFuIG9sZCBtdXJkZXJlciwKICAgIE5vdyBJIGhhdmUgc3RhaW4nZCB0aGUgY2hpbGRob29kIG9mIG91ciBqb3kKICAgIFdpdGggYmxvb2QgcmVtb3ZlZCBidXQgbGl0dGxlIGZyb20gaGVyIG93bj8KICAgIFdoZXJlIGlzIHNoZT8gYW5kIGhvdyBkb3RoIHNoZT8gYW5kIHdoYXQgc2F5cwogICAgTXkgY29uY2VhbCdkIGxhZHkgdG8gb3VyIGNhbmNlbGwnZCBsb3ZlPwoKTnVyc2UKCiAgICBPLCBzaGUgc2F5cyBub3RoaW5nLCBzaXIsIGJ1dCB3ZWVwcyBhbmQgd2VlcHM7CiAgICBBbmQgbm93IGZhbGxzIG9uIGhlciBiZWQ7IGFuZCB0aGVuIHN0YXJ0cyB1cCwKICAgIEFuZCBUeWJhbHQgY2FsbHM7IGFuZCB0aGVuIG9uIFJvbWVvIGNyaWVzLAogICAgQW5kIHRoZW4gZG93biBmYWxscyBhZ2Fpbi4KClJPTUVPCgogICAgQXMgaWYgdGhhdCBuYW1lLAogICAgU2hvdCBmcm9tIHRoZSBkZWFkbHkgbGV2ZWwgb2YgYSBndW4sCiAgICBEaWQgbXVyZGVyIGhlcjsgYXMgdGhhdCBuYW1lJ3MgY3Vyc2VkIGhhbmQKICAgIE11cmRlcidkIGhlciBraW5zbWFuLiBPLCB0ZWxsIG1lLCBmcmlhciwgdGVsbCBtZSwKICAgIEluIHdoYXQgdmlsZSBwYXJ0IG9mIHRoaXMgYW5hdG9teQogICAgRG90aCBteSBuYW1lIGxvZGdlPyB0ZWxsIG1lLCB0aGF0IEkgbWF5IHNhY2sKICAgIFRoZSBoYXRlZnVsIG1hbnNpb24uCgogICAgRHJhd2luZyBoaXMgc3dvcmQKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZCB0aHkgZGVzcGVyYXRlIGhhbmQ6CiAgICBBcnQgdGhvdSBhIG1hbj8gdGh5IGZvcm0gY3JpZXMgb3V0IHRob3UgYXJ0OgogICAgVGh5IHRlYXJzIGFyZSB3b21hbmlzaDsgdGh5IHdpbGQgYWN0cyBkZW5vdGUKICAgIFRoZSB1bnJlYXNvbmFibGUgZnVyeSBvZiBhIGJlYXN0OgogICAgVW5zZWVtbHkgd29tYW4gaW4gYSBzZWVtaW5nIG1hbiEKICAgIE9yIGlsbC1iZXNlZW1pbmcgYmVhc3QgaW4gc2VlbWluZyBib3RoIQogICAgVGhvdSBoYXN0IGFtYXplZCBtZTogYnkgbXkgaG9seSBvcmRlciwKICAgIEkgdGhvdWdodCB0aHkgZGlzcG9zaXRpb24gYmV0dGVyIHRlbXBlcidkLgogICAgSGFzdCB0aG91IHNsYWluIFR5YmFsdD8gd2lsdCB0aG91IHNsYXkgdGh5c2VsZj8KICAgIEFuZCBzdGF5IHRoeSBsYWR5IHRvbyB0aGF0IGxpdmVzIGluIHRoZWUsCiAgICBCeSBkb2luZyBkYW1uZWQgaGF0ZSB1cG9uIHRoeXNlbGYCiAgICBXaHkgcmFpbCdzdCB0aG91IG9uIHRoeSBiaXJ0aCwgdGhlIGhlYXZlbiwgYW5kIGVhcnRoPwogICAgU2luY2UgYmlydGgsIGFuZCBoZWF2ZW4sIGFuZCBlYXJ0aCwgYWxsIHRocmVlIGRvIG1lZXQKICAgIEluIHRoZWUgYXQgb25jZTsgd2hpY2ggdGhvdSBhdCBvbmNlIHdvdWxkc3QgbG9zZS4KICAgIEZpZSwgZmllLCB0aG91IHNoYW1lc3QgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDsKICAgIFdoaWNoLCBsaWtlIGEgdXN1cmVyLCBhYm91bmQnc3QgaW4gYWxsLAogICAgQW5kIHVzZXN0IG5vbmUgaW4gdGhhdCB0cnVlIHVzZSBpbmRlZWQKICAgIFdoaWNoIHNob3VsZCBiZWRlY2sgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDoKICAgIFRoeSBub2JsZSBzaGFwZSBpcyBidXQgYSBmb3JtIG9mIHdheCwKICAgIERpZ3Jlc3NpbmcgZnJvbSB0aGUgdmFsb3VyIG9mIGEgbWFuOwogICAgVGh5IGRlYXIgbG92ZSBzd29ybiBidXQgaG9sbG93IHBlcmp1cnksCiAgICBLaWxsaW5nIHRoYXQgbG92ZSB3aGljaCB0aG91IGhhc3Qgdm93J2QgdG8gY2hlcmlzaDsKICAgIFRoeSB3aXQsIHRoYXQgb3JuYW1lbnQgdG8gc2hhcGUgYW5kIGxvdmUsCiAgICBNaXNzaGFwZW4gaW4gdGhlIGNvbmR1Y3Qgb2YgdGhlbSBib3RoLAogICAgTGlrZSBwb3dkZXIgaW4gYSBza2l0bGVzcyBzb2xkaWVyJ3MgZmxhc2ssCiAgICBJcyBzZXQgYWZpcmUgYnkgdGhpbmUgb3duIGlnbm9yYW5jZSwKICAgIEFuZCB0aG91IGRpc21lbWJlcidkIHdpdGggdGhpbmUgb3duIGRlZmVuY2UuCiAgICBXaGF0LCByb3VzZSB0aGVlLCBtYW4hIHRoeSBKdWxpZXQgaXMgYWxpdmUsCiAgICBGb3Igd2hvc2UgZGVhciBzYWtlIHRob3Ugd2FzdCBidXQgbGF0ZWx5IGRlYWQ7CiAgICBUaGVyZSBhcnQgdGhvdSBoYXBweTogVHliYWx0IHdvdWxkIGtpbGwgdGhlZSwKICAgIEJ1dCB0aG91IHNsZXcnc3QgVHliYWx0OyB0aGVyZSBhcmUgdGhvdSBoYXBweSB0b286CiAgICBUaGUgbGF3IHRoYXQgdGhyZWF0ZW4nZCBkZWF0aCBiZWNvbWVzIHRoeSBmcmllbmQKICAgIEFuZCB0dXJucyBpdCB0byBleGlsZTsgdGhlcmUgYXJ0IHRob3UgaGFwcHk6CiAgICBBIHBhY2sgb2YgYmxlc3NpbmdzIGxpZ2h0cyB1cCB1cG9uIHRoeSBiYWNrOwogICAgSGFwcGluZXNzIGNvdXJ0cyB0aGVlIGluIGhlciBiZXN0IGFycmF5OwogICAgQnV0LCBsaWtlIGEgbWlzYmVoYXZlZCBhbmQgc3VsbGVuIHdlbmNoLAogICAgVGhvdSBwb3V0J3N0IHVwb24gdGh5IGZvcnR1bmUgYW5kIHRoeSBsb3ZlOgogICAgVGFrZSBoZWVkLCB0YWtlIGhlZWQsIGZvciBzdWNoIGRpZSBtaXNlcmFibGUuCiAgICBHbywgZ2V0IHRoZWUgdG8gdGh5IGxvdmUsIGFzIHdhcyBkZWNyZWVkLAogICAgQXNjZW5kIGhlciBjaGFtYmVyLCBoZW5jZSBhbmQgY29tZm9ydCBoZXI6CiAgICBCdXQgbG9vayB0aG91IHN0YXkgbm90IHRpbGwgdGhlIHdhdGNoIGJlIHNldCwKICAgIEZvciB0aGVuIHRob3UgY2Fuc3Qgbm90IHBhc3MgdG8gTWFudHVhOwogICAgV2hlcmUgdGhvdSBzaGFsdCBsaXZlLCB0aWxsIHdlIGNhbiBmaW5kIGEgdGltZQogICAgVG8gYmxhemUgeW91ciBtYXJyaWFnZSwgcmVjb25jaWxlIHlvdXIgZnJpZW5kcywKICAgIEJlZyBwYXJkb24gb2YgdGhlIHByaW5jZSwgYW5kIGNhbGwgdGhlZSBiYWNrCiAgICBXaXRoIHR3ZW50eSBodW5kcmVkIHRob3VzYW5kIHRpbWVzIG1vcmUgam95CiAgICBUaGFuIHRob3Ugd2VudCdzdCBmb3J0aCBpbiBsYW1lbnRhdGlvbi4KICAgIEdvIGJlZm9yZSwgbnVyc2U6IGNvbW1lbmQgbWUgdG8gdGh5IGxhZHk7CiAgICBBbmQgYmlkIGhlciBoYXN0ZW4gYWxsIHRoZSBob3VzZSB0byBiZWQsCiAgICBXaGljaCBoZWF2eSBzb3Jyb3cgbWFrZXMgdGhlbSBhcHQgdW50bzoKICAgIFJvbWVvIGlzIGNvbWluZy4KCk51cnNlCgogICAgTyBMb3JkLCBJIGNvdWxkIGhhdmUgc3RheSdkIGhlcmUgYWxsIHRoZSBuaWdodAogICAgVG8gaGVhciBnb29kIGNvdW5zZWw6IE8sIHdoYXQgbGVhcm5pbmcgaXMhCiAgICBNeSBsb3JkLCBJJ2xsIHRlbGwgbXkgbGFkeSB5b3Ugd2lsbCBjb21lLgoKUk9NRU8KCiAgICBEbyBzbywgYW5kIGJpZCBteSBzd2VldCBwcmVwYXJlIHRvIGNoaWRlLgoKTnVyc2UKCiAgICBIZXJlLCBzaXIsIGEgcmluZyBzaGUgYmlkIG1lIGdpdmUgeW91LCBzaXI6CiAgICBIaWUgeW91LCBtYWtlIGhhc3RlLCBmb3IgaXQgZ3Jvd3MgdmVyeSBsYXRlLgoKICAgIEV4aXQKClJPTUVPCgogICAgSG93IHdlbGwgbXkgY29tZm9ydCBpcyByZXZpdmVkIGJ5IHRoaXMhCgpGUklBUiBMQVVSRU5DRQoKICAgIEdvIGhlbmNlOyBnb29kIG5pZ2h0OyBhbmQgaGVyZSBzdGFuZHMgYWxsIHlvdXIgc3RhdGU6CiAgICBFaXRoZXIgYmUgZ29uZSBiZWZvcmUgdGhlIHdhdGNoIGJlIHNldCwKICAgIE9yIGJ5IHRoZSBicmVhayBvZiBkYXkgZGlzZ3Vpc2VkIGZyb20gaGVuY2U6CiAgICBTb2pvdXJuIGluIE1hbnR1YTsgSSdsbCBmaW5kIG91dCB5b3VyIG1hbiwKICAgIEFuZCBoZSBzaGFsbCBzaWduaWZ5IGZyb20gdGltZSB0byB0aW1lCiAgICBFdmVyeSBnb29kIGhhcCB0byB5b3UgdGhhdCBjaGFuY2VzIGhlcmU6CiAgICBHaXZlIG1lIHRoeSBoYW5kOyAndGlzIGxhdGU6IGZhcmV3ZWxsOyBnb29kIG5pZ2h0LgoKUk9NRU8KCiAgICBCdXQgdGhhdCBhIGpveSBwYXN0IGpveSBjYWxscyBvdXQgb24gbWUsCiAgICBJdCB3ZXJlIGEgZ3JpZWYsIHNvIGJyaWVmIHRvIHBhcnQgd2l0aCB0aGVlOiBGYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHJvb20gaW4gQ2FwdWxldCdzIGhvdXNlLgoKICAgIEVudGVyIENBUFVMRVQsIExBRFkgQ0FQVUxFVCwgYW5kIFBBUklTIAoKQ0FQVUxFVAoKICAgIFRoaW5ncyBoYXZlIGZhbGwnbiBvdXQsIHNpciwgc28gdW5sdWNraWx5LAogICAgVGhhdCB3ZSBoYXZlIGhhZCBubyB0aW1lIHRvIG1vdmUgb3VyIGRhdWdodGVyOgogICAgTG9vayB5b3UsIHNoZSBsb3ZlZCBoZXIga2luc21hbiBUeWJhbHQgZGVhcmx5LAogICAgQW5kIHNvIGRpZCBJOi0tV2VsbCwgd2Ugd2VyZSBib3JuIHRvIGRpZS4KICAgICdUaXMgdmVyeSBsYXRlLCBzaGUnbGwgbm90IGNvbWUgZG93biB0by1uaWdodDoKICAgIEkgcHJvbWlzZSB5b3UsIGJ1dCBmb3IgeW91ciBjb21wYW55LAogICAgSSB3b3VsZCBoYXZlIGJlZW4gYS1iZWQgYW4gaG91ciBhZ28uCgpQQVJJUwoKICAgIFRoZXNlIHRpbWVzIG9mIHdvZSBhZmZvcmQgbm8gdGltZSB0byB3b28uCiAgICBNYWRhbSwgZ29vZCBuaWdodDogY29tbWVuZCBtZSB0byB5b3VyIGRhdWdodGVyLgoKTEFEWSBDQVBVTEVUCgogICAgSSB3aWxsLCBhbmQga25vdyBoZXIgbWluZCBlYXJseSB0by1tb3Jyb3c7CiAgICBUby1uaWdodCBzaGUgaXMgbWV3J2QgdXAgdG8gaGVyIGhlYXZpbmVzcy4KCkNBUFVMRVQKCiAgICBTaXIgUGFyaXMsIEkgd2lsbCBtYWtlIGEgZGVzcGVyYXRlIHRlbmRlcgogICAgT2YgbXkgY2hpbGQncyBsb3ZlOiBJIHRoaW5rIHNoZSB3aWxsIGJlIHJ1bGVkCiAgICBJbiBhbGwgcmVzcGVjdHMgYnkgbWU7IG5heSwgbW9yZSwgSSBkb3VidCBpdCBub3QuCiAgICBXaWZlLCBnbyB5b3UgdG8gaGVyIGVyZSB5b3UgZ28gdG8gYmVkOwogICAgQWNxdWFpbnQgaGVyIGhlcmUgb2YgbXkgc29uIFBhcmlzJyBsb3ZlOwogICAgQW5kIGJpZCBoZXIsIG1hcmsgeW91IG1lLCBvbiBXZWRuZXNkYXkgbmV4dC0tCiAgICBCdXQsIHNvZnQhIHdoYXQgZGF5IGlzIHRoaXMCgpQQVJJUwoKICAgIE1vbmRheSwgbXkgbG9yZCwKCkNBUFVMRVQKCiAgICBNb25kYXkhIGhhLCBoYSEgV2VsbCwgV2VkbmVzZGF5IGlzIHRvbyBzb29uLAogICAgTycgVGh1cnNkYXkgbGV0IGl0IGJlOiBvJyBUaHVyc2RheSwgdGVsbCBoZXIsCiAgICBTaGUgc2hhbGwgYmUgbWFycmllZCB0byB0aGlzIG5vYmxlIGVhcmwuCiAgICBXaWxsIHlvdSBiZSByZWFkeT8gZG8geW91IGxpa2UgdGhpcyBoYXN0ZT8KICAgIFdlJ2xsIGtlZXAgbm8gZ3JlYXQgYWRvLC0tYSBmcmllbmQgb3IgdHdvOwogICAgRm9yLCBoYXJrIHlvdSwgVHliYWx0IGJlaW5nIHNsYWluIHNvIGxhdGUsCiAgICBJdCBtYXkgYmUgdGhvdWdodCB3ZSBoZWxkIGhpbSBjYXJlbGVzc2x5LAogICAgQmVpbmcgb3VyIGtpbnNtYW4sIGlmIHdlIHJldmVsIG11Y2g6CiAgICBUaGVyZWZvcmUgd2UnbGwgaGF2ZSBzb21lIGhhbGYgYSBkb3plbiBmcmllbmRzLAogICAgQW5kIHRoZXJlIGFuIGVuZC4gQnV0IHdoYXQgc2F5IHlvdSB0byBUaHVyc2RheT8KClBBUklTCgogICAgTXkgbG9yZCwgSSB3b3VsZCB0aGF0IFRodXJzZGF5IHdlcmUgdG8tbW9ycm93LgoKQ0FQVUxFVAoKICAgIFdlbGwgZ2V0IHlvdSBnb25lOiBvJyBUaHVyc2RheSBiZSBpdCwgdGhlbi4KICAgIEdvIHlvdSB0byBKdWxpZXQgZXJlIHlvdSBnbyB0byBiZWQsCiAgICBQcmVwYXJlIGhlciwgd2lmZSwgYWdhaW5zdCB0aGlzIHdlZGRpbmctZGF5LgogICAgRmFyZXdlbGwsIG15IGxvcmQuIExpZ2h0IHRvIG15IGNoYW1iZXIsIGhvIQogICAgQWZvcmUgbWUhIGl0IGlzIHNvIHZlcnkgdmVyeSBsYXRlLAogICAgVGhhdCB3ZSBtYXkgY2FsbCBpdCBlYXJseSBieSBhbmQgYnkuCiAgICBHb29kIG5pZ2h0LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gYW5kIEpVTElFVCBhYm92ZSwgYXQgdGhlIHdpbmRvdyAKCkpVTElFVAoKICAgIFdpbHQgdGhvdSBiZSBnb25lPyBpdCBpcyBub3QgeWV0IG5lYXIgZGF5OgogICAgSXQgd2FzIHRoZSBuaWdodGluZ2FsZSwgYW5kIG5vdCB0aGUgbGFyaywKICAgIFRoYXQgcGllcmNlZCB0aGUgZmVhcmZ1bCBob2xsb3cgb2YgdGhpbmUgZWFyOwogICAgTmlnaHRseSBzaGUgc2luZ3Mgb24geW9uIHBvbWVncmFuYXRlLXRyZWU6CiAgICBCZWxpZXZlIG1lLCBsb3ZlLCBpdCB3YXMgdGhlIG5pZ2h0aW5nYWxlLgoKUk9NRU8KCiAgICBJdCB3YXMgdGhlIGxhcmssIHRoZSBoZXJhbGQgb2YgdGhlIG1vcm4sCiAgICBObyBuaWdodGluZ2FsZTogbG9vaywgbG92ZSwgd2hhdCBlbnZpb3VzIHN0cmVha3MKICAgIERvIGxhY2UgdGhlIHNldmVyaW5nIGNsb3VkcyBpbiB5b25kZXIgZWFzdDoKICAgIE5pZ2h0J3MgY2FuZGxlcyBhcmUgYnVybnQgb3V0LCBhbmQgam9jdW5kIGRheQogICAgU3RhbmRzIHRpcHRvZSBvbiB0aGUgbWlzdHkgbW91bnRhaW4gdG9wcy4KICAgIEkgbXVzdCBiZSBnb25lIGFuZCBsaXZlLCBvciBzdGF5IGFuZCBkaWUuCgpKVUxJRVQKCiAgICBZb24gbGlnaHQgaXMgbm90IGRheS1saWdodCwgSSBrbm93IGl0LCBJOgogICAgSXQgaXMgc29tZSBtZXRlb3IgdGhhdCB0aGUgc3VuIGV4aGFsZXMsCiAgICBUbyBiZSB0byB0aGVlIHRoaXMgbmlnaHQgYSB0b3JjaC1iZWFyZXIsCiAgICBBbmQgbGlnaHQgdGhlZSBvbiB0aHkgd2F5IHRvIE1hbnR1YToKICAgIFRoZXJlZm9yZSBzdGF5IHlldDsgdGhvdSBuZWVkJ3N0IG5vdCB0byBiZSBnb25lLgoKUk9NRU8KCiAgICBMZXQgbWUgYmUgdGEnZW4sIGxldCBtZSBiZSBwdXQgdG8gZGVhdGg7CiAgICBJIGFtIGNvbnRlbnQsIHNvIHRob3Ugd2lsdCBoYXZlIGl0IHNvLgogICAgSSdsbCBzYXkgeW9uIGdyZXkgaXMgbm90IHRoZSBtb3JuaW5nJ3MgZXllLAogICAgJ1RpcyBidXQgdGhlIHBhbGUgcmVmbGV4IG9mIEN5bnRoaWEncyBicm93OwogICAgTm9yIHRoYXQgaXMgbm90IHRoZSBsYXJrLCB3aG9zZSBub3RlcyBkbyBiZWF0CiAgICBUaGUgdmF1bHR5IGhlYXZlbiBzbyBoaWdoIGFib3ZlIG91ciBoZWFkczoKICAgIEkgaGF2ZSBtb3JlIGNhcmUgdG8gc3RheSB0aGFuIHdpbGwgdG8gZ286CiAgICBDb21lLCBkZWF0aCwgYW5kIHdlbGNvbWUhIEp1bGlldCB3aWxscyBpdCBzby4KICAgIEhvdyBpcyd0LCBteSBzb3VsPyBsZXQncyB0YWxrOyBpdCBpcyBub3QgZGF5LgoKSlVMSUVUCgogICAgSXQgaXMsIGl0IGlzOiBoaWUgaGVuY2UsIGJlIGdvbmUsIGF3YXkhCiAgICBJdCBpcyB0aGUgbGFyayB0aGF0IHNpbmdzIHNvIG91dCBvZiB0dW5lLAogICAgU3RyYWluaW5nIGhhcnNoIGRpc2NvcmRzIGFuZCB1bnBsZWFzaW5nIHNoYXJwcy4KICAgIFNvbWUgc2F5IHRoZSBsYXJrIG1ha2VzIHN3ZWV0IGRpdmlzaW9uOwogICAgVGhpcyBkb3RoIG5vdCBzbywgZm9yIHNoZSBkaXZpZGV0aCB1czoKICAgIFNvbWUgc2F5IHRoZSBsYXJrIGFuZCBsb2F0aGVkIHRvYWQgY2hhbmdlIGV5ZXMsCiAgICBPLCBub3cgSSB3b3VsZCB0aGV5IGhhZCBjaGFuZ2VkIHZvaWNlcyB0b28hCiAgICBTaW5jZSBhcm0gZnJvbSBhcm0gdGhhdCB2b2ljZSBkb3RoIHVzIGFmZnJheSwKICAgIEh1bnRpbmcgdGhlZSBoZW5jZSB3aXRoIGh1bnQnc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cmUgd2VlcGluZyBmb3IgeW91ciBjb3VzaW4ncyBkZWF0aD8KICAgIFdoYXQsIHdpbHQgdGhvdSB3YXNoIGhpbSBmcm9tIGhpcyBncmF2ZSB3aXRoIHRlYXJzPwogICAgQW4gaWYgdGhvdSBjb3VsZHN0LCB0aG91IGNvdWxkc3Qgbm90IG1ha2UgaGltIGxpdmU7CiAgICBUaGVyZWZvcmUsIGhhdmUgZG9uZTogc29tZSBncmllZiBzaG93cyBtdWNoIG9mIGxvdmU7CiAgICBCdXQgbXVjaCBvZiBncmllZiBzaG93cyBzdGlsbCBzb21lIHdhbnQgb2Ygd2l0LgoKSlVMSUVUCgogICAgWWV0IGxldCBtZSB3ZWVwIGZvciBzdWNoIGEgZmVlbGluZyBsb3NzLgoKTEFEWSBDQVBVTEVUCgogICAgU28gc2hhbGwgeW91IGZlZWwgdGhlIGxvc3MsIGJ1dCBub3QgdGhlIGZyaWVuZAogICAgV2hpY2ggeW91IHdlZXAgZm9yLgoKSlVMSUVUCgogICAgRmVlbGluZyBzbyB0aGUgbG9zcywKICAgIENhbm5vdCBjaG9vc2UgYnV0IGV2ZXIgd2VlcCB0aGUgZnJpZW5kLgoKTEFEWSBDQVBVTEVUCgogICAgV2VsbCwgZ2lybCwgdGhvdSB3ZWVwJ3N0IG5vdCBzbyBtdWNoIGZvciBoaXMgZGVhdGgsCiAgICBBcyB0aGF0IHRoZSB2aWxsYWluIGxpdmVzIHdoaWNoIHNsYXVnaHRlcidkIGhpbS4KCkpVTElFVAoKICAgIFdoYXQgdmlsbGFpbiBtYWRhbT8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoYXQgc2FtZSB2aWxsYWluLCBSb21lby4KCkpVTElFVAoKICAgIFtBc2lkZV0gVmlsbGFpbiBhbmQgaGUgYmUgbWFueSBtaWxlcyBhc3VuZGVyLi0tCiAgICBHb2QgUGFyZG9uIGhpbSEgSSBkbywgd2l0aCBhbGwgbXkgaGVhcnQ7CiAgICBBbmQgeWV0IG5vIG1hbiBsaWtlIGhlIGRvdGggZ3JpZXZlIG15IGhlYXJ0LgoKTEFEWSBDQVBVTEVUCgogICAgVGhhdCBpcywgYmVjYXVzZSB0aGUgdHJhaXRvciBtdXJkZXJlciBsaXZlcy4KCkpVTElFVAoKICAgIEF5LCBtYWRhbSwgZnJvbSB0aGUgcmVhY2ggb2YgdGhlc2UgbXkgaGFuZHM6CiAgICBXb3VsZCBub25lIGJ1dCBJIG1pZ2h0IHZlbmdlIG15IGNvdXNpbidzIGRlYXRoIQoKTEFEWSBDQVBVTEVUCgogICAgV2Ugd2lsbCBoYXZlIHZlbmdlYW5jZSBmb3IgaXQsIGZlYXIgdGhvdSBub3Q6CiAgICBUaGVuIHdlZXAgbm8gbW9yZS4gSSdsbCBzZW5kIHRvIG9uZSBpbiBNYW50dWEsCiAgICBXaGVyZSB0aGF0IHNhbWUgYmFuaXNoJ2QgcnVuYWdhdGUgZG90aCBsaXZlLAogICAgU2hhbGwgZ2l2ZSBoaW0gc3VjaCBhbiB1bmFjY3VzdG9tJ2QgZHJhbSwKICAgIFRoYXQgaGUgc2hhbGwgc29vbiBrZWVwIFR5YmFsdCBjb21wYW55OgogICAgQW5kIHRoZW4sIEkgaG9wZSwgdGhvdSB3aWx0IGJlIHNhdGlzZmllZC4KCkpVTElFVAoKICAgIEluZGVlZCwgSSBuZXZlciBzaGFsbCBiZSBzYXRpc2ZpZWQKICAgIFdpdGggUm9tZW8sIHRpbGwgSSBiZWhvbGQgaGltLS1kZWFkLS0KICAgIElzIG15IHBvb3IgaGVhcnQgZm9yIGEga2luc21hbiB2ZXgnZC4KICAgIE1hZGFtLCBpZiB5b3UgY291bGQgZmluZCBvdXQgYnV0IGEgbWFuCiAgICBUbyBiZWFyIGEgcG9pc29uLCBJIHdvdWxkIHRlbXBlciBpdDsKICAgIFRoYXQgUm9tZW8gc2hvdWxkLCB1cG9uIHJlY2VpcHQgdGhlcmVvZiwKICAgIFNvb24gc2xlZXAgaW4gcXVpZXQuIE8sIGhvdyBteSBoZWFydCBhYmhvcnMKICAgIFRvIGhlYXIgaGltIG5hbWVkLCBhbmQgY2Fubm90IGNvbWUgdG8gaGltLgogICAgVG8gd3JlYWsgdGhlIGxvdmUgSSBib3JlIG15IGNvdXNpbgogICAgVXBvbiBoaXMgYm9keSB0aGF0IHNsYXVnaHRlcidkIGhpbSEKCkxBRFkgQ0FQVUxFVAoKICAgIEZpbmQgdGhvdSB0aGUgbWVhbnMsIGFuZCBJJ2xsIGZpbmQgc3VjaCBhIG1hbi4KICAgIEJ1dCBub3cgSSdsbCB0ZWxsIHRoZWUgam95ZnVsIHRpZGluZ3MsIGdpcmwuCgpKVUxJRVQKCiAgICBBbmQgam95IGNvbWVzIHdlbGwgaW4gc3VjaCBhIG5lZWR5IHRpbWU6CiAgICBXaGF0IGFyZSB0aGV5LCBJIGJlc2VlY2ggeW91ciBsYWR5c2hpcD8KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHdlbGwsIHRob3UgaGFzdCBhIGNhcmVmdWwgZmF0aGVyLCBjaGlsZDsKICAgIE9uZSB3aG8sIHRvIHB1dCB0aGVlIGZyb20gdGh5IGhlYXZpbmVzcywKICAgIEhhdGggc29ydGVkIG91dCBhIHN1ZGRlbiBkYXkgb2Ygam95LAogICAgVGhhdCB0aG91IGV4cGVjdCdzdCBub3Qgbm9yIEkgbG9vaydkIG5vdCBmb3IuCgpKVUxJRVQKCiAgICBNYWRhbSwgaW4gaGFwcHkgdGltZSwgd2hhdCBkYXkgaXMgdGhhdD8KCkxBRFkgQ0FQVUxFVAoKICAgIE1hcnJ5LCBteSBjaGlsZCwgZWFybHkgbmV4dCBUaHVyc2RheSBtb3JuLAogICAgVGhlIGdhbGxhbnQsIHlvdW5nIGFuZCBub2JsZSBnZW50bGVtYW4sCiAgICBUaGUgQ291bnR5IFBhcmlzLCBhdCBTYWludCBQZXRlcidzIENodXJjaCwKICAgIFNoYWxsIGhhcHBpbHkgbWFrZSB0aGVlIHRoZXJlIGEgam95ZnVsIGJyaWRlLgoKSlVMSUVUCgogICAgTm93LCBieSBTYWludCBQZXRlcidzIENodXJjaCBhbmQgUGV0ZXIgdG9vLAogICAgSGUgc2hhbGwgbm90IG1ha2UgbWUgdGhlcmUgYSBqb3lmdWwgYnJpZGUuCiAgICBJIHdvbmRlciBhdCB0aGlzIGhhc3RlOyB0aGF0IEkgbXVzdCB3ZWQKICAgIEVyZSBoZSwgdGhhdCBzaG91bGQgYmUgaHVzYmFuZCwgY29tZXMgdG8gd29vLgogICAgSSBwcmF5IHlvdSwgdGVsbCBteSBsb3JkIGFuZCBmYXRoZXIsIG1hZGFtLAogICAgSSB3aWxsIG5vdCBtYXJyeSB5ZXQ7IGFuZCwgd2hlbiBJIGRvLCBJIHN3ZWFyLAogICAgSXQgc2hhbGwgYmUgUm9tZW8sIHdob20geW91IGtub3cgSSBoYXRlLAogICAgUmF0aGVyIHRoYW4gUGFyaXMuIFRoZXNlIGFyZSBuZXdzIGluZGVlZCEKCkxBRFkgQ0FQVUxFVAoKICAgIEhlcmUgY29tZXMgeW91ciBmYXRoZXI7IHRlbGwgaGltIHNvIHlvdXJzZWxmLAogICAgQW5kIHNlZSBob3cgaGUgd2lsbCB0YWtlIGl0IGF0IHlvdXIgaGFuZHMuCgogICAgRW50ZXIgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBXaGVuIHRoZSBzdW4gc2V0cywgdGhlIGFpciBkb3RoIGRyaXp6bGUgZGV3OwogICAgQnV0IGZvciB0aGUgc3Vuc2V0IG9mIG15IGJyb3RoZXIncyBzb24KICAgIEl0IHJhaW5zIGRvd25yaWdodC4KICAgIEhvdyBub3chIGEgY29uZHVpdCwgZ2lybD8gd2hhdCwgc3RpbGwgaW4gdGVhcnMCiAgICBFdmVybW9yZSBzaG93ZXJpbmcIEluIG9uZSBsaXR0bGUgYm9keQogICAgVGhvdSBjb3VudGVyZmVpdCdzdCBhIGJhcmssIGEgc2VhLCBhIHdpbmQ7CiAgICBGb3Igc3RpbGwgdGh5IGV5ZXMsIHdoaWNoIEkgbWF5IGNhbGwgdGhlIHNlYSwKICAgIERvIGViYiBhbmQgZmxvdyB3aXRoIHRlYXJzOyB0aGUgYmFyayB0aHkgYm9keSBpcywKICAgIFNhaWxpbmcgaW4gdGhpcyBzYWx0IGZsb29kOyB0aGUgd2luZHMsIHRoeSBzaWdoczsKICAgIFdobywgcmFnaW5nIHdpdGggdGh5IHRlYXJzLCBhbmQgdGhleSB3aXRoIHRoZW0sCiAgICBXaXRob3V0IGEgc3VkZGVuIGNhbG0sIHdpbGwgb3ZlcnNldAogICAgVGh5IHRlbXBlc3QtdG9zc2VkIGJvZHkuIEhvdyBub3csIHdpZmUhCiAgICBIYXZlIHlvdSBkZWxpdmVyJ2QgdG8gaGVyIG91ciBkZWNyZWUCgpMQURZIENBUFVMRVQKCiAgICBBeSwgc2lyOyBidXQgc2hlIHdpbGwgbm9uZSwgc2hlIGdpdmVzIHlvdSB0aGFua3MuCiAgICBJIHdvdWxkIHRoZSBmb29sIHdlcmUgbWFycmllZCB0byBoZXIgZ3JhdmUhCgpDQVBVTEVUCgogICAgU29mdCEgdGFrZSBtZSB3aXRoIHlvdSwgdGFrZSBtZSB3aXRoIHlvdSwgd2lmZS4KICAgIEhvdyEgd2lsbCBzaGUgbm9uZT8gZG90aCBzaGUgbm90IGdpdmUgdXMgdGhhbmtzPwogICAgSXMgc2hlIG5vdCBwcm91ZD8gZG90aCBzaGUgbm90IGNvdW50IGhlciBibGVzdCwKICAgIFVud29ydGh5IGFzIHNoZSBpcywgdGhhdCB3ZSBoYXZlIHdyb3VnaHQKICAgIFNvIHdvcnRoeSBhIGdlbnRsZW1hbiB0byBiZSBoZXIgYnJpZGVncm9vbT8KCkpVTElFVAoKICAgIE5vdCBwcm91ZCwgeW91IGhhdmU7IGJ1dCB0aGFua2Z1bCwgdGhhdCB5b3UgaGF2ZToKICAgIFByb3VkIGNhbiBJIG5ldmVyIGJlIG9mIHdoYXQgSSBoYXRlOwogICAgQnV0IHRoYW5rZnVsIGV2ZW4gZm9yIGhhdGUsIHRoYXQgaXMgbWVhbnQgbG92ZS4KCkNBUFVMRVQKCiAgICBIb3cgbm93LCBob3cgbm93LCBjaG9wLWxvZ2ljISBXaGF0IGlzIHRoaXMCiAgICAnUHJvdWQsJyBhbmQgJ0kgdGhhbmsgeW91LCcgYW5kICdJIHRoYW5rIHlvdSBub3Q7JwogICAgQW5kIHlldCAnbm90IHByb3VkLCcgbWlzdHJlc3MgbWluaW9uLCB5b3UsCiAgICBUaGFuayBtZSBubyB0aGFua2luZ3MsIG5vciwgcHJvdWQgbWUgbm8gcHJvdWRzLAogICAgQnV0IGZldHRsZSB5b3VyIGZpbmUgam9pbnRzICdnYWluc3QgVGh1cnNkYXkgbmV4dCwKICAgIFRvIGdvIHdpdGggUGFyaXMgdG8gU2FpbnQgUGV0ZXIncyBDaHVyY2gsCiAgICBPciBJIHdpbGwgZHJhZyB0aGVlIG9uIGEgaHVyZGxlIHRoaXRoZXIuCiAgICBPdXQsIHlvdSBncmVlbi1zaWNrbmVzcyBjYXJyaW9uISBvdXQsIHlvdSBiYWdnYWdlIQogICAgWW91IHRhbGxvdy1mYWNlIQoKTEFEWSBDQVBVTEVUCgogICAgRmllLCBmaWUhIHdoYXQsIGFyZSB5b3UgbWFkPwoKSlVMSUVUCgogICAgR29vZCBmYXRoZXIsIEkgYmVzZWVjaCB5b3Ugb24gbXkga25lZXMsCiAgICBIZWFyIG1lIHdpdGggcGF0aWVuY2UgYnV0IHRvIHNwZWFrIGEgd29yZC4KCkNBUFVMRVQKCiAgICBIYW5nIHRoZWUsIHlvdW5nIGJhZ2dhZ2UhIGRpc29iZWRpZW50IHdyZXRjaCEKICAgIEkgdGVsbCB0aGVlIHdoYXQ6IGdldCB0aGVlIHRvIGNodXJjaCBvJyBUaHVyc2RheSwKICAgIE9yIG5ldmVyIGFmdGVyIGxvb2sgbWUgaW4gdGhlIGZhY2U6CiAgICBTcGVhayBub3QsIHJlcGx5IG5vdCwgZG8gbm90IGFuc3dlciBtZTsKICAgIE15IGZpbmdlcnMgaXRjaC4gV2lmZSwgd2Ugc2NhcmNlIHRob3VnaHQgdXMgYmxlc3QKICAgIFRoYXQgR29kIGhhZCBsZW50IHVzIGJ1dCB0aGlzIG9ubHkgY2hpbGQ7CiAgICBCdXQgbm93IEkgc2VlIHRoaXMgb25lIGlzIG9uZSB0b28gbXVjaCwKICAgIEFuZCB0aGF0IHdlIGhhdmUgYSBjdXJzZSBpbiBoYXZpbmcgaGVyOgogICAgT3V0IG9uIGhlciwgaGlsZGluZyEKCk51cnNlCgogICAgR29kIGluIGhlYXZlbiBibGVzcyBoZXIhCiAgICBZb3UgYXJlIHRvIGJsYW1lLCBteSBsb3JkLCB0byByYXRlIGhlciBzby4KCkNBUFVMRVQKCiAgICBBbmQgd2h5LCBteSBsYWR5IHdpc2RvbT8gaG9sZCB5b3VyIHRvbmd1ZSwKICAgIEdvb2QgcHJ1ZGVuY2U7IHNtYXR0ZXIgd2l0aCB5b3VyIGdvc3NpcHMsIGdvLgoKTnVyc2UKCiAgICBJIHNwZWFrIG5vIHRyZWFzb24uCgpDQVBVTEVUCgogICAgTywgR29kIHllIGdvZC1kZW4uCgpOdXJzZQoKICAgIE1heSBub3Qgb25lIHNwZWFrPwoKQ0FQVUxFVAoKICAgIFBlYWNlLCB5b3UgbXVtYmxpbmcgZm9vbCEKICAgIFV0dGVyIHlvdXIgZ3Jhdml0eSBvJ2VyIGEgZ29zc2lwJ3MgYm93bDsKICAgIEZvciBoZXJlIHdlIG5lZWQgaXQgbm90LgoKTEFEWSBDQVBVTEVUCgogICAgWW91IGFyZSB0b28gaG90LgoKQ0FQVUxFVAoKICAgIEdvZCdzIGJyZWFkISBpdCBtYWtlcyBtZSBtYWQ6CiAgICBEYXksIG5pZ2h0LCBob3VyLCB0aWRlLCB0aW1lLCB3b3JrLCBwbGF5LAogICAgQWxvbmUsIGluIGNvbXBhbnksIHN0aWxsIG15IGNhcmUgaGF0aCBiZWVuCiAgICBUbyBoYXZlIGhlciBtYXRjaCdkOiBhbmQgaGF2aW5nIG5vdyBwcm92aWRlZAogICAgQSBnZW50bGVtYW4gb2Ygbm9ibGUgcGFyZW50YWdlLAogICAgT2YgZmFpciBkZW1lc25lcywgeW91dGhmdWwsIGFuZCBub2JseSB0cmFpbidkLAogICAgU3R1ZmYnZCwgYXMgdGhleSBzYXksIHdpdGggaG9ub3VyYWJsZSBwYXJ0cywKICAgIFByb3BvcnRpb24nZCBhcyBvbmUncyB0aG91Z2h0IHdvdWxkIHdpc2ggYSBtYW47CiAgICBBbmQgdGhlbiB0byBoYXZlIGEgd3JldGNoZWQgcHVsaW5nIGZvb2wsCiAgICBBIHdoaW5pbmcgbWFtbWV0LCBpbiBoZXIgZm9ydHVuZSdzIHRlbmRlciwKICAgIFRvIGFuc3dlciAnSSdsbCBub3Qgd2VkOyBJIGNhbm5vdCBsb3ZlLAogICAgSSBhbSB0b28geW91bmc7IEkgcHJheSB5b3UsIHBhcmRvbiBtZS4nCiAgICBCdXQsIGFzIHlvdSB3aWxsIG5vdCB3ZWQsIEknbGwgcGFyZG9uIHlvdToKICAgIEdyYXplIHdoZXJlIHlvdSB3aWxsIHlvdSBzaGFsbCBub3QgaG91c2Ugd2l0aCBtZToKICAgIExvb2sgdG8ndCwgdGhpbmsgb24ndCwgSSBkbyBub3QgdXNlIHRvIGplc3QuCiAgICBUaHVyc2RheSBpcyBuZWFyOyBsYXkgaGFuZCBvbiBoZWFydCwgYWR2aXNlOgogICAgQW4geW91IGJlIG1pbmUsIEknbGwgZ2l2ZSB5b3UgdG8gbXkgZnJpZW5kOwogICAgQW5kIHlvdSBiZSBub3QsIGhhbmcsIGJlZywgc3RhcnZlLCBkaWUgaW4KICAgIHRoZSBzdHJlZXRzLAogICAgRm9yLCBieSBteSBzb3VsLCBJJ2xsIG5lJ2VyIGFja25vd2xlZGdlIHRoZWUsCiAgICBOb3Igd2hhdCBpcyBtaW5lIHNoYWxsIG5ldmVyIGRvIHRoZWUgZ29vZDoKICAgIFRydXN0IHRvJ3QsIGJldGhpbmsgeW91OyBJJ2xsIG5vdCBiZSBmb3Jzd29ybi4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBJcyB0aGVyZSBubyBwaXR5IHNpdHRpbmcgaW4gdGhlIGNsb3VkcywKICAgIFRoYXQgc2VlcyBpbnRvIHRoZSBib3R0b20gb2YgbXkgZ3JpZWYCiAgICBPLCBzd2VldCBteSBtb3RoZXIsIGNhc3QgbWUgbm90IGF3YXkhCiAgICBEZWxheSB0aGlzIG1hcnJpYWdlIGZvciBhIG1vbnRoLCBhIHdlZWs7CiAgICBPciwgaWYgeW91IGRvIG5vdCwgbWFrZSB0aGUgYnJpZGFsIGJlZAogICAgSW4gdGhhdCBkaW0gbW9udW1lbnQgd2hlcmUgVHliYWx0IGxpZXMuCgpMQURZIENBUFVMRVQKCiAgICBUYWxrIG5vdCB0byBtZSwgZm9yIEknbGwgbm90IHNwZWFrIGEgd29yZDoKICAgIERvIGFzIHRob3Ugd2lsdCwgZm9yIEkgaGF2ZSBkb25lIHdpdGggdGhlZS4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIEdvZCEtLU8gbnVyc2UsIGhvdyBzaGFsbCB0aGlzIGJlIHByZXZlbnRlZD8KICAgIE15IGh1c2JhbmQgaXMgb24gZWFydGgsIG15IGZhaXRoIGluIGhlYXZlbjsKICAgIEhvdyBzaGFsbCB0aGF0IGZhaXRoIHJldHVybiBhZ2FpbiB0byBlYXJ0aCwKICAgIFVubGVzcyB0aGF0IGh1c2JhbmQgc2VuZCBpdCBtZSBmcm9tIGhlYXZlbgogICAgQnkgbGVhdmluZyBlYXJ0aD8gY29tZm9ydCBtZSwgY291bnNlbCBtZS4KICAgIEFsYWNrLCBhbGFjaywgdGhhdCBoZWF2ZW4gc2hvdWxkIHByYWN0aXNlIHN0cmF0YWdlbXMKICAgIFVwb24gc28gc29mdCBhIHN1YmplY3QgYXMgbXlzZWxmIQogICAgV2hhdCBzYXknc3QgdGhvdT8gaGFzdCB0aG91IG5vdCBhIHdvcmQgb2Ygam95PwogICAgU29tZSBjb21mb3J0LCBudXJzZS4KCk51cnNlCgogICAgRmFpdGgsIGhlcmUgaXQgaXMuCiAgICBSb21lbyBpcyBiYW5pc2gnZDsgYW5kIGFsbCB0aGUgd29ybGQgdG8gbm90aGluZywKICAgIFRoYXQgaGUgZGFyZXMgbmUnZXIgY29tZSBiYWNrIHRvIGNoYWxsZW5nZSB5b3U7CiAgICBPciwgaWYgaGUgZG8sIGl0IG5lZWRzIG11c3QgYmUgYnkgc3RlYWx0aC4KICAgIFRoZW4sIHNpbmNlIHRoZSBjYXNlIHNvIHN0YW5kcyBhcyBub3cgaXQgZG90aCwKICAgIEkgdGhpbmsgaXQgYmVzdCB5b3UgbWFycmllZCB3aXRoIHRoZSBjb3VudHkuCiAgICBPLCBoZSdzIGEgbG92ZWx5IGdlbnRsZW1hbiEKICAgIFJvbWVvJ3MgYSBkaXNoY2xvdXQgdG8gaGltOiBhbiBlYWdsZSwgbWFkYW0sCiAgICBIYXRoIG5vdCBzbyBncmVlbiwgc28gcXVpY2ssIHNvIGZhaXIgYW4gZXllCiAgICBBcyBQYXJpcyBoYXRoLiBCZXNocmV3IG15IHZlcnkgaGVhcnQsCiAgICBJIHRoaW5rIHlvdSBhcmUgaGFwcHkgaW4gdGhpcyBzZWNvbmQgbWF0Y2gsCiAgICBGb3IgaXQgZXhjZWxzIHlvdXIgZmlyc3Q6IG9yIGlmIGl0IGRpZCBub3QsCiAgICBZb3VyIGZpcnN0IGlzIGRlYWQ7IG9yICd0d2VyZSBhcyBnb29kIGhlIHdlcmUsCiAgICBBcyBsaXZpbmcgaGVyZSBhbmQgeW91IG5vIHVzZSBvZiBoaW0uCgpKVUxJRVQKCiAgICBTcGVha2VzdCB0aG91IGZyb20gdGh5IGhlYXJ0PwoKTnVyc2UKCiAgICBBbmQgZnJvbSBteSBzb3VsIHRvbzsKICAgIE9yIGVsc2UgYmVzaHJldyB0aGVtIGJvdGguCgpKVUxJRVQKCiAgICBBbWVuIQoKTnVyc2UKCiAgICBXaGF0PwoKSlVMSUVUCgogICAgV2VsbCwgdGhvdSBoYXN0IGNvbWZvcnRlZCBtZSBtYXJ2ZWxsb3VzIG11Y2guCiAgICBHbyBpbjogYW5kIHRlbGwgbXkgbGFkeSBJIGFtIGdvbmUsCiAgICBIYXZpbmcgZGlzcGxlYXNlZCBteSBmYXRoZXIsIHRvIExhdXJlbmNlJyBjZWxsLAogICAgVG8gbWFrZSBjb25mZXNzaW9uIGFuZCB0byBiZSBhYnNvbHZlZC4KCk51cnNlCgogICAgTWFycnksIEkgd2lsbDsgYW5kIHRoaXMgaXMgd2lzZWx5IGRvbmUuCgogICAgRXhpdAoKSlVMSUVUCgogICAgQW5jaWVudCBkYW1uYXRpb24hIE8gbW9zdCB3aWNrZWQgZmllbmQhCiAgICBJcyBpdCBtb3JlIHNpbiB0byB3aXNoIG1lIHRodXMgZm9yc3dvcm4sCiAgICBPciB0byBkaXNwcmFpc2UgbXkgbG9yZCB3aXRoIHRoYXQgc2FtZSB0b25ndWUKICAgIFdoaWNoIHNoZSBoYXRoIHByYWlzZWQgaGltIHdpdGggYWJvdmUgY29tcGFyZQogICAgU28gbWFueSB0aG91c2FuZCB0aW1lcz8gR28sIGNvdW5zZWxsb3I7CiAgICBUaG91IGFuZCBteSBib3NvbSBoZW5jZWZvcnRoIHNoYWxsIGJlIHR3YWluLgogICAgSSdsbCB0byB0aGUgZnJpYXIsIHRvIGtub3cgaGlzIHJlbWVkeToKICAgIElmIGFsbCBlbHNlIGZhaWwsIG15c2VsZiBoYXZlIHBvd2VyIHRvIGRpZS4KCiAgICBFeGl0CgpBQ1QgSVYKU0NFTkUgSS4gRnJpYXIgTGF1cmVuY2UncyBjZWxsLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUyAKCkZSSUFSIExBVVJFTkNFCgogICAgT24gVGh1cnNkYXksIHNpcj8gdGhlIHRpbWUgaXMgdmVyeSBzaG9ydC4KClBBUklTCgogICAgTXkgZmF0aGVyIENhcHVsZXQgd2lsbCBoYXZlIGl0IHNvOwogICAgQW5kIEkgYW0gbm90aGluZyBzbG93IHRvIHNsYWNrIGhpcyBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgWW91IHNheSB5b3UgZG8gbm90IGtub3cgdGhlIGxhZHkncyBtaW5kOgogICAgVW5ldmVuIGlzIHRoZSBjb3Vyc2UsIEkgbGlrZSBpdCBub3QuCgpQQVJJUwoKICAgIEltbW9kZXJhdGVseSBzaGUgd2VlcHMgZm9yIFR5YmFsdCdzIGRlYXRoLAogICAgQW5kIHRoZXJlZm9yZSBoYXZlIEkgbGl0dGxlIHRhbGsnZCBvZiBsb3ZlOwogICAgRm9yIFZlbnVzIHNtaWxlcyBub3QgaW4gYSBob3VzZSBvZiB0ZWFycy4KICAgIE5vdywgc2lyLCBoZXIgZmF0aGVyIGNvdW50cyBpdCBkYW5nZXJvdXMKICAgIFRoYXQgc2hlIGRvdGggZ2l2ZSBoZXIgc29ycm93IHNvIG11Y2ggc3dheSwKICAgIEFuZCBpbiBoaXMgd2lzZG9tIGhhc3RlcyBvdXIgbWFycmlhZ2UsCiAgICBUbyBzdG9wIHRoZSBpbnVuZGF0aW9uIG9mIGhlciB0ZWFyczsKICAgIFdoaWNoLCB0b28gbXVjaCBtaW5kZWQgYnkgaGVyc2VsZiBhbG9uZSwKICAgIE1heSBiZSBwdXQgZnJvbSBoZXIgYnkgc29jaWV0eToKICAgIE5vdyBkbyB5b3Uga25vdyB0aGUgcmVhc29uIG9mIHRoaXMgaGFzdGUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFtBc2lkZV0gSSB3b3VsZCBJIGtuZXcgbm90IHdoeSBpdCBzaG91bGQgYmUgc2xvdydkLgogICAgTG9vaywgc2lyLCBoZXJlIGNvbWVzIHRoZSBsYWR5IHRvd2FyZHMgbXkgY2VsbC4KCiAgICBFbnRlciBKVUxJRVQKClBBUklTCgogICAgSGFwcGlseSBtZXQsIG15IGxhZHkgYW5kIG15IHdpZmUhCgpKVUxJRVQKCiAgICBUaGF0IG1heSBiZSwgc2lyLCB3aGVuIEkgbWF5IGJlIGEgd2lmZS4KClBBUklTCgogICAgVGhhdCBtYXkgYmUgbXVzdCBiZSwgbG92ZSwgb24gVGh1cnNkYXkgbmV4dC4KCkpVTElFVAoKICAgIFdoYXQgbXVzdCBiZSBzaGFsbCBiZS4KCkZSSUFSIExBVVJFTkNFCgogICAgVGhhdCdzIGEgY2VydGFpbiB0ZXh0LgoKUEFSSVMKCiAgICBDb21lIHlvdSB0byBtYWtlIGNvbmZlc3Npb24gdG8gdGhpcyBmYXRoZXICgpKVUxJRVQKCiAgICBUbyBhbnN3ZXIgdGhhdCwgSSBzaG91bGQgY29uZmVzcyB0byB5b3UuCgpQQVJJUwoKICAgIERvIG5vdCBkZW55IHRvIGhpbSB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSSB3aWxsIGNvbmZlc3MgdG8geW91IHRoYXQgSSBsb3ZlIGhpbS4KClBBUklTCgogICAgU28gd2lsbCB5ZSwgSSBhbSBzdXJlLCB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSWYgSSBkbyBzbywgaXQgd2lsbCBiZSBvZiBtb3JlIHByaWNlLAogICAgQmVpbmcgc3Bva2UgYmVoaW5kIHlvdXIgYmFjaywgdGhhbiB0byB5b3VyIGZhY2UuCgpQQVJJUwoKICAgIFBvb3Igc291bCwgdGh5IGZhY2UgaXMgbXVjaCBhYnVzZWQgd2l0aCB0ZWFycy4KCkpVTElFVAoKICAgIFRoZSB0ZWFycyBoYXZlIGdvdCBzbWFsbCB2aWN0b3J5IGJ5IHRoYXQ7CiAgICBGb3IgaXQgd2FzIGJhZCBlbm91Z2ggYmVmb3JlIHRoZWlyIHNwaXRlLgoKUEFSSVMKCiAgICBUaG91IHdyb25nJ3N0IGl0LCBtb3JlIHRoYW4gdGVhcnMsIHdpdGggdGhhdCByZXBvcnQuCgpKVUxJRVQKCiAgICBUaGF0IGlzIG5vIHNsYW5kZXIsIHNpciwgd2hpY2ggaXMgYSB0cnV0aDsKICAgIEFuZCB3aGF0IEkgc3Bha2UsIEkgc3Bha2UgaXQgdG8gbXkgZmFjZS4KClBBUklTCgogICAgVGh5IGZhY2UgaXMgbWluZSwgYW5kIHRob3UgaGFzdCBzbGFuZGVyJ2QgaXQuCgpKVUxJRVQKCiAgICBJdCBtYXkgYmUgc28sIGZvciBpdCBpcyBub3QgbWluZSBvd24uCiAgICBBcmUgeW91IGF0IGxlaXN1cmUsIGhvbHkgZmF0aGVyLCBub3c7CiAgICBPciBzaGFsbCBJIGNvbWUgdG8geW91IGF0IGV2ZW5pbmcgbWFzcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTXkgbGVpc3VyZSBzZXJ2ZXMgbWUsIHBlbnNpdmUgZGF1Z2h0ZXIsIG5vdy4KICAgIE15IGxvcmQsIHdlIG11c3QgZW50cmVhdCB0aGUgdGltZSBhbG9uZS4KClBBUklTCgogICAgR29kIHNoaWVsZCBJIHNob3VsZCBkaXN0dXJiIGRldm90aW9uIQogICAgSnVsaWV0LCBvbiBUaHVyc2RheSBlYXJseSB3aWxsIEkgcm91c2UgeWU6CiAgICBUaWxsIHRoZW4sIGFkaWV1OyBhbmQga2VlcCB0aGlzIGhvbHkga2lzcy4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIHNodXQgdGhlIGRvb3IhIGFuZCB3aGVuIHRob3UgaGFzdCBkb25lIHNvLAogICAgQ29tZSB3ZWVwIHdpdGggbWU7IHBhc3QgaG9wZSwgcGFzdCBjdXJlLCBwYXN0IGhlbHAhCgpGUklBUiBMQVVSRU5DRQoKICAgIEFoLCBKdWxpZXQsIEkgYWxyZWFkeSBrbm93IHRoeSBncmllZjsKICAgIEl0IHN0cmFpbnMgbWUgcGFzdCB0aGUgY29tcGFzcyBvZiBteSB3aXRzOgogICAgSSBoZWFyIHRob3UgbXVzdCwgYW5kIG5vdGhpbmcgbWF5IHByb3JvZ3VlIGl0LAogICAgT24gVGh1cnNkYXkgbmV4dCBiZSBtYXJyaWVkIHRvIHRoaXMgY291bnR5LgoKSlVMSUVUCgogICAgVGVsbCBtZSBub3QsIGZyaWFyLCB0aGF0IHRob3UgaGVhcidzdCBvZiB0aGlzLAogICAgVW5sZXNzIHRob3UgdGVsbCBtZSBob3cgSSBtYXkgcHJldmVudCBpdDoKICAgIElmLCBpbiB0aHkgd2lzZG9tLCB0aG91IGNhbnN0IGdpdmUgbm8gaGVscCwKICAgIERvIHRob3UgYnV0IGNhbGwgbXkgcmVzb2x1dGlvbiB3aXNlLAogICAgQW5kIHdpdGggdGhpcyBrbmlmZSBJJ2xsIGhlbHAgaXQgcHJlc2VudGx5LgogICAgR29kIGpvaW4nZCBteSBoZWFydCBhbmQgUm9tZW8ncywgdGhvdSBvdXIgaGFuZHM7CiAgICBBbmQgZXJlIHRoaXMgaGFuZCwgYnkgdGhlZSB0byBSb21lbyBzZWFsJ2QsCiAgICBTaGFsbCBiZSB0aGUgbGFiZWwgdG8gYW5vdGhlciBkZWVkLAogICAgT3IgbXkgdHJ1ZSBoZWFydCB3aXRoIHRyZWFjaGVyb3VzIHJldm9sdAogICAgVHVybiB0byBhbm90aGVyLCB0aGlzIHNoYWxsIHNsYXkgdGhlbSBib3RoOgogICAgVGhlcmVmb3JlLCBvdXQgb2YgdGh5IGxvbmctZXhwZXJpZW5jZWQgdGltZSwKICAgIEdpdmUgbWUgc29tZSBwcmVzZW50IGNvdW5zZWwsIG9yLCBiZWhvbGQsCiAgICAnVHdpeHQgbXkgZXh0cmVtZXMgYW5kIG1lIHRoaXMgYmxvb2R5IGtuaWZlCiAgICBTaGFsbCBwbGF5IHRoZSB1bXBpcmUsIGFyYml0cmF0aW5nIHRoYXQKICAgIFdoaWNoIHRoZSBjb21taXNzaW9uIG9mIHRoeSB5ZWFycyBhbmQgYXJ0CiAgICBDb3VsZCB0byBubyBpc3N1ZSBvZiB0cnVlIGhvbm91ciBicmluZy4KICAgIEJlIG5vdCBzbyBsb25nIHRvIHNwZWFrOyBJIGxvbmcgdG8gZGllLAogICAgSWYgd2hhdCB0aG91IHNwZWFrJ3N0IHNwZWFrIG5vdCBvZiByZW1lZHkuCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvbGQsIGRhdWdodGVyOiBJIGRvIHNweSBhIGtpbmQgb2YgaG9wZSwKICAgIFdoaWNoIGNyYXZlcyBhcyBkZXNwZXJhdGUgYW4gZXhlY3V0aW9uLgogICAgQXMgdGhhdCBpcyBkZXNwZXJhdGUgd2hpY2ggd2Ugd291bGQgcHJldmVudC4KICAgIElmLCByYXRoZXIgdGhhbiB0byBtYXJyeSBDb3VudHkgUGFyaXMsCiAgICBUaG91IGhhc3QgdGhlIHN0cmVuZ3RoIG9mIHdpbGwgdG8gc2xheSB0aHlzZWxmLAogICAgVGhlbiBpcyBpdCBsaWtlbHkgdGhvdSB3aWx0IHVuZGVydGFrZQogICAgQSB0aGluZyBsaWtlIGRlYXRoIHRvIGNoaWRlIGF3YXkgdGhpcyBzaGFtZSwKICAgIFRoYXQgY29wZXN0IHdpdGggZGVhdGggaGltc2VsZiB0byBzY2FwZSBmcm9tIGl0OgogICAgQW5kLCBpZiB0aG91IGRhcmVzdCwgSSdsbCBnaXZlIHRoZWUgcmVtZWR5LgoKSlVMSUVUCgogICAgTywgYmlkIG1lIGxlYXAsIHJhdGhlciB0aGFuIG1hcnJ5IFBhcmlzLAogICAgRnJvbSBvZmYgdGhlIGJhdHRsZW1lbnRzIG9mIHlvbmRlciB0b3dlcjsKICAgIE9yIHdhbGsgaW4gdGhpZXZpc2ggd2F5czsgb3IgYmlkIG1lIGx1cmsKICAgIFdoZXJlIHNlcnBlbnRzIGFyZTsgY2hhaW4gbWUgd2l0aCByb2FyaW5nIGJlYXJzOwogICAgT3Igc2h1dCBtZSBuaWdodGx5IGluIGEgY2hhcm5lbC1ob3VzZSwKICAgIE8nZXItY292ZXInZCBxdWl0ZSB3aXRoIGRlYWQgbWVuJ3MgcmF0dGxpbmcgYm9uZXMsCiAgICBXaXRoIHJlZWt5IHNoYW5rcyBhbmQgeWVsbG93IGNoYXBsZXNzIHNrdWxsczsKICAgIE9yIGJpZCBtZSBnbyBpbnRvIGEgbmV3LW1hZGUgZ3JhdmUKICAgIEFuZCBoaWRlIG1lIHdpdGggYSBkZWFkIG1hbiBpbiBoaXMgc2hyb3VkOwogICAgVGhpbmdzIHRoYXQsIHRvIGhlYXIgdGhlbSB0b2xkLCBoYXZlIG1hZGUgbWUgdHJlbWJsZTsKICAgIEFuZCBJIHdpbGwgZG8gaXQgd2l0aG91dCBmZWFyIG9yIGRvdWJ0LAogICAgVG8gbGl2ZSBhbiB1bnN0YWluJ2Qgd2lmZSB0byBteSBzd2VldCBsb3ZlLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIb2xkLCB0aGVuOyBnbyBob21lLCBiZSBtZXJyeSwgZ2l2ZSBjb25zZW50CiAgICBUbyBtYXJyeSBQYXJpczogV2VkbmVzZGF5IGlzIHRvLW1vcnJvdzoKICAgIFRvLW1vcnJvdyBuaWdodCBsb29rIHRoYXQgdGhvdSBsaWUgYWxvbmU7CiAgICBMZXQgbm90IHRoeSBudXJzZSBsaWUgd2l0aCB0aGVlIGluIHRoeSBjaGFtYmVyOgogICAgVGFrZSB0aG91IHRoaXMgdmlhbCwgYmVpbmcgdGhlbiBpbiBiZWQsCiAgICBBbmQgdGhpcyBkaXN0aWxsZWQgbGlxdW9yIGRyaW5rIHRob3Ugb2ZmOwogICAgV2hlbiBwcmVzZW50bHkgdGhyb3VnaCBhbGwgdGh5IHZlaW5zIHNoYWxsIHJ1bgogICAgQSBjb2xkIGFuZCBkcm93c3kgaHVtb3VyLCBmb3Igbm8gcHVsc2UKICAgIFNoYWxsIGtlZXAgaGlzIG5hdGl2ZSBwcm9ncmVzcywgYnV0IHN1cmNlYXNlOgogICAgTm8gd2FybXRoLCBubyBicmVhdGgsIHNoYWxsIHRlc3RpZnkgdGhvdSBsaXZlc3Q7CiAgICBUaGUgcm9zZXMgaW4gdGh5IGxpcHMgYW5kIGNoZWVrcyBzaGFsbCBmYWRlCiAgICBUbyBwYWx5IGFzaGVzLCB0aHkgZXllcycgd2luZG93cyBmYWxsLAogICAgTGlrZSBkZWF0aCwgd2hlbiBoZSBzaHV0cyB1cCB0aGUgZGF5IG9mIGxpZmU7CiAgICBFYWNoIHBhcnQsIGRlcHJpdmVkIG9mIHN1cHBsZSBnb3Zlcm5tZW50LAogICAgU2hhbGwsIHN0aWZmIGFuZCBzdGFyayBhbmQgY29sZCwgYXBwZWFyIGxpa2UgZGVhdGg6CiAgICBBbmQgaW4gdGhpcyBib3Jyb3cnZCBsaWtlbmVzcyBvZiBzaHJ1bmsgZGVhdGgKICAgIFRob3Ugc2hhbHQgY29udGludWUgdHdvIGFuZCBmb3J0eSBob3VycywKICAgIEFuZCB0aGVuIGF3YWtlIGFzIGZyb20gYSBwbGVhc2FudCBzbGVlcC4KICAgIE5vdywgd2hlbiB0aGUgYnJpZGVncm9vbSBpbiB0aGUgbW9ybmluZyBjb21lcwogICAgVG8gcm91c2UgdGhlZSBmcm9tIHRoeSBiZWQsIHRoZXJlIGFydCB0aG91IGRlYWQ6CiAgICBUaGVuLCBhcyB0aGUgbWFubmVyIG9mIG91ciBjb3VudHJ5IGlzLAogICAgSW4gdGh5IGJlc3Qgcm9iZXMgdW5jb3ZlcidkIG9uIHRoZSBiaWVyCiAgICBUaG91IHNoYWx0IGJlIGJvcm5lIHRvIHRoYXQgc2FtZSBhbmNpZW50IHZhdWx0CiAgICBXaGVyZSBhbGwgdGhlIGtpbmRyZWQgb2YgdGhlIENhcHVsZXRzIGxpZS4KICAgIEluIHRoZSBtZWFuIHRpbWUsIGFnYWluc3QgdGhvdSBzaGFsdCBhd2FrZSwKICAgIFNoYWxsIFJvbWVvIGJ5IG15IGxldHRlcnMga25vdyBvdXIgZHJpZnQsCiAgICBBbmQgaGl0aGVyIHNoYWxsIGhlIGNvbWU6IGFuZCBoZSBhbmQgSQogICAgV2lsbCB3YXRjaCB0aHkgd2FraW5nLCBhbmQgdGhhdCB2ZXJ5IG5pZ2h0CiAgICBTaGFsbCBSb21lbyBiZWFyIHRoZWUgaGVuY2UgdG8gTWFudHVhLgogICAgQW5kIHRoaXMgc2hhbGwgZnJlZSB0aGVlIGZyb20gdGhpcyBwcmVzZW50IHNoYW1lOwogICAgSWYgbm8gaW5jb25zdGFudCB0b3ksIG5vciB3b21hbmlzaCBmZWFyLAogICAgQWJhdGUgdGh5IHZhbG91ciBpbiB0aGUgYWN0aW5nIGl0LgoKSlVMSUVUCgogICAgR2l2ZSBtZSwgZ2l2ZSBtZSEgTywgdGVsbCBub3QgbWUgb2YgZmVhciEKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZDsgZ2V0IHlvdSBnb25lLCBiZSBzdHJvbmcgYW5kIHByb3NwZXJvdXMKICAgIEluIHRoaXMgcmVzb2x2ZTogSSdsbCBzZW5kIGEgZnJpYXIgd2l0aCBzcGVlZAogICAgVG8gTWFudHVhLCB3aXRoIG15IGxldHRlcnMgdG8gdGh5IGxvcmQuCgpKVUxJRVQKCiAgICBMb3ZlIGdpdmUgbWUgc3RyZW5ndGghIGFuZCBzdHJlbmd0aCBzaGFsbCBoZWxwIGFmZm9yZC4KICAgIEZhcmV3ZWxsLCBkZWFyIGZhdGhlciEKCiAgICBFeGV1bnQKClNDRU5FIElJLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIE51cnNlLCBhbmQgdHdvIFNlcnZpbmdtZW4gCgpDQVBVTEVUCgogICAgU28gbWFueSBndWVzdHMgaW52aXRlIGFzIGhlcmUgYXJlIHdyaXQuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGdvIGhpcmUgbWUgdHdlbnR5IGN1bm5pbmcgY29va3MuCgpTZWNvbmQgU2VydmFudAoKICAgIFlvdSBzaGFsbCBoYXZlIG5vbmUgaWxsLCBzaXI7IGZvciBJJ2xsIHRyeSBpZiB0aGV5CiAgICBjYW4gbGljayB0aGVpciBmaW5nZXJzLgoKQ0FQVUxFVAoKICAgIEhvdyBjYW5zdCB0aG91IHRyeSB0aGVtIHNvPwoKU2Vjb25kIFNlcnZhbnQKCiAgICBNYXJyeSwgc2lyLCAndGlzIGFuIGlsbCBjb29rIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBvd24gZmluZ2VyczogdGhlcmVmb3JlIGhlIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBmaW5nZXJzIGdvZXMgbm90IHdpdGggbWUuCgpDQVBVTEVUCgogICAgR28sIGJlIGdvbmUuCgogICAgRXhpdCBTZWNvbmQgU2VydmFudAogICAgV2Ugc2hhbGwgYmUgbXVjaCB1bmZ1cm5pc2hlZCBmb3IgdGhpcyB0aW1lLgogICAgV2hhdCwgaXMgbXkgZGF1Z2h0ZXIgZ29uZSB0byBGcmlhciBMYXVyZW5jZT8KCk51cnNlCgogICAgQXksIGZvcnNvb3RoLgoKQ0FQVUxFVAoKICAgIFdlbGwsIGhlIG1heSBjaGFuY2UgdG8gZG8gc29tZSBnb29kIG9uIGhlcjoKICAgIEEgcGVldmlzaCBzZWxmLXdpbGwnZCBoYXJsb3RyeSBpdCBpcy4KCk51cnNlCgogICAgU2VlIHdoZXJlIHNoZSBjb21lcyBmcm9tIHNocmlmdCB3aXRoIG1lcnJ5IGxvb2suCgogICAgRW50ZXIgSlVMSUVUCgpDQVBVTEVUCgogICAgSG93IG5vdywgbXkgaGVhZHN0cm9uZyEgd2hlcmUgaGF2ZSB5b3UgYmVlbiBnYWRkaW5nPwoKSlVMSUVUCgogICAgV2hlcmUgSSBoYXZlIGxlYXJuJ2QgbWUgdG8gcmVwZW50IHRoZSBzaW4KICAgIE9mIGRpc29iZWRpZW50IG9wcG9zaXRpb24KICAgIFRvIHlvdSBhbmQgeW91ciBiZWhlc3RzLCBhbmQgYW0gZW5qb2luJ2QKICAgIEJ5IGhvbHkgTGF1cmVuY2UgdG8gZmFsbCBwcm9zdHJhdGUgaGVyZSwKICAgIEFuZCBiZWcgeW91ciBwYXJkb246IHBhcmRvbiwgSSBiZXNlZWNoIHlvdSEKICAgIEhlbmNlZm9yd2FyZCBJIGFtIGV2ZXIgcnVsZWQgYnkgeW91LgoKQ0FQVUxFVAoKICAgIFNlbmQgZm9yIHRoZSBjb3VudHk7IGdvIHRlbGwgaGltIG9mIHRoaXM6CiAgICBJJ2xsIGhhdmUgdGhpcyBrbm90IGtuaXQgdXAgdG8tbW9ycm93IG1vcm5pbmcuCgpKVUxJRVQKCiAgICBJIG1ldCB0aGUgeW91dGhmdWwgbG9yZCBhdCBMYXVyZW5jZScgY2VsbDsKICAgIEFuZCBnYXZlIGhpbSB3aGF0IGJlY29tZWQgbG92ZSBJIG1pZ2h0LAogICAgTm90IHN0ZXAgbydlciB0aGUgYm91bmRzIG9mIG1vZGVzdHkuCgpDQVBVTEVUCgogICAgV2h5LCBJIGFtIGdsYWQgb24ndDsgdGhpcyBpcyB3ZWxsOiBzdGFuZCB1cDoKICAgIFRoaXMgaXMgYXMndCBzaG91bGQgYmUuIExldCBtZSBzZWUgdGhlIGNvdW50eTsKICAgIEF5LCBtYXJyeSwgZ28sIEkgc2F5LCBhbmQgZmV0Y2ggaGltIGhpdGhlci4KICAgIE5vdywgYWZvcmUgR29kISB0aGlzIHJldmVyZW5kIGhvbHkgZnJpYXIsCiAgICBPdXIgd2hvbGUgY2l0eSBpcyBtdWNoIGJvdW5kIHRvIGhpbS4KCkpVTElFVAoKICAgIE51cnNlLCB3aWxsIHlvdSBnbyB3aXRoIG1lIGludG8gbXkgY2xvc2V0LAogICAgVG8gaGVscCBtZSBzb3J0IHN1Y2ggbmVlZGZ1bCBvcm5hbWVudHMKICAgIEFzIHlvdSB0aGluayBmaXQgdG8gZnVybmlzaCBtZSB0by1tb3Jyb3cCgpMQURZIENBUFVMRVQKCiAgICBObywgbm90IHRpbGwgVGh1cnNkYXk7IHRoZXJlIGlzIHRpbWUgZW5vdWdoLgoKQ0FQVUxFVAoKICAgIEdvLCBudXJzZSwgZ28gd2l0aCBoZXI6IHdlJ2xsIHRvIGNodXJjaCB0by1tb3Jyb3cuCgogICAgRXhldW50IEpVTElFVCBhbmQgTnVyc2UKCkxBRFkgQ0FQVUxFVAoKICAgIFdlIHNoYWxsIGJlIHNob3J0IGluIG91ciBwcm92aXNpb246CiAgICAnVGlzIG5vdyBuZWFyIG5pZ2h0LgoKQ0FQVUxFVAoKICAgIFR1c2gsIEkgd2lsbCBzdGlyIGFib3V0LAogICAgQW5kIGFsbCB0aGluZ3Mgc2hhbGwgYmUgd2VsbCwgSSB3YXJyYW50IHRoZWUsIHdpZmU6CiAgICBHbyB0aG91IHRvIEp1bGlldCwgaGVscCB0byBkZWNrIHVwIGhlcjsKICAgIEknbGwgbm90IHRvIGJlZCB0by1uaWdodDsgbGV0IG1lIGFsb25lOwogICAgSSdsbCBwbGF5IHRoZSBob3VzZXdpZmUgZm9yIHRoaXMgb25jZS4gV2hhdCwgaG8hCiAgICBUaGV5IGFyZSBhbGwgZm9ydGguIFdlbGwsIEkgd2lsbCB3YWxrIG15c2VsZgogICAgVG8gQ291bnR5IFBhcmlzLCB0byBwcmVwYXJlIGhpbSB1cAogICAgQWdhaW5zdCB0by1tb3Jyb3c6IG15IGhlYXJ0IGlzIHdvbmRyb3VzIGxpZ2h0LAogICAgU2luY2UgdGhpcyBzYW1lIHdheXdhcmQgZ2lybCBpcyBzbyByZWNsYWltJ2QuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEp1bGlldCdzIGNoYW1iZXIuCgogICAgRW50ZXIgSlVMSUVUIGFuZCBOdXJzZSAKCkpVTElFVAoKICAgIEF5LCB0aG9zZSBhdHRpcmVzIGFyZSBiZXN0OiBidXQsIGdlbnRsZSBudXJzZSwKICAgIEkgcHJheSB0aGVlLCBsZWF2ZSBtZSB0byBteSBzZWxmIHRvLW5pZ2h0LAogICAgRm9yIEkgaGF2ZSBuZWVkIG9mIG1hbnkgb3Jpc29ucwogICAgVG8gbW92ZSB0aGUgaGVhdmVucyB0byBzbWlsZSB1cG9uIG15IHN0YXRlLAogICAgV2hpY2gsIHdlbGwgdGhvdSBrbm93J3N0LCBpcyBjcm9zcywgYW5kIGZ1bGwgb2Ygc2luLgoKICAgIEVudGVyIExBRFkgQ0FQVUxFVAoKTEFEWSBDQVBVTEVUCgogICAgV2hhdCwgYXJlIHlvdSBidXN5LCBobz8gbmVlZCB5b3UgbXkgaGVscD8KCkpVTElFVAoKICAgIE5vLCBtYWRhbTsgd2UgaGF2ZSBjdWxsJ2Qgc3VjaCBuZWNlc3NhcmllcwogICAgQXMgYXJlIGJlaG92ZWZ1bCBmb3Igb3VyIHN0YXRlIHRvLW1vcnJvdzoKICAgIFNvIHBsZWFzZSB5b3UsIGxldCBtZSBub3cgYmUgbGVmdCBhbG9uZSwKICAgIEFuZCBsZXQgdGhlIG51cnNlIHRoaXMgbmlnaHQgc2l0IHVwIHdpdGggeW91OwogICAgRm9yLCBJIGFtIHN1cmUsIHlvdSBoYXZlIHlvdXIgaGFuZHMgZnVsbCBhbGwsCiAgICBJbiB0aGlzIHNvIHN1ZGRlbiBidXNpbmVzcy4KCkxBRFkgQ0FQVUxFVAoKICAgIEdvb2QgbmlnaHQ6CiAgICBHZXQgdGhlZSB0byBiZWQsIGFuZCByZXN0OyBmb3IgdGhvdSBoYXN0IG5lZWQuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkpVTElFVAoKICAgIEZhcmV3ZWxsISBHb2Qga25vd3Mgd2hlbiB3ZSBzaGFsbCBtZWV0IGFnYWluLgogICAgSSBoYXZlIGEgZmFpbnQgY29sZCBmZWFyIHRocmlsbHMgdGhyb3VnaCBteSB2ZWlucywKICAgIFRoYXQgYWxtb3N0IGZyZWV6ZXMgdXAgdGhlIGhlYXQgb2YgbGlmZToKICAgIEknbGwgY2FsbCB0aGVtIGJhY2sgYWdhaW4gdG8gY29tZm9ydCBtZToKICAgIE51cnNlISBXaGF0IHNob3VsZCBzaGUgZG8gaGVyZT8KICAgIE15IGRpc21hbCBzY2VuZSBJIG5lZWRzIG11c3QgYWN0IGFsb25lLgogICAgQ29tZSwgdmlhbC4KICAgIFdoYXQgaWYgdGhpcyBtaXh0dXJlIGRvIG5vdCB3b3JrIGF0IGFsbD8KICAgIFNoYWxsIEkgYmUgbWFycmllZCB0aGVuIHRvLW1vcnJvdyBtb3JuaW5nPwogICAgTm8sIG5vOiB0aGlzIHNoYWxsIGZvcmJpZCBpdDogbGllIHRob3UgdGhlcmUuCgogICAgTGF5aW5nIGRvd24gaGVyIGRhZ2dlcgogICAgV2hhdCBpZiBpdCBiZSBhIHBvaXNvbiwgd2hpY2ggdGhlIGZyaWFyCiAgICBTdWJ0bHkgaGF0aCBtaW5pc3RlcidkIHRvIGhhdmUgbWUgZGVhZCwKICAgIExlc3QgaW4gdGhpcyBtYXJyaWFnZSBoZSBzaG91bGQgYmUgZGlzaG9ub3VyJ2QsCiAgICBCZWNhdXNlIGhlIG1hcnJpZWQgbWUgYmVmb3JlIHRvIFJvbWVvPwogICAgSSBmZWFyIGl0IGlzOiBhbmQgeWV0LCBtZXRoaW5rcywgaXQgc2hvdWxkIG5vdCwKICAgIEZvciBoZSBoYXRoIHN0aWxsIGJlZW4gdHJpZWQgYSBob2x5IG1hbi4KICAgIEhvdyBpZiwgd2hlbiBJIGFtIGxhaWQgaW50byB0aGUgdG9tYiwKICAgIEkgd2FrZSBiZWZvcmUgdGhlIHRpbWUgdGhhdCBSb21lbwogICAgQ29tZSB0byByZWRlZW0gbWUIHRoZXJlJ3MgYSBmZWFyZnVsIHBvaW50IQogICAgU2hhbGwgSSBub3QsIHRoZW4sIGJlIHN0aWZsZWQgaW4gdGhlIHZhdWx0LAogICAgVG8gd2hvc2UgZm91bCBtb3V0aCBubyBoZWFsdGhzb21lIGFpciBicmVhdGhlcyBpbiwKICAgIEFuZCB0aGVyZSBkaWUgc3RyYW5nbGVkIGVyZSBteSBSb21lbyBjb21lcz8KICAgIE9yLCBpZiBJIGxpdmUsIGlzIGl0IG5vdCB2ZXJ5IGxpa2UsCiAgICBUaGUgaG9ycmlibGUgY29uY2VpdCBvZiBkZWF0aCBhbmQgbmlnaHQsCiAgICBUb2dldGhlciB3aXRoIHRoZSB0ZXJyb3Igb2YgdGhlIHBsYWNlLC0tCiAgICBBcyBpbiBhIHZhdWx0LCBhbiBhbmNpZW50IHJlY2VwdGFjbGUsCiAgICBXaGVyZSwgZm9yIHRoZXNlIG1hbnkgaHVuZHJlZCB5ZWFycywgdGhlIGJvbmVzCiAgICBPZiBhbGwgbXkgYnVyaWVkIGFuY2VzdG9ycyBhcmUgcGFja2VkOgogICAgV2hlcmUgYmxvb2R5IFR5YmFsdCwgeWV0IGJ1dCBncmVlbiBpbiBlYXJ0aCwKICAgIExpZXMgZmVzdGVyaW5nIGluIGhpcyBzaHJvdWQ7IHdoZXJlLCBhcyB0aGV5IHNheSwKICAgIEF0IHNvbWUgaG91cnMgaW4gdGhlIG5pZ2h0IHNwaXJpdHMgcmVzb3J0Oy0tCiAgICBBbGFjaywgYWxhY2ssIGlzIGl0IG5vdCBsaWtlIHRoYXQgSSwKICAgIFNvIGVhcmx5IHdha2luZywgd2hhdCB3aXRoIGxvYXRoc29tZSBzbWVsbHMsCiAgICBBbmQgc2hyaWVrcyBsaWtlIG1hbmRyYWtlcycgdG9ybiBvdXQgb2YgdGhlIGVhcnRoLAogICAgVGhhdCBsaXZpbmcgbW9ydGFscywgaGVhcmluZyB0aGVtLCBydW4gbWFkOi0tCiAgICBPLCBpZiBJIHdha2UsIHNoYWxsIEkgbm90IGJlIGRpc3RyYXVnaHQsCiAgICBFbnZpcm9uZWQgd2l0aCBhbGwgdGhlc2UgaGlkZW91cyBmZWFycz8KICAgIEFuZCBtYWRseSBwbGF5IHdpdGggbXkgZm9yZWZhdGhlcidzIGpvaW50cz8KICAgIEFuZCBwbHVjayB0aGUgbWFuZ2xlZCBUeWJhbHQgZnJvbSBoaXMgc2hyb3VkPwogICAgQW5kLCBpbiB0aGlzIHJhZ2UsIHdpdGggc29tZSBncmVhdCBraW5zbWFuJ3MgYm9uZSwKICAgIEFzIHdpdGggYSBjbHViLCBkYXNoIG91dCBteSBkZXNwZXJhdGUgYnJhaW5zPwogICAgTywgbG9vayEgbWV0aGlua3MgSSBzZWUgbXkgY291c2luJ3MgZ2hvc3QKICAgIFNlZWtpbmcgb3V0IFJvbWVvLCB0aGF0IGRpZCBzcGl0IGhpcyBib2R5CiAgICBVcG9uIGEgcmFwaWVyJ3MgcG9pbnQ6IHN0YXksIFR5YmFsdCwgc3RheSEKICAgIFJvbWVvLCBJIGNvbWUhIHRoaXMgZG8gSSBkcmluayB0byB0aGVlLgoKICAgIFNoZSBmYWxscyB1cG9uIGhlciBiZWQsIHdpdGhpbiB0aGUgY3VydGFpbnMKClNDRU5FIElWLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgSG9sZCwgdGFrZSB0aGVzZSBrZXlzLCBhbmQgZmV0Y2ggbW9yZSBzcGljZXMsIG51cnNlLgoKTnVyc2UKCiAgICBUaGV5IGNhbGwgZm9yIGRhdGVzIGFuZCBxdWluY2VzIGluIHRoZSBwYXN0cnkuCgogICAgRW50ZXIgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIENvbWUsIHN0aXIsIHN0aXIsIHN0aXIhIHRoZSBzZWNvbmQgY29jayBoYXRoIGNyb3cnZCwKICAgIFRoZSBjdXJmZXctYmVsbCBoYXRoIHJ1bmcsICd0aXMgdGhyZWUgbydjbG9jazoKICAgIExvb2sgdG8gdGhlIGJha2VkIG1lYXRzLCBnb29kIEFuZ2VsaWNhOgogICAgU3BhcmUgbm90IGZvciB0aGUgY29zdC4KCk51cnNlCgogICAgR28sIHlvdSBjb3QtcXVlYW4sIGdvLAogICAgR2V0IHlvdSB0byBiZWQ7IGZhaXRoLCBZb3UnbGwgYmUgc2ljayB0by1tb3Jyb3cKICAgIEZvciB0aGlzIG5pZ2h0J3Mgd2F0Y2hpbmcuCgpDQVBVTEVUCgogICAgTm8sIG5vdCBhIHdoaXQ6IHdoYXQhIEkgaGF2ZSB3YXRjaCdkIGVyZSBub3cKICAgIEFsbCBuaWdodCBmb3IgbGVzc2VyIGNhdXNlLCBhbmQgbmUnZXIgYmVlbiBzaWNrLgoKTEFEWSBDQVBVTEVUCgogICAgQXksIHlvdSBoYXZlIGJlZW4gYSBtb3VzZS1odW50IGluIHlvdXIgdGltZTsKICAgIEJ1dCBJIHdpbGwgd2F0Y2ggeW91IGZyb20gc3VjaCB3YXRjaGluZyBub3cuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBBIGplYWxvdXMgaG9vZCwgYSBqZWFsb3VzIGhvb2QhCgogICAgRW50ZXIgdGhyZWUgb3IgZm91ciBTZXJ2aW5nbWVuLCB3aXRoIHNwaXRzLCBsb2dzLCBhbmQgYmFza2V0cwogICAgTm93LCBmZWxsb3csCiAgICBXaGF0J3MgdGhlcmUCgpGaXJzdCBTZXJ2YW50CgogICAgVGhpbmdzIGZvciB0aGUgY29vaywgc2lyOyBidXQgSSBrbm93IG5vdCB3aGF0LgoKQ0FQVUxFVAoKICAgIE1ha2UgaGFzdGUsIG1ha2UgaGFzdGUuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGZldGNoIGRyaWVyIGxvZ3M6CiAgICBDYWxsIFBldGVyLCBoZSB3aWxsIHNob3cgdGhlZSB3aGVyZSB0aGV5IGFyZS4KClNlY29uZCBTZXJ2YW50CgogICAgSSBoYXZlIGEgaGVhZCwgc2lyLCB0aGF0IHdpbGwgZmluZCBvdXQgbG9ncywKICAgIEFuZCBuZXZlciB0cm91YmxlIFBldGVyIGZvciB0aGUgbWF0dGVyLgoKICAgIEV4aXQKCkNBUFVMRVQKCiAgICBNYXNzLCBhbmQgd2VsbCBzYWlkOyBhIG1lcnJ5IHdob3Jlc29uLCBoYSEKICAgIFRob3Ugc2hhbHQgYmUgbG9nZ2VyLWhlYWQuIEdvb2QgZmFpdGgsICd0aXMgZGF5OgogICAgVGhlIGNvdW50eSB3aWxsIGJlIGhlcmUgd2l0aCBtdXNpYyBzdHJhaWdodCwKICAgIEZvciBzbyBoZSBzYWlkIGhlIHdvdWxkOiBJIGhlYXIgaGltIG5lYXIuCgogICAgTXVzaWMgd2l0aGluCiAgICBOdXJzZSEgV2lmZSEgV2hhdCwgaG8hIFdoYXQsIG51cnNlLCBJIHNheSEKCiAgICBSZS1lbnRlciBOdXJzZQogICAgR28gd2FrZW4gSnVsaWV0LCBnbyBhbmQgdHJpbSBoZXIgdXA7CiAgICBJJ2xsIGdvIGFuZCBjaGF0IHdpdGggUGFyaXM6IGhpZSwgbWFrZSBoYXN0ZSwKICAgIE1ha2UgaGFzdGU7IHRoZSBicmlkZWdyb29tIGhlIGlzIGNvbWUgYWxyZWFkeToKICAgIE1ha2UgaGFzdGUsIEkgc2F5LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gSnVsaWV0J3MgY2hhbWJlci4KCiAgICBFbnRlciBOdXJzZSAKCk51cnNlCgogICAgTWlzdHJlc3MhIHdoYXQsIG1pc3RyZXNzISBKdWxpZXQhIGZhc3QsIEkgd2FycmFudCBoZXIsIHNoZToKICAgIFdoeSwgbGFtYiEgd2h5LCBsYWR5ISBmaWUsIHlvdSBzbHVnLWEtYmVkIQogICAgV2h5LCBsb3ZlLCBJIHNheSEgbWFkYW0hIHN3ZWV0LWhlYXJ0ISB3aHksIGJyaWRlIQogICAgV2hhdCwgbm90IGEgd29yZD8geW91IHRha2UgeW91ciBwZW5ueXdvcnRocyBub3c7CiAgICBTbGVlcCBmb3IgYSB3ZWVrOyBmb3IgdGhlIG5leHQgbmlnaHQsIEkgd2FycmFudCwKICAgIFRoZSBDb3VudHkgUGFyaXMgaGF0aCBzZXQgdXAgaGlzIHJlc3QsCiAgICBUaGF0IHlvdSBzaGFsbCByZXN0IGJ1dCBsaXR0bGUuIEdvZCBmb3JnaXZlIG1lLAogICAgTWFycnksIGFuZCBhbWVuLCBob3cgc291bmQgaXMgc2hlIGFzbGVlcCEKICAgIEkgbXVzdCBuZWVkcyB3YWtlIGhlci4gTWFkYW0sIG1hZGFtLCBtYWRhbSEKICAgIEF5LCBsZXQgdGhlIGNvdW50eSB0YWtlIHlvdSBpbiB5b3VyIGJlZDsKICAgIEhlJ2xsIGZyaWdodCB5b3UgdXAsIGknIGZhaXRoLiBXaWxsIGl0IG5vdCBiZT8KCiAgICBVbmRyYXdzIHRoZSBjdXJ0YWlucwogICAgV2hhdCwgZHJlc3MnZCEgYW5kIGluIHlvdXIgY2xvdGhlcyEgYW5kIGRvd24gYWdhaW4hCiAgICBJIG11c3QgbmVlZHMgd2FrZSB5b3U7IExhZHkhIGxhZHkhIGxhZHkhCiAgICBBbGFzLCBhbGFzISBIZWxwLCBoZWxwISBteSBsYWR5J3MgZGVhZCEKICAgIE8sIHdlbGwtYS1kYXksIHRoYXQgZXZlciBJIHdhcyBib3JuIQogICAgU29tZSBhcXVhIHZpdGFlLCBobyEgTXkgbG9yZCEgbXkgbGFkeSEKCiAgICBFbnRlciBMQURZIENBUFVMRVQKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgaGVyZT8KCk51cnNlCgogICAgTyBsYW1lbnRhYmxlIGRheSEKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgaXMgdGhlIG1hdHRlcj8KCk51cnNlCgogICAgTG9vaywgbG9vayEgTyBoZWF2eSBkYXkhCgpMQURZIENBUFVMRVQKCiAgICBPIG1lLCBPIG1lISBNeSBjaGlsZCwgbXkgb25seSBsaWZlLAogICAgUmV2aXZlLCBsb29rIHVwLCBvciBJIHdpbGwgZGllIHdpdGggdGhlZSEKICAgIEhlbHAsIGhlbHAhIENhbGwgaGVscC4KCiAgICBFbnRlciBDQVBVTEVUCgpDQVBVTEVUCgogICAgRm9yIHNoYW1lLCBicmluZyBKdWxpZXQgZm9ydGg7IGhlciBsb3JkIGlzIGNvbWUuCgpOdXJzZQoKICAgIFNoZSdzIGRlYWQsIGRlY2Vhc2VkLCBzaGUncyBkZWFkOyBhbGFjayB0aGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgQWxhY2sgdGhlIGRheSwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCEKCkNBUFVMRVQKCiAgICBIYSEgbGV0IG1lIHNlZSBoZXI6IG91dCwgYWxhcyEgc2hlJ3MgY29sZDoKICAgIEhlciBibG9vZCBpcyBzZXR0bGVkLCBhbmQgaGVyIGpvaW50cyBhcmUgc3RpZmY7CiAgICBMaWZlIGFuZCB0aGVzZSBsaXBzIGhhdmUgbG9uZyBiZWVuIHNlcGFyYXRlZDoKICAgIERlYXRoIGxpZXMgb24gaGVyIGxpa2UgYW4gdW50aW1lbHkgZnJvc3QKICAgIFVwb24gdGhlIHN3ZWV0ZXN0IGZsb3dlciBvZiBhbGwgdGhlIGZpZWxkLgoKTnVyc2UKCiAgICBPIGxhbWVudGFibGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgTyB3b2Z1bCB0aW1lIQoKQ0FQVUxFVAoKICAgIERlYXRoLCB0aGF0IGhhdGggdGEnZW4gaGVyIGhlbmNlIHRvIG1ha2UgbWUgd2FpbCwKICAgIFRpZXMgdXAgbXkgdG9uZ3VlLCBhbmQgd2lsbCBub3QgbGV0IG1lIHNwZWFrLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUywgd2l0aCBNdXNpY2lhbnMKCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgaXMgdGhlIGJyaWRlIHJlYWR5IHRvIGdvIHRvIGNodXJjaD8KCkNBUFVMRVQKCiAgICBSZWFkeSB0byBnbywgYnV0IG5ldmVyIHRvIHJldHVybi4KICAgIE8gc29uISB0aGUgbmlnaHQgYmVmb3JlIHRoeSB3ZWRkaW5nLWRheQogICAgSGF0aCBEZWF0aCBsYWluIHdpdGggdGh5IHdpZmUuIFRoZXJlIHNoZSBsaWVzLAogICAgRmxvd2VyIGFzIHNoZSB3YXMsIGRlZmxvd2VyZWQgYnkgaGltLgogICAgRGVhdGggaXMgbXkgc29uLWluLWxhdywgRGVhdGggaXMgbXkgaGVpcjsKICAgIE15IGRhdWdodGVyIGhlIGhhdGggd2VkZGVkOiBJIHdpbGwgZGllLAogICAgQW5kIGxlYXZlIGhpbSBhbGw7IGxpZmUsIGxpdmluZywgYWxsIGlzIERlYXRoJ3MuCgpQQVJJUwoKICAgIEhhdmUgSSB0aG91Z2h0IGxvbmcgdG8gc2VlIHRoaXMgbW9ybmluZydzIGZhY2UsCiAgICBBbmQgZG90aCBpdCBnaXZlIG1lIHN1Y2ggYSBzaWdodCBhcyB0aGlzPwoKTEFEWSBDQVBVTEVUCgogICAgQWNjdXJzZWQsIHVuaGFwcHksIHdyZXRjaGVkLCBoYXRlZnVsIGRheSEKICAgIE1vc3QgbWlzZXJhYmxlIGhvdXIgdGhhdCBlJ2VyIHRpbWUgc2F3CiAgICBJbiBsYXN0aW5nIGxhYm91ciBvZiBoaXMgcGlsZ3JpbWFnZSEKICAgIEJ1dCBvbmUsIHBvb3Igb25lLCBvbmUgcG9vciBhbmQgbG92aW5nIGNoaWxkLAogICAgQnV0IG9uZSB0aGluZyB0byByZWpvaWNlIGFuZCBzb2xhY2UgaW4sCiAgICBBbmQgY3J1ZWwgZGVhdGggaGF0aCBjYXRjaCdkIGl0IGZyb20gbXkgc2lnaHQhCgpOdXJzZQoKICAgIE8gd29lISBPIHdvZnVsLCB3b2Z1bCwgd29mdWwgZGF5IQogICAgTW9zdCBsYW1lbnRhYmxlIGRheSwgbW9zdCB3b2Z1bCBkYXksCiAgICBUaGF0IGV2ZXIsIGV2ZXIsIEkgZGlkIHlldCBiZWhvbGQhCiAgICBPIGRheSEgTyBkYXkhIE8gZGF5ISBPIGhhdGVmdWwgZGF5IQogICAgTmV2ZXIgd2FzIHNlZW4gc28gYmxhY2sgYSBkYXkgYXMgdGhpczoKICAgIE8gd29mdWwgZGF5LCBPIHdvZnVsIGRheSEKClBBUklTCgogICAgQmVndWlsZWQsIGRpdm9yY2VkLCB3cm9uZ2VkLCBzcGl0ZWQsIHNsYWluIQogICAgTW9zdCBkZXRlc3RhYmxlIGRlYXRoLCBieSB0aGVlIGJlZ3VpbCdkLAogICAgQnkgY3J1ZWwgY3J1ZWwgdGhlZSBxdWl0ZSBvdmVydGhyb3duIQogICAgTyBsb3ZlISBPIGxpZmUhIG5vdCBsaWZlLCBidXQgbG92ZSBpbiBkZWF0aCEKCkNBUFVMRVQKCiAgICBEZXNwaXNlZCwgZGlzdHJlc3NlZCwgaGF0ZWQsIG1hcnR5cidkLCBraWxsJ2QhCiAgICBVbmNvbWZvcnRhYmxlIHRpbWUsIHdoeSBjYW1lc3QgdGhvdSBub3cKICAgIFRvIG11cmRlciwgbXVyZGVyIG91ciBzb2xlbW5pdHkCiAgICBPIGNoaWxkISBPIGNoaWxkISBteSBzb3VsLCBhbmQgbm90IG15IGNoaWxkIQogICAgRGVhZCBhcnQgdGhvdSEgQWxhY2shIG15IGNoaWxkIGlzIGRlYWQ7CiAgICBBbmQgd2l0aCBteSBjaGlsZCBteSBqb3lzIGFyZSBidXJpZWQuCgpGUklBUiBMQVVSRU5DRQoKICAgIFBlYWNlLCBobywgZm9yIHNoYW1lISBjb25mdXNpb24ncyBjdXJlIGxpdmVzIG5vdAogICAgSW4gdGhlc2UgY29uZnVzaW9ucy4gSGVhdmVuIGFuZCB5b3Vyc2VsZgogICAgSGFkIHBhcnQgaW4gdGhpcyBmYWlyIG1haWQ7IG5vdyBoZWF2ZW4gaGF0aCBhbGwsCiAgICBBbmQgYWxsIHRoZSBiZXR0ZXIgaXMgaXQgZm9yIHRoZSBtYWlkOgogICAgWW91ciBwYXJ0IGluIGhlciB5b3UgY291bGQgbm90IGtlZXAgZnJvbSBkZWF0aCwKICAgIEJ1dCBoZWF2ZW4ga2VlcHMgaGlzIHBhcnQgaW4gZXRlcm5hbCBsaWZlLgogICAgVGhlIG1vc3QgeW91IHNvdWdodCB3YXMgaGVyIHByb21vdGlvbjsKICAgIEZvciAndHdhcyB5b3VyIGhlYXZlbiBzaGUgc2hvdWxkIGJlIGFkdmFuY2VkOgogICAgQW5kIHdlZXAgeWUgbm93LCBzZWVpbmcgc2hlIGlzIGFkdmFuY2VkCiAgICBBYm92ZSB0aGUgY2xvdWRzLCBhcyBoaWdoIGFzIGhlYXZlbiBpdHNlbGYCiAgICBPLCBpbiB0aGlzIGxvdmUsIHlvdSBsb3ZlIHlvdXIgY2hpbGQgc28gaWxsLAogICAgVGhhdCB5b3UgcnVuIG1hZCwgc2VlaW5nIHRoYXQgc2hlIGlzIHdlbGw6CiAgICBTaGUncyBub3Qgd2VsbCBtYXJyaWVkIHRoYXQgbGl2ZXMgbWFycmllZCBsb25nOwogICAgQnV0IHNoZSdzIGJlc3QgbWFycmllZCB0aGF0IGRpZXMgbWFycmllZCB5b3VuZy4KICAgIERyeSB1cCB5b3VyIHRlYXJzLCBhbmQgc3RpY2sgeW91ciByb3NlbWFyeQogICAgT24gdGhpcyBmYWlyIGNvcnNlOyBhbmQsIGFzIHRoZSBjdXN0b20gaXMsCiAgICBJbiBhbGwgaGVyIGJlc3QgYXJyYXkgYmVhciBoZXIgdG8gY2h1cmNoOgogICAgRm9yIHRob3VnaCBmb25kIG5hdHVyZSBiaWRzIHVzIGFuIGxhbWVudCwKICAgIFlldCBuYXR1cmUncyB0ZWFycyBhcmUgcmVhc29uJ3MgbWVycmltZW50LgoKQ0FQVUxFVAoKICAgIEFsbCB0aGluZ3MgdGhhdCB3ZSBvcmRhaW5lZCBmZXN0aXZhbCwKICAgIFR1cm4gZnJvbSB0aGVpciBvZmZpY2UgdG8gYmxhY2sgZnVuZXJhbDsKICAgIE91ciBpbnN0cnVtZW50cyB0byBtZWxhbmNob2x5IGJlbGxzLAogICAgT3VyIHdlZGRpbmcgY2hlZXIgdG8gYSBzYWQgYnVyaWFsIGZlYXN0LAogICAgT3VyIHNvbGVtbiBoeW1ucyB0byBzdWxsZW4gZGlyZ2VzIGNoYW5nZSwKICAgIE91ciBicmlkYWwgZmxvd2VycyBzZXJ2ZSBmb3IgYSBidXJpZWQgY29yc2UsCiAgICBBbmQgYWxsIHRoaW5ncyBjaGFuZ2UgdGhlbSB0byB0aGUgY29udHJhcnkuCgpGUklBUiBMQVVSRU5DRQoKICAgIFNpciwgZ28geW91IGluOyBhbmQsIG1hZGFtLCBnbyB3aXRoIGhpbTsKICAgIEFuZCBnbywgU2lyIFBhcmlzOyBldmVyeSBvbmUgcHJlcGFyZQogICAgVG8gZm9sbG93IHRoaXMgZmFpciBjb3JzZSB1bnRvIGhlciBncmF2ZToKICAgIFRoZSBoZWF2ZW5zIGRvIGxvdXIgdXBvbiB5b3UgZm9yIHNvbWUgaWxsOwogICAgTW92ZSB0aGVtIG5vIG1vcmUgYnkgY3Jvc3NpbmcgdGhlaXIgaGlnaCB3aWxsLgoKICAgIEV4ZXVudCBDQVBVTEVULCBMQURZIENBUFVMRVQsIFBBUklTLCBhbmQgRlJJQVIgTEFVUkVOQ0UKCkZpcnN0IE11c2ljaWFuCgogICAgRmFpdGgsIHdlIG1heSBwdXQgdXAgb3VyIHBpcGVzLCBhbmQgYmUgZ29uZS4KCk51cnNlCgogICAgSG9uZXN0IGdvb2RmZWxsb3dzLCBhaCwgcHV0IHVwLCBwdXQgdXA7CiAgICBGb3IsIHdlbGwgeW91IGtub3csIHRoaXMgaXMgYSBwaXRpZnVsIGNhc2UuCgogICAgRXhpdAoKRmlyc3QgTXVzaWNpYW4KCiAgICBBeSwgYnkgbXkgdHJvdGgsIHRoZSBjYXNlIG1heSBiZSBhbWVuZGVkLgoKICAgIEVudGVyIFBFVEVSCgpQRVRFUgoKICAgIE11c2ljaWFucywgTywgbXVzaWNpYW5zLCAnSGVhcnQncyBlYXNlLCBIZWFydCdzCiAgICBlYXNlOicgTywgYW4geW91IHdpbGwgaGF2ZSBtZSBsaXZlLCBwbGF5ICdIZWFydCdzIGVhc2UuJwoKRmlyc3QgTXVzaWNpYW4KCiAgICBXaHkgJ0hlYXJ0J3MgZWFzZT8nCgpQRVRFUgoKICAgIE8sIG11c2ljaWFucywgYmVjYXVzZSBteSBoZWFydCBpdHNlbGYgcGxheXMgJ015CiAgICBoZWFydCBpcyBmdWxsIG9mIHdvZTonIE8sIHBsYXkgbWUgc29tZSBtZXJyeSBkdW1wLAogICAgdG8gY29tZm9ydCBtZS4KCkZpcnN0IE11c2ljaWFuCgogICAgTm90IGEgZHVtcCB3ZTsgJ3RpcyBubyB0aW1lIHRvIHBsYXkgbm93LgoKUEVURVIKCiAgICBZb3Ugd2lsbCBub3QsIHRoZW4CgpGaXJzdCBNdXNp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Rocm9uZTsKICAgIEFuZCBhbGwgdGhpcyBkYXkgYW4gdW5hY2N1c3RvbSdkIHNwaXJpdAogICAgTGlmdHMgbWUgYWJvdmUgdGhlIGdyb3VuZCB3aXRoIGNoZWVyZnVsIHRob3VnaHRzLgogICAgSSBkcmVhbXQgbXkgbGFkeSBjYW1lIGFuZCBmb3VuZCBtZSBkZWFkLS0KICAgIFN0cmFuZ2UgZHJlYW0sIHRoYXQgZ2l2ZXMgYSBkZWFkIG1hbiBsZWF2ZQogICAgdG8gdGhpbmshLS0KICAgIEFuZCBicmVhdGhlZCBzdWNoIGxpZmUgd2l0aCBraXNzZXMgaW4gbXkgbGlwcywKICAgIFRoYXQgSSByZXZpdmVkLCBhbmQgd2FzIGFuIGVtcGVyb3IuCiAgICBBaCBtZSEgaG93IHN3ZWV0IGlzIGxvdmUgaXRzZWxmIHBvc3Nlc3MnZCwKICAgIFdoZW4gYnV0IGxvdmUncyBzaGFkb3dzIGFyZSBzbyByaWNoIGluIGpveSEKCiAgICBFbnRlciBCQUxUSEFTQVIsIGJvb3RlZAogICAgTmV3cyBmcm9tIFZlcm9uYSEtLUhvdyBub3csIEJhbHRoYXNhciEKICAgIERvc3QgdGhvdSBub3QgYnJpbmcgbWUgbGV0dGVycyBmcm9tIHRoZSBmcmlhcj8KICAgIEhvdyBkb3RoIG15IGxhZHkIElzIG15IGZhdGhlciB3ZWxsPwogICAgSG93IGZhcmVzIG15IEp1bGlldD8gdGhhdCBJIGFzayBhZ2FpbjsKICAgIEZvciBub3RoaW5nIGNhbiBiZSBpbGwsIGlmIHNoZSBiZSB3ZWxsLgoKQkFMVEhBU0FSCgogICAgVGhlbiBzaGUgaXMgd2VsbCwgYW5kIG5vdGhpbmcgY2FuIGJlIGlsbDoKICAgIEhlciBib2R5IHNsZWVwcyBpbiBDYXBlbCdzIG1vbnVtZW50LAogICAgQW5kIGhlciBpbW1vcnRhbCBwYXJ0IHdpdGggYW5nZWxzIGxpdmVzLgogICAgSSBzYXcgaGVyIGxhaWQgbG93IGluIGhlciBraW5kcmVkJ3MgdmF1bHQsCiAgICBBbmQgcHJlc2VudGx5IHRvb2sgcG9zdCB0byB0ZWxsIGl0IHlvdToKICAgIE8sIHBhcmRvbiBtZSBmb3IgYnJpbmdpbmcgdGhlc2UgaWxsIG5ld3MsCiAgICBTaW5jZSB5b3UgZGlkIGxlYXZlIGl0IGZvciBteSBvZmZpY2UsIHNpci4KClJPTUVPCgogICAgSXMgaXQgZXZlbiBzbz8gdGhlbiBJIGRlZnkgeW91LCBzdGFycyEKICAgIFRob3Uga25vdydzdCBteSBsb2RnaW5nOiBnZXQgbWUgaW5rIGFuZCBwYXBlciwKICAgIEFuZCBoaXJlIHBvc3QtaG9yc2VzOyBJIHdpbGwgaGVuY2UgdG8tbmlnaHQuCgpCQUxUSEFTQVIKCiAgICBJIGRvIGJlc2VlY2ggeW91LCBzaXIsIGhhdmUgcGF0aWVuY2U6CiAgICBZb3VyIGxvb2tzIGFyZSBwYWxlIGFuZCB3aWxkLCBhbmQgZG8gaW1wb3J0CiAgICBTb21lIG1pc2FkdmVudHVyZS4KClJPTUVPCgogICAgVHVzaCwgdGhvdSBhcnQgZGVjZWl2ZWQ6CiAgICBMZWF2ZSBtZSwgYW5kIGRvIHRoZSB0aGluZyBJIGJpZCB0aGVlIGRvLgogICAgSGFzdCB0aG91IG5vIGxldHRlcnMgdG8gbWUgZnJvbSB0aGUgZnJpYXICgpCQUxUSEFTQVIKCiAgICBObywgbXkgZ29vZCBsb3JkLgoKUk9NRU8KCiAgICBObyBtYXR0ZXI6IGdldCB0aGVlIGdvbmUsCiAgICBBbmQgaGlyZSB0aG9zZSBob3JzZXM7IEknbGwgYmUgd2l0aCB0aGVlIHN0cmFpZ2h0LgoKICAgIEV4aXQgQkFMVEhBU0FSCiAgICBXZWxsLCBKdWxpZXQsIEkgd2lsbCBsaWUgd2l0aCB0aGVlIHRvLW5pZ2h0LgogICAgTGV0J3Mgc2VlIGZvciBtZWFuczogTyBtaXNjaGllZiwgdGhvdSBhcnQgc3dpZnQKICAgIFRvIGVudGVyIGluIHRoZSB0aG91Z2h0cyBvZiBkZXNwZXJhdGUgbWVuIQogICAgSSBkbyByZW1lbWJlciBhbiBhcG90aGVjYXJ5LC0tCiAgICBBbmQgaGVyZWFib3V0cyBoZSBkd2VsbHMsLS13aGljaCBsYXRlIEkgbm90ZWQKICAgIEluIHRhdHRlcidkIHdlZWRzLCB3aXRoIG92ZXJ3aGVsbWluZyBicm93cywKICAgIEN1bGxpbmcgb2Ygc2ltcGxlczsgbWVhZ3JlIHdlcmUgaGlzIGxvb2tzLAogICAgU2hhcnAgbWlzZXJ5IGhhZCB3b3JuIGhpbSB0byB0aGUgYm9uZXM6CiAgICBBbmQgaW4gaGlzIG5lZWR5IHNob3AgYSB0b3J0b2lzZSBodW5nLAogICAgQW4gYWxsaWdhdG9yIHN0dWZmJ2QsIGFuZCBvdGhlciBza2lucwogICAgT2YgaWxsLXNoYXBlZCBmaXNoZXM7IGFuZCBhYm91dCBoaXMgc2hlbHZlcwogICAgQSBiZWdnYXJseSBhY2NvdW50IG9mIGVtcHR5IGJveGVzLAogICAgR3JlZW4gZWFydGhlbiBwb3RzLCBibGFkZGVycyBhbmQgbXVzdHkgc2VlZHMsCiAgICBSZW1uYW50cyBvZiBwYWNrdGhyZWFkIGFuZCBvbGQgY2FrZXMgb2Ygcm9zZXMsCiAgICBXZXJlIHRoaW5seSBzY2F0dGVyJ2QsIHRvIG1ha2UgdXAgYSBzaG93LgogICAgTm90aW5nIHRoaXMgcGVudXJ5LCB0byBteXNlbGYgSSBzYWlkCiAgICAnQW4gaWYgYSBtYW4gZGlkIG5lZWQgYSBwb2lzb24gbm93LAogICAgV2hvc2Ugc2FsZSBpcyBwcmVzZW50IGRlYXRoIGluIE1hbnR1YSwKICAgIEhlcmUgbGl2ZXMgYSBjYWl0aWZmIHdyZXRjaCB3b3VsZCBzZWxsIGl0IGhpbS4nCiAgICBPLCB0aGlzIHNhbWUgdGhvdWdodCBkaWQgYnV0IGZvcmVydW4gbXkgbmVlZDsKICAgIEFuZCB0aGlzIHNhbWUgbmVlZHkgbWFuIG11c3Qgc2VsbCBpdCBtZS4KICAgIEFzIEkgcmVtZW1iZXIsIHRoaXMgc2hvdWxkIGJlIHRoZSBob3VzZS4KICAgIEJlaW5nIGhvbGlkYXksIHRoZSBiZWdnYXIncyBzaG9wIGlzIHNodXQuCiAgICBXaGF0LCBobyEgYXBvdGhlY2FyeSEKCiAgICBFbnRlciBBcG90aGVjYXJ5CgpBcG90aGVjYXJ5CgogICAgV2hvIGNhbGxzIHNvIGxvdWQCgpST01FTwoKICAgIENvbWUgaGl0aGVyLCBtYW4uIEkgc2VlIHRoYXQgdGhvdSBhcnQgcG9vcjoKICAgIEhvbGQsIHRoZXJlIGlzIGZvcnR5IGR1Y2F0czogbGV0IG1lIGhhdmUKICAgIEEgZHJhbSBvZiBwb2lzb24sIHN1Y2ggc29vbi1zcGVlZGluZyBnZWFyCiAgICBBcyB3aWxsIGRpc3BlcnNlIGl0c2VsZiB0aHJvdWdoIGFsbCB0aGUgdmVpbnMKICAgIFRoYXQgdGhlIGxpZmUtd2VhcnkgdGFrZXIgbWF5IGZhbGwgZGVhZAogICAgQW5kIHRoYXQgdGhlIHRydW5rIG1heSBiZSBkaXNjaGFyZ2VkIG9mIGJyZWF0aAogICAgQXMgdmlvbGVudGx5IGFzIGhhc3R5IHBvd2RlciBmaXJlZAogICAgRG90aCBodXJyeSBmcm9tIHRoZSBmYXRhbCBjYW5ub24ncyB3b21iLgoKQXBvdGhlY2FyeQoKICAgIFN1Y2ggbW9ydGFsIGRydWdzIEkgaGF2ZTsgYnV0IE1hbnR1YSdzIGxhdwogICAgSXMgZGVhdGggdG8gYW55IGhlIHRoYXQgdXR0ZXJzIHRoZW0uCgpST01FTwoKICAgIEFydCB0aG91IHNvIGJhcmUgYW5kIGZ1bGwgb2Ygd3JldGNoZWRuZXNzLAogICAgQW5kIGZlYXInc3QgdG8gZGllPyBmYW1pbmUgaXMgaW4gdGh5IGNoZWVrcywKICAgIE5lZWQgYW5kIG9wcHJlc3Npb24gc3RhcnZldGggaW4gdGhpbmUgZXllcywKICAgIENvbnRlbXB0IGFuZCBiZWdnYXJ5IGhhbmdzIHVwb24gdGh5IGJhY2s7CiAgICBUaGUgd29ybGQgaXMgbm90IHRoeSBmcmllbmQgbm9yIHRoZSB3b3JsZCdzIGxhdzsKICAgIFRoZSB3b3JsZCBhZmZvcmRzIG5vIGxhdyB0byBtYWtlIHRoZWUgcmljaDsKICAgIFRoZW4gYmUgbm90IHBvb3IsIGJ1dCBicmVhayBpdCwgYW5kIHRha2UgdGhpcy4KCkFwb3RoZWNhcnkKCiAgICBNeSBwb3ZlcnR5LCBidXQgbm90IG15IHdpbGwsIGNvbnNlbnRzLgoKUk9NRU8KCiAgICBJIHBheSB0aHkgcG92ZXJ0eSwgYW5kIG5vdCB0aHkgd2lsbC4KCkFwb3RoZWNhcnkKCiAgICBQdXQgdGhpcyBpbiBhbnkgbGlxdWlkIHRoaW5nIHlvdSB3aWxsLAogICAgQW5kIGRyaW5rIGl0IG9mZjsgYW5kLCBpZiB5b3UgaGFkIHRoZSBzdHJlbmd0aAogICAgT2YgdHdlbnR5IG1lbiwgaXQgd291bGQgZGlzcGF0Y2ggeW91IHN0cmFpZ2h0LgoKUk9NRU8KCiAgICBUaGVyZSBpcyB0aHkgZ29sZCwgd29yc2UgcG9pc29uIHRvIG1lbidzIHNvdWxzLAogICAgRG9pbmcgbW9yZSBtdXJkZXJzIGluIHRoaXMgbG9hdGhzb21lIHdvcmxkLAogICAgVGhhbiB0aGVzZSBwb29yIGNvbXBvdW5kcyB0aGF0IHRob3UgbWF5c3Qgbm90IHNlbGwuCiAgICBJIHNlbGwgdGhlZSBwb2lzb247IHRob3UgaGFzdCBzb2xkIG1lIG5vbmUuCiAgICBGYXJld2VsbDogYnV5IGZvb2QsIGFuZCBnZXQgdGh5c2VsZiBpbiBmbGVzaC4KICAgIENvbWUsIGNvcmRpYWwgYW5kIG5vdCBwb2lzb24sIGdvIHdpdGggbWUKICAgIFRvIEp1bGlldCdzIGdyYXZlOyBmb3IgdGhlcmUgbXVzdCBJIHVzZSB0aGVlLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBKT0hOIAoKRlJJQVIgSk9ITgoKICAgIEhvbHkgRnJhbmNpc2NhbiBmcmlhciEgYnJvdGhlciwgaG8hCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UKCkZSSUFSIExBVVJFTkNFCgogICAgVGhpcyBzYW1lIHNob3VsZCBiZSB0aGUgdm9pY2Ugb2YgRnJpYXIgSm9obi4KICAgIFdlbGNvbWUgZnJvbSBNYW50dWE6IHdoYXQgc2F5cyBSb21lbz8KICAgIE9yLCBpZiBoaXMgbWluZCBiZSB3cml0LCBnaXZlIG1lIGhpcyBsZXR0ZXIuCgpGUklBUiBKT0hOCgogICAgR29pbmcgdG8gZmluZCBhIGJhcmUtZm9vdCBicm90aGVyIG91dAogICAgT25lIG9mIG91ciBvcmRlciwgdG8gYXNzb2NpYXRlIG1lLAogICAgSGVyZSBpbiB0aGlzIGNpdHkgdmlzaXRpbmcgdGhlIHNpY2ssCiAgICBBbmQgZmluZGluZyBoaW0sIHRoZSBzZWFyY2hlcnMgb2YgdGhlIHRvd24sCiAgICBTdXNwZWN0aW5nIHRoYXQgd2UgYm90aCB3ZXJlIGluIGEgaG91c2UKICAgIFdoZXJlIHRoZSBpbmZlY3Rpb3VzIHBlc3RpbGVuY2UgZGlkIHJlaWduLAogICAgU2VhbCdkIHVwIHRoZSBkb29ycywgYW5kIHdvdWxkIG5vdCBsZXQgdXMgZm9ydGg7CiAgICBTbyB0aGF0IG15IHNwZWVkIHRvIE1hbnR1YSB0aGVyZSB3YXMgc3RheSdkLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXaG8gYmFyZSBteSBsZXR0ZXIsIHRoZW4sIHRvIFJvbWVvPwoKRlJJQVIgSk9ITgoKICAgIEkgY291bGQgbm90IHNlbmQgaXQsLS1oZXJlIGl0IGlzIGFnYWluLC0tCiAgICBOb3IgZ2V0IGEgbWVzc2VuZ2VyIHRvIGJyaW5nIGl0IHRoZWUsCiAgICBTbyBmZWFyZnVsIHdlcmUgdGhleSBvZiBpbmZlY3Rpb24uCgpGUklBUiBMQVVSRU5DRQoKICAgIFVuaGFwcHkgZm9ydHVuZSEgYnkgbXkgYnJvdGhlcmhvb2QsCiAgICBUaGUgbGV0dGVyIHdhcyBub3QgbmljZSBidXQgZnVsbCBvZiBjaGFyZ2UKICAgIE9mIGRlYXIgaW1wb3J0LCBhbmQgdGhlIG5lZ2xlY3RpbmcgaXQKICAgIE1heSBkbyBtdWNoIGRhbmdlci4gRnJpYXIgSm9obiwgZ28gaGVuY2U7CiAgICBHZXQgbWUgYW4gaXJvbiBjcm93LCBhbmQgYnJpbmcgaXQgc3RyYWlnaHQKICAgIFVudG8gbXkgY2VsbC4KCkZSSUFSIEpPSE4KCiAgICBCcm90aGVyLCBJJ2xsIGdvIGFuZCBicmluZyBpdCB0aGVlLgoKICAgIEV4aXQKCkZSSUFSIExBVVJFTkNFCgogICAgTm93IG11c3QgSSB0byB0aGUgbW9udW1lbnQgYWxvbmU7CiAgICBXaXRoaW4gdGhyZWUgaG91cnMgd2lsbCBmYWlyIEp1bGlldCB3YWtlOgogICAgU2hlIHdpbGwgYmVzaHJldyBtZSBtdWNoIHRoYXQgUm9tZW8KICAgIEhhdGggaGFkIG5vIG5vdGljZSBvZiB0aGVzZSBhY2NpZGVudHM7CiAgICBCdXQgSSB3aWxsIHdyaXRlIGFnYWluIHRvIE1hbnR1YSwKICAgIEFuZCBrZWVwIGhlciBhdCBteSBjZWxsIHRpbGwgUm9tZW8gY29tZTsKICAgIFBvb3IgbGl2aW5nIGNvcnNlLCBjbG9zZWQgaW4gYSBkZWFkIG1hbidzIHRvbWIhCgogICAgRXhpdAoKU0NFTkUgSUlJLiBBIGNodXJjaHlhcmQ7IGluIGl0IGEgdG9tYiBiZWxvbmdpbmcgdG8gdGhlIENhcHVsZXRzLgoKICAgIEVudGVyIFBBUklTLCBhbmQgaGlzIFBhZ2UgYmVhcmluZyBmbG93ZXJzIGFuZCBhIHRvcmNoIAoKUEFSSVMKCiAgICBHaXZlIG1lIHRoeSB0b3JjaCwgYm95OiBoZW5jZSwgYW5kIHN0YW5kIGFsb29mOgogICAgWWV0IHB1dCBpdCBvdXQsIGZvciBJIHdvdWxkIG5vdCBiZSBzZWVuLgogICAgVW5kZXIgeW9uZCB5ZXctdHJlZXMgbGF5IHRoZWUgYWxsIGFsb25nLAogICAgSG9sZGluZyB0aGluZSBlYXIgY2xvc2UgdG8gdGhlIGhvbGxvdyBncm91bmQ7CiAgICBTbyBzaGFsbCBubyBmb290IHVwb24gdGhlIGNodXJjaHlhcmQgdHJlYWQsCiAgICBCZWluZyBsb29zZSwgdW5maXJtLCB3aXRoIGRpZ2dpbmcgdXAgb2YgZ3JhdmVzLAogICAgQnV0IHRob3Ugc2hhbHQgaGVhciBpdDogd2hpc3RsZSB0aGVuIHRvIG1lLAogICAgQXMgc2lnbmFsIHRoYXQgdGhvdSBoZWFyJ3N0IHNvbWV0aGluZyBhcHByb2FjaC4KICAgIEdpdmUgbWUgdGhvc2UgZmxvd2Vycy4gRG8gYXMgSSBiaWQgdGhlZSwgZ28uCgpQQUdFCgogICAgW0FzaWRlXSBJIGFtIGFsbW9zdCBhZnJhaWQgdG8gc3RhbmQgYWxvbmUKICAgIEhlcmUgaW4gdGhlIGNodXJjaHlhcmQ7IHlldCBJIHdpbGwgYWR2ZW50dXJlLgoKICAgIFJldGlyZXMKClBBUklTCgogICAgU3dlZXQgZmxvd2VyLCB3aXRoIGZsb3dlcnMgdGh5IGJyaWRhbCBiZWQgSSBzdHJldywtLQogICAgTyB3b2UhIHRoeSBjYW5vcHkgaXMgZHVzdCBhbmQgc3RvbmVzOy0tCiAgICBXaGljaCB3aXRoIHN3ZWV0IHdhdGVyIG5pZ2h0bHkgSSB3aWxsIGRldywKICAgIE9yLCB3YW50aW5nIHRoYXQsIHdpdGggdGVhcnMgZGlzdGlsbCdkIGJ5IG1vYW5zOgogICAgVGhlIG9ic2VxdWllcyB0aGF0IEkgZm9yIHRoZWUgd2lsbCBrZWVwCiAgICBOaWdodGx5IHNoYWxsIGJlIHRvIHN0cmV3IHRoeSBncmF2ZSBhbmQgd2VlcC4KCiAgICBUaGUgUGFnZSB3aGlzdGxlcwogICAgVGhlIGJveSBnaXZlcyB3YXJuaW5nIHNvbWV0aGluZyBkb3RoIGFwcHJvYWNoLgogICAgV2hhdCBjdXJzZWQgZm9vdCB3YW5kZXJzIHRoaXMgd2F5IHRvLW5pZ2h0LAogICAgVG8gY3Jvc3MgbXkgb2JzZXF1aWVzIGFuZCB0cnVlIGxvdmUncyByaXRlPwogICAgV2hhdCB3aXRoIGEgdG9yY2ghIG11ZmZsZSBtZSwgbmlnaHQsIGF3aGlsZS4KCiAgICBSZXRpcmVzCgogICAgRW50ZXIgUk9NRU8gYW5kIEJBTFRIQVNBUiwgd2l0aCBhIHRvcmNoLCBtYXR0b2NrLCAmIGMKClJPTUVPCgogICAgR2l2ZSBtZSB0aGF0IG1hdHRvY2sgYW5kIHRoZSB3cmVuY2hpbmcgaXJvbi4KICAgIEhvbGQsIHRha2UgdGhpcyBsZXR0ZXI7IGVhcmx5IGluIHRoZSBtb3JuaW5nCiAgICBTZWUgdGhvdSBkZWxpdmVyIGl0IHRvIG15IGxvcmQgYW5kIGZhdGhlci4KICAgIEdpdmUgbWUgdGhlIGxpZ2h0OiB1cG9uIHRoeSBsaWZlLCBJIGNoYXJnZSB0aGVlLAogICAgV2hhdGUnZXIgdGhvdSBoZWFyJ3N0IG9yIHNlZXN0LCBzdGFuZCBhbGwgYWxvb2YsCiAgICBBbmQgZG8gbm90IGludGVycnVwdCBtZSBpbiBteSBjb3Vyc2UuCiAgICBXaHkgSSBkZXNjZW5kIGludG8gdGhpcyBiZWQgb2YgZGVhdGgsCiAgICBJcyBwYXJ0bHkgdG8gYmVob2xkIG15IGxhZHkncyBmYWNlOwogICAgQnV0IGNoaWVmbHkgdG8gdGFrZSB0aGVuY2UgZnJvbSBoZXIgZGVhZCBmaW5nZXIKICAgIEEgcHJlY2lvdXMgcmluZywgYSByaW5nIHRoYXQgSSBtdXN0IHVzZQogICAgSW4gZGVhciBlbXBsb3ltZW50OiB0aGVyZWZvcmUgaGVuY2UsIGJlIGdvbmU6CiAgICBCdXQgaWYgdGhvdSwgamVhbG91cywgZG9zdCByZXR1cm4gdG8gcHJ5CiAgICBJbiB3aGF0IEkgZnVydGhlciBzaGFsbCBpbnRlbmQgdG8gZG8sCiAgICBCeSBoZWF2ZW4sIEkgd2lsbCB0ZWFyIHRoZWUgam9pbnQgYnkgam9pbnQKICAgIEFuZCBzdHJldyB0aGlzIGh1bmdyeSBjaHVyY2h5YXJkIHdpdGggdGh5IGxpbWJzOgogICAgVGhlIHRpbWUgYW5kIG15IGludGVudHMgYXJlIHNhdmFnZS13aWxkLAogICAgTW9yZSBmaWVyY2UgYW5kIG1vcmUgaW5leG9yYWJsZSBmYXIKICAgIFRoYW4gZW1wdHkgdGlnZXJzIG9yIHRoZSByb2FyaW5nIHNlYS4KCkJBTFRIQVNBUgoKICAgIEkgd2lsbCBiZSBnb25lLCBzaXIsIGFuZCBub3QgdHJvdWJsZSB5b3UuCgpST01FTwoKICAgIFNvIHNoYWx0IHRob3Ugc2hvdyBtZSBmcmllbmRzaGlwLiBUYWtlIHRob3UgdGhhdDoKICAgIExpdmUsIGFuZCBiZSBwcm9zcGVyb3VzOiBhbmQgZmFyZXdlbGwsIGdvb2QgZmVsbG93LgoKQkFMVEhBU0FSCgogICAgW0FzaWRlXSBGb3IgYWxsIHRoaXMgc2FtZSwgSSdsbCBoaWRlIG1lIGhlcmVhYm91dDoKICAgIEhpcyBsb29rcyBJIGZlYXIsIGFuZCBoaXMgaW50ZW50cyBJIGRvdWJ0LgoKICAgIFJldGlyZXMKClJPTUVPCgogICAgVGhvdSBkZXRlc3RhYmxlIG1hdywgdGhvdSB3b21iIG9mIGRlYXRoLAogICAgR29yZ2VkIHdpdGggdGhlIGRlYXJlc3QgbW9yc2VsIG9mIHRoZSBlYXJ0aCwKICAgIFRodXMgSSBlbmZvcmNlIHRoeSByb3R0ZW4gamF3cyB0byBvcGVuLAogICAgQW5kLCBpbiBkZXNwaXRlLCBJJ2xsIGNyYW0gdGhlZSB3aXRoIG1vcmUgZm9vZCEKCiAgICBPcGVucyB0aGUgdG9tYgoKUEFSSVMKCiAgICBUaGlzIGlzIHRoYXQgYmFuaXNoJ2QgaGF1Z2h0eSBNb250YWd1ZSwKICAgIFRoYXQgbXVyZGVyJ2QgbXkgbG92ZSdzIGNvdXNpbiwgd2l0aCB3aGljaCBncmllZiwKICAgIEl0IGlzIHN1cHBvc2VkLCB0aGUgZmFpciBjcmVhdHVyZSBkaWVkOwogICAgQW5kIGhlcmUgaXMgY29tZSB0byBkbyBzb21lIHZpbGxhbm91cyBzaGFtZQogICAgVG8gdGhlIGRlYWQgYm9kaWVzOiBJIHdpbGwgYXBwcmVoZW5kIGhpbS4KCiAgICBDb21lcyBmb3J3YXJkCiAgICBTdG9wIHRoeSB1bmhhbGxvdydkIHRvaWwsIHZpbGUgTW9udGFndWUhCiAgICBDYW4gdmVuZ2VhbmNlIGJlIHB1cnN1ZWQgZnVydGhlciB0aGFuIGRlYXRoPwogICAgQ29uZGVtbmVkIHZpbGxhaW4sIEkgZG8gYXBwcmVoZW5kIHRoZWU6CiAgICBPYmV5LCBhbmQgZ28gd2l0aCBtZTsgZm9yIHRob3UgbXVzdCBkaWUuCgpST01FTwoKICAgIEkgbXVzdCBpbmRlZWQ7IGFuZCB0aGVyZWZvcmUgY2FtZSBJIGhpdGhlci4KICAgIEdvb2QgZ2VudGxlIHlvdXRoLCB0ZW1wdCBub3QgYSBkZXNwZXJhdGUgbWFuOwogICAgRmx5IGhlbmNlLCBhbmQgbGVhdmUgbWU6IHRoaW5rIHVwb24gdGhlc2UgZ29uZTsKICAgIExldCB0aGVtIGFmZnJpZ2h0IHRoZWUuIEkgYmVzZWVjaCB0aGVlLCB5b3V0aCwKICAgIFB1dCBub3QgYW5vdGhlciBzaW4gdXBvbiBteSBoZWFkLAogICAgQnkgdXJnaW5nIG1lIHRvIGZ1cnk6IE8sIGJlIGdvbmUhCiAgICBCeSBoZWF2ZW4sIEkgbG92ZSB0aGVlIGJldHRlciB0aGFuIG15c2VsZjsKICAgIEZvciBJIGNvbWUgaGl0aGVyIGFybSdkIGFnYWluc3QgbXlzZWxmOgogICAgU3RheSBub3QsIGJlIGdvbmU7IGxpdmUsIGFuZCBoZXJlYWZ0ZXIgc2F5LAogICAgQSBtYWRtYW4ncyBtZXJjeSBiYWRlIHRoZWUgcnVuIGF3YXkuCgpQQVJJUwoKICAgIEkgZG8gZGVmeSB0aHkgY29uanVyYXRpb25zLAogICAgQW5kIGFwcHJlaGVuZCB0aGVlIGZvciBhIGZlbG9uIGhlcmUuCgpST01FTwoKICAgIFdpbHQgdGhvdSBwcm92b2tlIG1lPyB0aGVuIGhhdmUgYXQgdGhlZSwgYm95IQoKICAgIFRoZXkgZmlnaHQKClBBR0UKCiAgICBPIExvcmQsIHRoZXkgZmlnaHQhIEkgd2lsbCBnbyBjYWxsIHRoZSB3YXRjaC4KCiAgICBFeGl0CgpQQVJJUwoKICAgIE8sIEkgYW0gc2xhaW4hCgogICAgRmFsbHMKICAgIElmIHRob3UgYmUgbWVyY2lmdWwsCiAgICBPcGVuIHRoZSB0b21iLCBsYXkgbWUgd2l0aCBKdWxpZXQuCgogICAgRGllcwoKUk9NRU8KCiAgICBJbiBmYWl0aCwgSSB3aWxsLiBMZXQgbWUgcGVydXNlIHRoaXMgZmFjZS4KICAgIE1lcmN1dGlvJ3Mga2luc21hbiwgbm9ibGUgQ291bnR5IFBhcmlzIQogICAgV2hhdCBzYWlkIG15IG1hbiwgd2hlbiBteSBiZXRvc3NlZCBzb3VsCiAgICBEaWQgbm90IGF0dGVuZCBoaW0gYXMgd2Ugcm9kZT8gSSB0aGluawogICAgSGUgdG9sZCBtZSBQYXJpcyBzaG91bGQgaGF2ZSBtYXJyaWVkIEp1bGlldDoKICAgIFNhaWQgaGUgbm90IHNvPyBvciBkaWQgSSBkcmVhbSBpdCBzbz8KICAgIE9yIGFtIEkgbWFkLCBoZWFyaW5nIGhpbSB0YWxrIG9mIEp1bGlldCwKICAgIFRvIHRoaW5rIGl0IHdhcyBzbz8gTywgZ2l2ZSBtZSB0aHkgaGFuZCwKICAgIE9uZSB3cml0IHdpdGggbWUgaW4gc291ciBtaXNmb3J0dW5lJ3MgYm9vayEKICAgIEknbGwgYnVyeSB0aGVlIGluIGEgdHJpdW1waGFudCBncmF2ZTsKICAgIEEgZ3JhdmUIE8gbm8hIGEgbGFudGVybiwgc2xhdWdodGVyJ2QgeW91dGgsCiAgICBGb3IgaGVyZSBsaWVzIEp1bGlldCwgYW5kIGhlciBiZWF1dHkgbWFrZXMKICAgIFRoaXMgdmF1bHQgYSBmZWFzdGluZyBwcmVzZW5jZSBmdWxsIG9mIGxpZ2h0LgogICAgRGVhdGgsIGxpZSB0aG91IHRoZXJlLCBieSBhIGRlYWQgbWFuIGludGVycidkLgoKICAgIExheWluZyBQQVJJUyBpbiB0aGUgdG9tYgogICAgSG93IG9mdCB3aGVuIG1lbiBhcmUgYXQgdGhlIHBvaW50IG9mIGRlYXRoCiAgICBIYXZlIHRoZXkgYmVlbiBtZXJyeSEgd2hpY2ggdGhlaXIga2VlcGVycyBjYWxsCiAgICBBIGxpZ2h0bmluZyBiZWZvcmUgZGVhdGg6IE8sIGhvdyBtYXkgSQogICAgQ2FsbCB0aGlzIGEgbGlnaHRuaW5nPyBPIG15IGxvdmUhIG15IHdpZmUhCiAgICBEZWF0aCwgdGhhdCBoYXRoIHN1Y2snZCB0aGUgaG9uZXkgb2YgdGh5IGJyZWF0aCwKICAgIEhhdGggaGFkIG5vIHBvd2VyIHlldCB1cG9uIHRoeSBiZWF1dHk6CiAgICBUaG91IGFydCBub3QgY29ucXVlcidkOyBiZWF1dHkncyBlbnNpZ24geWV0CiAgICBJcyBjcmltc29uIGluIHRoeSBsaXBzIGFuZCBpbiB0aHkgY2hlZWtzLAogICAgQW5kIGRlYXRoJ3MgcGFsZSBmbGFnIGlzIG5vdCBhZHZhbmNlZCB0aGVyZS4KICAgIFR5YmFsdCwgbGllc3QgdGhvdSB0aGVyZSBpbiB0aHkgYmxvb2R5IHNoZWV0PwogICAgTywgd2hhdCBtb3JlIGZhdm91ciBjYW4gSSBkbyB0byB0aGVlLAogICAgVGhhbiB3aXRoIHRoYXQgaGFuZCB0aGF0IGN1dCB0aHkgeW91dGggaW4gdHdhaW4KICAgIFRvIHN1bmRlciBoaXMgdGhhdCB3YXMgdGhpbmUgZW5lbXkCiAgICBGb3JnaXZlIG1lLCBjb3VzaW4hIEFoLCBkZWFyIEp1bGlldCwKICAgIFdoeSBhcnQgdGhvdSB5ZXQgc28gZmFpcj8gc2hhbGwgSSBiZWxpZXZlCiAgICBUaGF0IHVuc3Vic3RhbnRpYWwgZGVhdGggaXMgYW1vcm91cywKICAgIEFuZCB0aGF0IHRoZSBsZWFuIGFiaG9ycmVkIG1vbnN0ZXIga2VlcHMKICAgIFRoZWUgaGVyZSBpbiBkYXJrIHRvIGJlIGhpcyBwYXJhbW91cj8KICAgIEZvciBmZWFyIG9mIHRoYXQsIEkgc3RpbGwgd2lsbCBzdGF5IHdpdGggdGhlZTsKICAgIEFuZCBuZXZlciBmcm9tIHRoaXMgcGFsYWNlIG9mIGRpbSBuaWdodAogICAgRGVwYXJ0IGFnYWluOiBoZXJlLCBoZXJlIHdpbGwgSSByZW1haW4KICAgIFdpdGggd29ybXMgdGhhdCBhcmUgdGh5IGNoYW1iZXItbWFpZHM7IE8sIGhlcmUKICAgIFdpbGwgSSBzZXQgdXAgbXkgZXZlcmxhc3RpbmcgcmVzdCwKICAgIEFuZCBzaGFrZSB0aGUgeW9rZSBvZiBpbmF1c3BpY2lvdXMgc3RhcnMKICAgIEZyb20gdGhpcyB3b3JsZC13ZWFyaWVkIGZsZXNoLiBFeWVzLCBsb29rIHlvdXIgbGFzdCEKICAgIEFybXMsIHRha2UgeW91ciBsYXN0IGVtYnJhY2UhIGFuZCwgbGlwcywgTyB5b3UKICAgIFRoZSBkb29ycyBvZiBicmVhdGgsIHNlYWwgd2l0aCBhIHJpZ2h0ZW91cyBraXNzCiAgICBBIGRhdGVsZXNzIGJhcmdhaW4gdG8gZW5ncm9zc2luZyBkZWF0aCEKICAgIENvbWUsIGJpdHRlciBjb25kdWN0LCBjb21lLCB1bnNhdm91cnkgZ3VpZGUhCiAgICBUaG91IGRlc3BlcmF0ZSBwaWxvdCwgbm93IGF0IG9uY2UgcnVuIG9uCiAgICBUaGUgZGFzaGluZyByb2NrcyB0aHkgc2VhLXNpY2sgd2VhcnkgYmFyayEKICAgIEhlcmUncyB0byBteSBsb3ZlIQoKICAgIERyaW5rcwogICAgTyB0cnVlIGFwb3RoZWNhcnkhCiAgICBUaHkgZHJ1Z3MgYXJlIHF1aWNrLiBUaHVzIHdpdGggYSBraXNzIEkgZGllLgoKICAgIERpZXMKCiAgICBFbnRlciwgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgY2h1cmNoeWFyZCwgRlJJQVIgTEFVUkVOQ0UsIHdpdGggYSBsYW50ZXJuLCBjcm93LCBhbmQgc3BhZGUKCkZSSUFSIExBVVJFTkNFCgogICAgU2FpbnQgRnJhbmNpcyBiZSBteSBzcGVlZCEgaG93IG9mdCB0by1uaWdodAogICAgSGF2ZSBteSBvbGQgZmVldCBzdHVtYmxlZCBhdCBncmF2ZXMhIFdobydzIHRoZXJlPwoKQkFMVEhBU0FSCgogICAgSGVyZSdzIG9uZSwgYSBmcmllbmQsIGFuZCBvbmUgdGhhdCBrbm93cyB5b3Ugd2VsbC4KCkZSSUFSIExBVVJFTkNFCgogICAgQmxpc3MgYmUgdXBvbiB5b3UhIFRlbGwgbWUsIGdvb2QgbXkgZnJpZW5kLAogICAgV2hhdCB0b3JjaCBpcyB5b25kLCB0aGF0IHZhaW5seSBsZW5kcyBoaXMgbGlnaHQKICAgIFRvIGdydWJzIGFuZCBleWVsZXNzIHNrdWxscz8gYXMgSSBkaXNjZXJuLAogICAgSXQgYnVybmV0aCBpbiB0aGUgQ2FwZWwncyBtb251bWVudC4KCkJBTFRIQVNBUgoKICAgIEl0IGRvdGggc28sIGhvbHkgc2lyOyBhbmQgdGhlcmUncyBteSBtYXN0ZXIsCiAgICBPbmUgdGhhdCB5b3UgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2hvIGlzIGl0PwoKQkFMVEhBU0FSCgogICAgUm9tZW8uCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvdyBsb25nIGhhdGggaGUgYmVlbiB0aGVyZT8KCkJBTFRIQVNBUgoKICAgIEZ1bGwgaGFsZiBhbiBob3VyLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHbyB3aXRoIG1lIHRvIHRoZSB2YXVsdC4KCkJBTFRIQVNBUgoKICAgIEkgZGFyZSBub3QsIHNpcgogICAgTXkgbWFzdGVyIGtub3dzIG5vdCBidXQgSSBhbSB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CwgYm95OiB3aGljaCB3YXkCgpKVUxJRVQKCiAgICBZZWEsIG5vaXNlPyB0aGVuIEknbGwgYmUgYnJpZWYuIE8gaGFwcHkgZGFnZ2VyIQoKICAgIFNuYXRjaGluZyBST01FTydzIGRhZ2dlcgogICAgVGhpcyBpcyB0aHkgc2hlYXRoOwoKICAgIFN0YWJzIGhlcnNlbGYKICAgIHRoZXJlIHJ1c3QsIGFuZCBsZXQgbWUgZGllLgoKICAgIEZhbGxzIG9uIFJPTUVPJ3MgYm9keSwgYW5kIGRpZXMKCiAgICBFbnRlciBXYXRjaCwgd2l0aCB0aGUgUGFnZSBvZiBQQVJJUwoKUEFHRQoKICAgIFRoaXMgaXMgdGhlIHBsYWNlOyB0aGVyZSwgd2hlcmUgdGhlIHRvcmNoIGRvdGggYnVybi4KCkZpcnN0IFdhdGNobWFuCgogICAgVGhlIGdyb3VuZCBpcyBibG9vZHk7IHNlYXJjaCBhYm91dCB0aGUgY2h1cmNoeWFyZDoKICAgIEdvLCBzb21lIG9mIHlvdSwgd2hvZSdlciB5b3UgZmluZCBhdHRhY2guCiAgICBQaXRpZnVsIHNpZ2h0ISBoZXJlIGxpZXMgdGhlIGNvdW50eSBzbGFpbiwKICAgIEFuZCBKdWxpZXQgYmxlZWRpbmcsIHdhcm0sIGFuZCBuZXdseSBkZWFkLAogICAgV2hvIGhlcmUgaGF0aCBsYWluIHRoZXNlIHR3byBkYXlzIGJ1cmllZC4KICAgIEdvLCB0ZWxsIHRoZSBwcmluY2U6IHJ1biB0byB0aGUgQ2FwdWxldHM6CiAgICBSYWlzZSB1cCB0aGUgTW9udGFndWVzOiBzb21lIG90aGVycyBzZWFyY2g6CiAgICBXZSBzZWUgdGhlIGdyb3VuZCB3aGVyZW9uIHRoZXNlIHdvZXMgZG8gbGllOwogICAgQnV0IHRoZSB0cnVlIGdyb3VuZCBvZiBhbGwgdGhlc2UgcGl0ZW91cyB3b2VzCiAgICBXZSBjYW5ub3Qgd2l0aG91dCBjaXJjdW1zdGFuY2UgZGVzY3J5LgoKICAgIFJlLWVudGVyIHNvbWUgb2YgdGhlIFdhdGNoLCB3aXRoIEJBTFRIQVNBUgoKU2Vjb25kIFdhdGNobWFuCgogICAgSGVyZSdzIFJvbWVvJ3MgbWFuOyB3ZSBmb3VuZCBoaW0gaW4gdGhlIGNodXJjaHlhcmQuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhvbGQgaGltIGluIHNhZmV0eSwgdGlsbCB0aGUgcHJpbmNlIGNvbWUgaGl0aGVyLgoKICAgIFJlLWVudGVyIG90aGVycyBvZiB0aGUgV2F0Y2gsIHdpdGggRlJJQVIgTEFVUkVOQ0UKClRoaXJkIFdhdGNobWFuCgogICAgSGVyZSBpcyBhIGZyaWFyLCB0aGF0IHRyZW1ibGVzLCBzaWdocyBhbmQgd2VlcHM6CiAgICBXZSB0b29rIHRoaXMgbWF0dG9jayBhbmQgdGhpcyBzcGFkZSBmcm9tIGhpbSwKICAgIEFzIGhlIHdhcyBjb21pbmcgZnJvbSB0aGlzIGNodXJjaHlhcmQgc2lkZS4KCkZpcnN0IFdhdGNobWFuCgogICAgQSBncmVhdCBzdXNwaWNpb246IHN0YXkgdGhlIGZyaWFyIHRvby4KCiAgICBFbnRlciB0aGUgUFJJTkNFIGFuZCBBdHRlbmRhbnRzCgpQUklOQ0UKCiAgICBXaGF0IG1pc2FkdmVudHVyZSBpcyBzbyBlYXJseSB1cCwKICAgIFRoYXQgY2FsbHMgb3VyIHBlcnNvbiBmcm9tIG91ciBtb3JuaW5nJ3MgcmVzdD8KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIGFuZCBvdGhlcnMKCkNBUFVMRVQKCiAgICBXaGF0IHNob3VsZCBpdCBiZSwgdGhhdCB0aGV5IHNvIHNocmllayBhYnJvYWQCgpMQURZIENBUFVMRVQKCiAgICBUaGUgcGVvcGxlIGluIHRoZSBzdHJlZXQgY3J5IFJvbWVvLAogICAgU29tZSBKdWxpZXQsIGFuZCBzb21lIFBhcmlzOyBhbmQgYWxsIHJ1biwKICAgIFdpdGggb3BlbiBvdXRjcnkgdG93YXJkIG91ciBtb251bWVudC4KClBSSU5DRQoKICAgIFdoYXQgZmVhciBpcyB0aGlzIHdoaWNoIHN0YXJ0bGVzIGluIG91ciBlYXJzPwoKRmlyc3QgV2F0Y2htYW4KCiAgICBTb3ZlcmVpZ24sIGhlcmUgbGllcyB0aGUgQ291bnR5IFBhcmlzIHNsYWluOwogICAgQW5kIFJvbWVvIGRlYWQ7IGFuZCBKdWxpZXQsIGRlYWQgYmVmb3JlLAogICAgV2FybSBhbmQgbmV3IGtpbGwnZC4KClBSSU5DRQoKICAgIFNlYXJjaCwgc2VlaywgYW5kIGtub3cgaG93IHRoaXMgZm91bCBtdXJkZXIgY29tZXMuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhlcmUgaXMgYSBmcmlhciwgYW5kIHNsYXVnaHRlcidkIFJvbWVvJ3MgbWFuOwogICAgV2l0aCBpbnN0cnVtZW50cyB1cG9uIHRoZW0sIGZpdCB0byBvcGVuCiAgICBUaGVzZSBkZWFkIG1lbidzIHRvbWJzLgoKQ0FQVUxFVAoKICAgIE8gaGVhdmVucyEgTyB3aWZlLCBsb29rIGhvdyBvdXIgZGF1Z2h0ZXIgYmxlZWRzIQogICAgVGhpcyBkYWdnZXIgaGF0aCBtaXN0YSdlbi0tZm9yLCBsbywgaGlzIGhvdXNlCiAgICBJcyBlbXB0eSBvbiB0aGUgYmFjayBvZiBNb250YWd1ZSwtLQogICAgQW5kIGl0IG1pcy1zaGVhdGhlZCBpbiBteSBkYXVnaHRlcidzIGJvc29tIQoKTEFEWSBDQVBVTEVUCgogICAgTyBtZSEgdGhpcyBzaWdodCBvZiBkZWF0aCBpcyBhcyBhIGJlbGwsCiAgICBUaGF0IHdhcm5zIG15IG9sZCBhZ2UgdG8gYSBzZXB1bGNocmUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIG90aGVycwoKUFJJTkNFCgogICAgQ29tZSwgTW9udGFndWU7IGZvciB0aG91IGFydCBlYXJseSB1cCwKICAgIFRvIHNlZSB0aHkgc29uIGFuZCBoZWlyIG1vcmUgZWFybHkgZG93bi4KCk1PTlRBR1VFCgogICAgQWxhcywgbXkgbGllZ2UsIG15IHdpZmUgaXMgZGVhZCB0by1uaWdodDsKICAgIEdyaWVmIG9mIG15IHNvbidzIGV4aWxlIGhhdGggc3RvcHAnZCBoZXIgYnJlYXRoOgogICAgV2hhdCBmdXJ0aGVyIHdvZSBjb25zcGlyZXMgYWdhaW5zdCBtaW5lIGFnZT8KClBSSU5DRQoKICAgIExvb2ssIGFuZCB0aG91IHNoYWx0IHNlZS4KCk1PTlRBR1VFCgogICAgTyB0aG91IHVudGF1Z2h0ISB3aGF0IG1hbm5lcnMgaXMgaW4gdGhpcz8KICAgIFRvIHByZXNzIGJlZm9yZSB0aHkgZmF0aGVyIHRvIGEgZ3JhdmUCgpQUklOQ0UKCiAgICBTZWFsIHVwIHRoZSBtb3V0aCBvZiBvdXRyYWdlIGZvciBhIHdoaWxlLAogICAgVGlsbCB3ZSBjYW4gY2xlYXIgdGhlc2UgYW1iaWd1aXRpZXMsCiAgICBBbmQga25vdyB0aGVpciBzcHJpbmcsIHRoZWlyIGhlYWQsIHRoZWlyCiAgICB0cnVlIGRlc2NlbnQ7CiAgICBBbmQgdGhlbiB3aWxsIEkgYmUgZ2VuZXJhbCBvZiB5b3VyIHdvZXMsCiAgICBBbmQgbGVhZCB5b3UgZXZlbiB0byBkZWF0aDogbWVhbnRpbWUgZm9yYmVhciwKICAgIEFuZCBsZXQgbWlzY2hhbmNlIGJlIHNsYXZlIHRvIHBhdGllbmNlLgogICAgQnJpbmcgZm9ydGggdGhlIHBhcnRpZXMgb2Ygc3VzcGljaW9uLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJIGFtIHRoZSBncmVhdGVzdCwgYWJsZSB0byBkbyBsZWFzdCwKICAgIFlldCBtb3N0IHN1c3BlY3RlZCwgYXMgdGhlIHRpbWUgYW5kIHBsYWNlCiAgICBEb3RoIG1ha2UgYWdhaW5zdCBtZSBvZiB0aGlzIGRpcmVmdWwgbXVyZGVyOwogICAgQW5kIGhlcmUgSSBzdGFuZCwgYm90aCB0byBpbXBlYWNoIGFuZCBwdXJnZQogICAgTXlzZWxmIGNvbmRlbW5lZCBhbmQgbXlzZWxmIGV4Y3VzZWQuCgpQUklOQ0UKCiAgICBUaGVuIHNheSBhdCBvbmNlIHdoYXQgdGhvdSBkb3N0IGtub3cgaW4gdGhpcy4KCkZSSUFSIExBVVJFTkNFCgogICAgSSB3aWxsIGJlIGJyaWVmLCBmb3IgbXkgc2hvcnQgZGF0ZSBvZiBicmVhdGgKICAgIElzIG5vdCBzbyBsb25nIGFzIGlzIGEgdGVkaW91cyB0YWxlLgogICAgUm9tZW8sIHRoZXJlIGRlYWQsIHdhcyBodXNiYW5kIHRvIHRoYXQgSnVsaWV0OwogICAgQW5kIHNoZSwgdGhlcmUgZGVhZCwgdGhhdCBSb21lbydzIGZhaXRoZnVsIHdpZmU6CiAgICBJIG1hcnJpZWQgdGhlbTsgYW5kIHRoZWlyIHN0b2wnbiBtYXJyaWFnZS1kYXkKICAgIFdhcyBUeWJhbHQncyBkb29tcy1kYXksIHdob3NlIHVudGltZWx5IGRlYXRoCiAgICBCYW5pc2gnZCB0aGUgbmV3LW1hZGUgYnJpZGVncm9vbSBmcm9tIHRoZSBjaXR5LAogICAgRm9yIHdob20sIGFuZCBub3QgZm9yIFR5YmFsdCwgSnVsaWV0IHBpbmVkLgogICAgWW91LCB0byByZW1vdmUgdGhhdCBzaWVnZSBvZiBncmllZiBmcm9tIGhlciwKICAgIEJldHJvdGgnZCBhbmQgd291bGQgaGF2ZSBtYXJyaWVkIGhlciBwZXJmb3JjZQogICAgVG8gQ291bnR5IFBhcmlzOiB0aGVuIGNvbWVzIHNoZSB0byBtZSwKICAgIEFuZCwgd2l0aCB3aWxkIGxvb2tzLCBiaWQgbWUgZGV2aXNlIHNvbWUgbWVhbgogICAgVG8gcmlkIGhlciBmcm9tIHRoaXMgc2Vjb25kIG1hcnJpYWdlLAogICAgT3IgaW4gbXkgY2VsbCB0aGVyZSB3b3VsZCBzaGUga2lsbCBoZXJzZWxmLgogICAgVGhlbiBnYXZlIEkgaGVyLCBzbyB0dXRvcidkIGJ5IG15IGFydCwKICAgIEEgc2xlZXBpbmcgcG90aW9uOyB3aGljaCBzbyB0b29rIGVmZmVjdAogICAgQXMgSSBpbnRlbmRlZCwgZm9yIGl0IHdyb3VnaHQgb24gaGVyCiAgICBUaGUgZm9ybSBvZiBkZWF0aDogbWVhbnRpbWUgSSB3cml0IHRvIFJvbWVvLAogICAgVGhhdCBoZSBzaG91bGQgaGl0aGVyIGNvbWUgYXMgdGhpcyBkaXJlIG5pZ2h0LAogICAgVG8gaGVscCB0byB0YWtlIGhlciBmcm9tIGhlciBib3Jyb3cnZCBncmF2ZSwKICAgIEJlaW5nIHRoZSB0aW1lIHRoZSBwb3Rpb24ncyBmb3JjZSBzaG91bGQgY2Vhc2UuCiAgICBCdXQgaGUgd2hpY2ggYm9yZSBteSBsZXR0ZXIsIEZyaWFyIEpvaG4sCiAgICBXYXMgc3RheSdkIGJ5IGFjY2lkZW50LCBhbmQgeWVzdGVybmlnaHQKICAgIFJldHVybidkIG15IGxldHRlciBiYWNrLiBUaGVuIGFsbCBhbG9uZQogICAgQXQgdGhlIHByZWZpeGVkIGhvdXIgb2YgaGVyIHdha2luZywKICAgIENhbWUgSSB0byB0YWtlIGhlciBmcm9tIGhlciBraW5kcmVkJ3MgdmF1bHQ7CiAgICBNZWFuaW5nIHRvIGtlZXAgaGVyIGNsb3NlbHkgYXQgbXkgY2VsbCwKICAgIFRpbGwgSSBjb252ZW5pZW50bHkgY291bGQgc2VuZCB0byBSb21lbzoKICAgIEJ1dCB3aGVuIEkgY2FtZSwgc29tZSBtaW51dGUgZXJlIHRoZSB0aW1lCiAgICBPZiBoZXIgYXdha2luZywgaGVyZSB1bnRpbWVseSBsYXkKICAgIFRoZSBub2JsZSBQYXJpcyBhbmQgdHJ1ZSBSb21lbyBkZWFkLgogICAgU2hlIHdha2VzOyBhbmQgSSBlbnRyZWF0ZWQgaGVyIGNvbWUgZm9ydGgsCiAgICBBbmQgYmVhciB0aGlzIHdvcmsgb2YgaGVhdmVuIHdpdGggcGF0aWVuY2U6CiAgICBCdXQgdGhlbiBhIG5vaXNlIGRpZCBzY2FyZSBtZSBmcm9tIHRoZSB0b21iOwogICAgQW5kIHNoZSwgdG9vIGRlc3BlcmF0ZSwgd291bGQgbm90IGdvIHdpdGggbWUsCiAgICBCdXQsIGFzIGl0IHNlZW1zLCBkaWQgdmlvbGVuY2Ugb24gaGVyc2VsZi4KICAgIEFsbCB0aGlzIEkga25vdzsgYW5kIHRvIHRoZSBtYXJyaWFnZQogICAgSGVyIG51cnNlIGlzIHByaXZ5OiBhbmQsIGlmIGF1Z2h0IGluIHRoaXMKICAgIE1pc2NhcnJpZWQgYnkgbXkgZmF1bHQsIGxldCBteSBvbGQgbGlmZQogICAgQmUgc2FjcmlmaWNlZCwgc29tZSBob3VyIGJlZm9yZSBoaXMgdGltZSwKICAgIFVudG8gdGhlIHJpZ291ciBvZiBzZXZlcmVzdCBsYXcuCgpQUklOQ0UKCiAgICBXZSBzdGlsbCBoYXZlIGtub3duIHRoZWUgZm9yIGEgaG9seSBtYW4uCiAgICBXaGVyZSdzIFJvbWVvJ3MgbWFuPyB3aGF0IGNhbiBoZSBzYXkgaW4gdGhpcz8KCkJBTFRIQVNBUgoKICAgIEkgYnJvdWdodCBteSBtYXN0ZXIgbmV3cyBvZiBKdWxpZXQncyBkZWF0aDsKICAgIEFuZCB0aGVuIGluIHBvc3QgaGUgY2FtZSBmcm9tIE1hbnR1YQogICAgVG8gdGhpcyBzYW1lIHBsYWNlLCB0byB0aGlzIHNhbWUgbW9udW1lbnQuCiAgICBUaGlzIGxldHRlciBoZSBlYXJseSBiaWQgbWUgZ2l2ZSBoaXMgZmF0aGVyLAogICAgQW5kIHRocmVhdGVuZWQgbWUgd2l0aCBkZWF0aCwgZ29pbmcgaW4gdGhlIHZhdWx0LAogICAgSSBkZXBhcnRlZCBub3QgYW5kIGxlZnQgaGltIHRoZXJlLgoKUFJJTkNFCgogICAgR2l2ZSBtZSB0aGUgbGV0dGVyOyBJIHdpbGwgbG9vayBvbiBpdC4KICAgIFdoZXJlIGlzIHRoZSBjb3VudHkncyBwYWdlLCB0aGF0IHJhaXNlZCB0aGUgd2F0Y2gCiAgICBTaXJyYWgsIHdoYXQgbWFkZSB5b3VyIG1hc3RlciBpbiB0aGlzIHBsYWNlPwoKUEFHRQoKICAgIEhlIGNhbWUgd2l0aCBmbG93ZXJzIHRvIHN0cmV3IGhpcyBsYWR5J3MgZ3JhdmU7CiAgICBBbmQgYmlkIG1lIHN0YW5kIGFsb29mLCBhbmQgc28gSSBkaWQ6CiAgICBBbm9uIGNvbWVzIG9uZSB3aXRoIGxpZ2h0IHRvIG9wZSB0aGUgdG9tYjsKICAgIEFuZCBieSBhbmQgYnkgbXkgbWFzdGVyIGRyZXcgb24gaGltOwogICAgQW5kIHRoZW4gSSByYW4gYXdheSB0byBjYWxsIHRoZSB3YXRjaC4KClBSSU5DRQoKICAgIFRoaXMgbGV0dGVyIGRvdGggbWFrZSBnb29kIHRoZSBmcmlhcidzIHdvcmRzLAogICAgVGhlaXIgY291cnNlIG9mIGxvdmUsIHRoZSB0aWRpbmdzIG9mIGhlciBkZWF0aDoKICAgIEFuZCBoZXJlIGhlIHdyaXRlcyB0aGF0IGhlIGRpZCBidXkgYSBwb2lzb24KICAgIE9mIGEgcG9vciAncG90aGVjYXJ5LCBhbmQgdGhlcmV3aXRoYWwKICAgIENhbWUgdG8gdGhpcyB2YXVsdCB0byBkaWUsIGFuZCBsaWUgd2l0aCBKdWxpZXQuCiAgICBXaGVyZSBiZSB0aGVzZSBlbmVtaWVzPyBDYXB1bGV0ISBNb250YWd1ZSEKICAgIFNlZSwgd2hhdCBhIHNjb3VyZ2UgaXMgbGFpZCB1cG9uIHlvdXIgaGF0ZSwKICAgIFRoYXQgaGVhdmVuIGZpbmRzIG1lYW5zIHRvIGtpbGwgeW91ciBqb3lzIHdpdGggbG92ZS4KICAgIEFuZCBJIGZvciB3aW5raW5nIGF0IHlvdXIgZGlzY29yZHMgdG9vCiAgICBIYXZlIGxvc3QgYSBicmFjZSBvZiBraW5zbWVuOiBhbGwgYXJlIHB1bmlzaCdkLgoKQ0FQVUxFVAoKICAgIE8gYnJvdGhlciBNb250YWd1ZSwgZ2l2ZSBtZSB0aHkgaGFuZDoKICAgIFRoaXMgaXMgbXkgZGF1Z2h0ZXIncyBqb2ludHVyZSwgZm9yIG5vIG1vcmUKICAgIENhbiBJIGRlbWFuZC4KCk1PTlRBR1VFCgogICAgQnV0IEkgY2FuIGdpdmUgdGhlZSBtb3JlOgogICAgRm9yIEkgd2lsbCByYWlzZSBoZXIgc3RhdHVlIGluIHB1cmUgZ29sZDsKICAgIFRoYXQgd2hpbGUgVmVyb25hIGJ5IHRoYXQgbmFtZSBpcyBrbm93biwKICAgIFRoZXJlIHNoYWxsIG5vIGZpZ3VyZSBhdCBzdWNoIHJhdGUgYmUgc2V0CiAgICBBcyB0aGF0IG9mIHRydWUgYW5kIGZhaXRoZnVsIEp1bGlldC4KCkNBUFVMRVQKCiAgICBBcyByaWNoIHNoYWxsIFJvbWVvJ3MgYnkgaGlzIGxhZHkncyBsaWU7CiAgICBQb29yIHNhY3JpZmljZXMgb2Ygb3VyIGVubWl0eSEKClBSSU5DRQoKICAgIEEgZ2xvb21pbmcgcGVhY2UgdGhpcyBtb3JuaW5nIHdpdGggaXQgYnJpbmdzOwogICAgVGhlIHN1biwgZm9yIHNvcnJvdywgd2lsbCBub3Qgc2hvdyBoaXMgaGVhZDoKICAgIEdvIGhlbmNlLCB0byBoYXZlIG1vcmUgdGFsayBvZiB0aGVzZSBzYWQgdGhpbmdzOwogICAgU29tZSBzaGFsbCBiZSBwYXJkb24nZCwgYW5kIHNvbWUgcHVuaXNoZWQ6CiAgICBGb3IgbmV2ZXIgd2FzIGEgc3Rvcnkgb2YgbW9yZSB3b2UKICAgIFRoYW4gdGhpcyBvZiBKdWxpZXQgYW5kIGhlciBSb21lby4KCiAgICBFeGV1bnQK

Chuck Cartledge
Chuck Cartledge
Chuck Cartledge

httpantonio-ferraroeupnword-clouds-in-r-packages-wordcloud2-and-tmrm(list=ls())library(wordcloud2)library(NLP)library(tm)library(RCurl) Necessary steps 1 Use imagesgooglecom to find an outline of the shape to fill (tmpusapng) 2 Use gimp to fill the outline with black 3 Use a command like wordcloud2(TDMasDF size = 20 figPath=tmpusapng backgroundColor = white fontFamily=Loma) to populate shape 4 Result is a web page with javascript embedded to create image and allow mouse overs Clean corpuscleanCorpus lt- function(corpus) corpustmp lt- tm_map(corpus removePunctuation) corpustmp lt- tm_map(corpustmpstripWhitespace) corpustmp lt- tm_map(corpustmptolower) corpustmp lt- tm_map(corpustmp PlainTextDocument) corpustmp lt- tm_map(corpustmpremoveWords stopwords(english)) return(corpustmp) Build TDMgenerateTDM lt- function(path) sdir lt-path scor lt-Corpus(DirSource(directory = sdir encoding= UTF-8)) scorcl lt- cleanCorpus(scor) stdm lt- TermDocumentMatrix(scorcl) stdminitData lt- function(path) if (direxists(path) == FALSE) If the directory does not exist create and populate with dummy data dummyDataFile lt- romeoAndJulietbase64 fileName lt- sprintf(sdummyDatatxt path) print(sprintf(Creating and populating the file s with dummy data fileName)) dircreate(path recursive = TRUE) write(base64( paste( readLines(dummyDataFile) collapse=) encode=FALSE) file=fileName) main lt- function() options(stringsAsFactors = FALSE) The working directory pathName lt- Text initData(pathName) Get the Term Document Matrix TDM lt- generateTDM(pathName) Do I need a matrix or a DF We will see TDMasMatrix lt- asmatrix(TDM) TDMasDFlt-dataframe(TDMasMatrix) TDMasDF$words lt-rownames(TDMasDF) Column headers colnames(TDMasDF) lt- c(freq word) TDMasDFlt-TDMasDF[ c(word freq)] TDMasDF lt- TDMasDF[order(TDMasDF$freqdecreasing=TRUE)] The results a lt- wordcloud2(TDMasDF size = 03 shape=star backgroundColor = black fontFamily=Loma) print(a) a lt- letterCloud(TDMasDF word=USA size = 03 fontFamily=Loma backgroundColor = black) print(a) a lt- wordcloud2(TDMasDF size = 13 figPath=heartpng backgroundColor = white fontFamily=Loma color=red) print(a) TDMasDF$freq lt- log(TDMasDF$freq) a lt- wordcloud2(TDMasDF size = 12 figPath=usapng backgroundColor = white shuffle=FALSE minRotation = 0 maxRotation = 2pi) print(a) print(The program has ended)main()

Chuck Cartledge
Page 10: Creating Shaped Wordclouds Using R - clc-ent.comThe wordcloud2 function behaves slightly di erently than most of the other R plot func-tions that I’ve used. The result from both

A Misc files

The files used to create all these figures are attached to this report They are

1 romeoAndJulietbase64 ndash default text used to demonstrate the software

2 heartpng ndash a heart shape with a hole

3 usapng ndash an outline of the continental United States

4 wordCloudR ndash an R script to demonstrate making word clouds

9

ClJvbWVvIGFuZCBKdWxpZXQKU2hha2VzcGVhcmUgaG9tZXBhZ2UgfCBSb21lbyBhbmQgSnVsaWV0IHwgRW50aXJlIHBsYXkKQUNUIEkKUFJPTE9HVUUKCiAgICBUd28gaG91c2Vob2xkcywgYm90aCBhbGlrZSBpbiBkaWduaXR5LAogICAgSW4gZmFpciBWZXJvbmEsIHdoZXJlIHdlIGxheSBvdXIgc2NlbmUsCiAgICBGcm9tIGFuY2llbnQgZ3J1ZGdlIGJyZWFrIHRvIG5ldyBtdXRpbnksCiAgICBXaGVyZSBjaXZpbCBibG9vZCBtYWtlcyBjaXZpbCBoYW5kcyB1bmNsZWFuLgogICAgRnJvbSBmb3J0aCB0aGUgZmF0YWwgbG9pbnMgb2YgdGhlc2UgdHdvIGZvZXMKICAgIEEgcGFpciBvZiBzdGFyLWNyb3NzJ2QgbG92ZXJzIHRha2UgdGhlaXIgbGlmZTsKICAgIFdob3NlIG1pc2FkdmVudHVyZWQgcGl0ZW91cyBvdmVydGhyb3dzCiAgICBEbyB3aXRoIHRoZWlyIGRlYXRoIGJ1cnkgdGhlaXIgcGFyZW50cycgc3RyaWZlLgogICAgVGhlIGZlYXJmdWwgcGFzc2FnZSBvZiB0aGVpciBkZWF0aC1tYXJrJ2QgbG92ZSwKICAgIEFuZCB0aGUgY29udGludWFuY2Ugb2YgdGhlaXIgcGFyZW50cycgcmFnZSwKICAgIFdoaWNoLCBidXQgdGhlaXIgY2hpbGRyZW4ncyBlbmQsIG5vdWdodCBjb3VsZCByZW1vdmUsCiAgICBJcyBub3cgdGhlIHR3byBob3VycycgdHJhZmZpYyBvZiBvdXIgc3RhZ2U7CiAgICBUaGUgd2hpY2ggaWYgeW91IHdpdGggcGF0aWVudCBlYXJzIGF0dGVuZCwKICAgIFdoYXQgaGVyZSBzaGFsbCBtaXNzLCBvdXIgdG9pbCBzaGFsbCBzdHJpdmUgdG8gbWVuZC4KClNDRU5FIEkuIFZlcm9uYS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgU0FNUFNPTiBhbmQgR1JFR09SWSwgb2YgdGhlIGhvdXNlIG9mIENhcHVsZXQsIGFybWVkIHdpdGggc3dvcmRzIGFuZCBidWNrbGVycyAKClNBTVBTT04KCiAgICBHcmVnb3J5LCBvJyBteSB3b3JkLCB3ZSdsbCBub3QgY2FycnkgY29hbHMuCgpHUkVHT1JZCgogICAgTm8sIGZvciB0aGVuIHdlIHNob3VsZCBiZSBjb2xsaWVycy4KClNBTVBTT04KCiAgICBJIG1lYW4sIGFuIHdlIGJlIGluIGNob2xlciwgd2UnbGwgZHJhdy4KCkdSRUdPUlkKCiAgICBBeSwgd2hpbGUgeW91IGxpdmUsIGRyYXcgeW91ciBuZWNrIG91dCBvJyB0aGUgY29sbGFyLgoKU0FNUFNPTgoKICAgIEkgc3RyaWtlIHF1aWNrbHksIGJlaW5nIG1vdmVkLgoKR1JFR09SWQoKICAgIEJ1dCB0aG91IGFydCBub3QgcXVpY2tseSBtb3ZlZCB0byBzdHJpa2UuCgpTQU1QU09OCgogICAgQSBkb2cgb2YgdGhlIGhvdXNlIG9mIE1vbnRhZ3VlIG1vdmVzIG1lLgoKR1JFR09SWQoKICAgIFRvIG1vdmUgaXMgdG8gc3RpcjsgYW5kIHRvIGJlIHZhbGlhbnQgaXMgdG8gc3RhbmQ6CiAgICB0aGVyZWZvcmUsIGlmIHRob3UgYXJ0IG1vdmVkLCB0aG91IHJ1bm4nc3QgYXdheS4KClNBTVBTT04KCiAgICBBIGRvZyBvZiB0aGF0IGhvdXNlIHNoYWxsIG1vdmUgbWUgdG8gc3RhbmQ6IEkgd2lsbAogICAgdGFrZSB0aGUgd2FsbCBvZiBhbnkgbWFuIG9yIG1haWQgb2YgTW9udGFndWUncy4KCkdSRUdPUlkKCiAgICBUaGF0IHNob3dzIHRoZWUgYSB3ZWFrIHNsYXZlOyBmb3IgdGhlIHdlYWtlc3QgZ29lcwogICAgdG8gdGhlIHdhbGwuCgpTQU1QU09OCgogICAgVHJ1ZTsgYW5kIHRoZXJlZm9yZSB3b21lbiwgYmVpbmcgdGhlIHdlYWtlciB2ZXNzZWxzLAogICAgYXJlIGV2ZXIgdGhydXN0IHRvIHRoZSB3YWxsOiB0aGVyZWZvcmUgSSB3aWxsIHB1c2gKICAgIE1vbnRhZ3VlJ3MgbWVuIGZyb20gdGhlIHdhbGwsIGFuZCB0aHJ1c3QgaGlzIG1haWRzCiAgICB0byB0aGUgd2FsbC4KCkdSRUdPUlkKCiAgICBUaGUgcXVhcnJlbCBpcyBiZXR3ZWVuIG91ciBtYXN0ZXJzIGFuZCB1cyB0aGVpciBtZW4uCgpTQU1QU09OCgogICAgJ1RpcyBhbGwgb25lLCBJIHdpbGwgc2hvdyBteXNlbGYgYSB0eXJhbnQ6IHdoZW4gSQogICAgaGF2ZSBmb3VnaHQgd2l0aCB0aGUgbWVuLCBJIHdpbGwgYmUgY3J1ZWwgd2l0aCB0aGUKICAgIG1haWRzLCBhbmQgY3V0IG9mZiB0aGVpciBoZWFkcy4KCkdSRUdPUlkKCiAgICBUaGUgaGVhZHMgb2YgdGhlIG1haWRzPwoKU0FNUFNPTgoKICAgIEF5LCB0aGUgaGVhZHMgb2YgdGhlIG1haWRzLCBvciB0aGVpciBtYWlkZW5oZWFkczsKICAgIHRha2UgaXQgaW4gd2hhdCBzZW5zZSB0aG91IHdpbHQuCgpHUkVHT1JZCgogICAgVGhleSBtdXN0IHRha2UgaXQgaW4gc2Vuc2UgdGhhdCBmZWVsIGl0LgoKU0FNUFNPTgoKICAgIE1lIHRoZXkgc2hhbGwgZmVlbCB3aGlsZSBJIGFtIGFibGUgdG8gc3RhbmQ6IGFuZAogICAgJ3RpcyBrbm93biBJIGFtIGEgcHJldHR5IHBpZWNlIG9mIGZsZXNoLgoKR1JFR09SWQoKICAgICdUaXMgd2VsbCB0aG91IGFydCBub3QgZmlzaDsgaWYgdGhvdSBoYWRzdCwgdGhvdQogICAgaGFkc3QgYmVlbiBwb29yIEpvaG4uIERyYXcgdGh5IHRvb2whIGhlcmUgY29tZXMKICAgIHR3byBvZiB0aGUgaG91c2Ugb2YgdGhlIE1vbnRhZ3Vlcy4KClNBTVBTT04KCiAgICBNeSBuYWtlZCB3ZWFwb24gaXMgb3V0OiBxdWFycmVsLCBJIHdpbGwgYmFjayB0aGVlLgoKR1JFR09SWQoKICAgIEhvdyEgdHVybiB0aHkgYmFjayBhbmQgcnVuPwoKU0FNUFNPTgoKICAgIEZlYXIgbWUgbm90LgoKR1JFR09SWQoKICAgIE5vLCBtYXJyeTsgSSBmZWFyIHRoZWUhCgpTQU1QU09OCgogICAgTGV0IHVzIHRha2UgdGhlIGxhdyBvZiBvdXIgc2lkZXM7IGxldCB0aGVtIGJlZ2luLgoKR1JFR09SWQoKICAgIEkgd2lsbCBmcm93biBhcyBJIHBhc3MgYnksIGFuZCBsZXQgdGhlbSB0YWtlIGl0IGFzCiAgICB0aGV5IGxpc3QuCgpTQU1QU09OCgogICAgTmF5LCBhcyB0aGV5IGRhcmUuIEkgd2lsbCBiaXRlIG15IHRodW1iIGF0IHRoZW07CiAgICB3aGljaCBpcyBhIGRpc2dyYWNlIHRvIHRoZW0sIGlmIHRoZXkgYmVhciBpdC4KCiAgICBFbnRlciBBQlJBSEFNIGFuZCBCQUxUSEFTQVIKCkFCUkFIQU0KCiAgICBEbyB5b3UgYml0ZSB5b3VyIHRodW1iIGF0IHVzLCBzaXICgpTQU1QU09OCgogICAgSSBkbyBiaXRlIG15IHRodW1iLCBzaXIuCgpBQlJBSEFNCgogICAgRG8geW91IGJpdGUgeW91ciB0aHVtYiBhdCB1cywgc2lyPwoKU0FNUFNPTgoKICAgIFtBc2lkZSB0byBHUkVHT1JZXSBJcyB0aGUgbGF3IG9mIG91ciBzaWRlLCBpZiBJIHNheQogICAgYXkCgpHUkVHT1JZCgogICAgTm8uCgpTQU1QU09OCgogICAgTm8sIHNpciwgSSBkbyBub3QgYml0ZSBteSB0aHVtYiBhdCB5b3UsIHNpciwgYnV0IEkKICAgIGJpdGUgbXkgdGh1bWIsIHNpci4KCkdSRUdPUlkKCiAgICBEbyB5b3UgcXVhcnJlbCwgc2lyPwoKQUJSQUhBTQoKICAgIFF1YXJyZWwgc2lyISBubywgc2lyLgoKU0FNUFNPTgoKICAgIElmIHlvdSBkbywgc2lyLCBJIGFtIGZvciB5b3U6IEkgc2VydmUgYXMgZ29vZCBhIG1hbiBhcyB5b3UuCgpBQlJBSEFNCgogICAgTm8gYmV0dGVyLgoKU0FNUFNPTgoKICAgIFdlbGwsIHNpci4KCkdSRUdPUlkKCiAgICBTYXkgJ2JldHRlcjonIGhlcmUgY29tZXMgb25lIG9mIG15IG1hc3RlcidzIGtpbnNtZW4uCgpTQU1QU09OCgogICAgWWVzLCBiZXR0ZXIsIHNpci4KCkFCUkFIQU0KCiAgICBZb3UgbGllLgoKU0FNUFNPTgoKICAgIERyYXcsIGlmIHlvdSBiZSBtZW4uIEdyZWdvcnksIHJlbWVtYmVyIHRoeSBzd2FzaGluZyBibG93LgoKICAgIFRoZXkgZmlnaHQKCiAgICBFbnRlciBCRU5WT0xJTwoKQkVOVk9MSU8KCiAgICBQYXJ0LCBmb29scyEKICAgIFB1dCB1cCB5b3VyIHN3b3JkczsgeW91IGtub3cgbm90IHdoYXQgeW91IGRvLgoKICAgIEJlYXRzIGRvd24gdGhlaXIgc3dvcmRzCgogICAgRW50ZXIgVFlCQUxUCgpUWUJBTFQKCiAgICBXaGF0LCBhcnQgdGhvdSBkcmF3biBhbW9uZyB0aGVzZSBoZWFydGxlc3MgaGluZHMCiAgICBUdXJuIHRoZWUsIEJlbnZvbGlvLCBsb29rIHVwb24gdGh5IGRlYXRoLgoKQkVOVk9MSU8KCiAgICBJIGRvIGJ1dCBrZWVwIHRoZSBwZWFjZTogcHV0IHVwIHRoeSBzd29yZCwKICAgIE9yIG1hbmFnZSBpdCB0byBwYXJ0IHRoZXNlIG1lbiB3aXRoIG1lLgoKVFlCQUxUCgogICAgV2hhdCwgZHJhd24sIGFuZCB0YWxrIG9mIHBlYWNlISBJIGhhdGUgdGhlIHdvcmQsCiAgICBBcyBJIGhhdGUgaGVsbCwgYWxsIE1vbnRhZ3VlcywgYW5kIHRoZWU6CiAgICBIYXZlIGF0IHRoZWUsIGNvd2FyZCEKCiAgICBUaGV5IGZpZ2h0CgogICAgRW50ZXIsIHNldmVyYWwgb2YgYm90aCBob3VzZXMsIHdobyBqb2luIHRoZSBmcmF5OyB0aGVuIGVudGVyIENpdGl6ZW5zLCB3aXRoIGNsdWJzCgpGaXJzdCBDaXRpemVuCgogICAgQ2x1YnMsIGJpbGxzLCBhbmQgcGFydGlzYW5zISBzdHJpa2UhIGJlYXQgdGhlbSBkb3duIQogICAgRG93biB3aXRoIHRoZSBDYXB1bGV0cyEgZG93biB3aXRoIHRoZSBNb250YWd1ZXMhCgogICAgRW50ZXIgQ0FQVUxFVCBpbiBoaXMgZ293biwgYW5kIExBRFkgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgdGhpcz8gR2l2ZSBtZSBteSBsb25nIHN3b3JkLCBobyEKCkxBRFkgQ0FQVUxFVAoKICAgIEEgY3J1dGNoLCBhIGNydXRjaCEgd2h5IGNhbGwgeW91IGZvciBhIHN3b3JkPwoKQ0FQVUxFVAoKICAgIE15IHN3b3JkLCBJIHNheSEgT2xkIE1vbnRhZ3VlIGlzIGNvbWUsCiAgICBBbmQgZmxvdXJpc2hlcyBoaXMgYmxhZGUgaW4gc3BpdGUgb2YgbWUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIExBRFkgTU9OVEFHVUUKCk1PTlRBR1VFCgogICAgVGhvdSB2aWxsYWluIENhcHVsZXQsLS1Ib2xkIG1lIG5vdCwgbGV0IG1lIGdvLgoKTEFEWSBNT05UQUdVRQoKICAgIFRob3Ugc2hhbHQgbm90IHN0aXIgYSBmb290IHRvIHNlZWsgYSBmb2UuCgogICAgRW50ZXIgUFJJTkNFLCB3aXRoIEF0dGVuZGFudHMKClBSSU5DRQoKICAgIFJlYmVsbGlvdXMgc3ViamVjdHMsIGVuZW1pZXMgdG8gcGVhY2UsCiAgICBQcm9mYW5lcnMgb2YgdGhpcyBuZWlnaGJvdXItc3RhaW5lZCBzdGVlbCwtLQogICAgV2lsbCB0aGV5IG5vdCBoZWFyPyBXaGF0LCBobyEgeW91IG1lbiwgeW91IGJlYXN0cywKICAgIFRoYXQgcXVlbmNoIHRoZSBmaXJlIG9mIHlvdXIgcGVybmljaW91cyByYWdlCiAgICBXaXRoIHB1cnBsZSBmb3VudGFpbnMgaXNzdWluZyBmcm9tIHlvdXIgdmVpbnMsCiAgICBPbiBwYWluIG9mIHRvcnR1cmUsIGZyb20gdGhvc2UgYmxvb2R5IGhhbmRzCiAgICBUaHJvdyB5b3VyIG1pc3RlbXBlcidkIHdlYXBvbnMgdG8gdGhlIGdyb3VuZCwKICAgIEFuZCBoZWFyIHRoZSBzZW50ZW5jZSBvZiB5b3VyIG1vdmVkIHByaW5jZS4KICAgIFRocmVlIGNpdmlsIGJyYXdscywgYnJlZCBvZiBhbiBhaXJ5IHdvcmQsCiAgICBCeSB0aGVlLCBvbGQgQ2FwdWxldCwgYW5kIE1vbnRhZ3VlLAogICAgSGF2ZSB0aHJpY2UgZGlzdHVyYidkIHRoZSBxdWlldCBvZiBvdXIgc3RyZWV0cywKICAgIEFuZCBtYWRlIFZlcm9uYSdzIGFuY2llbnQgY2l0aXplbnMKICAgIENhc3QgYnkgdGhlaXIgZ3JhdmUgYmVzZWVtaW5nIG9ybmFtZW50cywKICAgIFRvIHdpZWxkIG9sZCBwYXJ0aXNhbnMsIGluIGhhbmRzIGFzIG9sZCwKICAgIENhbmtlcidkIHdpdGggcGVhY2UsIHRvIHBhcnQgeW91ciBjYW5rZXInZCBoYXRlOgogICAgSWYgZXZlciB5b3UgZGlzdHVyYiBvdXIgc3RyZWV0cyBhZ2FpbiwKICAgIFlvdXIgbGl2ZXMgc2hhbGwgcGF5IHRoZSBmb3JmZWl0IG9mIHRoZSBwZWFjZS4KICAgIEZvciB0aGlzIHRpbWUsIGFsbCB0aGUgcmVzdCBkZXBhcnQgYXdheToKICAgIFlvdSBDYXB1bGV0OyBzaGFsbCBnbyBhbG9uZyB3aXRoIG1lOgogICAgQW5kLCBNb250YWd1ZSwgY29tZSB5b3UgdGhpcyBhZnRlcm5vb24sCiAgICBUbyBrbm93IG91ciBmdXJ0aGVyIHBsZWFzdXJlIGluIHRoaXMgY2FzZSwKICAgIFRvIG9sZCBGcmVlLXRvd24sIG91ciBjb21tb24ganVkZ21lbnQtcGxhY2UuCiAgICBPbmNlIG1vcmUsIG9uIHBhaW4gb2YgZGVhdGgsIGFsbCBtZW4gZGVwYXJ0LgoKICAgIEV4ZXVudCBhbGwgYnV0IE1PTlRBR1VFLCBMQURZIE1PTlRBR1VFLCBhbmQgQkVOVk9MSU8KCk1PTlRBR1VFCgogICAgV2hvIHNldCB0aGlzIGFuY2llbnQgcXVhcnJlbCBuZXcgYWJyb2FjaD8KICAgIFNwZWFrLCBuZXBoZXcsIHdlcmUgeW91IGJ5IHdoZW4gaXQgYmVnYW4CgpCRU5WT0xJTwoKICAgIEhlcmUgd2VyZSB0aGUgc2VydmFudHMgb2YgeW91ciBhZHZlcnNhcnksCiAgICBBbmQgeW91cnMsIGNsb3NlIGZpZ2h0aW5nIGVyZSBJIGRpZCBhcHByb2FjaDoKICAgIEkgZHJldyB0byBwYXJ0IHRoZW06IGluIHRoZSBpbnN0YW50IGNhbWUKICAgIFRoZSBmaWVyeSBUeWJhbHQsIHdpdGggaGlzIHN3b3JkIHByZXBhcmVkLAogICAgV2hpY2gsIGFzIGhlIGJyZWF0aGVkIGRlZmlhbmNlIHRvIG15IGVhcnMsCiAgICBIZSBzd3VuZyBhYm91dCBoaXMgaGVhZCBhbmQgY3V0IHRoZSB3aW5kcywKICAgIFdobyBub3RoaW5nIGh1cnQgd2l0aGFsIGhpc3MnZCBoaW0gaW4gc2Nvcm46CiAgICBXaGlsZSB3ZSB3ZXJlIGludGVyY2hhbmdpbmcgdGhydXN0cyBhbmQgYmxvd3MsCiAgICBDYW1lIG1vcmUgYW5kIG1vcmUgYW5kIGZvdWdodCBvbiBwYXJ0IGFuZCBwYXJ0LAogICAgVGlsbCB0aGUgcHJpbmNlIGNhbWUsIHdobyBwYXJ0ZWQgZWl0aGVyIHBhcnQuCgpMQURZIE1PTlRBR1VFCgogICAgTywgd2hlcmUgaXMgUm9tZW8IHNhdyB5b3UgaGltIHRvLWRheT8KICAgIFJpZ2h0IGdsYWQgSSBhbSBoZSB3YXMgbm90IGF0IHRoaXMgZnJheS4KCkJFTlZPTElPCgogICAgTWFkYW0sIGFuIGhvdXIgYmVmb3JlIHRoZSB3b3JzaGlwcCdkIHN1bgogICAgUGVlcidkIGZvcnRoIHRoZSBnb2xkZW4gd2luZG93IG9mIHRoZSBlYXN0LAogICAgQSB0cm91YmxlZCBtaW5kIGRyYXZlIG1lIHRvIHdhbGsgYWJyb2FkOwogICAgV2hlcmUsIHVuZGVybmVhdGggdGhlIGdyb3ZlIG9mIHN5Y2Ftb3JlCiAgICBUaGF0IHdlc3R3YXJkIHJvb3RldGggZnJvbSB0aGUgY2l0eSdzIHNpZGUsCiAgICBTbyBlYXJseSB3YWxraW5nIGRpZCBJIHNlZSB5b3VyIHNvbjoKICAgIFRvd2FyZHMgaGltIEkgbWFkZSwgYnV0IGhlIHdhcyB3YXJlIG9mIG1lCiAgICBBbmQgc3RvbGUgaW50byB0aGUgY292ZXJ0IG9mIHRoZSB3b29kOgogICAgSSwgbWVhc3VyaW5nIGhpcyBhZmZlY3Rpb25zIGJ5IG15IG93biwKICAgIFRoYXQgbW9zdCBhcmUgYnVzaWVkIHdoZW4gdGhleSdyZSBtb3N0IGFsb25lLAogICAgUHVyc3VlZCBteSBodW1vdXIgbm90IHB1cnN1aW5nIGhpcywKICAgIEFuZCBnbGFkbHkgc2h1bm4nZCB3aG8gZ2xhZGx5IGZsZWQgZnJvbSBtZS4KCk1PTlRBR1VFCgogICAgTWFueSBhIG1vcm5pbmcgaGF0aCBoZSB0aGVyZSBiZWVuIHNlZW4sCiAgICBXaXRoIHRlYXJzIGF1Z21lbnRpbmcgdGhlIGZyZXNoIG1vcm5pbmcgZGV3LgogICAgQWRkaW5nIHRvIGNsb3VkcyBtb3JlIGNsb3VkcyB3aXRoIGhpcyBkZWVwIHNpZ2hzOwogICAgQnV0IGFsbCBzbyBzb29uIGFzIHRoZSBhbGwtY2hlZXJpbmcgc3VuCiAgICBTaG91bGQgaW4gdGhlIGZ1cnRoZXN0IGVhc3QgYmVnaW4gdG8gZHJhdwogICAgVGhlIHNoYWR5IGN1cnRhaW5zIGZyb20gQXVyb3JhJ3MgYmVkLAogICAgQXdheSBmcm9tIHRoZSBsaWdodCBzdGVhbHMgaG9tZSBteSBoZWF2eSBzb24sCiAgICBBbmQgcHJpdmF0ZSBpbiBoaXMgY2hhbWJlciBwZW5zIGhpbXNlbGYsCiAgICBTaHV0cyB1cCBoaXMgd2luZG93cywgbG9ja3MgZmFyIGRheWxpZ2h0IG91dAogICAgQW5kIG1ha2VzIGhpbXNlbGYgYW4gYXJ0aWZpY2lhbCBuaWdodDoKICAgIEJsYWNrIGFuZCBwb3J0ZW50b3VzIG11c3QgdGhpcyBodW1vdXIgcHJvdmUsCiAgICBVbmxlc3MgZ29vZCBjb3Vuc2VsIG1heSB0aGUgY2F1c2UgcmVtb3ZlLgoKQkVOVk9MSU8KCiAgICBNeSBub2JsZSB1bmNsZSwgZG8geW91IGtub3cgdGhlIGNhdXNlPwoKTU9OVEFHVUUKCiAgICBJIG5laXRoZXIga25vdyBpdCBub3IgY2FuIGxlYXJuIG9mIGhpbS4KCkJFTlZPTElPCgogICAgSGF2ZSB5b3UgaW1wb3J0dW5lZCBoaW0gYnkgYW55IG1lYW5zPwoKTU9OVEFHVUUKCiAgICBCb3RoIGJ5IG15c2VsZiBhbmQgbWFueSBvdGhlciBmcmllbmRzOgogICAgQnV0IGhlLCBoaXMgb3duIGFmZmVjdGlvbnMnIGNvdW5zZWxsb3IsCiAgICBJcyB0byBoaW1zZWxmLS1JIHdpb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UVPCgogICAgR29vZCBoZWFydCwgYXQgd2hhdD8KCkJFTlZPTElPCgogICAgQXQgdGh5IGdvb2QgaGVhcnQncyBvcHByZXNzaW9uLgoKUk9NRU8KCiAgICBXaHksIHN1Y2ggaXMgbG92ZSdzIHRyYW5zZ3Jlc3Npb24uCiAgICBHcmllZnMgb2YgbWluZSBvd24gbGllIGhlYXZ5IGluIG15IGJyZWFzdCwKICAgIFdoaWNoIHRob3Ugd2lsdCBwcm9wYWdhdGUsIHRvIGhhdmUgaXQgcHJlc3QKICAgIFdpdGggbW9yZSBvZiB0aGluZTogdGhpcyBsb3ZlIHRoYXQgdGhvdSBoYXN0IHNob3duCiAgICBEb3RoIGFkZCBtb3JlIGdyaWVmIHRvIHRvbyBtdWNoIG9mIG1pbmUgb3duLgogICAgTG92ZSBpcyBhIHNtb2tlIHJhaXNlZCB3aXRoIHRoZSBmdW1lIG9mIHNpZ2hzOwogICAgQmVpbmcgcHVyZ2VkLCBhIGZpcmUgc3BhcmtsaW5nIGluIGxvdmVycycgZXllczsKICAgIEJlaW5nIHZleCdkIGEgc2VhIG5vdXJpc2gnZCB3aXRoIGxvdmVycycgdGVhcnM6CiAgICBXaGF0IGlzIGl0IGVsc2UIGEgbWFkbmVzcyBtb3N0IGRpc2NyZWV0LAogICAgQSBjaG9raW5nIGdhbGwgYW5kIGEgcHJlc2VydmluZyBzd2VldC4KICAgIEZhcmV3ZWxsLCBteSBjb3ouCgpCRU5WT0xJTwoKICAgIFNvZnQhIEkgd2lsbCBnbyBhbG9uZzsKICAgIEFuIGlmIHlvdSBsZWF2ZSBtZSBzbywgeW91IGRvIG1lIHdyb25nLgoKUk9NRU8KCiAgICBUdXQsIEkgaGF2ZSBsb3N0IG15c2VsZjsgSSBhbSBub3QgaGVyZTsKICAgIFRoaXMgaXMgbm90IFJvbWVvLCBoZSdzIHNvbWUgb3RoZXIgd2hlcmUuCgpCRU5WT0xJTwoKICAgIFRlbGwgbWUgaW4gc2FkbmVzcywgd2hvIGlzIHRoYXQgeW91IGxvdmUuCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIEkgZ3JvYW4gYW5kIHRlbGwgdGhlZT8KCkJFTlZPTElPCgogICAgR3JvYW4hIHdoeSwgbm8uCiAgICBCdXQgc2FkbHkgdGVsbCBtZSB3aG8uCgpST01FTwoKICAgIEJpZCBhIHNpY2sgbWFuIGluIHNhZG5lc3MgbWFrZSBoaXMgd2lsbDoKICAgIEFoLCB3b3JkIGlsbCB1cmdlZCB0byBvbmUgdGhhdCBpcyBzbyBpbGwhCiAgICBJbiBzYWRuZXNzLCBjb3VzaW4sIEkgZG8gbG92ZSBhIHdvbWFuLgoKQkVOVk9MSU8KCiAgICBJIGFpbSdkIHNvIG5lYXIsIHdoZW4gSSBzdXBwb3NlZCB5b3UgbG92ZWQuCgpST01FTwoKICAgIEEgcmlnaHQgZ29vZCBtYXJrLW1hbiEgQW5kIHNoZSdzIGZhaXIgSSBsb3ZlLgoKQkVOVk9MSU8KCiAgICBBIHJpZ2h0IGZhaXIgbWFyaywgZmFpciBjb3osIGlzIHNvb25lc3QgaGl0LgoKUk9NRU8KCiAgICBXZWxsLCBpbiB0aGF0IGhpdCB5b3UgbWlzczogc2hlJ2xsIG5vdCBiZSBoaXQKICAgIFdpdGggQ3VwaWQncyBhcnJvdzsgc2hlIGhhdGggRGlhbidzIHdpdDsKICAgIEFuZCwgaW4gc3Ryb25nIHByb29mIG9mIGNoYXN0aXR5IHdlbGwgYXJtJ2QsCiAgICBGcm9tIGxvdmUncyB3ZWFrIGNoaWxkaXNoIGJvdyBzaGUgbGl2ZXMgdW5oYXJtJ2QuCiAgICBTaGUgd2lsbCBub3Qgc3RheSB0aGUgc2llZ2Ugb2YgbG92aW5nIHRlcm1zLAogICAgTm9yIGJpZGUgdGhlIGVuY291bnRlciBvZiBhc3NhaWxpbmcgZXllcywKICAgIE5vciBvcGUgaGVyIGxhcCB0byBzYWludC1zZWR1Y2luZyBnb2xkOgogICAgTywgc2hlIGlzIHJpY2ggaW4gYmVhdXR5LCBvbmx5IHBvb3IsCiAgICBUaGF0IHdoZW4gc2hlIGRpZXMgd2l0aCBiZWF1dHkgZGllcyBoZXIgc3RvcmUuCgpCRU5WT0xJTwoKICAgIFRoZW4gc2hlIGhhdGggc3dvcm4gdGhhdCBzaGUgd2lsbCBzdGlsbCBsaXZlIGNoYXN0ZT8KClJPTUVPCgogICAgU2hlIGhhdGgsIGFuZCBpbiB0aGF0IHNwYXJpbmcgbWFrZXMgaHVnZSB3YXN0ZSwKICAgIEZvciBiZWF1dHkgc3RhcnZlZCB3aXRoIGhlciBzZXZlcml0eQogICAgQ3V0cyBiZWF1dHkgb2ZmIGZyb20gYWxsIHBvc3Rlcml0eS4KICAgIFNoZSBpcyB0b28gZmFpciwgdG9vIHdpc2UsIHdpc2VseSB0b28gZmFpciwKICAgIFRvIG1lcml0IGJsaXNzIGJ5IG1ha2luZyBtZSBkZXNwYWlyOgogICAgU2hlIGhhdGggZm9yc3dvcm4gdG8gbG92ZSwgYW5kIGluIHRoYXQgdm93CiAgICBEbyBJIGxpdmUgZGVhZCB0aGF0IGxpdmUgdG8gdGVsbCBpdCBub3cuCgpCRU5WT0xJTwoKICAgIEJlIHJ1bGVkIGJ5IG1lLCBmb3JnZXQgdG8gdGhpbmsgb2YgaGVyLgoKUk9NRU8KCiAgICBPLCB0ZWFjaCBtZSBob3cgSSBzaG91bGQgZm9yZ2V0IHRvIHRoaW5rLgoKQkVOVk9MSU8KCiAgICBCeSBnaXZpbmcgbGliZXJ0eSB1bnRvIHRoaW5lIGV5ZXM7CiAgICBFeGFtaW5lIG90aGVyIGJlYXV0aWVzLgoKUk9NRU8KCiAgICAnVGlzIHRoZSB3YXkKICAgIFRvIGNhbGwgaGVycyBleHF1aXNpdGUsIGluIHF1ZXN0aW9uIG1vcmU6CiAgICBUaGVzZSBoYXBweSBtYXNrcyB0aGF0IGtpc3MgZmFpciBsYWRpZXMnIGJyb3dzCiAgICBCZWluZyBibGFjayBwdXQgdXMgaW4gbWluZCB0aGV5IGhpZGUgdGhlIGZhaXI7CiAgICBIZSB0aGF0IGlzIHN0cnVja2VuIGJsaW5kIGNhbm5vdCBmb3JnZXQKICAgIFRoZSBwcmVjaW91cyB0cmVhc3VyZSBvZiBoaXMgZXllc2lnaHQgbG9zdDoKICAgIFNob3cgbWUgYSBtaXN0cmVzcyB0aGF0IGlzIHBhc3NpbmcgZmFpciwKICAgIFdoYXQgZG90aCBoZXIgYmVhdXR5IHNlcnZlLCBidXQgYXMgYSBub3RlCiAgICBXaGVyZSBJIG1heSByZWFkIHdobyBwYXNzJ2QgdGhhdCBwYXNzaW5nIGZhaXICiAgICBGYXJld2VsbDogdGhvdSBjYW5zdCBub3QgdGVhY2ggbWUgdG8gZm9yZ2V0LgoKQkVOVk9MSU8KCiAgICBJJ2xsIHBheSB0aGF0IGRvY3RyaW5lLCBvciBlbHNlIGRpZSBpbiBkZWJ0LgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEEgc3RyZWV0LgoKICAgIEVudGVyIENBUFVMRVQsIFBBUklTLCBhbmQgU2VydmFudCAKCkNBUFVMRVQKCiAgICBCdXQgTW9udGFndWUgaXMgYm91bmQgYXMgd2VsbCBhcyBJLAogICAgSW4gcGVuYWx0eSBhbGlrZTsgYW5kICd0aXMgbm90IGhhcmQsIEkgdGhpbmssCiAgICBGb3IgbWVuIHNvIG9sZCBhcyB3ZSB0byBrZWVwIHRoZSBwZWFjZS4KClBBUklTCgogICAgT2YgaG9ub3VyYWJsZSByZWNrb25pbmcgYXJlIHlvdSBib3RoOwogICAgQW5kIHBpdHkgJ3RpcyB5b3UgbGl2ZWQgYXQgb2RkcyBzbyBsb25nLgogICAgQnV0IG5vdywgbXkgbG9yZCwgd2hhdCBzYXkgeW91IHRvIG15IHN1aXQCgpDQVBVTEVUCgogICAgQnV0IHNheWluZyBvJ2VyIHdoYXQgSSBoYXZlIHNhaWQgYmVmb3JlOgogICAgTXkgY2hpbGQgaXMgeWV0IGEgc3RyYW5nZXIgaW4gdGhlIHdvcmxkOwogICAgU2hlIGhhdGggbm90IHNlZW4gdGhlIGNoYW5nZSBvZiBmb3VydGVlbiB5ZWFycywKICAgIExldCB0d28gbW9yZSBzdW1tZXJzIHdpdGhlciBpbiB0aGVpciBwcmlkZSwKICAgIEVyZSB3ZSBtYXkgdGhpbmsgaGVyIHJpcGUgdG8gYmUgYSBicmlkZS4KClBBUklTCgogICAgWW91bmdlciB0aGFuIHNoZSBhcmUgaGFwcHkgbW90aGVycyBtYWRlLgoKQ0FQVUxFVAoKICAgIEFuZCB0b28gc29vbiBtYXJyJ2QgYXJlIHRob3NlIHNvIGVhcmx5IG1hZGUuCiAgICBUaGUgZWFydGggaGF0aCBzd2FsbG93J2QgYWxsIG15IGhvcGVzIGJ1dCBzaGUsCiAgICBTaGUgaXMgdGhlIGhvcGVmdWwgbGFkeSBvZiBteSBlYXJ0aDoKICAgIEJ1dCB3b28gaGVyLCBnZW50bGUgUGFyaXMsIGdldCBoZXIgaGVhcnQsCiAgICBNeSB3aWxsIHRvIGhlciBjb25zZW50IGlzIGJ1dCBhIHBhcnQ7CiAgICBBbiBzaGUgYWdyZWUsIHdpdGhpbiBoZXIgc2NvcGUgb2YgY2hvaWNlCiAgICBMaWVzIG15IGNvbnNlbnQgYW5kIGZhaXIgYWNjb3JkaW5nIHZvaWNlLgogICAgVGhpcyBuaWdodCBJIGhvbGQgYW4gb2xkIGFjY3VzdG9tJ2QgZmVhc3QsCiAgICBXaGVyZXRvIEkgaGF2ZSBpbnZpdGVkIG1hbnkgYSBndWVzdCwKICAgIFN1Y2ggYXMgSSBsb3ZlOyBhbmQgeW91LCBhbW9uZyB0aGUgc3RvcmUsCiAgICBPbmUgbW9yZSwgbW9zdCB3ZWxjb21lLCBtYWtlcyBteSBudW1iZXIgbW9yZS4KICAgIEF0IG15IHBvb3IgaG91c2UgbG9vayB0byBiZWhvbGQgdGhpcyBuaWdodAogICAgRWFydGgtdHJlYWRpbmcgc3RhcnMgdGhhdCBtYWtlIGRhcmsgaGVhdmVuIGxpZ2h0OgogICAgU3VjaCBjb21mb3J0IGFzIGRvIGx1c3R5IHlvdW5nIG1lbiBmZWVsCiAgICBXaGVuIHdlbGwtYXBwYXJlbGwnZCBBcHJpbCBvbiB0aGUgaGVlbAogICAgT2YgbGltcGluZyB3aW50ZXIgdHJlYWRzLCBldmVuIHN1Y2ggZGVsaWdodAogICAgQW1vbmcgZnJlc2ggZmVtYWxlIGJ1ZHMgc2hhbGwgeW91IHRoaXMgbmlnaHQKICAgIEluaGVyaXQgYXQgbXkgaG91c2U7IGhlYXIgYWxsLCBhbGwgc2VlLAogICAgQW5kIGxpa2UgaGVyIG1vc3Qgd2hvc2UgbWVyaXQgbW9zdCBzaGFsbCBiZToKICAgIFdoaWNoIG9uIG1vcmUgdmlldywgb2YgbWFueSBtaW5lIGJlaW5nIG9uZQogICAgTWF5IHN0YW5kIGluIG51bWJlciwgdGhvdWdoIGluIHJlY2tvbmluZyBub25lLAogICAgQ29tZSwgZ28gd2l0aCBtZS4KCiAgICBUbyBTZXJ2YW50LCBnaXZpbmcgYSBwYXBlcgogICAgR28sIHNpcnJhaCwgdHJ1ZGdlIGFib3V0CiAgICBUaHJvdWdoIGZhaXIgVmVyb25hOyBmaW5kIHRob3NlIHBlcnNvbnMgb3V0CiAgICBXaG9zZSBuYW1lcyBhcmUgd3JpdHRlbiB0aGVyZSwgYW5kIHRvIHRoZW0gc2F5LAogICAgTXkgaG91c2UgYW5kIHdlbGNvbWUgb24gdGhlaXIgcGxlYXN1cmUgc3RheS4KCiAgICBFeGV1bnQgQ0FQVUxFVCBhbmQgUEFSSVMKClNlcnZhbnQKCiAgICBGaW5kIHRoZW0gb3V0IHdob3NlIG5hbWVzIGFyZSB3cml0dGVuIGhlcmUhIEl0IGlzCiAgICB3cml0dGVuLCB0aGF0IHRoZSBzaG9lbWFrZXIgc2hvdWxkIG1lZGRsZSB3aXRoIGhpcwogICAgeWFyZCwgYW5kIHRoZSB0YWlsb3Igd2l0aCBoaXMgbGFzdCwgdGhlIGZpc2hlciB3aXRoCiAgICBoaXMgcGVuY2lsLCBhbmQgdGhlIHBhaW50ZXIgd2l0aCBoaXMgbmV0czsgYnV0IEkgYW0KICAgIHNlbnQgdG8gZmluZCB0aG9zZSBwZXJzb25zIHdob3NlIG5hbWVzIGFyZSBoZXJlCiAgICB3cml0LCBhbmQgY2FuIG5ldmVyIGZpbmQgd2hhdCBuYW1lcyB0aGUgd3JpdGluZwogICAgcGVyc29uIGhhdGggaGVyZSB3cml0LiBJIG11c3QgdG8gdGhlIGxlYXJuZWQuLS1JbiBnb29kIHRpbWUuCgogICAgRW50ZXIgQkVOVk9MSU8gYW5kIFJPTUVPCgpCRU5WT0xJTwoKICAgIFR1dCwgbWFuLCBvbmUgZmlyZSBidXJucyBvdXQgYW5vdGhlcidzIGJ1cm5pbmcsCiAgICBPbmUgcGFpbiBpcyBsZXNzZW4nZCBieSBhbm90aGVyJ3MgYW5ndWlzaDsKICAgIFR1cm4gZ2lkZHksIGFuZCBiZSBob2xwIGJ5IGJhY2t3YXJkIHR1cm5pbmc7CiAgICBPbmUgZGVzcGVyYXRlIGdyaWVmIGN1cmVzIHdpdGggYW5vdGhlcidzIGxhbmd1aXNoOgogICAgVGFrZSB0aG91IHNvbWUgbmV3IGluZmVjdGlvbiB0byB0aHkgZXllLAogICAgQW5kIHRoZSByYW5rIHBvaXNvbiBvZiB0aGUgb2xkIHdpbGwgZGllLgoKUk9NRU8KCiAgICBZb3VyIHBsYWludGFpbi1sZWFmIGlzIGV4Y2VsbGVudCBmb3IgdGhhdC4KCkJFTlZPTElPCgogICAgRm9yIHdoYXQsIEkgcHJheSB0aGVlPwoKUk9NRU8KCiAgICBGb3IgeW91ciBicm9rZW4gc2hpbi4KCkJFTlZPTElPCgogICAgV2h5LCBSb21lbywgYXJ0IHRob3UgbWFkPwoKUk9NRU8KCiAgICBOb3QgbWFkLCBidXQgYm91bmQgbW9yZSB0aGFuIGEgbWFkLW1hbiBpczsKICAgIFNodXQgdXAgaW4gcHJpc29uLCBrZXB0IHdpdGhvdXQgbXkgZm9vZCwKICAgIFdoaXBwJ2QgYW5kIHRvcm1lbnRlZCBhbmQtLUdvZC1kZW4sIGdvb2QgZmVsbG93LgoKU2VydmFudAoKICAgIEdvZCBnaScgZ29kLWRlbi4gSSBwcmF5LCBzaXIsIGNhbiB5b3UgcmVhZD8KClJPTUVPCgogICAgQXksIG1pbmUgb3duIGZvcnR1bmUgaW4gbXkgbWlzZXJ5LgoKU2VydmFudAoKICAgIFBlcmhhcHMgeW91IGhhdmUgbGVhcm5lZCBpdCB3aXRob3V0IGJvb2s6IGJ1dCwgSQogICAgcHJheSwgY2FuIHlvdSByZWFkIGFueSB0aGluZyB5b3Ugc2VlPwoKUk9NRU8KCiAgICBBeSwgaWYgSSBrbm93IHRoZSBsZXR0ZXJzIGFuZCB0aGUgbGFuZ3VhZ2UuCgpTZXJ2YW50CgogICAgWWUgc2F5IGhvbmVzdGx5OiByZXN0IHlvdSBtZXJyeSEKClJPTUVPCgogICAgU3RheSwgZmVsbG93OyBJIGNhbiByZWFkLgoKICAgIFJlYWRzCiAgICAnU2lnbmlvciBNYXJ0aW5vIGFuZCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOwogICAgQ291bnR5IEFuc2VsbWUgYW5kIGhpcyBiZWF1dGVvdXMgc2lzdGVyczsgdGhlIGxhZHkKICAgIHdpZG93IG9mIFZpdHJhdmlvOyBTaWduaW9yIFBsYWNlbnRpbyBhbmQgaGlzIGxvdmVseQogICAgbmllY2VzOyBNZXJjdXRpbyBhbmQgaGlzIGJyb3RoZXIgVmFsZW50aW5lOyBtaW5lCiAgICB1bmNsZSBDYXB1bGV0LCBoaXMgd2lmZSBhbmQgZGF1Z2h0ZXJzOyBteSBmYWlyIG5pZWNlCiAgICBSb3NhbGluZTsgTGl2aWE7IFNpZ25pb3IgVmFsZW50aW8gYW5kIGhpcyBjb3VzaW4KICAgIFR5YmFsdCwgTHVjaW8gYW5kIHRoZSBsaXZlbHkgSGVsZW5hLicgQSBmYWlyCiAgICBhc3NlbWJseTogd2hpdGhlciBzaG91bGQgdGhleSBjb21lPwoKU2VydmFudAoKICAgIFVwLgoKUk9NRU8KCiAgICBXaGl0aGVyPwoKU2VydmFudAoKICAgIFRvIHN1cHBlcjsgdG8gb3VyIGhvdXNlLgoKUk9NRU8KCiAgICBXaG9zZSBob3VzZT8KClNlcnZhbnQKCiAgICBNeSBtYXN0ZXIncy4KClJPTUVPCgogICAgSW5kZWVkLCBJIHNob3VsZCBoYXZlIGFzaydkIHlvdSB0aGF0IGJlZm9yZS4KClNlcnZhbnQKCiAgICBOb3cgSSdsbCB0ZWxsIHlvdSB3aXRob3V0IGFza2luZzogbXkgbWFzdGVyIGlzIHRoZQogICAgZ3JlYXQgcmljaCBDYXB1bGV0OyBhbmQgaWYgeW91IGJlIG5vdCBvZiB0aGUgaG91c2UKICAgIG9mIE1vbnRhZ3VlcywgSSBwcmF5LCBjb21lIGFuZCBjcnVzaCBhIGN1cCBvZiB3aW5lLgogICAgUmVzdCB5b3UgbWVycnkhCgogICAgRXhpdAoKQkVOVk9MSU8KCiAgICBBdCB0aGlzIHNhbWUgYW5jaWVudCBmZWFzdCBvZiBDYXB1bGV0J3MKICAgIFN1cHMgdGhlIGZhaXIgUm9zYWxpbmUgd2hvbSB0aG91IHNvIGxvdmVzdCwKICAgIFdpdGggYWxsIHRoZSBhZG1pcmVkIGJlYXV0aWVzIG9mIFZlcm9uYToKICAgIEdvIHRoaXRoZXI7IGFuZCwgd2l0aCB1bmF0dGFpbnRlZCBleWUsCiAgICBDb21wYXJlIGhlciBmYWNlIHdpdGggc29tZSB0aGF0IEkgc2hhbGwgc2hvdywKICAgIEFuZCBJIHdpbGwgbWFrZSB0aGVlIHRoaW5rIHRoeSBzd2FuIGEgY3Jvdy4KClJPTUVPCgogICAgV2hlbiB0aGUgZGV2b3V0IHJlbGlnaW9uIG9mIG1pbmUgZXllCiAgICBNYWludGFpbnMgc3VjaCBmYWxzZWhvb2QsIHRoZW4gdHVybiB0ZWFycyB0byBmaXJlczsKICAgIEFuZCB0aGVzZSwgd2hvIG9mdGVuIGRyb3duJ2QgY291bGQgbmV2ZXIgZGllLAogICAgVHJhbnNwYXJlbnQgaGVyZXRpY3MsIGJlIGJ1cm50IGZvciBsaWFycyEKICAgIE9uZSBmYWlyZXIgdGhhbiBteSBsb3ZlISB0aGUgYWxsLXNlZWluZyBzdW4KICAgIE5lJ2VyIHNhdyBoZXIgbWF0Y2ggc2luY2UgZmlyc3QgdGhlIHdvcmxkIGJlZ3VuLgoKQkVOVk9MSU8KCiAgICBUdXQsIHlvdSBzYXcgaGVyIGZhaXIsIG5vbmUgZWxzZSBiZWluZyBieSwKICAgIEhlcnNlbGYgcG9pc2VkIHdpdGggaGVyc2VsZiBpbiBlaXRoZXIgZXllOgogICAgQnV0IGluIHRoYXQgY3J5c3RhbCBzY2FsZXMgbGV0IHRoZXJlIGJlIHdlaWdoJ2QKICAgIFlvdXIgbGFkeSdzIGxvdmUgYWdhaW5zdCBzb21lIG90aGVyIG1haWQKICAgIFRoYXQgSSB3aWxsIHNob3cgeW91IHNoaW5pbmcgYXQgdGhpcyBmZWFzdCwKICAgIEFuZCBzaGUgc2hhbGwgc2NhbnQgc2hvdyB3ZWxsIHRoYXQgbm93IHNob3dzIGJlc3QuCgpST01FTwoKICAgIEknbGwgZ28gYWxvbmcsIG5vIHN1Y2ggc2lnaHQgdG8gYmUgc2hvd24sCiAgICBCdXQgdG8gcmVqb2ljZSBpbiBzcGxlbmRvciBvZiBtaW5lIG93bi4KCiAgICBFeGV1bnQKClNDRU5FIElJSS4gQSByb29tIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgTnVyc2UsIHdoZXJlJ3MgbXkgZGF1Z2h0ZXIIGNhbGwgaGVyIGZvcnRoIHRvIG1lLgoKTnVyc2UKCiAgICBOb3csIGJ5IG15IG1haWRlbmhlYWQsIGF0IHR3ZWx2ZSB5ZWFyIG9sZCwKICAgIEkgYmFkZSBoZXIgY29tZS4gV2hhdCwgbGFtYiEgd2hhdCwgbGFkeWJpcmQhCiAgICBHb2QgZm9yYmlkISBXaGVyZSdzIHRoaXMgZ2lybD8gV2hhdCwgSnVsaWV0IQoKICAgIEVudGVyIEpVTElFVAoKSlVMSUVUCgogICAgSG93IG5vdyEgd2hvIGNhbGxzPwoKTnVyc2UKCiAgICBZb3VyIG1vdGhlci4KCkpVTElFVAoKICAgIE1hZGFtLCBJIGFtIGhlcmUuCiAgICBXaGF0IGlzIHlvdXIgd2lsbD8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoaXMgaXMgdGhlIG1hdHRlcjotLU51cnNlLCBnaXZlIGxlYXZlIGF3aGlsZSwKICAgIFdlIG11c3QgdGFsayBpbiBzZWNyZXQ6LS1udXJzZSwgY29tZSBiYWNrIGFnYWluOwogICAgSSBoYXZlIHJlbWVtYmVyJ2QgbWUsIHRob3UncyBoZWFyIG91ciBjb3Vuc2VsLgogICAgVGhvdSBrbm93J3N0IG15IGRhdWdodGVyJ3Mgb2YgYSBwcmV0dHkgYWdlLgoKTnVyc2UKCiAgICBGYWl0aCwgSSBjYW4gdGVsbCBoZXIgYWdlIHVudG8gYW4gaG91ci4KCkxBRFkgQ0FQVUxFVAoKICAgIFNoZSdzIG5vdCBmb3VydGVlbi4KCk51cnNlCgogICAgSSdsbCBsYXkgZm91cnRlZW4gb2YgbXkgdGVldGgsLS0KICAgIEFuZCB5ZXQsIHRvIG15IHRlZXRoIGJlIGl0IHNwb2tlbiwgSSBoYXZlIGJ1dCBmb3VyLS0KICAgIFNoZSBpcyBub3QgZm91cnRlZW4uIEhvdyBsb25nIGlzIGl0IG5vdwogICAgVG8gTGFtbWFzLXRpZGUCgpMQURZIENBUFVMRVQKCiAgICBBIGZvcnRuaWdodCBhbmQgb2RkIGRheXMuCgpOdXJzZQoKICAgIEV2ZW4gb3Igb2RkLCBvZiBhbGwgZGF5cyBpbiB0aGUgeWVhciwKICAgIENvbWUgTGFtbWFzLWV2ZSBhdCBuaWdodCBzaGFsbCBzaGUgYmUgZm91cnRlZW4uCiAgICBTdXNhbiBhbmQgc2hlLS1Hb2QgcmVzdCBhbGwgQ2hyaXN0aWFuIHNvdWxzIS0tCiAgICBXZXJlIG9mIGFuIGFnZTogd2VsbCwgU3VzYW4gaXMgd2l0aCBHb2Q7CiAgICBTaGUgd2FzIHRvbyBnb29kIGZvciBtZTogYnV0LCBhcyBJIHNhaWQsCiAgICBPbiBMYW1tYXMtZXZlIGF0IG5pZ2h0IHNoYWxsIHNoZSBiZSBmb3VydGVlbjsKICAgIFRoYXQgc2hhbGwgc2hlLCBtYXJyeTsgSSByZW1lbWJlciBpdCB3ZWxsLgogICAgJ1RpcyBzaW5jZSB0aGUgZWFydGhxdWFrZSBub3cgZWxldmVuIHllYXJzOwogICAgQW5kIHNoZSB3YXMgd2VhbidkLC0tSSBuZXZlciBzaGFsbCBmb3JnZXQgaXQsLS0KICAgIE9mIGFsbCB0aGUgZGF5cyBvZiB0aGUgeWVhciwgdXBvbiB0aGF0IGRheToKICAgIEZvciBJIGhhZCB0aGVuIGxhaWQgd29ybXdvb2QgdG8gbXkgZHVnLAogICAgU2l0dGluZyBpbiB0aGUgc3VuIHVuZGVyIHRoZSBkb3ZlLWhvdXNlIHdhbGw7CiAgICBNeSBsb3JkIGFuZCB5b3Ugd2VyZSB0aGVuIGF0IE1hbnR1YTotLQogICAgTmF5LCBJIGRvIGJlYXIgYSBicmFpbjotLWJ1dCwgYXMgSSBzYWlkLAogICAgV2hlbiBpdCBkaWQgdGFzdGUgdGhlIHdvcm13b29kIG9uIHRoZSBuaXBwbGUKICAgIE9mIG15IGR1ZyBhbmQgZmVsdCBpdCBiaXR0ZXIsIHByZXR0eSBmb29sLAogICAgVG8gc2VlIGl0IHRldGNoeSBhbmQgZmFsbCBvdXQgd2l0aCB0aGUgZHVnIQogICAgU2hha2UgcXVvdGggdGhlIGRvdmUtaG91c2U6ICd0d2FzIG5vIG5lZWQsIEkgdHJvdywKICAgIFRvIGJpZCBtZSB0cnVkZ2U6CiAgICBBbmQgc2luY2UgdGhhdCB0aW1lIGl0IGlzIGVsZXZlbiB5ZWFyczsKICAgIEZvciB0aGVuIHNoZSBjb3VsZCBzdGFuZCBhbG9uZTsgbmF5LCBieSB0aGUgcm9vZCwKICAgIFNoZSBjb3VsZCBoYXZlIHJ1biBhbmQgd2FkZGxlZCBhbGwgYWJvdXQ7CiAgICBGb3IgZXZlbiB0aGUgZGF5IGJlZm9yZSwgc2hlIGJyb2tlIGhlciBicm93OgogICAgQW5kIHRoZW4gbXkgaHVzYmFuZC0tR29kIGJlIHdpdGggaGlzIHNvdWwhCiAgICBBJyB3YXMgYSBtZXJyeSBtYW4tLXRvb2sgdXAgdGhlIGNoaWxkOgogICAgJ1llYSwnIHF1b3RoIGhlLCAnZG9zdCB0aG91IGZhbGwgdXBvbiB0aHkgZmFjZT8KICAgIFRob3Ugd2lsdCBmYWxsIGJhY2t3YXJkIHdoZW4gdGhvdSBoYXN0IG1vcmUgd2l0OwogICAgV2lsdCB0aG91IG5vdCwgSnVsZT8nIGFuZCwgYnkgbXkgaG9saWRhbWUsCiAgICBUaGUgcHJldHR5IHdyZXRjaCBsZWZ0IGNyeWluZyBhbmQgc2FpZCAnQXkuJwogICAgVG8gc2VlLCBub3csIGhvdyBhIGplc3Qgc2hhbGwgY29tZSBhYm91dCEKICAgIEkgd2FycmFudCwgYW4gSSBzaG91bGQgbGl2ZSBhIHRob3VzYW5kIHllYXJzLAogICAgSSBuZXZlciBzaG91bGQgZm9yZ2V0IGl0OiAnV2lsdCB0aG91IG5vdCwgSnVsZT8nIHF1b3RoIGhlOwogICAgQW5kLCBwcmV0dHkgZm9vbCwgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKTEFEWSBDQVBVTEVUCgogICAgRW5vdWdoIG9mIHRoaXM7IEkgcHJheSB0aGVlLCBob2xkIHRoeSBwZWFjZS4KCk51cnNlCgogICAgWWVzLCBtYWRhbTogeWV0IEkgY2Fubm90IGNob29zZSBidXQgbGF1Z2gsCiAgICBUbyB0aGluayBpdCBzaG91bGQgbGVhdmUgY3J5aW5nIGFuZCBzYXkgJ0F5LicKICAgIEFuZCB5ZXQsIEkgd2FycmFudCwgaXQgaGFkIHVwb24gaXRzIGJyb3cKICAgIEEgYnVtcCBhcyBiaWcgYXMgYSB5b3VuZyBjb2NrZXJlbCdzIHN0b25lOwogICAgQSBwYXJsb3VzIGtub2NrOyBhbmQgaXQgY3JpZWQgYml0dGVybHk6CiAgICAnWWVhLCcgcXVvdGggbXkgaHVzYmFuZCwnZmFsbCdzdCB1cG9uIHRoeSBmYWNlPwogICAgVGhvdSB3aWx0IGZhbGwgYmFja3dhcmQgd2hlbiB0aG91IGNvbWVzdCB0byBhZ2U7CiAgICBXaWx0IHRob3Ugbm90LCBKdWxlPycgaXQgc3RpbnRlZCBhbmQgc2FpZCAnQXkuJwoKSlVMSUVUCgogICAgQW5kIHN0aW50IHRob3UgdG9vLCBJIHByYXkgdGhlZSwgbnVyc2UsIHNheSBJLgoKTnVyc2UKCiAgICBQZWFjZSwgSSBoYXZlIGRvbmUuIEdvZCBtYXJrIHRoZWUgdG8gaGlzIGdyYWNlIQogICAgVGhvdSB3YXN0IHRoZSBwcmV0dGllc3QgYmFiZSB0aGF0IGUnZXIgSSBudXJzZWQ6CiAgICBBbiBJIG1pZ2h0IGxpdmUgdG8gc2VlIHRoZWUgbWFycmllZCBvbmNlLAogICAgSSBoYXZlIG15IHdpc2guCgpMQURZIENBUFVMRVQKCiAgICBNYXJyeSwgdGhhdCAnbWFycnknIGlzIHRoZSB2ZXJ5IHRoZW1lCiAgICBJIGNhbWUgdG8gdGFsayBvZi4gVGVsbCBtZSwgZGF1Z2h0ZXIgSnVsaWV0LAogICAgSG93IHN0YW5kcyB5b3VyIGRpc3Bvc2l0aW9uIHRvIGJlIG1hcnJpZWQCgpKVUxJRVQKCiAgICBJdCBpcyBhbiBob25vdXIgdGhhdCBJIGRyZWFtIG5vdCBvZi4KCk51cnNlCgogICAgQW4gaG9ub3VyISB3ZXJlIG5vdCBJIHRoaW5lIG9ubHkgbnVyc2UsCiAgICBJIHdvdWxkIHNheSB0aG91IGhhZHN0IHN1Y2snZCB3aXNkb20gZnJvbSB0aHkgdGVhdC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHRoaW5rIG9mIG1hcnJpYWdlIG5vdzsgeW91bmdlciB0aGFuIHlvdSwKICAgIEhlcmUgaW4gVmVyb25hLCBsYWRpZXMgb2YgZXN0ZWVtLAogICAgQXJlIG1hZGUgYWxyZWFkeSBtb3RoZXJzOiBieSBteSBjb3VudCwKICAgIEkgd2FzIHlvdXIgbW90aGVyIG11Y2ggdXBvbiB0aGVzZSB5ZWFycwogICAgVGhhdCB5b3UgYXJlIG5vdyBhIG1haWQuIFRodXMgdGhlbiBpbiBicmllZjoKICAgIFRoZSB2YWxpYW50IFBhcmlzIHNlZWtzIHlvdSBmb3IgaGlzIGxvdmUuCgpOdXJzZQoKICAgIEEgbWFuLCB5b3VuZyBsYWR5ISBsYWR5LCBzdWNoIGEgbWFuCiAgICBBcyBhbGwgdGhlIHdvcmxkLS13aHksIGhlJ3MgYSBtYW4gb2Ygd2F4LgoKTEFEWSBDQVBVTEVUCgogICAgVmVyb25hJ3Mgc3VtbWVyIGhhdGggbm90IHN1Y2ggYSBmbG93ZXIuCgpOdXJzZQoKICAgIE5heSwgaGUncyBhIGZsb3dlcjsgaW4gZmFpdGgsIGEgdmVyeSBmbG93ZXIuCgpMQURZIENBUFVMRVQKCiAgICBXaGF0IHNheSB5b3UIGNhbiB5b3UgbG92ZSB0aGUgZ2VudGxlbWFuPwogICAgVGhpcyBuaWdodCB5b3Ugc2hhbGwgYmVob2xkIGhpbSBhdCBvdXIgZmVhc3Q7CiAgICBSZWFkIG8nZXIgdGhlIHZvbHVtZSBvZiB5b3VuZyBQYXJpcycgZmFjZSwKICAgIEFuZCBmaW5kIGRlbGlnaHQgd3JpdCB0aGVyZSB3aXRoIGJlYXV0eSdzIHBlbjsKICAgIEV4YW1pbmUgZXZlcnkgbWFycmllZCBsaW5lYW1lbnQsCiAgICBBbmQgc2VlIGhvdyBvbmUgYW5vdGhlciBsZW5kcyBjb250ZW50CiAgICBBbmQgd2hhdCBvYnNjdXJlZCBpbiB0aGlzIGZhaXIgdm9sdW1lIGxpZXMKICAgIEZpbmQgd3JpdHRlbiBpbiB0aGUgbWFyZ2VudCBvZiBoaXMgZXllcy4KICAgIFRoaXMgcHJlY2lvdXMgYm9vayBvZiBsb3ZlLCB0aGlzIHVuYm91bmQgbG92ZXIsCiAgICBUbyBiZWF1dGlmeSBoaW0sIG9ubHkgbGFja3MgYSBjb3ZlcjoKICAgIFRoZSBmaXNoIGxpdmVzIGluIHRoZSBzZWEsIGFuZCAndGlzIG11Y2ggcHJpZGUKICAgIEZvciBmYWlyIHdpdGhvdXQgdGhlIGZhaXIgd2l0aGluIHRvIGhpZGU6CiAgICBUaGF0IGJvb2sgaW4gbWFueSdzIGV5ZXMgZG90aCBzaGFyZSB0aGUgZ2xvcnksCiAgICBUaGF0IGluIGdvbGQgY2xhc3BzIGxvY2tzIGluIHRoZSBnb2xkZW4gc3Rvcnk7CiAgICBTbyBzaGFsbCB5b3Ugc2hhcmUgYWxsIHRoYXQgaGUgZG90aCBwb3NzZXNzLAogICAgQnkgaGF2aW5nIGhpbSwgbWFraW5nIHlvdXJzZWxmIG5vIGxlc3MuCgpOdXJzZQoKICAgIE5vIGxlc3MhIG5heSwgYmlnZ2VyOyB3b21lbiBncm93IGJ5IG1lbi4KCkxBRFkgQ0FQVUxFVAoKICAgIFNwZWFrIGJyaWVmbHksIGNhbiB5b3UgbGlrZSBvZiBQYXJpcycgbG92ZT8KCkpVTElFVAoKICAgIEknbGwgbG9vayB0byBsaWtlLCBpZiBsb29raW5nIGxpa2luZyBtb3ZlOgogICAgQnV0IG5vIG1vcmUgZGVlcCB3aWxsIEkgZW5kYXJ0IG1pbmUgZXllCiAgICBUaGFuIHlvdXIgY29uc2VudCBnaXZlcyBzdHJlbmd0aCB0byBtYWtlIGl0IGZseS4KCiAgICBFbnRlciBhIFNlcnZhbnQKClNlcnZhbnQKCiAgICBNYWRhbSwgdGhlIGd1ZXN0cyBhcmUgY29tZSwgc3VwcGVyIHNlcnZlZCB1cCwgeW91CiAgICBjYWxsZWQsIG15IHlvdW5nIGxhZHkgYXNrZWQgZm9yLCB0aGUgbnVyc2UgY3Vyc2VkIGluCiAgICB0aGUgcGFudHJ5LCBhbmQgZXZlcnkgdGhpbmcgaW4gZXh0cmVtaXR5LiBJIG11c3QKICAgIGhlbmNlIHRvIHdhaXQ7IEkgYmVzZWVjaCB5b3UsIGZvbGxvdyBzdHJhaWdodC4KCkxBRFkgQ0FQVUxFVAoKICAgIFdlIGZvbGxvdyB0aGVlLgoKICAgIEV4aXQgU2VydmFudAogICAgSnVsaWV0LCB0aGUgY291bnR5IHN0YXlzLgoKTnVyc2UKCiAgICBHbywgZ2lybCwgc2VlayBoYXBweSBuaWdodHMgdG8gaGFwcHkgZGF5cy4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBST01FTywgTUVSQ1VUSU8sIEJFTlZPTElPLCB3aXRoIGZpdmUgb3Igc2l4IE1hc2tlcnMsIFRvcmNoLWJlYXJlcnMsIGFuZCBvdGhlcnMgCgpST01FTwoKICAgIFdoYXQsIHNoYWxsIHRoaXMgc3BlZWNoIGJlIHNwb2tlIGZvciBvdXIgZXhjdXNlPwogICAgT3Igc2hhbGwgd2Ugb24gd2l0aG91dCBhIGFwb2xvZ3kCgpCRU5WT0xJTwoKICAgIFRoZSBkYXRlIGlzIG91dCBvZiBzdWNoIHByb2xpeGl0eToKICAgIFdlJ2xsIGhhdmUgbm8gQ3VwaWQgaG9vZHdpbmsnZCB3aXRoIGEgc2NhcmYsCiAgICBCZWFyaW5nIGEgVGFydGFyJ3MgcGFpbnRlZCBib3cgb2YgbGF0aCwKICAgIFNjYXJpbmcgdGhlIGxhZGllcyBsaWtlIGEgY3Jvdy1rZWVwZXI7CiAgICBOb3Igbm8gd2l0aG91dC1ib29rIHByb2xvZ3VlLCBmYWludGx5IHNwb2tlCiAgICBBZnRlciB0aGUgcHJvbXB0ZXIsIGZvciBvdXIgZW50cmFuY2U6CiAgICBCdXQgbGV0IHRoZW0gbWVhc3VyZSB1cyBieSB3aGF0IHRoZXkgd2lsbDsKICAgIFdlJ2xsIG1lYXN1cmUgdGhlbSBhIG1lYXN1cmUsIGFuZCBiZSBnb25lLgoKUk9NRU8KCiAgICBHaXZlIG1lIGEgdG9yY2g6IEkgYW0gbm90IGZvciB0aGlzIGFtYmxpbmc7CiAgICBCZWluZyBidXQgaGVhdnksIEkgd2lsbCBiZWFyIHRoZSBsaWdodC4KCk1FUkNVVElPCgogICAgTmF5LCBnZW50bGUgUm9tZW8sIHdlIG11c3QgaGF2ZSB5b3UgZGFuY2UuCgpST01FTwoKICAgIE5vdCBJLCBiZWxpZXZlIG1lOiB5b3UgaGF2ZSBkYW5jaW5nIHNob2VzCiAgICBXaXRoIG5pbWJsZSBzb2xlczogSSBoYXZlIGEgc291bCBvZiBsZWFkCiAgICBTbyBzdGFrZXMgbWUgdG8gdGhlIGdyb3VuZCBJIGNhbm5vdCBtb3ZlLgoKTUVSQ1VUSU8KCiAgICBZb3UgYXJlIGEgbG92ZXI7IGJvcnJvdyBDdXBpZCdzIHdpbmdzLAogICAgQW5kIHNvYXIgd2l0aCB0aGVtIGFib3ZlIGEgY29tbW9uIGJvdW5kLgoKUk9NRU8KCiAgICBJIGFtIHRvbyBzb3JlIGVucGllcmNlZCB3aXRoIGhpcyBzaGFmdAogICAgVG8gc29hciB3aXRoIGhpcyBsaWdodCBmZWF0aGVycywgYW5kIHNvIGJvdW5kLAogICAgSSBjYW5ub3QgYm91bmQgYSBwaXRjaCBhYm92ZSBkdWxsIHdvZToKICAgIFVuZGVyIGxvdmUncyBoZWF2eSBidXJkZW4gZG8gSSBzaW5rLgoKTUVSQ1VUSU8KCiAgICBBbmQsIHRvIHNpbmsgaW4gaXQsIHNob3VsZCB5b3UgYnVyZGVuIGxvdmU7CiAgICBUb28gZ3JlYXQgb3BwcmVzc2lvbiBmb3IgYSB0ZW5kZXIgdGhpbmcuCgpST01FTwoKICAgIElzIGxvdmUgYSB0ZW5kZXIgdGhpbmcIGl0IGlzIHRvbyByb3VnaCwKICAgIFRvbyBydWRlLCB0b28gYm9pc3Rlcm91cywgYW5kIGl0IHByaWNrcyBsaWtlIHRob3JuLgoKTUVSQ1VUSU8KCiAgICBJZiBsb3ZlIGJlIHJvdWdoIHdpdGggeW91LCBiZSByb3VnaCB3aXRoIGxvdmU7CiAgICBQcmljayBsb3ZlIGZvciBwcmlja2luZywgYW5kIHlvdSBiZWF0IGxvdmUgZG93bi4KICAgIEdpdmUgbWUgYSBjYXNlIHRvIHB1dCBteSB2aXNhZ2UgaW46CiAgICBBIHZpc29yIGZvciBhIHZpc29yISB3aGF0IGNhcmUgSQogICAgV2hhdCBjdXJpb3VzIGV5ZSBkb3RoIHF1b3RlIGRlZm9ybWl0aWVzPwogICAgSGVyZSBhcmUgdGhlIGJlZXRsZSBicm93cyBzaGFsbCBibHVzaCBmb3IgbWUuCgpCRU5WT0xJTwoKICAgIENvbWUsIGtub2NrIGFuZCBlbnRlcjsgYW5kIG5vIHNvb25lciBpbiwKICAgIEJ1dCBldmVyeSBtYW4gYmV0YWtlIGhpbSB0byBoaXMgbGVncy4KClJPTUVPCgogICAgQSB0b3JjaCBmb3IgbWU6IGxldCB3YW50b25zIGxpZ2h0IG9mIGhlYXJ0CiAgICBUaWNrbGUgdGhlIHNlbnNlbGVzcyBydXNoZXMgd2l0aCB0aGVpciBoZWVscywKICAgIEZvciBJIGFtIHByb3ZlcmInZCB3aXRoIGEgZ3JhbmRzaXJlIHBocmFzZTsKICAgIEknbGwgYmUgYSBjYW5kbGUtaG9sZGVyLCBhbmQgbG9vayBvbi4KICAgIFRoZSBnYW1lIHdhcyBuZSdlciBzbyBmYWlyLCBhbmQgSSBhbSBkb25lLgoKTUVSQ1VUSU8KCiAgICBUdXQsIGR1bidzIHRoZSBtb3VzZSwgdGhlIGNvbnN0YWJsZSdzIG93biB3b3JkOgogICAgSWYgdGhvdSBhcnQgZHVuLCB3ZSdsbCBkcmF3IHRoZWUgZnJvbSB0aGUgbWlyZQogICAgT2YgdGhpcyBzaXItcmV2ZXJlbmNlIGxvdmUsIHdoZXJlaW4gdGhvdSBzdGljaydzdAogICAgVXAgdG8gdGhlIGVhcnMuIENvbWUsIHdlIGJ1cm4gZGF5bGlnaHQsIGhvIQoKUk9NRU8KCiAgICBOYXksIHRoYXQncyBub3Qgc28uCgpNRVJDVVRJTwoKICAgIEkgbWVhbiwgc2lyLCBpbiBkZWxheQogICAgV2Ugd2FzdGUgb3VyIGxpZ2h0cyBpbiB2YWluLCBsaWtlIGxhbXBzIGJ5IGRheS4KICAgIFRha2Ugb3VyIGdvb2QgbWVhbmluZywgZm9yIG91ciBqdWRnbWVudCBzaXRzCiAgICBGaXZlIHRpbWVzIGluIHRoYXQgZXJlIG9uY2UgaW4gb3VyIGZpdmUgd2l0cy4KClJPTUVPCgogICAgQW5kIHdlIG1lYW4gd2VsbCBpbiBnb2luZyB0byB0aGlzIG1hc2s7CiAgICBCdXQgJ3RpcyBubyB3aXQgdG8gZ28uCgpNRVJDVVRJTwoKICAgIFdoeSwgbWF5IG9uZSBhc2sCgpST01FTwoKICAgIEkgZHJlYW0nZCBhIGRyZWFtIHRvLW5pZ2h0LgoKTUVSQ1VUSU8KCiAgICBBbmQgc28gZGlkIEkuCgpST01FTwoKICAgIFdlbGwsIHdoYXQgd2FzIHlvdXJzPwoKTUVSQ1VUSU8KCiAgICBUaGF0IGRyZWFtZXJzIG9mdGVuIGxpZS4KClJPTUVPCgogICAgSW4gYmVkIGFzbGVlcCwgd2hpbGUgdGhleSBkbyBkcmVhbSB0aGluZ3MgdHJ1ZS4KCk1FUkNVVElPCgogICAgTywgdGhlbiwgSSBzZWUgUXVlZW4gTWFiIGhhdGggYmVlbiB3aXRoIHlvdS4KICAgIFNoZSBpcyB0aGUgZmFpcmllcycgbWlkd2lmZSwgYW5kIHNoZSBjb21lcwogICAgSW4gc2hhcGUgbm8gYmlnZ2VyIHRoYW4gYW4gYWdhdGUtc3RvbmUKICAgIE9uIHRoZSBmb3JlLWZpbmdlciBvZiBhbiBhbGRlcm1hbiwKICAgIERyYXduIHdpdGggYSB0ZWFtIG9mIGxpdHRsZSBhdG9taWVzCiAgICBBdGh3YXJ0IG1lbidzIG5vc2VzIGFzIHRoZXkgbGllIGFzbGVlcDsKICAgIEhlciB3YWdvbi1zcG9rZXMgbWFkZSBvZiBsb25nIHNwaWRlcnMnIGxlZ3MsCiAgICBUaGUgY292ZXIgb2YgdGhlIHdpbmdzIG9mIGdyYXNzaG9wcGVycywKICAgIFRoZSB0cmFjZXMgb2YgdGhlIHNtYWxsZXN0IHNwaWRlcidzIHdlYiwKICAgIFRoZSBjb2xsYXJzIG9mIHRoZSBtb29uc2hpbmUncyB3YXRlcnkgYmVhbXMsCiAgICBIZXIgd2hpcCBvZiBjcmlja2V0J3MgYm9uZSwgdGhlIGxhc2ggb2YgZmlsbSwKICAgIEhlciB3YWdvbmVyIGEgc21hbGwgZ3JleS1jb2F0ZWQgZ25hdCwKICAgIE5vdCBzbyBiaWcgYXMgYSByb3VuZCBsaXR0bGUgd29ybQogICAgUHJpY2snZCBmcm9tIHRoZSBsYXp5IGZpbmdlciBvZiBhIG1haWQ7CiAgICBIZXIgY2hhcmlvdCBpcyBhbiBlbXB0eSBoYXplbC1udXQKICAgIE1hZGUgYnkgdGhlIGpvaW5lciBzcXVpcnJlbCBvciBvbGQgZ3J1YiwKICAgIFRpbWUgb3V0IG8nIG1pbmQgdGhlIGZhaXJpZXMnIGNvYWNobWFrZXJzLgogICAgQW5kIGluIHRoaXMgc3RhdGUgc2hlIGdhbGxvcHMgbmlnaHQgYnkgbmlnaHQKICAgIFRocm91Z2ggbG92ZXJzJyBicmFpbnMsIGFuZCB0aGVuIHRoZXkgZHJlYW0gb2YgbG92ZTsKICAgIE8nZXIgY291cnRpZXJzJyBrbmVlcywgdGhhdCBkcmVhbSBvbiBjb3VydCdzaWVzIHN0cmFpZ2h0LAogICAgTydlciBsYXd5ZXJzJyBmaW5nZXJzLCB3aG8gc3RyYWlnaHQgZHJlYW0gb24gZmVlcywKICAgIE8nZXIgbGFkaWVzICcgbGlwcywgd2hvIHN0cmFpZ2h0IG9uIGtpc3NlcyBkcmVhbSwKICAgIFdoaWNoIG9mdCB0aGUgYW5ncnkgTWFiIHdpdGggYmxpc3RlcnMgcGxhZ3VlcywKICAgIEJlY2F1c2UgdGhlaXIgYnJlYXRocyB3aXRoIHN3ZWV0bWVhdHMgdGFpbnRlZCBhcmU6CiAgICBTb21ldGltZSBzaGUgZ2FsbG9wcyBvJ2VyIGEgY291cnRpZXIncyBub3NlLAogICAgQW5kIHRoZW4gZHJlYW1zIGhlIG9mIHNtZWxsaW5nIG91dCBhIHN1aXQ7CiAgICBBbmQgc29tZXRpbWUgY29tZXMgc2hlIHdpdGggYSB0aXRoZS1waWcncyB0YWlsCiAgICBUaWNrbGluZyBhIHBhcnNvbidzIG5vc2UgYXMgYScgbGllcyBhc2xlZXAsCiAgICBUaGVuIGRyZWFtcywgaGUgb2YgYW5vdGhlciBiZW5lZmljZToKICAgIFNvbWV0aW1lIHNoZSBkcml2ZXRoIG8nZXIgYSBzb2xkaWVyJ3MgbmVjaywKICAgIEFuZCB0aGVuIGRyZWFtcyBoZSBvZiBjdXR0aW5nIGZvcmVpZ24gdGhyb2F0cywKICAgIE9mIGJyZWFjaGVzLCBhbWJ1c2NhZG9lcywgU3BhbmlzaCBibGFkZXMsCiAgICBPZiBoZWFsdGhzIGZpdmUtZmF0aG9tIGRlZXA7IGFuZCB0aGVuIGFub24KICAgIERydW1zIGluIGhpcyBlYXIsIGF0IHdoaWNoIGhlIHN0YXJ0cyBhbmQgd2FrZXMsCiAgICBBbmQgYmVpbmcgdGh1cyBmcmlnaHRlZCBzd2VhcnMgYSBwcmF5ZXIgb3IgdHdvCiAgICBBbmQgc2xlZXBzIGFnYWluLiBUaGlzIGlzIHRoYXQgdmVyeSBNYWIKICAgIFRoYXQgcGxhdHMgdGhlIG1hbmVzIG9mIGhvcnNlcyBpbiB0aGUgbmlnaHQsCiAgICBBbmQgYmFrZXMgdGhlIGVsZmxvY2tzIGluIGZvdWwgc2x1dHRpc2ggaGFpcnMsCiAgICBXaGljaCBvbmNlIHVudGFuZ2xlZCwgbXVjaCBtaXNmb3J0dW5lIGJvZGVzOgogICAgVGhpcyBpcyB0aGUgaGFnLCB3aGVuIG1haWRzIGxpZSBvbiB0aGVpciBiYWNrcywKICAgIFRoYXQgcHJlc3NlcyB0aGVtIGFuZCBsZWFybnMgdGhlbSBmaXJzdCB0byBiZWFyLAogICAgTWFraW5nIHRoZW0gd29tZW4gb2YgZ29vZCBjYXJyaWFnZToKICAgIFRoaXMgaXMgc2hlLS0KClJPTUVPCgogICAgUGVhY2UsIHBlYWNlLCBNZXJjdXRpbywgcGVhY2UhCiAgICBUaG91IHRhbGsnc3Qgb2Ygbm90aGluZy4KCk1FUkNVVElPCgogICAgVHJ1ZSwgSSB0YWxrIG9mIGRyZWFtcywKICAgIFdoaWNoIGFyZSB0aGUgY2hpbGRyZW4gb2YgYW4gaWRsZSBicmFpbiwKICAgIEJlZ290IG9mIG5vdGhpbmcgYnV0IHZhaW4gZmFudGFzeSwKICAgIFdoaWNoIGlzIGFzIHRoaW4gb2Ygc3Vic3RhbmNlIGFzIHRoZSBhaXIKICAgIEFuZCBtb3JlIGluY29uc3RhbnQgdGhhbiB0aGUgd2luZCwgd2hvIHdvb2VzCiAgICBFdmVuIG5vdyB0aGUgZnJvemVuIGJvc29tIG9mIHRoZSBub3J0aCwKICAgIEFuZCwgYmVpbmcgYW5nZXInZCwgcHVmZnMgYXdheSBmcm9tIHRoZW5jZSwKICAgIFR1cm5pbmcgaGlzIGZhY2UgdG8gdGhlIGRldy1kcm9wcGluZyBzb3V0aC4KCkJFTlZPTElPCgogICAgVGhpcyB3aW5kLCB5b3UgdGFsayBvZiwgYmxvd3MgdXMgZnJvbSBvdXJzZWx2ZXM7CiAgICBTdXBwZXIgaXMgZG9uZSwgYW5kIHdlIHNoYWxsIGNvbWUgdG9vIGxhdGUuCgpST01FTwoKICAgIEkgZmVhciwgdG9vIGVhcmx5OiBmb3IgbXkgbWluZCBtaXNnaXZlcwogICAgU29tZSBjb25zZXF1ZW5jZSB5ZXQgaGFuZ2luZyBpbiB0aGUgc3RhcnMKICAgIFNoYWxsIGJpdHRlcmx5IGJlZ2luIGhpcyBmZWFyZnVsIGRhdGUKICAgIFdpdGggdGhpcyBuaWdodCdzIHJldmVscyBhbmQgZXhwaXJlIHRoZSB0ZXJtCiAgICBPZiBhIGRlc3Bpc2VkIGxpZmUgY2xvc2VkIGluIG15IGJyZWFzdAogICAgQnkgc29tZSB2aWxlIGZvcmZlaXQgb2YgdW50aW1lbHkgZGVhdGguCiAgICBCdXQgSGUsIHRoYXQgaGF0aCB0aGUgc3RlZXJhZ2Ugb2YgbXkgY291cnNlLAogICAgRGlyZWN0IG15IHNhaWwhIE9uLCBsdXN0eSBnZW50bGVtZW4uCgpCRU5WT0xJTwoKICAgIFN0cmlrZSwgZHJ1bS4KCiAgICBFeGV1bnQKClNDRU5FIFYuIEEgaGFsbCBpbiBDYXB1bGV0J3MgaG91c2UuCgogICAgTXVzaWNpYW5zIHdhaXRpbmcuIEVudGVyIFNlcnZpbmdtZW4gd2l0aCBuYXBraW5zIAoKRmlyc3QgU2VydmFudAoKICAgIFdoZXJlJ3MgUG90cGFuLCB0aGF0IGhlIGhlbHBzIG5vdCB0byB0YWtlIGF3YXkIEhlCiAgICBzaGlmdCBhIHRyZW5jaGVyPyBoZSBzY3JhcGUgYSB0cmVuY2hlciEKClNlY29uZCBTZXJ2YW50CgogICAgV2hlbiBnb29kIG1hbm5lcnMgc2hhbGwgbGllIGFsbCBpbiBvbmUgb3IgdHdvIG1lbidzCiAgICBoYW5kcyBhbmQgdGhleSB1bndhc2hlZCB0b28sICd0aXMgYSBmb3VsIHRoaW5nLgoKRmlyc3QgU2VydmFudAoKICAgIEF3YXkgd2l0aCB0aGUgam9pbnQtc3Rvb2xzLCByZW1vdmUgdGhlCiAgICBjb3VydC1jdXBib2FyZCwgbG9vayB0byB0aGUgcGxhdGUuIEdvb2QgdGhvdSwgc2F2ZQogICAgbWUgYSBwaWVjZSBvZiBtYXJjaHBhbmU7IGFuZCwgYXMgdGhvdSBsb3Zlc3QgbWUsIGxldAogICAgdGhlIHBvcnRlciBsZXQgaW4gU3VzYW4gR3JpbmRzdG9uZSBhbmQgTmVsbC4KICAgIEFudG9ueSwgYW5kIFBvdHBhbiEKClNlY29uZCBTZXJ2YW50CgogICAgQXksIGJveSwgcmVhZHkuCgpGaXJzdCBTZXJ2YW50CgogICAgWW91IGFyZSBsb29rZWQgZm9yIGFuZCBjYWxsZWQgZm9yLCBhc2tlZCBmb3IgYW5kCiAgICBzb3VnaHQgZm9yLCBpbiB0aGUgZ3JlYXQgY2hhbWJlci4KClNlY29uZCBTZXJ2YW50CgogICAgV2UgY2Fubm90IGJlIGhlcmUgYW5kIHRoZXJlIHRvby4gQ2hlZXJseSwgYm95czsgYmUKICAgIGJyaXNrIGF3aGlsZSwgYW5kIHRoZSBsb25nZXIgbGl2ZXIgdGFrZSBhbGwuCgogICAgRW50ZXIgQ0FQVUxFVCwgd2l0aCBKVUxJRVQgYW5kIG90aGVycyBvZiBoaXMgaG91c2UsIG1lZXRpbmcgdGhlIEd1ZXN0cyBhbmQgTWFza2VycwoKQ0FQVUxFVAoKICAgIFdlbGNvbWUsIGdlbnRsZW1lbiEgbGFkaWVzIHRoYXQgaGF2ZSB0aGVpciB0b2VzCiAgICBVbnBsYWd1ZWQgd2l0aCBjb3JucyB3aWxsIGhhdmUgYSBib3V0IHdpdGggeW91LgogICAgQWggaGEsIG15IG1pc3RyZXNzZXMhIHdoaWNoIG9mIHlvdSBhbGwKICAgIFdpbGwgbm93IGRlbnkgdG8gZGFuY2UIHNoZSB0aGF0IG1ha2VzIGRhaW50eSwKICAgIFNoZSwgSSdsbCBzd2VhciwgaGF0aCBjb3JuczsgYW0gSSBjb21lIG5lYXIgeWUgbm93PwogICAgV2VsY29tZSwgZ2VudGxlbWVuISBJIGhhdmUgc2VlbiB0aGUgZGF5CiAgICBUaGF0IEkgaGF2ZSB3b3JuIGEgdmlzb3IgYW5kIGNvdWxkIHRlbGwKICAgIEEgd2hpc3BlcmluZyB0YWxlIGluIGEgZmFpciBsYWR5J3MgZWFyLAogICAgU3VjaCBhcyB3b3VsZCBwbGVhc2U6ICd0aXMgZ29uZSwgJ3RpcyBnb25lLCAndGlzIGdvbmU6CiAgICBZb3UgYXJlIHdlbGNvbWUsIGdlbnRsZW1lbiEgY29tZSwgbXVzaWNpYW5zLCBwbGF5LgogICAgQSBoYWxsLCBhIGhhbGwhIGdpdmUgcm9vbSEgYW5kIGZvb3QgaXQsIGdpcmxzLgoKICAgIE11c2ljIHBsYXlzLCBhbmQgdGhleSBkYW5jZQogICAgTW9yZSBsaWdodCwgeW91IGtuYXZlczsgYW5kIHR1cm4gdGhlIHRhYmxlcyB1cCwKICAgIEFuZCBxdWVuY2ggdGhlIGZpcmUsIHRoZSByb29tIGlzIGdyb3duIHRvbyBob3QuCiAgICBBaCwgc2lycmFoLCB0aGlzIHVubG9vaydkLWZvciBzcG9ydCBjb21lcyB3ZWxsLgogICAgTmF5LCBzaXQsIG5heSwgc2l0LCBnb29kIGNvdXNpbiBDYXB1bGV0OwogICAgRm9yIHlvdSBhbmQgSSBhcmUgcGFzdCBvdXIgZGFuY2luZyBkYXlzOgogICAgSG93IGxvbmcgaXMndCBub3cgc2luY2UgbGFzdCB5b3Vyc2VsZiBhbmQgSQogICAgV2VyZSBpbiBhIG1hc2sCgpTZWNvbmQgQ2FwdWxldAoKICAgIEJ5J3IgbGFkeSwgdGhpcnR5IHllYXJzLgoKQ0FQVUxFVAoKICAgIFdoYXQsIG1hbiEgJ3RpcyBub3Qgc28gbXVjaCwgJ3RpcyBub3Qgc28gbXVjaDoKICAgICdUaXMgc2luY2UgdGhlIG51cHRpYWxzIG9mIEx1Y2VudGlvLAogICAgQ29tZSBwZW50ZWNvc3QgYXMgcXVpY2tseSBhcyBpdCB3aWxsLAogICAgU29tZSBmaXZlIGFuZCB0d2VudHkgeWVhcnM7IGFuZCB0aGVuIHdlIG1hc2snZC4KClNlY29uZCBDYXB1bGV0CgogICAgJ1RpcyBtb3JlLCAndGlzIG1vcmUsIGhpcyBzb24gaXMgZWxkZXIsIHNpcjsKICAgIEhpcyBzb24gaXMgdGhpcnR5LgoKQ0FQVUxFVAoKICAgIFdpbGwgeW91IHRlbGwgbWUgdGhhdD8KICAgIEhpcyBzb24gd2FzIGJ1dCBhIHdhcmQgdHdvIHllYXJzIGFnby4KClJPTUVPCgogICAgW1RvIGEgU2VydmluZ21hbl0gV2hhdCBsYWR5IGlzIHRoYXQsIHdoaWNoIGRvdGgKICAgIGVucmljaCB0aGUgaGFuZAogICAgT2YgeW9uZGVyIGtuaWdodD8KClNlcnZhbnQKCiAgICBJIGtub3cgbm90LCBzaXIuCgpST01FTwoKICAgIE8sIHNoZSBkb3RoIHRlYWNoIHRoZSB0b3JjaGVzIHRvIGJ1cm4gYnJpZ2h0IQogICAgSXQgc2VlbXMgc2hlIGhhbmdzIHVwb24gdGhlIGNoZWVrIG9mIG5pZ2h0CiAgICBMaWtlIGEgcmljaCBqZXdlbCBpbiBhbiBFdGhpb3BlJ3MgZWFyOwogICAgQmVhdXR5IHRvbyByaWNoIGZvciB1c2UsIGZvciBlYXJ0aCB0b28gZGVhciEKICAgIFNvIHNob3dzIGEgc25vd3kgZG92ZSB0cm9vcGluZyB3aXRoIGNyb3dzLAogICAgQXMgeW9uZGVyIGxhZHkgbydlciBoZXIgZmVsbG93cyBzaG93cy4KICAgIFRoZSBtZWFzdXJlIGRvbmUsIEknbGwgd2F0Y2ggaGVyIHBsYWNlIG9mIHN0YW5kLAogICAgQW5kLCB0b3VjaGluZyBoZXJzLCBtYWtlIGJsZXNzZWQgbXkgcnVkZSBoYW5kLgogICAgRGlkIG15IGhlYXJ0IGxvdmUgdGlsbCBub3cIGZvcnN3ZWFyIGl0LCBzaWdodCEKICAgIEZvciBJIG5lJ2VyIHNhdyB0cnVlIGJlYXV0eSB0aWxsIHRoaXMgbmlnaHQuCgpUWUJBTFQKCiAgICBUaGlzLCBieSBoaXMgdm9pY2UsIHNob3VsZCBiZSBhIE1vbnRhZ3VlLgogICAgRmV0Y2ggbWUgbXkgcmFwaWVyLCBib3kuIFdoYXQgZGFyZXMgdGhlIHNsYXZlCiAgICBDb21lIGhpdGhlciwgY292ZXInZCB3aXRoIGFuIGFudGljIGZhY2UsCiAgICBUbyBmbGVlciBhbmQgc2Nvcm4gYXQgb3VyIHNvbGVtbml0eT8KICAgIE5vdywgYnkgdGhlIHN0b2NrIGFuZCBob25vdXIgb2YgbXkga2luLAogICAgVG8gc3RyaWtlIGhpbSBkZWFkLCBJIGhvbGQgaXQgbm90IGEgc2luLgoKQ0FQVUxFVAoKICAgIFdoeSwgaG93IG5vdywga2luc21hbiEgd2hlcmVmb3JlIHN0b3JtIHlvdSBzbz8KClRZQkFMVAoKICAgIFVuY2xlLCB0aGlzIGlzIGEgTW9udGFndWUsIG91ciBmb2UsCiAgICBBIHZpbGxhaW4gdGhhdCBpcyBoaXRoZXIgY29tZSBpbiBzcGl0ZSwKICAgIFRvIHNjb3JuIGF0IG91ciBzb2xlbW5pdHkgdGhpcyBuaWdodC4KCkNBUFVMRVQKCiAgICBZb3VuZyBSb21lbyBpcyBpdD8KClRZQkFMVAoKICAgICdUaXMgaGUsIHRoYXQgdmlsbGFpbiBSb21lby4KCkNBUFVMRVQKCiAgICBDb250ZW50IHRoZWUsIGdlbnRsZSBjb3osIGxldCBoaW0gYWxvbmU7CiAgICBIZSBiZWFycyBoaW0gbGlrZSBhIHBvcnRseSBnZW50bGVtYW47CiAgICBBbmQsIHRvIHNheSB0cnV0aCwgVmVyb25hIGJyYWdzIG9mIGhpbQogICAgVG8gYmUgYSB2aXJ0dW91cyBhbmQgd2VsbC1nb3Zlcm4nZCB5b3V0aDoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd2VhbHRoIG9mIGFsbCB0aGUgdG93bgogICAgSGVyZSBpbiBteSBob3VzZSBkbyBoaW0gZGlzcGFyYWdlbWVudDoKICAgIFRoZXJlZm9yZSBiZSBwYXRpZW50LCB0YWtlIG5vIG5vdGUgb2YgaGltOgogICAgSXQgaXMgbXkgd2lsbCwgdGhlIHdoaWNoIGlmIHRob3UgcmVzcGVjdCwKICAgIFNob3cgYSBmYWlyIHByZXNlbmNlIGFuZCBwdXQgb2ZmIHRoZXNlIGZyb3ducywKICAgIEFuZCBpbGwtYmVzZWVtaW5nIHNlbWJsYW5jZSBmb3IgYSBmZWFzdC4KClRZQkFMVAoKICAgIEl0IGZpdHMsIHdoZW4gc3VjaCBhIHZpbGxhaW4gaXMgYSBndWVzdDoKICAgIEknbGwgbm90IGVuZHVyZSBoaW0uCgpDQVBVTEVUCgogICAgSGUgc2hhbGwgYmUgZW5kdXJlZDoKICAgIFdoYXQsIGdvb2RtYW4gYm95ISBJIHNheSwgaGUgc2hhbGw6IGdvIHRvOwogICAgQW0gSSB0aGUgbWFzdGVyIGhlcmUsIG9yIHlvdT8gZ28gdG8uCiAgICBZb3UnbGwgbm90IGVuZHVyZSBoaW0hIEdvZCBzaGFsbCBtZW5kIG15IHNvdWwhCiAgICBZb3UnbGwgbWFrZSBhIG11dGlueSBhbW9uZyBteSBndWVzdHMhCiAgICBZb3Ugd2lsbCBzZXQgY29jay1hLWhvb3AhIHlvdSdsbCBiZSB0aGUgbWFuIQoKVFlCQUxUCgogICAgV2h5LCB1bmNsZSwgJ3RpcyBhIHNoYW1lLgoKQ0FQVUxFVAoKICAgIEdvIHRvLCBnbyB0bzsKICAgIFlvdSBhcmUgYSBzYXVjeSBib3k6IGlzJ3Qgc28sIGluZGVlZD8KICAgIFRoaXMgdHJpY2sgbWF5IGNoYW5jZSB0byBzY2F0aGUgeW91LCBJIGtub3cgd2hhdDoKICAgIFlvdSBtdXN0IGNvbnRyYXJ5IG1lISBtYXJyeSwgJ3RpcyB0aW1lLgogICAgV2VsbCBzYWlkLCBteSBoZWFydHMhIFlvdSBhcmUgYSBwcmluY294OyBnbzoKICAgIEJlIHF1aWV0LCBvci0tTW9yZSBsaWdodCwgbW9yZSBsaWdodCEgRm9yIHNoYW1lIQogICAgSSdsbCBtYWtlIHlvdSBxdWlldC4gV2hhdCwgY2hlZXJseSwgbXkgaGVhcnRzIQoKVFlCQUxUCgogICAgUGF0aWVuY2UgcGVyZm9yY2Ugd2l0aCB3aWxmdWwgY2hvbGVyIG1lZXRpbmcKICAgIE1ha2VzIG15IGZsZXNoIHRyZW1ibGUgaW4gdGhlaXIgZGlmZmVyZW50IGdyZWV0aW5nLgogICAgSSB3aWxsIHdpdGhkcmF3OiBidXQgdGhpcyBpbnRydXNpb24gc2hhbGwKICAgIE5vdyBzZWVtaW5nIHN3ZWV0IGNvbnZlcnQgdG8gYml0dGVyIGdhbGwuCgogICAgRXhpdAoKUk9NRU8KCiAgICBbVG8gSlVMSUVUXSBJZiBJIHByb2ZhbmUgd2l0aCBteSB1bndvcnRoaWVzdCBoYW5kCiAgICBUaGlzIGhvbHkgc2hyaW5lLCB0aGUgZ2VudGxlIGZpbmUgaXMgdGhpczoKICAgIE15IGxpcHMsIHR3byBibHVzaGluZyBwaWxncmltcywgcmVhZHkgc3RhbmQKICAgIFRvIHNtb290aCB0aGF0IHJvdWdoIHRvdWNoIHdpdGggYSB0ZW5kZXIga2lzcy4KCkpVTElFVAoKICAgIEdvb2QgcGlsZ3JpbSwgeW91IGRvIHdyb25nIHlvdXIgaGFuZCB0b28gbXVjaCwKICAgIFdoaWNoIG1hbm5lcmx5IGRldm90aW9uIHNob3dzIGluIHRoaXM7CiAgICBGb3Igc2FpbnRzIGhhdmUgaGFuZHMgdGhhdCBwaWxncmltcycgaGFuZHMgZG8gdG91Y2gsCiAgICBBbmQgcGF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lIGJlIG1hcnJpZWQuCiAgICBNeSBncmF2ZSBpcyBsaWtlIHRvIGJlIG15IHdlZGRpbmcgYmVkLgoKTnVyc2UKCiAgICBIaXMgbmFtZSBpcyBSb21lbywgYW5kIGEgTW9udGFndWU7CiAgICBUaGUgb25seSBzb24gb2YgeW91ciBncmVhdCBlbmVteS4KCkpVTElFVAoKICAgIE15IG9ubHkgbG92ZSBzcHJ1bmcgZnJvbSBteSBvbmx5IGhhdGUhCiAgICBUb28gZWFybHkgc2VlbiB1bmtub3duLCBhbmQga25vd24gdG9vIGxhdGUhCiAgICBQcm9kaWdpb3VzIGJpcnRoIG9mIGxvdmUgaXQgaXMgdG8gbWUsCiAgICBUaGF0IEkgbXVzdCBsb3ZlIGEgbG9hdGhlZCBlbmVteS4KCk51cnNlCgogICAgV2hhdCdzIHRoaXMIHdoYXQncyB0aGlzPwoKSlVMSUVUCgogICAgQSByaHltZSBJIGxlYXJuJ2QgZXZlbiBub3cKICAgIE9mIG9uZSBJIGRhbmNlZCB3aXRoYWwuCgogICAgT25lIGNhbGxzIHdpdGhpbiAnSnVsaWV0LicKCk51cnNlCgogICAgQW5vbiwgYW5vbiEKICAgIENvbWUsIGxldCdzIGF3YXk7IHRoZSBzdHJhbmdlcnMgYWxsIGFyZSBnb25lLgoKICAgIEV4ZXVudAoKQUNUIElJClBST0xPR1VFCgogICAgRW50ZXIgQ2hvcnVzIAoKQ2hvcnVzCgogICAgTm93IG9sZCBkZXNpcmUgZG90aCBpbiBoaXMgZGVhdGgtYmVkIGxpZSwKICAgIEFuZCB5b3VuZyBhZmZlY3Rpb24gZ2FwZXMgdG8gYmUgaGlzIGhlaXI7CiAgICBUaGF0IGZhaXIgZm9yIHdoaWNoIGxvdmUgZ3JvYW4nZCBmb3IgYW5kIHdvdWxkIGRpZSwKICAgIFdpdGggdGVuZGVyIEp1bGlldCBtYXRjaCdkLCBpcyBub3cgbm90IGZhaXIuCiAgICBOb3cgUm9tZW8gaXMgYmVsb3ZlZCBhbmQgbG92ZXMgYWdhaW4sCiAgICBBbGlrZSBiZXR3aXRjaGVkIGJ5IHRoZSBjaGFybSBvZiBsb29rcywKICAgIEJ1dCB0byBoaXMgZm9lIHN1cHBvc2VkIGhlIG11c3QgY29tcGxhaW4sCiAgICBBbmQgc2hlIHN0ZWFsIGxvdmUncyBzd2VldCBiYWl0IGZyb20gZmVhcmZ1bCBob29rczoKICAgIEJlaW5nIGhlbGQgYSBmb2UsIGhlIG1heSBub3QgaGF2ZSBhY2Nlc3MKICAgIFRvIGJyZWF0aGUgc3VjaCB2b3dzIGFzIGxvdmVycyB1c2UgdG8gc3dlYXI7CiAgICBBbmQgc2hlIGFzIG11Y2ggaW4gbG92ZSwgaGVyIG1lYW5zIG11Y2ggbGVzcwogICAgVG8gbWVldCBoZXIgbmV3LWJlbG92ZWQgYW55IHdoZXJlOgogICAgQnV0IHBhc3Npb24gbGVuZHMgdGhlbSBwb3dlciwgdGltZSBtZWFucywgdG8gbWVldAogICAgVGVtcGVyaW5nIGV4dHJlbWl0aWVzIHdpdGggZXh0cmVtZSBzd2VldC4KCiAgICBFeGl0CgpTQ0VORSBJLiBBIGxhbmUgYnkgdGhlIHdhbGwgb2YgQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gCgpST01FTwoKICAgIENhbiBJIGdvIGZvcndhcmQgd2hlbiBteSBoZWFydCBpcyBoZXJlPwogICAgVHVybiBiYWNrLCBkdWxsIGVhcnRoLCBhbmQgZmluZCB0aHkgY2VudHJlIG91dC4KCiAgICBIZSBjbGltYnMgdGhlIHdhbGwsIGFuZCBsZWFwcyBkb3duIHdpdGhpbiBpdAoKICAgIEVudGVyIEJFTlZPTElPIGFuZCBNRVJDVVRJTwoKQkVOVk9MSU8KCiAgICBSb21lbyEgbXkgY291c2luIFJvbWVvIQoKTUVSQ1VUSU8KCiAgICBIZSBpcyB3aXNlOwogICAgQW5kLCBvbiBteSBsaWUsIGhhdGggc3RvbCduIGhpbSBob21lIHRvIGJlZC4KCkJFTlZPTElPCgogICAgSGUgcmFuIHRoaXMgd2F5LCBhbmQgbGVhcCdkIHRoaXMgb3JjaGFyZCB3YWxsOgogICAgQ2FsbCwgZ29vZCBNZXJjdXRpby4KCk1FUkNVVElPCgogICAgTmF5LCBJJ2xsIGNvbmp1cmUgdG9vLgogICAgUm9tZW8hIGh1bW91cnMhIG1hZG1hbiEgcGFzc2lvbiEgbG92ZXIhCiAgICBBcHBlYXIgdGhvdSBpbiB0aGUgbGlrZW5lc3Mgb2YgYSBzaWdoOgogICAgU3BlYWsgYnV0IG9uZSByaHltZSwgYW5kIEkgYW0gc2F0aXNmaWVkOwogICAgQ3J5IGJ1dCAnQXkgbWUhJyBwcm9ub3VuY2UgYnV0ICdsb3ZlJyBhbmQgJ2RvdmU7JwogICAgU3BlYWsgdG8gbXkgZ29zc2lwIFZlbnVzIG9uZSBmYWlyIHdvcmQsCiAgICBPbmUgbmljay1uYW1lIGZvciBoZXIgcHVyYmxpbmQgc29uIGFuZCBoZWlyLAogICAgWW91bmcgQWRhbSBDdXBpZCwgaGUgdGhhdCBzaG90IHNvIHRyaW0sCiAgICBXaGVuIEtpbmcgQ29waGV0dWEgbG92ZWQgdGhlIGJlZ2dhci1tYWlkIQogICAgSGUgaGVhcmV0aCBub3QsIGhlIHN0aXJyZXRoIG5vdCwgaGUgbW92ZXRoIG5vdDsKICAgIFRoZSBhcGUgaXMgZGVhZCwgYW5kIEkgbXVzdCBjb25qdXJlIGhpbS4KICAgIEkgY29uanVyZSB0aGVlIGJ5IFJvc2FsaW5lJ3MgYnJpZ2h0IGV5ZXMsCiAgICBCeSBoZXIgaGlnaCBmb3JlaGVhZCBhbmQgaGVyIHNjYXJsZXQgbGlwLAogICAgQnkgaGVyIGZpbmUgZm9vdCwgc3RyYWlnaHQgbGVnIGFuZCBxdWl2ZXJpbmcgdGhpZ2gKICAgIEFuZCB0aGUgZGVtZXNuZXMgdGhhdCB0aGVyZSBhZGphY2VudCBsaWUsCiAgICBUaGF0IGluIHRoeSBsaWtlbmVzcyB0aG91IGFwcGVhciB0byB1cyEKCkJFTlZPTElPCgogICAgQW5kIGlmIGhlIGhlYXIgdGhlZSwgdGhvdSB3aWx0IGFuZ2VyIGhpbS4KCk1FUkNVVElPCgogICAgVGhpcyBjYW5ub3QgYW5nZXIgaGltOiAndHdvdWxkIGFuZ2VyIGhpbQogICAgVG8gcmFpc2UgYSBzcGlyaXQgaW4gaGlzIG1pc3RyZXNzJyBjaXJjbGUKICAgIE9mIHNvbWUgc3RyYW5nZSBuYXR1cmUsIGxldHRpbmcgaXQgdGhlcmUgc3RhbmQKICAgIFRpbGwgc2hlIGhhZCBsYWlkIGl0IGFuZCBjb25qdXJlZCBpdCBkb3duOwogICAgVGhhdCB3ZXJlIHNvbWUgc3BpdGU6IG15IGludm9jYXRpb24KICAgIElzIGZhaXIgYW5kIGhvbmVzdCwgYW5kIGluIGhpcyBtaXN0cmVzIHMnIG5hbWUKICAgIEkgY29uanVyZSBvbmx5IGJ1dCB0byByYWlzZSB1cCBoaW0uCgpCRU5WT0xJTwoKICAgIENvbWUsIGhlIGhhdGggaGlkIGhpbXNlbGYgYW1vbmcgdGhlc2UgdHJlZXMsCiAgICBUbyBiZSBjb25zb3J0ZWQgd2l0aCB0aGUgaHVtb3JvdXMgbmlnaHQ6CiAgICBCbGluZCBpcyBoaXMgbG92ZSBhbmQgYmVzdCBiZWZpdHMgdGhlIGRhcmsuCgpNRVJDVVRJTwoKICAgIElmIGxvdmUgYmUgYmxpbmQsIGxvdmUgY2Fubm90IGhpdCB0aGUgbWFyay4KICAgIE5vdyB3aWxsIGhlIHNpdCB1bmRlciBhIG1lZGxhciB0cmVlLAogICAgQW5kIHdpc2ggaGlzIG1pc3RyZXNzIHdlcmUgdGhhdCBraW5kIG9mIGZydWl0CiAgICBBcyBtYWlkcyBjYWxsIG1lZGxhcnMsIHdoZW4gdGhleSBsYXVnaCBhbG9uZS4KICAgIFJvbWVvLCB0aGF0IHNoZSB3ZXJlLCBPLCB0aGF0IHNoZSB3ZXJlCiAgICBBbiBvcGVuIGV0IGNhZXRlcmEsIHRob3UgYSBwb3BlcmluIHBlYXIhCiAgICBSb21lbywgZ29vZCBuaWdodDogSSdsbCB0byBteSB0cnVja2xlLWJlZDsKICAgIFRoaXMgZmllbGQtYmVkIGlzIHRvbyBjb2xkIGZvciBtZSB0byBzbGVlcDoKICAgIENvbWUsIHNoYWxsIHdlIGdvPwoKQkVOVk9MSU8KCiAgICBHbywgdGhlbjsgZm9yICd0aXMgaW4gdmFpbgogICAgVG8gc2VlayBoaW0gaGVyZSB0aGF0IG1lYW5zIG5vdCB0byBiZSBmb3VuZC4KCiAgICBFeGV1bnQKClNDRU5FIElJLiBDYXB1bGV0J3Mgb3JjaGFyZC4KCiAgICBFbnRlciBST01FTyAKClJPTUVPCgogICAgSGUgamVzdHMgYXQgc2NhcnMgdGhhdCBuZXZlciBmZWx0IGEgd291bmQuCgogICAgSlVMSUVUIGFwcGVhcnMgYWJvdmUgYXQgYSB3aW5kb3cKICAgIEJ1dCwgc29mdCEgd2hhdCBsaWdodCB0aHJvdWdoIHlvbmRlciB3aW5kb3cgYnJlYWtzPwogICAgSXQgaXMgdGhlIGVhc3QsIGFuZCBKdWxpZXQgaXMgdGhlIHN1bi4KICAgIEFyaXNlLCBmYWlyIHN1biwgYW5kIGtpbGwgdGhlIGVudmlvdXMgbW9vbiwKICAgIFdobyBpcyBhbHJlYWR5IHNpY2sgYW5kIHBhbGUgd2l0aCBncmllZiwKICAgIFRoYXQgdGhvdSBoZXIgbWFpZCBhcnQgZmFyIG1vcmUgZmFpciB0aGFuIHNoZToKICAgIEJlIG5vdCBoZXIgbWFpZCwgc2luY2Ugc2hlIGlzIGVudmlvdXM7CiAgICBIZXIgdmVzdGFsIGxpdmVyeSBpcyBidXQgc2ljayBhbmQgZ3JlZW4KICAgIEFuZCBub25lIGJ1dCBmb29scyBkbyB3ZWFyIGl0OyBjYXN0IGl0IG9mZi4KICAgIEl0IGlzIG15IGxhZHksIE8sIGl0IGlzIG15IGxvdmUhCiAgICBPLCB0aGF0IHNoZSBrbmV3IHNoZSB3ZXJlIQogICAgU2hlIHNwZWFrcyB5ZXQgc2hlIHNheXMgbm90aGluZzogd2hhdCBvZiB0aGF0PwogICAgSGVyIGV5ZSBkaXNjb3Vyc2VzOyBJIHdpbGwgYW5zd2VyIGl0LgogICAgSSBhbSB0b28gYm9sZCwgJ3RpcyBub3QgdG8gbWUgc2hlIHNwZWFrczoKICAgIFR3byBvZiB0aGUgZmFpcmVzdCBzdGFycyBpbiBhbGwgdGhlIGhlYXZlbiwKICAgIEhhdmluZyBzb21lIGJ1c2luZXNzLCBkbyBlbnRyZWF0IGhlciBleWVzCiAgICBUbyB0d2lua2xlIGluIHRoZWlyIHNwaGVyZXMgdGlsbCB0aGV5IHJldHVybi4KICAgIFdoYXQgaWYgaGVyIGV5ZXMgd2VyZSB0aGVyZSwgdGhleSBpbiBoZXIgaGVhZD8KICAgIFRoZSBicmlnaHRuZXNzIG9mIGhlciBjaGVlayB3b3VsZCBzaGFtZSB0aG9zZSBzdGFycywKICAgIEFzIGRheWxpZ2h0IGRvdGggYSBsYW1wOyBoZXIgZXllcyBpbiBoZWF2ZW4KICAgIFdvdWxkIHRocm91Z2ggdGhlIGFpcnkgcmVnaW9uIHN0cmVhbSBzbyBicmlnaHQKICAgIFRoYXQgYmlyZHMgd291bGQgc2luZyBhbmQgdGhpbmsgaXQgd2VyZSBub3QgbmlnaHQuCiAgICBTZWUsIGhvdyBzaGUgbGVhbnMgaGVyIGNoZWVrIHVwb24gaGVyIGhhbmQhCiAgICBPLCB0aGF0IEkgd2VyZSBhIGdsb3ZlIHVwb24gdGhhdCBoYW5kLAogICAgVGhhdCBJIG1pZ2h0IHRvdWNoIHRoYXQgY2hlZWshCgpKVUxJRVQKCiAgICBBeSBtZSEKClJPTUVPCgogICAgU2hlIHNwZWFrczoKICAgIE8sIHNwZWFrIGFnYWluLCBicmlnaHQgYW5nZWwhIGZvciB0aG91IGFydAogICAgQXMgZ2xvcmlvdXMgdG8gdGhpcyBuaWdodCwgYmVpbmcgbydlciBteSBoZWFkCiAgICBBcyBpcyBhIHdpbmdlZCBtZXNzZW5nZXIgb2YgaGVhdmVuCiAgICBVbnRvIHRoZSB3aGl0ZS11cHR1cm5lZCB3b25kZXJpbmcgZXllcwogICAgT2YgbW9ydGFscyB0aGF0IGZhbGwgYmFjayB0byBnYXplIG9uIGhpbQogICAgV2hlbiBoZSBiZXN0cmlkZXMgdGhlIGxhenktcGFjaW5nIGNsb3VkcwogICAgQW5kIHNhaWxzIHVwb24gdGhlIGJvc29tIG9mIHRoZSBhaXIuCgpKVUxJRVQKCiAgICBPIFJvbWVvLCBSb21lbyEgd2hlcmVmb3JlIGFydCB0aG91IFJvbWVvPwogICAgRGVueSB0aHkgZmF0aGVyIGFuZCByZWZ1c2UgdGh5IG5hbWU7CiAgICBPciwgaWYgdGhvdSB3aWx0IG5vdCwgYmUgYnV0IHN3b3JuIG15IGxvdmUsCiAgICBBbmQgSSdsbCBubyBsb25nZXIgYmUgYSBDYXB1bGV0LgoKUk9NRU8KCiAgICBbQXNpZGVdIFNoYWxsIEkgaGVhciBtb3JlLCBvciBzaGFsbCBJIHNwZWFrIGF0IHRoaXMCgpKVUxJRVQKCiAgICAnVGlzIGJ1dCB0aHkgbmFtZSB0aGF0IGlzIG15IGVuZW15OwogICAgVGhvdSBhcnQgdGh5c2VsZiwgdGhvdWdoIG5vdCBhIE1vbnRhZ3VlLgogICAgV2hhdCdzIE1vbnRhZ3VlPyBpdCBpcyBub3IgaGFuZCwgbm9yIGZvb3QsCiAgICBOb3IgYXJtLCBub3IgZmFjZSwgbm9yIGFueSBvdGhlciBwYXJ0CiAgICBCZWxvbmdpbmcgdG8gYSBtYW4uIE8sIGJlIHNvbWUgb3RoZXIgbmFtZSEKICAgIFdoYXQncyBpbiBhIG5hbWUIHRoYXQgd2hpY2ggd2UgY2FsbCBhIHJvc2UKICAgIEJ5IGFueSBvdGhlciBuYW1lIHdvdWxkIHNtZWxsIGFzIHN3ZWV0OwogICAgU28gUm9tZW8gd291bGQsIHdlcmUgaGUgbm90IFJvbWVvIGNhbGwnZCwKICAgIFJldGFpbiB0aGF0IGRlYXIgcGVyZmVjdGlvbiB3aGljaCBoZSBvd2VzCiAgICBXaXRob3V0IHRoYXQgdGl0bGUuIFJvbWVvLCBkb2ZmIHRoeSBuYW1lLAogICAgQW5kIGZvciB0aGF0IG5hbWUgd2hpY2ggaXMgbm8gcGFydCBvZiB0aGVlCiAgICBUYWtlIGFsbCBteXNlbGYuCgpST01FTwoKICAgIEkgdGFrZSB0aGVlIGF0IHRoeSB3b3JkOgogICAgQ2FsbCBtZSBidXQgbG92ZSwgYW5kIEknbGwgYmUgbmV3IGJhcHRpemVkOwogICAgSGVuY2Vmb3J0aCBJIG5ldmVyIHdpbGwgYmUgUm9tZW8uCgpKVUxJRVQKCiAgICBXaGF0IG1hbiBhcnQgdGhvdSB0aGF0IHRodXMgYmVzY3JlZW4nZCBpbiBuaWdodAogICAgU28gc3R1bWJsZXN0IG9uIG15IGNvdW5zZWwCgpST01FTwoKICAgIEJ5IGEgbmFtZQogICAgSSBrbm93IG5vdCBob3cgdG8gdGVsbCB0aGVlIHdobyBJIGFtOgogICAgTXkgbmFtZSwgZGVhciBzYWludCwgaXMgaGF0ZWZ1bCB0byBteXNlbGYsCiAgICBCZWNhdXNlIGl0IGlzIGFuIGVuZW15IHRvIHRoZWU7CiAgICBIYWQgSSBpdCB3cml0dGVuLCBJIHdvdWxkIHRlYXIgdGhlIHdvcmQuCgpKVUxJRVQKCiAgICBNeSBlYXJzIGhhdmUgbm90IHlldCBkcnVuayBhIGh1bmRyZWQgd29yZHMKICAgIE9mIHRoYXQgdG9uZ3VlJ3MgdXR0ZXJhbmNlLCB5ZXQgSSBrbm93IHRoZSBzb3VuZDoKICAgIEFydCB0aG91IG5vdCBSb21lbyBhbmQgYSBNb250YWd1ZT8KClJPTUVPCgogICAgTmVpdGhlciwgZmFpciBzYWludCwgaWYgZWl0aGVyIHRoZWUgZGlzbGlrZS4KCkpVTElFVAoKICAgIEhvdyBjYW1lc3QgdGhvdSBoaXRoZXIsIHRlbGwgbWUsIGFuZCB3aGVyZWZvcmUCiAgICBUaGUgb3JjaGFyZCB3YWxscyBhcmUgaGlnaCBhbmQgaGFyZCB0byBjbGltYiwKICAgIEFuZCB0aGUgcGxhY2UgZGVhdGgsIGNvbnNpZGVyaW5nIHdobyB0aG91IGFydCwKICAgIElmIGFueSBvZiBteSBraW5zbWVuIGZpbmQgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBXaXRoIGxvdmUncyBsaWdodCB3aW5ncyBkaWQgSSBvJ2VyLXBlcmNoIHRoZXNlIHdhbGxzOwogICAgRm9yIHN0b255IGxpbWl0cyBjYW5ub3QgaG9sZCBsb3ZlIG91dCwKICAgIEFuZCB3aGF0IGxvdmUgY2FuIGRvIHRoYXQgZGFyZXMgbG92ZSBhdHRlbXB0OwogICAgVGhlcmVmb3JlIHRoeSBraW5zbWVuIGFyZSBubyBsZXQgdG8gbWUuCgpKVUxJRVQKCiAgICBJZiB0aGV5IGRvIHNlZSB0aGVlLCB0aGV5IHdpbGwgbXVyZGVyIHRoZWUuCgpST01FTwoKICAgIEFsYWNrLCB0aGVyZSBsaWVzIG1vcmUgcGVyaWwgaW4gdGhpbmUgZXllCiAgICBUaGFuIHR3ZW50eSBvZiB0aGVpciBzd29yZHM6IGxvb2sgdGhvdSBidXQgc3dlZXQsCiAgICBBbmQgSSBhbSBwcm9vZiBhZ2FpbnN0IHRoZWlyIGVubWl0eS4KCkpVTElFVAoKICAgIEkgd291bGQgbm90IGZvciB0aGUgd29ybGQgdGhleSBzYXcgdGhlZSBoZXJlLgoKUk9NRU8KCiAgICBJIGhhdmUgbmlnaHQncyBjbG9hayB0byBoaWRlIG1lIGZyb20gdGhlaXIgc2lnaHQ7CiAgICBBbmQgYnV0IHRob3UgbG92ZSBtZSwgbGV0IHRoZW0gZmluZCBtZSBoZXJlOgogICAgTXkgbGlmZSB3ZXJlIGJldHRlciBlbmRlZCBieSB0aGVpciBoYXRlLAogICAgVGhhbiBkZWF0aCBwcm9yb2d1ZWQsIHdhbnRpbmcgb2YgdGh5IGxvdmUuCgpKVUxJRVQKCiAgICBCeSB3aG9zZSBkaXJlY3Rpb24gZm91bmQnc3QgdGhvdSBvdXQgdGhpcyBwbGFjZT8KClJPTUVPCgogICAgQnkgbG92ZSwgd2hvIGZpcnN0IGRpZCBwcm9tcHQgbWUgdG8gaW5xdWlyZTsKICAgIEhlIGxlbnQgbWUgY291bnNlbCBhbmQgSSBsZW50IGhpbSBleWVzLgogICAgSSBhbSBubyBwaWxvdDsgeWV0LCB3ZXJ0IHRob3UgYXMgZmFyCiAgICBBcyB0aGF0IHZhc3Qgc2hvcmUgd2FzaCdkIHdpdGggdGhlIGZhcnRoZXN0IHNlYSwKICAgIEkgd291bGQgYWR2ZW50dXJlIGZvciBzdWNoIG1lcmNoYW5kaXNlLgoKSlVMSUVUCgogICAgVGhvdSBrbm93J3N0IHRoZSBtYXNrIG9mIG5pZ2h0IGlzIG9uIG15IGZhY2UsCiAgICBFbHNlIHdvdWxkIGEgbWFpZGVuIGJsdXNoIGJlcGFpbnQgbXkgY2hlZWsKICAgIEZvciB0aGF0IHdoaWNoIHRob3UgaGFzdCBoZWFyZCBtZSBzcGVhayB0by1uaWdodAogICAgRmFpbiB3b3VsZCBJIGR3ZWxsIG9uIGZvcm0sIGZhaW4sIGZhaW4gZGVueQogICAgV2hhdCBJIGhhdmUgc3Bva2U6IGJ1dCBmYXJld2VsbCBjb21wbGltZW50IQogICAgRG9zdCB0aG91IGxvdmUgbWUIEkga25vdyB0aG91IHdpbHQgc2F5ICdBeSwnCiAgICBBbmQgSSB3aWxsIHRha2UgdGh5IHdvcmQ6IHlldCBpZiB0aG91IHN3ZWFyJ3N0LAogICAgVGhvdSBtYXlzdCBwcm92ZSBmYWxzZTsgYXQgbG92ZXJzJyBwZXJqdXJpZXMKICAgIFRoZW4gc2F5LCBKb3ZlIGxhdWdocy4gTyBnZW50bGUgUm9tZW8sCiAgICBJZiB0aG91IGRvc3QgbG92ZSwgcHJvbm91bmNlIGl0IGZhaXRoZnVsbHk6CiAgICBPciBpZiB0aG91IHRoaW5rJ3N0IEkgYW0gdG9vIHF1aWNrbHkgd29uLAogICAgSSdsbCBmcm93biBhbmQgYmUgcGVydmVyc2UgYW4gc2F5IHRoZWUgbmF5LAogICAgU28gdGhvdSB3aWx0IHdvbzsgYnV0IGVsc2UsIG5vdCBmb3IgdGhlIHdvcmxkLgogICAgSW4gdHJ1dGgsIGZhaXIgTW9udGFndWUsIEkgYW0gdG9vIGZvbmQsCiAgICBBbmQgdGhlcmVmb3JlIHRob3UgbWF5c3QgdGhpbmsgbXkgJ2hhdmlvciBsaWdodDoKICAgIEJ1dCB0cnVzdCBtZSwgZ2VudGxlbWFuLCBJJ2xsIHByb3ZlIG1vcmUgdHJ1ZQogICAgVGhhbiB0aG9zZSB0aGF0IGhhdmUgbW9yZSBjdW5uaW5nIHRvIGJlIHN0cmFuZ2UuCiAgICBJIHNob3VsZCBoYXZlIGJlZW4gbW9yZSBzdHJhbmdlLCBJIG11c3QgY29uZmVzcywKICAgIEJ1dCB0aGF0IHRob3Ugb3ZlcmhlYXJkJ3N0LCBlcmUgSSB3YXMgd2FyZSwKICAgIE15IHRydWUgbG92ZSdzIHBhc3Npb246IHRoZXJlZm9yZSBwYXJkb24gbWUsCiAgICBBbmQgbm90IGltcHV0ZSB0aGlzIHlpZWxkaW5nIHRvIGxpZ2h0IGxvdmUsCiAgICBXaGljaCB0aGUgZGFyayBuaWdodCBoYXRoIHNvIGRpc2NvdmVyZWQuCgpST01FTwoKICAgIExhZHksIGJ5IHlvbmRlciBibGVzc2VkIG1vb24gSSBzd2VhcgogICAgVGhhdCB0aXBzIHdpdGggc2lsdmVyIGFsbCB0aGVzZSBmcnVpdC10cmVlIHRvcHMtLQoKSlVMSUVUCgogICAgTywgc3dlYXIgbm90IGJ5IHRoZSBtb29uLCB0aGUgaW5jb25zdGFudCBtb29uLAogICAgVGhhdCBtb250aGx5IGNoYW5nZXMgaW4gaGVyIGNpcmNsZWQgb3JiLAogICAgTGVzdCB0aGF0IHRoeSBsb3ZlIHByb3ZlIGxpa2V3aXNlIHZhcmlhYmxlLgoKUk9NRU8KCiAgICBXaGF0IHNoYWxsIEkgc3dlYXIgYnkCgpKVUxJRVQKCiAgICBEbyBub3Qgc3dlYXIgYXQgYWxsOwogICAgT3IsIGlmIHRob3Ugd2lsdCwgc3dlYXIgYnkgdGh5IGdyYWNpb3VzIHNlbGYsCiAgICBXaGljaCBpcyB0aGUgZ29kIG9mIG15IGlkb2xhdHJ5LAogICAgQW5kIEknbGwgYmVsaWV2ZSB0aGVlLgoKUk9NRU8KCiAgICBJZiBteSBoZWFydCdzIGRlYXIgbG92ZS0tCgpKVUxJRVQKCiAgICBXZWxsLCBkbyBub3Qgc3dlYXI6IGFsdGhvdWdoIEkgam95IGluIHRoZWUsCiAgICBJIGhhdmUgbm8gam95IG9mIHRoaXMgY29udHJhY3QgdG8tbmlnaHQ6CiAgICBJdCBpcyB0b28gcmFzaCwgdG9vIHVuYWR2aXNlZCwgdG9vIHN1ZGRlbjsKICAgIFRvbyBsaWtlIHRoZSBsaWdodG5pbmcsIHdoaWNoIGRvdGggY2Vhc2UgdG8gYmUKICAgIEVyZSBvbmUgY2FuIHNheSAnSXQgbGlnaHRlbnMuJyBTd2VldCwgZ29vZCBuaWdodCEKICAgIFRoaXMgYnVkIG9mIGxvdmUsIGJ5IHN1bW1lcidzIHJpcGVuaW5nIGJyZWF0aCwKICAgIE1heSBwcm92ZSBhIGJlYXV0ZW91cyBmbG93ZXIgd2hlbiBuZXh0IHdlIG1lZXQuCiAgICBHb29kIG5pZ2h0LCBnb29kIG5pZ2h0ISBhcyBzd2VldCByZXBvc2UgYW5kIHJlc3QKICAgIENvbWUgdG8gdGh5IGhlYXJ0IGFzIHRoYXQgd2l0aGluIG15IGJyZWFzdCEKClJPTUVPCgogICAgTywgd2lsdCB0aG91IGxlYXZlIG1lIHNvIHVuc2F0aXNmaWVkPwoKSlVMSUVUCgogICAgV2hhdCBzYXRpc2ZhY3Rpb24gY2Fuc3QgdGhvdSBoYXZlIHRvLW5pZ2h0PwoKUk9NRU8KCiAgICBUaGUgZXhjaGFuZ2Ugb2YgdGh5IGxvdmUncyBmYWl0aGZ1bCB2b3cgZm9yIG1pbmUuCgpKVUxJRVQKCiAgICBJIGdhdmUgdGhlZSBtaW5lIGJlZm9yZSB0aG91IGRpZHN0IHJlcXVlc3QgaXQ6CiAgICBBbmQgeWV0IEkgd291bGQgaXQgd2VyZSB0byBnaXZlIGFnYWluLgoKUk9NRU8KCiAgICBXb3VsZHN0IHRob3Ugd2l0aGRyYXcgaXQIGZvciB3aGF0IHB1cnBvc2UsIGxvdmUCgpKVUxJRVQKCiAgICBCdXQgdG8gYmUgZnJhbmssIGFuZCBnaXZlIGl0IHRoZWUgYWdhaW4uCiAgICBBbmQgeWV0IEkgd2lzaCBidXQgZm9yIHRoZSB0aGluZyBJIGhhdmU6CiAgICBNeSBib3VudHkgaXMgYXMgYm91bmRsZXNzIGFzIHRoZSBzZWEsCiAgICBNeSBsb3ZlIGFzIGRlZXA7IHRoZSBtb3JlIEkgZ2l2ZSB0byB0aGVlLAogICAgVGhlIG1vcmUgSSBoYXZlLCBmb3IgYm90aCBhcmUgaW5maW5pdGUuCgogICAgTnVyc2UgY2FsbHMgd2l0aGluCiAgICBJIGhlYXIgc29tZSBub2lzZSB3aXRoaW47IGRlYXIgbG92ZSwgYWRpZXUhCiAgICBBbm9uLCBnb29kIG51cnNlISBTd2VldCBNb250YWd1ZSwgYmUgdHJ1ZS4KICAgIFN0YXkgYnV0IGEgbGl0dGxlLCBJIHdpbGwgY29tZSBhZ2Fpbi4KCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBPIGJsZXNzZWQsIGJsZXNzZWQgbmlnaHQhIEkgYW0gYWZlYXJkLgogICAgQmVpbmcgaW4gbmlnaHQsIGFsbCB0aGlzIGlzIGJ1dCBhIGRyZWFtLAogICAgVG9vIGZsYXR0ZXJpbmctc3dlZXQgdG8gYmUgc3Vic3RhbnRpYWwuCgogICAgUmUtZW50ZXIgSlVMSUVULCBhYm92ZQoKSlVMSUVUCgogICAgVGhyZWUgd29yZHMsIGRlYXIgUm9tZW8sIGFuZCBnb29kIG5pZ2h0IGluZGVlZC4KICAgIElmIHRoYXQgdGh5IGJlbnQgb2YgbG92ZSBiZSBob25vdXJhYmxlLAogICAgVGh5IHB1cnBvc2UgbWFycmlhZ2UsIHNlbmQgbWUgd29yZCB0by1tb3Jyb3csCiAgICBCeSBvbmUgdGhhdCBJJ2xsIHByb2N1cmUgdG8gY29tZSB0byB0aGVlLAogICAgV2hlcmUgYW5kIHdoYXQgdGltZSB0aG91IHdpbHQgcGVyZm9ybSB0aGUgcml0ZTsKICAgIEFuZCBhbGwgbXkgZm9ydHVuZXMgYXQgdGh5IGZvb3QgSSdsbCBsYXkKICAgIEFuZCBmb2xsb3cgdGhlZSBteSBsb3JkIHRocm91Z2hvdXQgdGhlIHdvcmxkLgoKTnVyc2UKCiAgICBbV2l0aGluXSBNYWRhbSEKCkpVTElFVAoKICAgIEkgY29tZSwgYW5vbi4tLUJ1dCBpZiB0aG91IG1lYW4nc3Qgbm90IHdlbGwsCiAgICBJIGRvIGJlc2VlY2ggdGhlZS0tCgpOdXJzZQoKICAgIFtXaXRoaW5dIE1hZGFtIQoKSlVMSUVUCgogICAgQnkgYW5kIGJ5LCBJIGNvbWU6LS0KICAgIFRvIGNlYXNlIHRoeSBzdWl0LCBhbmQgbGVhdmUgbWUgdG8gbXkgZ3JpZWY6CiAgICBUby1tb3Jyb3cgd2lsbCBJIHNlbmQuCgpST01FTwoKICAgIFNvIHRocml2ZSBteSBzb3VsLS0KCkpVTElFVAoKICAgIEEgdGhvdXNhbmQgdGltZXMgZ29vZCBuaWdodCEKCiAgICBFeGl0LCBhYm92ZQoKUk9NRU8KCiAgICBBIHRob3VzYW5kIHRpbWVzIHRoZSB3b3JzZSwgdG8gd2FudCB0aHkgbGlnaHQuCiAgICBMb3ZlIGdvZXMgdG93YXJkIGxvdmUsIGFzIHNjaG9vbGJveXMgZnJvbQogICAgdGhlaXIgYm9va3MsCiAgICBCdXQgbG92ZSBmcm9tIGxvdmUsIHRvd2FyZCBzY2hvb2wgd2l0aCBoZWF2eSBsb29rcy4KCiAgICBSZXRpcmluZwoKICAgIFJlLWVudGVyIEpVTElFVCwgYWJvdmUKCkpVTElFVAoKICAgIEhpc3QhIFJvbWVvLCBoaXN0ISBPLCBmb3IgYSBmYWxjb25lcidzIHZvaWNlLAogICAgVG8gbHVyZSB0aGlzIHRhc3NlbC1nZW50bGUgYmFjayBhZ2FpbiEKICAgIEJvbmRhZ2UgaXMgaG9hcnNlLCBhbmQgbWF5IG5vdCBzcGVhayBhbG91ZDsKICAgIEVsc2Ugd291bGQgSSB0ZWFyIHRoZSBjYXZlIHdoZXJlIEVjaG8gbGllcywKICAgIEFuZCBtYWtlIGhlciBhaXJ5IHRvbmd1ZSBtb3JlIGhvYXJzZSB0aGFuIG1pbmUsCiAgICBXaXRoIHJlcGV0aXRpb24gb2YgbXkgUm9tZW8ncyBuYW1lLgoKUk9NRU8KCiAgICBJdCBpcyBteSBzb3VsIHRoYXQgY2FsbHMgdXBvbiBteSBuYW1lOgogICAgSG93IHNpbHZlci1zd2VldCBzb3VuZCBsb3ZlcnMnIHRvbmd1ZXMgYnkgbmlnaHQsCiAgICBMaWtlIHNvZnRlc3QgbXVzaWMgdG8gYXR0ZW5kaW5nIGVhcnMhCgpKVUxJRVQKCiAgICBSb21lbyEKClJPTUVPCgogICAgTXkgZGVhcj8KCkpVTElFVAoKICAgIEF0IHdoYXQgbydjbG9jayB0by1tb3Jyb3cKICAgIFNoYWxsIEkgc2VuZCB0byB0aGVlPwoKUk9NRU8KCiAgICBBdCB0aGUgaG91ciBvZiBuaW5lLgoKSlVMSUVUCgogICAgSSB3aWxsIG5vdCBmYWlsOiAndGlzIHR3ZW50eSB5ZWFycyB0aWxsIHRoZW4uCiAgICBJIGhhdmUgZm9yZ290IHdoeSBJIGRpZCBjYWxsIHRoZWUgYmFjay4KClJPTUVPCgogICAgTGV0IG1lIHN0YW5kIGhlcmUgdGlsbCB0aG91IHJlbWVtYmVyIGl0LgoKSlVMSUVUCgogICAgSSBzaGFsbCBmb3JnZXQsIHRvIGhhdmUgdGhlZSBzdGlsbCBzdGFuZCB0aGVyZSwKICAgIFJlbWVtYmVyaW5nIGhvdyBJIGxvdmUgdGh5IGNvbXBhbnkuCgpST01FTwoKICAgIEFuZCBJJ2xsIHN0aWxsIHN0YXksIHRvIGhhdmUgdGhlZSBzdGlsbCBmb3JnZXQsCiAgICBGb3JnZXR0aW5nIGFueSBvdGhlciBob21lIGJ1dCB0aGlzLgoKSlVMSUVUCgogICAgJ1RpcyBhbG1vc3QgbW9ybmluZzsgSSB3b3VsZCBoYXZlIHRoZWUgZ29uZToKICAgIEFuZCB5ZXQgbm8gZnVydGhlciB0aGFuIGEgd2FudG9uJ3MgYmlyZDsKICAgIFdobyBsZXRzIGl0IGhvcCBhIGxpdHRsZSBmcm9tIGhlciBoYW5kLAogICAgTGlrZSBhIHBvb3IgcHJpc29uZXIgaW4gaGlzIHR3aXN0ZWQgZ3l2ZXMsCiAgICBBbmQgd2l0aCBhIHNpbGsgdGhyZWFkIHBsdWNrcyBpdCBiYWNrIGFnYWluLAogICAgU28gbG92aW5nLWplYWxvdXMgb2YgaGlzIGxpYmVydHkuCgpST01FTwoKICAgIEkgd291bGQgSSB3ZXJlIHRoeSBiaXJkLgoKSlVMSUVUCgogICAgU3dlZXQsIHNvIHdvdWxkIEk6CiAgICBZZXQgSSBzaG91bGQga2lsbCB0aGVlIHdpdGggbXVjaCBjaGVyaXNoaW5nLgogICAgR29vZCBuaWdodCwgZ29vZCBuaWdodCEgcGFydGluZyBpcyBzdWNoCiAgICBzd2VldCBzb3Jyb3csCiAgICBUaGF0IEkgc2hhbGwgc2F5IGdvb2QgbmlnaHQgdGlsbCBpdCBiZSBtb3Jyb3cuCgogICAgRXhpdCBhYm92ZQoKUk9NRU8KCiAgICBTbGVlcCBkd2VsbCB1cG9uIHRoaW5lIGV5ZXMsIHBlYWNlIGluIHRoeSBicmVhc3QhCiAgICBXb3VsZCBJIHdlcmUgc2xlZXAgYW5kIHBlYWNlLCBzbyBzd2VldCB0byByZXN0IQogICAgSGVuY2Ugd2lsbCBJIHRvIG15IGdob3N0bHkgZmF0aGVyJ3MgY2VsbCwKICAgIEhpcyBoZWxwIHRvIGNyYXZlLCBhbmQgbXkgZGVhciBoYXAgdG8gdGVsbC4KCiAgICBFeGl0CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSwgd2l0aCBhIGJhc2tldCAKCkZSSUFSIExBVVJFTkNFCgogICAgVGhlIGdyZXktZXllZCBtb3JuIHNtaWxlcyBvbiB0aGUgZnJvd25pbmcgbmlnaHQsCiAgICBDaGVxdWVyaW5nIHRoZSBlYXN0ZXJuIGNsb3VkcyB3aXRoIHN0cmVha3Mgb2YgbGlnaHQsCiAgICBBbmQgZmxlY2tlZCBkYXJrbmVzcyBsaWtlIGEgZHJ1bmthcmQgcmVlbHMKICAgIEZyb20gZm9ydGggZGF5J3MgcGF0aCBhbmQgVGl0YW4ncyBmaWVyeSB3aGVlbHM6CiAgICBOb3csIGVyZSB0aGUgc3VuIGFkdmFuY2UgaGlzIGJ1cm5pbmcgZXllLAogICAgVGhlIGRheSB0byBjaGVlciBhbmQgbmlnaHQncyBkYW5rIGRldyB0byBkcnksCiAgICBJIG11c3QgdXAtZmlsbCB0aGlzIG9zaWVyIGNhZ2Ugb2Ygb3VycwogICAgV2l0aCBiYWxlZnVsIHdlZWRzIGFuZCBwcmVjaW91cy1qdWljZWQgZmxvd2Vycy4KICAgIFRoZSBlYXJ0aCB0aGF0J3MgbmF0dXJlJ3MgbW90aGVyIGlzIGhlciB0b21iOwogICAgV2hhdCBpcyBoZXIgYnVyeWluZyBncmF2ZSB0aGF0IGlzIGhlciB3b21iLAogICAgQW5kIGZyb20gaGVyIHdvbWIgY2hpbGRyZW4gb2YgZGl2ZXJzIGtpbmQKICAgIFdlIHN1Y2tpbmcgb24gaGVyIG5hdHVyYWwgYm9zb20gZmluZCwKICAgIE1hbnkgZm9yIG1hbnkgdmlydHVlcyBleGNlbGxlbnQsCiAgICBOb25lIGJ1dCBmb3Igc29tZSBhbmQgeWV0IGFsbCBkaWZmZXJlbnQuCiAgICBPLCBtaWNrbGUgaXMgdGhlIHBvd2VyZnVsIGdyYWNlIHRoYXQgbGllcwogICAgSW4gaGVyYnMsIHBsYW50cywgc3RvbmVzLCBhbmQgdGhlaXIgdHJ1ZSBxdWFsaXRpZXM6CiAgICBGb3Igbm91Z2h0IHNvIHZpbGUgdGhhdCBvbiB0aGUgZWFydGggZG90aCBsaXZlCiAgICBCdXQgdG8gdGhlIGVhcnRoIHNvbWUgc3BlY2lhbCBnb29kIGRvdGggZ2l2ZSwKICAgIE5vciBhdWdodCBzbyBnb29kIGJ1dCBzdHJhaW4nZCBmcm9tIHRoYXQgZmFpciB1c2UKICAgIFJldm9sdHMgZnJvbSB0cnVlIGJpcnRoLCBzdHVtYmxpbmcgb24gYWJ1c2U6CiAgICBWaXJ0dWUgaXRzZWxmIHR1cm5zIHZpY2UsIGJlaW5nIG1pc2FwcGxpZWQ7CiAgICBBbmQgdmljZSBzb21ldGltZXMgYnkgYWN0aW9uIGRpZ25pZmllZC4KICAgIFdpdGhpbiB0aGUgaW5mYW50IHJpbmQgb2YgdGhpcyBzbWFsbCBmbG93ZXIKICAgIFBvaXNvbiBoYXRoIHJlc2lkZW5jZSBhbmQgbWVkaWNpbmUgcG93ZXI6CiAgICBGb3IgdGhpcywgYmVpbmcgc21lbHQsIHdpdGggdGhhdCBwYXJ0IGNoZWVycyBlYWNoIHBhcnQ7CiAgICBCZWluZyB0YXN0ZWQsIHNsYXlzIGFsbCBzZW5zZXMgd2l0aCB0aGUgaGVhcnQuCiAgICBUd28gc3VjaCBvcHBvc2VkIGtpbmdzIGVuY2FtcCB0aGVtIHN0aWxsCiAgICBJbiBtYW4gYXMgd2VsbCBhcyBoZXJicywgZ3JhY2UgYW5kIHJ1ZGUgd2lsbDsKICAgIEFuZCB3aGVyZSB0aGUgd29yc2VyIGlzIHByZWRvbWluYW50LAogICAgRnVsbCBzb29uIHRoZSBjYW5rZXIgZGVhdGggZWF0cyB1cCB0aGF0IHBsYW50LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEdvb2QgbW9ycm93LCBmYXRoZXIuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlbmVkaWNpdGUhCiAgICBXaGF0IGVhcmx5IHRvbmd1ZSBzbyBzd2VldCBzYWx1dGV0aCBtZT8KICAgIFlvdW5nIHNvbiwgaXQgYXJndWVzIGEgZGlzdGVtcGVyJ2QgaGVhZAogICAgU28gc29vbiB0byBiaWQgZ29vZCBtb3Jyb3cgdG8gdGh5IGJlZDoKICAgIENhcmUga2VlcHMgaGlzIHdhdGNoIGluIGV2ZXJ5IG9sZCBtYW4ncyBleWUsCiAgICBBbmQgd2hlcmUgY2FyZSBsb2RnZXMsIHNsZWVwIHdpbGwgbmV2ZXIgbGllOwogICAgQnV0IHdoZXJlIHVuYnJ1aXNlZCB5b3V0aCB3aXRoIHVuc3R1ZmYnZCBicmFpbgogICAgRG90aCBjb3VjaCBoaXMgbGltYnMsIHRoZXJlIGdvbGRlbiBzbGVlcCBkb3RoIHJlaWduOgogICAgVGhlcmVmb3JlIHRoeSBlYXJsaW5lc3MgZG90aCBtZSBhc3N1cmUKICAgIFRob3UgYXJ0IHVwLXJvdXNlZCBieSBzb21lIGRpc3RlbXBlcmF0dXJlOwogICAgT3IgaWYgbm90IHNvLCB0aGVuIGhlcmUgSSBoaXQgaXQgcmlnaHQsCiAgICBPdXIgUm9tZW8gaGF0aCBub3QgYmVlbiBpbiBiZWQgdG8tbmlnaHQuCgpST01FTwoKICAgIFRoYXQgbGFzdCBpcyB0cnVlOyB0aGUgc3dlZXRlciByZXN0IHdhcyBtaW5lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHb2QgcGFyZG9uIHNpbiEgd2FzdCB0aG91IHdpdGggUm9zYWxpbmUCgpST01FTwoKICAgIFdpdGggUm9zYWxpbmUsIG15IGdob3N0bHkgZmF0aGVyPyBubzsKICAgIEkgaGF2ZSBmb3Jnb3QgdGhhdCBuYW1lLCBhbmQgdGhhdCBuYW1lJ3Mgd29lLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGF0J3MgbXkgZ29vZCBzb246IGJ1dCB3aGVyZSBoYXN0IHRob3UgYmVlbiwgdGhlbj8KClJPTUVPCgogICAgSSdsbCB0ZWxsIHRoZWUsIGVyZSB0aG91IGFzayBpdCBtZSBhZ2Fpbi4KICAgIEkgaGF2ZSBiZWVuIGZlYXN0aW5nIHdpdGggbWluZSBlbmVteSwKICAgIFdoZXJlIG9uIGEgc3VkZGVuIG9uZSBoYXRoIHdvdW5kZWQgbWUsCiAgICBUaGF0J3MgYnkgbWUgd291bmRlZDogYm90aCBvdXIgcmVtZWRpZXMKICAgIFdpdGhpbiB0aHkgaGVscCBhbmQgaG9seSBwaHlzaWMgbGllczoKICAgIEkgYmVhciBubyBoYXRyZWQsIGJsZXNzZWQgbWFuLCBmb3IsIGxvLAogICAgTXkgaW50ZXJjZXNzaW9uIGxpa2V3aXNlIHN0ZWFkcyBteSBmb2UuCgpGUklBUiBMQVVSRU5DRQoKICAgIEJlIHBsYWluLCBnb29kIHNvbiwgYW5kIGhvbWVseSBpbiB0aHkgZHJpZnQ7CiAgICBSaWRkbGluZyBjb25mZXNzaW9uIGZpbmRzIGJ1dCByaWRkbGluZyBzaHJpZnQuCgpST01FTwoKICAgIFRoZW4gcGxhaW5seSBrbm93IG15IGhlYXJ0J3MgZGVhciBsb3ZlIGlzIHNldAogICAgT24gdGhlIGZhaXIgZGF1Z2h0ZXIgb2YgcmljaCBDYXB1bGV0OgogICAgQXMgbWluZSBvbiBoZXJzLCBzbyBoZXJzIGlzIHNldCBvbiBtaW5lOwogICAgQW5kIGFsbCBjb21iaW5lZCwgc2F2ZSB3aGF0IHRob3UgbXVzdCBjb21iaW5lCiAgICBCeSBob2x5IG1hcnJpYWdlOiB3aGVuIGFuZCB3aGVyZSBhbmQgaG93CiAgICBXZSBtZXQsIHdlIHdvbydkIGFuZCBtYWRlIGV4Y2hhbmdlIG9mIHZvdywKICAgIEknbGwgdGVsbCB0aGVlIGFzIHdlIHBhc3M7IGJ1dCB0aGlzIEkgcHJheSwKICAgIFRoYXQgdGhvdSBjb25zZW50IHRvIG1hcnJ5IHVzIHRvLWRheS4KCkZSSUFSIExBVVJFTkNFCgogICAgSG9seSBTYWludCBGcmFuY2lzLCB3aGF0IGEgY2hhbmdlIGlzIGhlcmUhCiAgICBJcyBSb3NhbGluZSwgd2hvbSB0aG91IGRpZHN0IGxvdmUgc28gZGVhciwKICAgIFNvIHNvb24gZm9yc2FrZW4IHlvdW5nIG1lbidzIGxvdmUgdGhlbiBsaWVzCiAgICBOb3QgdHJ1bHkgaW4gdGhlaXIgaGVhcnRzLCBidXQgaW4gdGhlaXIgZXllcy4KICAgIEplc3UgTWFyaWEsIHdoYXQgYSBkZWFsIG9mIGJyaW5lCiAgICBIYXRoIHdhc2gnZCB0aHkgc2FsbG93IGNoZWVrcyBmb3IgUm9zYWxpbmUhCiAgICBIb3cgbXVjaCBzYWx0IHdhdGVyIHRocm93biBhd2F5IGluIHdhc3RlLAogICAgVG8gc2Vhc29uIGxvdmUsIHRoYXQgb2YgaXQgZG90aCBub3QgdGFzdGUhCiAgICBUaGUgc3VuIG5vdCB5ZXQgdGh5IHNpZ2hzIGZyb20gaGVhdmVuIGNsZWFycywKICAgIFRoeSBvbGQgZ3JvYW5zIHJpbmcgeWV0IGluIG15IGFuY2llbnQgZWFyczsKICAgIExvLCBoZXJlIHVwb24gdGh5IGNoZWVrIHRoZSBzdGFpbiBkb3RoIHNpdAogICAgT2YgYW4gb2xkIHRlYXIgdGhhdCBpcyBub3Qgd2FzaCdkIG9mZiB5ZXQ6CiAgICBJZiBlJ2VyIHRob3Ugd2FzdCB0aHlzZWxmIGFuZCB0aGVzZSB3b2VzIHRoaW5lLAogICAgVGhvdSBhbmQgdGhlc2Ugd29lcyB3ZXJlIGFsbCBmb3IgUm9zYWxpbmU6CiAgICBBbmQgYXJ0IHRob3UgY2hhbmdlZD8gcHJvbm91bmNlIHRoaXMgc2VudGVuY2UgdGhlbiwKICAgIFdvbWVuIG1heSBmYWxsLCB3aGVuIHRoZXJlJ3Mgbm8gc3RyZW5ndGggaW4gbWVuLgoKUk9NRU8KCiAgICBUaG91IGNoaWQnc3QgbWUgb2Z0IGZvciBsb3ZpbmcgUm9zYWxpbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIEZvciBkb3RpbmcsIG5vdCBmb3IgbG92aW5nLCBwdXBpbCBtaW5lLgoKUk9NRU8KCiAgICBBbmQgYmFkJ3N0IG1lIGJ1cnkgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTm90IGluIGEgZ3JhdmUsCiAgICBUbyBsYXkgb25lIGluLCBhbm90aGVyIG91dCB0byBoYXZlLgoKUk9NRU8KCiAgICBJIHByYXkgdGhlZSwgY2hpZGUgbm90OyBzaGUgd2hvbSBJIGxvdmUgbm93CiAgICBEb3RoIGdyYWNlIGZvciBncmFjZSBhbmQgbG92ZSBmb3IgbG92ZSBhbGxvdzsKICAgIFRoZSBvdGhlciBkaWQgbm90IHNvLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBPLCBzaGUga25ldyB3ZWxsCiAgICBUaHkgbG92ZSBkaWQgcmVhZCBieSByb3RlIGFuZCBjb3VsZCBub3Qgc3BlbGwuCiAgICBCdXQgY29tZSwgeW91bmcgd2F2ZXJlciwgY29tZSwgZ28gd2l0aCBtZSwKICAgIEluIG9uZSByZXNwZWN0IEknbGwgdGh5IGFzc2lzdGFudCBiZTsKICAgIEZvciB0aGlzIGFsbGlhbmNlIG1heSBzbyBoYXBweSBwcm92ZSwKICAgIFRvIHR1cm4geW91ciBob3VzZWhvbGRzJyByYW5jb3VyIHRvIHB1cmUgbG92ZS4KClJPTUVPCgogICAgTywgbGV0IHVzIGhlbmNlOyBJIHN0YW5kIG9uIHN1ZGRlbiBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2lzZWx5IGFuZCBzbG93OyB0aGV5IHN0dW1ibGUgdGhhdCBydW4gZmFzdC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHN0cmVldC4KCiAgICBFbnRlciBCRU5WT0xJTyBhbmQgTUVSQ1VUSU8gCgpNRVJDVVRJTwoKICAgIFdoZXJlIHRoZSBkZXZpbCBzaG91bGQgdGhpcyBSb21lbyBiZT8KICAgIENhbWUgaGUgbm90IGhvbWUgdG8tbmlnaHQCgpCRU5WT0xJTwoKICAgIE5vdCB0byBoaXMgZmF0aGVyJ3M7IEkgc3Bva2Ugd2l0aCBoaXMgbWFuLgoKTUVSQ1VUSU8KCiAgICBBaCwgdGhhdCBzYW1lIHBhbGUgaGFyZC1oZWFydGVkIHdlbmNoLCB0aGF0IFJvc2FsaW5lLgogICAgVG9ybWVudHMgaGltIHNvLCB0aGF0IGhlIHdpbGwgc3VyZSBydW4gbWFkLgoKQkVOVk9MSU8KCiAgICBUeWJhbHQsIHRoZSBraW5zbWFuIG9mIG9sZCBDYXB1bGV0LAogICAgSGF0aCBzZW50IGEgbGV0dGVyIHRvIGhpcyBmYXRoZXIncyBob3VzZS4KCk1FUkNVVElPCgogICAgQSBjaGFsbGVuZ2UsIG9uIG15IGxpZmUuCgpCRU5WT0xJTwoKICAgIFJvbWVvIHdpbGwgYW5zd2VyIGl0LgoKTUVSQ1VUSU8KCiAgICBBbnkgbWFuIHRoYXQgY2FuIHdyaXRlIG1heSBhbnN3ZXIgYSBsZXR0ZXIuCgpCRU5WT0xJTwoKICAgIE5heSwgaGUgd2lsbCBhbnN3ZXIgdGhlIGxldHRlcidzIG1hc3RlciwgaG93IGhlCiAgICBkYXJlcywgYmVpbmcgZGFyZWQuCgpNRVJDVVRJTwoKICAgIEFsYXMgcG9vciBSb21lbyEgaGUgaXMgYWxyZWFkeSBkZWFkOyBzdGFiYmVkIHdpdGggYQogICAgd2hpdGUgd2VuY2gncyBibGFjayBleWU7IHNob3QgdGhyb3VnaCB0aGUgZWFyIHdpdGggYQogICAgbG92ZS1zb25nOyB0aGUgdmVyeSBwaW4gb2YgaGlzIGhlYXJ0IGNsZWZ0IHdpdGggdGhlCiAgICBibGluZCBib3ctYm95J3MgYnV0dC1zaGFmdDogYW5kIGlzIGhlIGEgbWFuIHRvCiAgICBlbmNvdW50ZXIgVHliYWx0PwoKQkVOVk9MSU8KCiAgICBXaHksIHdoYXQgaXMgVHliYWx0PwoKTUVSQ1VUSU8KCiAgICBNb3JlIHRoYW4gcHJpbmNlIG9mIGNhdHMsIEkgY2FuIHRlbGwgeW91LiBPLCBoZSBpcwogICAgdGhlIGNvdXJhZ2VvdXMgY2FwdGFpbiBvZiBjb21wbGltZW50cy4gSGUgZmlnaHRzIGFzCiAgICB5b3Ugc2luZyBwcmljay1zb25nLCBrZWVwcyB0aW1lLCBkaXN0YW5jZSwgYW5kCiAgICBwcm9wb3J0aW9uOyByZXN0cyBtZSBoaXMgbWluaW0gcmVzdCwgb25lLCB0d28sIGFuZAogICAgdGhlIHRoaXJkIGluIHlvdXIgYm9zb206IHRoZSB2ZXJ5IGJ1dGNoZXIgb2YgYSBzaWxrCiAgICBidXR0b24sIGEgZHVlbGxpc3QsIGEgZHVlbGxpc3Q7IGEgZ2VudGxlbWFuIG9mIHRoZQogICAgdmVyeSBmaXJzdCBob3VzZSwgb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2F1c2U6CiAgICBhaCwgdGhlIGltbW9ydGFsIHBhc3NhZG8hIHRoZSBwdW50byByZXZlcnNvISB0aGUKICAgIGhhaSEKCkJFTlZPTElPCgogICAgVGhlIHdoYXQCgpNRVJDVVRJTwoKICAgIFRoZSBwb3ggb2Ygc3VjaCBhbnRpYywgbGlzcGluZywgYWZmZWN0aW5nCiAgICBmYW50YXN0aWNvZXM7IHRoZXNlIG5ldyB0dW5lcnMgb2YgYWNjZW50cyEgJ0J5IEplc3UsCiAgICBhIHZlcnkgZ29vZCBibGFkZSEgYSB2ZXJ5IHRhbGwgbWFuISBhIHZlcnkgZ29vZAogICAgd2hvcmUhJyBXaHksIGlzIG5vdCB0aGlzIGEgbGFtZW50YWJsZSB0aGluZywKICAgIGdyYW5kc2lyZSwgdGhhdCB3ZSBzaG91bGQgYmUgdGh1cyBhZmZsaWN0ZWQgd2l0aAogICAgdGhlc2Ugc3RyYW5nZSBmbGllcywgdGhlc2UgZmFzaGlvbi1tb25nZXJzLCB0aGVzZQogICAgcGVyZG9uYS1taSdzLCB3aG8gc3RhbmQgc28gbXVjaCBvbiB0aGUgbmV3IGZvcm0sCiAgICB0aGF0IHRoZXkgY2Fubm90IGF0IGVhc2Ugb24gdGhlIG9sZCBiZW5jaD8gTywgdGhlaXIKICAgIGJvbmVzLCB0aGVpciBib25lcyEKCiAgICBFbnRlciBST01FTwoKQkVOVk9MSU8KCiAgICBIZXJlIGNvbWVzIFJvbWVvLCBoZXJlIGNvbWVzIFJvbWVvLgoKTUVSQ1VUSU8KCiAgICBXaXRob3V0IGhpcyByb2UsIGxpa2UgYSBkcmllZCBoZXJyaW5nOiBmbGVzaCwgZmxlc2gsCiAgICBob3cgYXJ0IHRob3UgZmlzaGlmaWVkISBOb3cgaXMgaGUgZm9yIHRoZSBudW1iZXJzCiAgICB0aGF0IFBldHJhcmNoIGZsb3dlZCBpbjogTGF1cmEgdG8gaGlzIGxhZHkgd2FzIGJ1dCBhCiAgICBraXRjaGVuLXdlbmNoOyBtYXJyeSwgc2hlIGhhZCBhIGJldHRlciBsb3ZlIHRvCiAgICBiZS1yaHltZSBoZXI7IERpZG8gYSBkb3dkeTsgQ2xlb3BhdHJhIGEgZ2lwc3k7CiAgICBIZWxlbiBhbmQgSGVybyBoaWxkaW5ncyBhbmQgaGFybG90czsgVGhpc2JlIGEgZ3JleQogICAgZXllIG9yIHNvLCBidXQgbm90IHRvIHRoZSBwdXJwb3NlLiBTaWduaW9yCiAgICBSb21lbywgYm9uIGpvdXIhIHRoZXJlJ3MgYSBGcmVuY2ggc2FsdXRhdGlvbgogICAgdG8geW91ciBGcmVuY2ggc2xvcC4gWW91IGdhdmUgdXMgdGhlIGNvdW50ZXJmZWl0CiAgICBmYWlybHkgbGFzdCBuaWdodC4KClJPTUVPCgogICAgR29vZCBtb3Jyb3cgdG8geW91IGJvdGguIFdoYXQgY291bnRlcmZlaXQgZGlkIEkgZ2l2ZSB5b3UCgpNRVJDVVRJTwoKICAgIFRoZSBzaGlwLCBzaXIsIHRoZSBzbGlwOyBjYW4geW91IG5vdCBjb25jZWl2ZT8KClJPTUVPCgogICAgUGFyZG9uLCBnb29kIE1lcmN1dGlvLCBteSBidXNpbmVzcyB3YXMgZ3JlYXQ7IGFuZCBpbgogICAgc3VjaCBhIGNhc2UgYXMgbWluZSBhIG1hbiBtYXkgc3RyYWluIGNvdXJ0ZXN5LgoKTUVSQ1VUSU8KCiAgICBUaGF0J3MgYXMgbXVjaCBhcyB0byBzYXksIHN1Y2ggYSBjYXNlIGFzIHlvdXJzCiAgICBjb25zdHJhaW5zIGEgbWFuIHRvIGJvdyBpbiB0aGUgaGFtcy4KClJPTUVPCgogICAgTWVhbmluZywgdG8gY291cnQnc3kuCgpNRVJDVVRJTwoKICAgIFRob3UgaGFzdCBtb3N0IGtpbmRseSBoaXQgaXQuCgpST01FTwoKICAgIEEgbW9zdCBjb3VydGVvdXMgZXhwb3NpdGlvbi4KCk1FUkNVVElPCgogICAgTmF5LCBJIGFtIHRoZSB2ZXJ5IHBpbmsgb2YgY291cnRlc3kuCgpST01FTwoKICAgIFBpbmsgZm9yIGZsb3dlci4KCk1FUkNVVElPCgogICAgUmlnaHQuCgpST01FTwoKICAgIFdoeSwgdGhlbiBpcyBteSBwdW1wIHdlbGwgZmxvd2VyZWQuCgpNRVJDVVRJTwoKICAgIFdlbGwgc2FpZDogZm9sbG93IG1lIHRoaXMgamVzdCBub3cgdGlsbCB0aG91IGhhc3QKICAgIHdvcm4gb3V0IHRoeSBwdW1wLCB0aGF0IHdoZW4gdGhlIHNpbmdsZSBzb2xlIG9mIGl0CiAgICBpcyB3b3JuLCB0aGUgamVzdCBtYXkgcmVtYWluIGFmdGVyIHRoZSB3ZWFyaW5nIHNvbGUgc2luZ3VsYXIuCgpST01FTwoKICAgIE8gc2luZ2xlLXNvbGVkIGplc3QsIHNvbGVseSBzaW5ndWxhciBmb3IgdGhlCiAgICBzaW5nbGVuZXNzLgoKTUVSQ1VUSU8KCiAgICBDb21lIGJldHdlZW4gdXMsIGdvb2QgQmVudm9saW87IG15IHdpdHMgZmFpbnQuCgpST01FTwoKICAgIFN3aXRjaCBhbmQgc3B1cnMsIHN3aXRjaCBhbmQgc3B1cnM7IG9yIEknbGwgY3J5IGEgbWF0Y2guCgpNRVJDVVRJTwoKICAgIE5heSwgaWYgdGh5IHdpdHMgcnVuIHRoZSB3aWxkLWdvb3NlIGNoYXNlLCBJIGhhdmUKICAgIGRvbmUsIGZvciB0aG91IGhhc3QgbW9yZSBvZiB0aGUgd2lsZC1nb29zZSBpbiBvbmUgb2YKICAgIHRoeSB3aXRzIHRoYW4sIEkgYW0gc3VyZSwgSSBoYXZlIGluIG15IHdob2xlIGZpdmU6CiAgICB3YXMgSSB3aXRoIHlvdSB0aGVyZSBmb3IgdGhlIGdvb3NlPwoKUk9NRU8KCiAgICBUaG91IHdhc3QgbmV2ZXIgd2l0aCBtZSBmb3IgYW55IHRoaW5nIHdoZW4gdGhvdSB3YXN0CiAgICBub3QgdGhlcmUgZm9yIHRoZSBnb29zZS4KCk1FUkNVVElPCgogICAgSSB3aWxsIGJpdGUgdGhlZSBieSB0aGUgZWFyIGZvciB0aGF0IGplc3QuCgpST01FTwoKICAgIE5heSwgZ29vZCBnb29zZSwgYml0ZSBub3QuCgpNRVJDVVRJTwoKICAgIFRoeSB3aXQgaXMgYSB2ZXJ5IGJpdHRlciBzd2VldGluZzsgaXQgaXMgYSBtb3N0CiAgICBzaGFycCBzYXVjZS4KClJPTUVPCgogICAgQW5kIGlzIGl0IG5vdCB3ZWxsIHNlcnZlZCBpbiB0byBhIHN3ZWV0IGdvb3NlPwoKTUVSQ1VUSU8KCiAgICBPIGhlcmUncyBhIHdpdCBvZiBjaGV2ZXJpbCwgdGhhdCBzdHJldGNoZXMgZnJvbSBhbgogICAgaW5jaCBuYXJyb3cgdG8gYW4gZWxsIGJyb2FkIQoKUk9NRU8KCiAgICBJIHN0cmV0Y2ggaXQgb3V0IGZvciB0aGF0IHdvcmQgJ2Jyb2FkOycgd2hpY2ggYWRkZWQKICAgIHRvIHRoZSBnb29zZSwgcHJvdmVzIHRoZWUgZmFyIGFuZCB3aWRlIGEgYnJvYWQgZ29vc2UuCgpNRVJDVVRJTwoKICAgIFdoeSwgaXMgbm90IHRoaXMgYmV0dGVyIG5vdyB0aGFuIGdyb2FuaW5nIGZvciBsb3ZlPwogICAgbm93IGFydCB0aG91IHNvY2lhYmxlLCBub3cgYXJ0IHRob3UgUm9tZW87IG5vdyBhcnQKICAgIHRob3Ugd2hhdCB0aG91IGFydCwgYnkgYXJ0IGFzIHdlbGwgYXMgYnkgbmF0dXJlOgogICAgZm9yIHRoaXMgZHJpdmVsbGluZyBsb3ZlIGlzIGxpa2UgYSBncmVhdCBuYXR1cmFsLAogICAgdGhhdCBydW5zIGxvbGxpbmcgdXAgYW5kIGRvd24gdG8gaGlkZSBoaXMgYmF1YmxlIGluIGEgaG9sZS4KCkJFTlZPTElPCgogICAgU3RvcCB0aGVyZSwgc3RvcCB0aGVyZS4KCk1FUkNVVElPCgogICAgVGhvdSBkZXNpcmVzdCBtZSB0byBzdG9wIGluIG15IHRhbGUgYWdhaW5zdCB0aGUgaGFpci4KCkJFTlZPTElPCgogICAgVGhvdSB3b3VsZHN0IGVsc2UgaGF2ZSBtYWRlIHRoeSB0YWxlIGxhcmdlLgoKTUVSQ1VUSU8KCiAgICBPLCB0aG91IGFydCBkZWNlaXZlZDsgSSB3b3VsZCBoYXZlIG1hZGUgaXQgc2hvcnQ6CiAgICBmb3IgSSB3YXMgY29tZSB0byB0aGUgd2hvbGUgZGVwdGggb2YgbXkgdGFsZTsgYW5kCiAgICBtZWFudCwgaW5kZWVkLCB0byBvY2N1cHkgdGhlIGFyZ3VtZW50IG5vIGxvbmdlci4KClJPTUVPCgogICAgSGVyZSdzIGdvb2RseSBnZWFyIQoKICAgIEVudGVyIE51cnNlIGFuZCBQRVRFUgoKTUVSQ1VUSU8KCiAgICBBIHNhaWwsIGEgc2FpbCEKCkJFTlZPTElPCgogICAgVHdvLCB0d287IGEgc2hpcnQgYW5kIGEgc21vY2suCgpOdXJzZQoKICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBNeSBmYW4sIFBldGVyLgoKTUVSQ1VUSU8KCiAgICBHb29kIFBldGVyLCB0byBoaWRlIGhlciBmYWNlOyBmb3IgaGVyIGZhbidzIHRoZQogICAgZmFpcmVyIGZhY2UuCgpOdXJzZQoKICAgIEdvZCB5ZSBnb29kIG1vcnJvdywgZ2VudGxlbWVuLgoKTUVSQ1VUSU8KCiAgICBHb2QgeWUgZ29vZCBkZW4sIGZhaXIgZ2VudGxld29tYW4uCgpOdXJzZQoKICAgIElzIGl0IGdvb2QgZGVuPwoKTUVSQ1VUSU8KCiAgICAnVGlzIG5vIGxlc3MsIEkgdGVsbCB5b3UsIGZvciB0aGUgYmF3ZHkgaGFuZCBvZiB0aGUKICAgIGRpYWwgaXMgbm93IHVwb24gdGhlIHByaWNrIG9mIG5vb24uCgpOdXJzZQoKICAgIE91dCB1cG9uIHlvdSEgd2hhdCBhIG1hbiBhcmUgeW91IQoKUk9NRU8KCiAgICBPbmUsIGdlbnRsZXdvbWFuLCB0aGF0IEdvZCBoYXRoIG1hZGUgZm9yIGhpbXNlbGYgdG8KICAgIG1hci4KCk51cnNlCgogICAgQnkgbXkgdHJvdGgsIGl0IGlzIHdlbGwgc2FpZDsgJ2ZvciBoaW1zZWxmIHRvIG1hciwnCiAgICBxdW90aCBhJz8gR2VudGxlbWVuLCBjYW4gYW55IG9mIHlvdSB0ZWxsIG1lIHdoZXJlIEkKICAgIG1heSBmaW5kIHRoZSB5b3VuZyBSb21lbz8KClJPTUVPCgogICAgSSBjYW4gdGVsbCB5b3U7IGJ1dCB5b3VuZyBSb21lbyB3aWxsIGJlIG9sZGVyIHdoZW4KICAgIHlvdSBoYXZlIGZvdW5kIGhpbSB0aGFuIGhlIHdhcyB3aGVuIHlvdSBzb3VnaHQgaGltOgogICAgSSBhbSB0aGUgeW91bmdlc3Qgb2YgdGhhdCBuYW1lLCBmb3IgZmF1bHQgb2YgYSB3b3JzZS4KCk51cnNlCgogICAgWW91IHNheSB3ZWxsLgoKTUVSQ1VUSU8KCiAgICBZZWEsIGlzIHRoZSB3b3JzdCB3ZWxsPyB2ZXJ5IHdlbGwgdG9vaywgaScgZmFpdGg7CiAgICB3aXNlbHksIHdpc2VseS4KCk51cnNlCgogICAgaWYgeW91IGJlIGhlLCBzaXIsIEkgZGVzaXJlIHNvbWUgY29uZmlkZW5jZSB3aXRoCiAgICB5b3UuCgpCRU5WT0xJTwoKICAgIFNoZSB3aWxsIGluZGl0ZSBoaW0gdG8gc29tZSBzdXBwZXIuCgpNRVJDVVRJTwoKICAgIEEgYmF3ZCwgYSBiYXdkLCBhIGJhd2QhIHNvIGhvIQoKUk9NRU8KCiAgICBXaGF0IGhhc3QgdGhvdSBmb3VuZD8KCk1FUkNVVElPCgogICAgTm8gaGFyZSwgc2lyOyB1bmxlc3MgYSBoYXJlLCBzaXIsIGluIGEgbGVudGVuIHBpZSwKICAgIHRoYXQgaXMgc29tZXRoaW5nIHN0YWxlIGFuZCBob2FyIGVyZSBpdCBiZSBzcGVudC4KCiAgICBTaW5ncwogICAgQW4gb2xkIGhhcmUgaG9hciwKICAgIEFuZCBhbiBvbGQgaGFyZSBob2FyLAogICAgSXMgdmVyeSBnb29kIG1lYXQgaW4gbGVudAogICAgQnV0IGEgaGFyZSB0aGF0IGlzIGhvYXIKICAgIElzIHRvbyBtdWNoIGZvciBhIHNjb3JlLAogICAgV2hlbiBpdCBob2FycyBlcmUgaXQgYmUgc3BlbnQuCiAgICBSb21lbywgd2lsbCB5b3UgY29tZSB0byB5b3VyIGZhdGhlcidzPyB3ZSdsbAogICAgdG8gZGlubmVyLCB0aGl0aGVyLgoKUk9NRU8KCiAgICBJIHdpbGwgZm9sbG93IHlvdS4KCk1FUkNVVElPCgogICAgRmFyZXdlbGwsIGFuY2llbnQgbGFkeTsgZmFyZXdlbGwsCgogICAgU2luZ2luZwogICAgJ2xhZHksIGxhZHksIGxhZHkuJwoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KCk51cnNlCgogICAgTWFycnksIGZhcmV3ZWxsISBJIHByYXkgeW91LCBzaXIsIHdoYXQgc2F1Y3kKICAgIG1lcmNoYW50IHdhcyB0aGlzLCB0aGF0IHdhcyBzbyBmdWxsIG9mIGhpcyByb3BlcnkCgpST01FTwoKICAgIEEgZ2VudGxlbWFuLCBudXJzZSwgdGhhdCBsb3ZlcyB0byBoZWFyIGhpbXNlbGYgdGFsaywKICAgIGFuZCB3aWxsIHNwZWFrIG1vcmUgaW4gYSBtaW51dGUgdGhhbiBoZSB3aWxsIHN0YW5kCiAgICB0byBpbiBhIG1vbnRoLgoKTnVyc2UKCiAgICBBbiBhJyBzcGVhayBhbnkgdGhpbmcgYWdhaW5zdCBtZSwgSSdsbCB0YWtlIGhpbQogICAgZG93biwgYW4gYScgd2VyZSBsdXN0aWVyIHRoYW4gaGUgaXMsIGFuZCB0d2VudHkgc3VjaAogICAgSmFja3M7IGFuZCBpZiBJIGNhbm5vdCwgSSdsbCBmaW5kIHRob3NlIHRoYXQgc2hhbGwuCiAgICBTY3Vydnkga25hdmUhIEkgYW0gbm9uZSBvZiBoaXMgZmxpcnQtZ2lsbHM7IEkgYW0KICAgIG5vbmUgb2YgaGlzIHNrYWlucy1tYXRlcy4gQW5kIHRob3UgbXVzdCBzdGFuZCBieQogICAgdG9vLCBhbmQgc3VmZmVyIGV2ZXJ5IGtuYXZlIHRvIHVzZSBtZSBhdCBoaXMgcGxlYXN1cmUCgpQRVRFUgoKICAgIEkgc2F3IG5vIG1hbiB1c2UgeW91IGEgcGxlYXN1cmU7IGlmIEkgaGFkLCBteSB3ZWFwb24KICAgIHNob3VsZCBxdWlja2x5IGhhdmUgYmVlbiBvdXQsIEkgd2FycmFudCB5b3U6IEkgZGFyZQogICAgZHJhdyBhcyBzb29uIGFzIGFub3RoZXIgbWFuLCBpZiBJIHNlZSBvY2Nhc2lvbiBpbiBhCiAgICBnb29kIHF1YXJyZWwsIGFuZCB0aGUgbGF3IG9uIG15IHNpZGUuCgpOdXJzZQoKICAgIE5vdywgYWZvcmUgR29kLCBJIGFtIHNvIHZleGVkLCB0aGF0IGV2ZXJ5IHBhcnQgYWJvdXQKICAgIG1lIHF1aXZlcnMuIFNjdXJ2eSBrbmF2ZSEgUHJheSB5b3UsIHNpciwgYSB3b3JkOgogICAgYW5kIGFzIEkgdG9sZCB5b3UsIG15IHlvdW5nIGxhZHkgYmFkZSBtZSBpbnF1aXJlIHlvdQogICAgb3V0OyB3aGF0IHNoZSBiYWRlIG1lIHNheSwgSSB3aWxsIGtlZXAgdG8gbXlzZWxmOgogICAgYnV0IGZpcnN0IGxldCBtZSB0ZWxsIHllLCBpZiB5ZSBzaG91bGQgbGVhZCBoZXIgaW50bwogICAgYSBmb29sJ3MgcGFyYWRpc2UsIGFzIHRoZXkgc2F5LCBpdCB3ZXJlIGEgdmVyeSBncm9zcwogICAga2luZCBvZiBiZWhhdmlvciwgYXMgdGhleSBzYXk6IGZvciB0aGUgZ2VudGxld29tYW4KICAgIGlzIHlvdW5nOyBhbmQsIHRoZXJlZm9yZSwgaWYgeW91IHNob3VsZCBkZWFsIGRvdWJsZQogICAgd2l0aCBoZXIsIHRydWx5IGl0IHdlcmUgYW4gaWxsIHRoaW5nIHRvIGJlIG9mZmVyZWQKICAgIHRvIGFueSBnZW50bGV3b21hbiwgYW5kIHZlcnkgd2VhayBkZWFsaW5nLgoKUk9NRU8KCiAgICBOdXJzZSwgY29tbWVuZCBtZSB0byB0aHkgbGFkeSBhbmQgbWlzdHJlc3MuIEkKICAgIHByb3Rlc3QgdW50byB0aGVlLS0KCk51cnNlCgogICAgR29vZCBoZWFydCwgYW5kLCBpJyBmYWl0aCwgSSB3aWxsIHRlbGwgaGVyIGFzIG11Y2g6CiAgICBMb3JkLCBMb3JkLCBzaGUgd2lsbCBiZSBhIGpveWZ1bCB3b21hbi4KClJPTUVPCgogICAgV2hhdCB3aWx0IHRob3UgdGVsbCBoZXIsIG51cnNlPyB0aG91IGRvc3Qgbm90IG1hcmsgbWUuCgpOdXJzZQoKICAgIEkgd2lsbCB0ZWxsIGhlciwgc2lyLCB0aGF0IHlvdSBkbyBwcm90ZXN0OyB3aGljaCwgYXMKICAgIEkgdGFrZSBpdCwgaXMgYSBnZW50bGVtYW5saWtlIG9mZmVyLgoKUk9NRU8KCiAgICBCaWQgaGVyIGRldmlzZQogICAgU29tZSBtZWFucyB0byBjb21lIHRvIHNocmlmdCB0aGlzIGFmdGVybm9vbjsKICAgIEFuZCB0aGVyZSBzaGUgc2hhbGwgYXQgRnJpYXIgTGF1cmVuY2UnIGNlbGwKICAgIEJlIHNocml2ZWQgYW5kIG1hcnJpZWQuIEhlcmUgaXMgZm9yIHRoeSBwYWlucy4KCk51cnNlCgogICAgTm8gdHJ1bHkgc2lyOyBub3QgYSBwZW5ueS4KClJPTUVPCgogICAgR28gdG87IEkgc2F5IHlvdSBzaGFsbC4KCk51cnNlCgogICAgVGhpcyBhZnRlcm5vb24sIHNpcj8gd2VsbCwgc2hlIHNoYWxsIGJlIHRoZXJlLgoKUk9NRU8KCiAgICBBbmQgc3RheSwgZ29vZCBudXJzZSwgYmVoaW5kIHRoZSBhYmJleSB3YWxsOgogICAgV2l0aGluIHRoaXMgaG91ciBteSBtYW4gc2hhbGwgYmUgd2l0aCB0aGVlCiAgICBBbmQgYnJpbmcgdGhlZSBjb3JkcyBtYWRlIGxpa2UgYSB0YWNrbGVkIHN0YWlyOwogICAgV2hpY2ggdG8gdGhlIGhpZ2ggdG9wLWdhbGxhbnQgb2YgbXkgam95CiAgICBNdXN0IGJlIG15IGNvbnZveSBpbiB0aGUgc2VjcmV0IG5pZ2h0LgogICAgRmFyZXdlbGw7IGJlIHRydXN0eSwgYW5kIEknbGwgcXVpdCB0aHkgcGFpbnM6CiAgICBGYXJld2VsbDsgY29tbWVuZCBtZSB0byB0aHkgbWlzdHJlc3MuCgpOdXJzZQoKICAgIE5vdyBHb2QgaW4gaGVhdmVuIGJsZXNzIHRoZWUhIEhhcmsgeW91LCBzaXIuCgpST01FTwoKICAgIFdoYXQgc2F5J3N0IHRob3UsIG15IGRlYXIgbnVyc2UCgpOdXJzZQoKICAgIElzIHlvdXIgbWFuIHNlY3JldD8gRGlkIHlvdSBuZSdlciBoZWFyIHNheSwKICAgIFR3byBtYXkga2VlcCBjb3Vuc2VsLCBwdXR0aW5nIG9uZSBhd2F5PwoKUk9NRU8KCiAgICBJIHdhcnJhbnQgdGhlZSwgbXkgbWFuJ3MgYXMgdHJ1ZSBhcyBzdGVlbC4KCk5VUlNFCgogICAgV2VsbCwgc2lyOyBteSBtaXN0cmVzcyBpcyB0aGUgc3dlZXRlc3QgbGFkeS0tTG9yZCwKICAgIExvcmQhIHdoZW4gJ3R3YXMgYSBsaXR0bGUgcHJhdGluZyB0aGluZzotLU8sIHRoZXJlCiAgICBpcyBhIG5vYmxlbWFuIGluIHRvd24sIG9uZSBQYXJpcywgdGhhdCB3b3VsZCBmYWluCiAgICBsYXkga25pZmUgYWJvYXJkOyBidXQgc2hlLCBnb29kIHNvdWwsIGhhZCBhcyBsaWVmCiAgICBzZWUgYSB0b2FkLCBhIHZlcnkgdG9hZCwgYXMgc2VlIGhpbS4gSSBhbmdlciBoZXIKICAgIHNvbWV0aW1lcyBhbmQgdGVsbCBoZXIgdGhhdCBQYXJpcyBpcyB0aGUgcHJvcGVyZXIKICAgIG1hbjsgYnV0LCBJJ2xsIHdhcnJhbnQgeW91LCB3aGVuIEkgc2F5IHNvLCBzaGUgbG9va3MKICAgIGFzIHBhbGUgYXMgYW55IGNsb3V0IGluIHRoZSB2ZXJzYWwgd29ybGQuIERvdGggbm90CiAgICByb3NlbWFyeSBhbmQgUm9tZW8gYmVnaW4gYm90aCB3aXRoIGEgbGV0dGVyPwoKUk9NRU8KCiAgICBBeSwgbnVyc2U7IHdoYXQgb2YgdGhhdD8gYm90aCB3aXRoIGFuIFIuCgpOdXJzZQoKICAgIEFoLiBtb2NrZXIhIHRoYXQncyB0aGUgZG9nJ3MgbmFtZTsgUiBpcyBmb3IKICAgIHRoZS0tTm87IEkga25vdyBpdCBiZWdpbnMgd2l0aCBzb21lIG90aGVyCiAgICBsZXR0ZXI6LS1hbmQgc2hlIGhhdGggdGhlIHByZXR0aWVzdCBzZW50ZW50aW91cyBvZgogICAgaXQsIG9mIHlvdSBhbmQgcm9zZW1hcnksIHRoYXQgaXQgd291bGQgZG8geW91IGdvb2QKICAgIHRvIGhlYXIgaXQuCgpST01FTwoKICAgIENvbW1lbmQgbWUgdG8gdGh5IGxhZHkuCgpOdXJzZQoKICAgIEF5LCBhIHRob3VzYW5kIHRpbWVzLgoKICAgIEV4aXQgUm9tZW8KICAgIFBldGVyIQoKUEVURVIKCiAgICBBbm9uIQoKTnVyc2UKCiAgICBQZXRlciwgdGFrZSBteSBmYW4sIGFuZCBnbyBiZWZvcmUgYW5kIGFwYWNlLgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgSlVMSUVUIAoKSlVMSUVUCgogICAgVGhlIGNsb2NrIHN0cnVjayBuaW5lIHdoZW4gSSBkaWQgc2VuZCB0aGUgbnVyc2U7CiAgICBJbiBoYWxmIGFuIGhvdXIgc2hlIHByb21pc2VkIHRvIHJldHVybi4KICAgIFBlcmNoYW5jZSBzaGUgY2Fubm90IG1lZXQgaGltOiB0aGF0J3Mgbm90IHNvLgogICAgTywgc2hlIGlzIGxhbWUhIGxvdmUncyBoZXJhbGRzIHNob3VsZCBiZSB0aG91Z2h0cywKICAgIFdoaWNoIHRlbiB0aW1lcyBmYXN0ZXIgZ2xpZGUgdGhhbiB0aGUgc3VuJ3MgYmVhbXMsCiAgICBEcml2aW5nIGJhY2sgc2hhZG93cyBvdmVyIGxvdXJpbmcgaGlsbHM6CiAgICBUaGVyZWZvcmUgZG8gbmltYmxlLXBpbmlvbidkIGRvdmVzIGRyYXcgbG92ZSwKICAgIEFuZCB0aGVyZWZvcmUgaGF0aCB0aGUgd2luZC1zd2lmdCBDdXBpZCB3aW5ncy4KICAgIE5vdyBpcyB0aGUgc3VuIHVwb24gdGhlIGhpZ2htb3N0IGhpbGwKICAgIE9mIHRoaXMgZGF5J3Mgam91cm5leSwgYW5kIGZyb20gbmluZSB0aWxsIHR3ZWx2ZQogICAgSXMgdGhyZWUgbG9uZyBob3VycywgeWV0IHNoZSBpcyBub3QgY29tZS4KICAgIEhhZCBzaGUgYWZmZWN0aW9ucyBhbmQgd2FybSB5b3V0aGZ1bCBibG9vZCwKICAgIFNoZSB3b3VsZCBiZSBhcyBzd2lmdCBpbiBtb3Rpb24gYXMgYSBiYWxsOwogICAgTXkgd29yZHMgd291bGQgYmFuZHkgaGVyIHRvIG15IHN3ZWV0IGxvdmUsCiAgICBBbmQgaGlzIHRvIG1lOgogICAgQnV0IG9sZCBmb2xrcywgbWFueSBmZWlnbiBhcyB0aGV5IHdlcmUgZGVhZDsKICAgIFVud2llbGR5LCBzbG93LCBoZWF2eSBhbmQgcGFsZSBhcyBsZWFkLgogICAgTyBHb2QsIHNoZSBjb21lcyEKCiAgICBFbnRlciBOdXJzZSBhbmQgUEVURVIKICAgIE8gaG9uZXkgbnVyc2UsIHdoYXQgbmV3cz8KICAgIEhhc3QgdGhvdSBtZXQgd2l0aCBoaW0IFNlbmQgdGh5IG1hbiBhd2F5LgoKTnVyc2UKCiAgICBQZXRlciwgc3RheSBhdCB0aGUgZ2F0ZS4KCiAgICBFeGl0IFBFVEVSCgpKVUxJRVQKCiAgICBOb3csIGdvb2Qgc3dlZXQgbnVyc2UsLS1PIExvcmQsIHdoeSBsb29rJ3N0IHRob3Ugc2FkPwogICAgVGhvdWdoIG5ld3MgYmUgc2FkLCB5ZXQgdGVsbCB0aGVtIG1lcnJpbHk7CiAgICBJZiBnb29kLCB0aG91IHNoYW1lc3QgdGhlIG11c2ljIG9mIHN3ZWV0IG5ld3MKICAgIEJ5IHBsYXlpbmcgaXQgdG8gbWUgd2l0aCBzbyBzb3VyIGEgZmFjZS4KCk51cnNlCgogICAgSSBhbSBhLXdlYXJ5LCBnaXZlIG1lIGxlYXZlIGF3aGlsZToKICAgIEZpZSwgaG93IG15IGJvbmVzIGFjaGUhIHdoYXQgYSBqYXVudCBoYXZlIEkgaGFkIQoKSlVMSUVUCgogICAgSSB3b3VsZCB0aG91IGhhZHN0IG15IGJvbmVzLCBhbmQgSSB0aHkgbmV3czoKICAgIE5heSwgY29tZSwgSSBwcmF5IHRoZWUsIHNwZWFrOyBnb29kLCBnb29kIG51cnNlLCBzcGVhay4KCk51cnNlCgogICAgSmVzdSwgd2hhdCBoYXN0ZT8gY2FuIHlvdSBub3Qgc3RheSBhd2hpbGUCiAgICBEbyB5b3Ugbm90IHNlZSB0aGF0IEkgYW0gb3V0IG9mIGJyZWF0aD8KCkpVTElFVAoKICAgIEhvdyBhcnQgdGhvdSBvdXQgb2YgYnJlYXRoLCB3aGVuIHRob3UgaGFzdCBicmVhdGgKICAgIFRvIHNheSB0byBtZSB0aGF0IHRob3UgYXJ0IG91dCBvZiBicmVhdGgCiAgICBUaGUgZXhjdXNlIHRoYXQgdGhvdSBkb3N0IG1ha2UgaW4gdGhpcyBkZWxheQogICAgSXMgbG9uZ2VyIHRoYW4gdGhlIHRhbGUgdGhvdSBkb3N0IGV4Y3VzZS4KICAgIElzIHRoeSBuZXdzIGdvb2QsIG9yIGJhZD8gYW5zd2VyIHRvIHRoYXQ7CiAgICBTYXkgZWl0aGVyLCBhbmQgSSdsbCBzdGF5IHRoZSBjaXJjdW1zdGFuY2U6CiAgICBMZXQgbWUgYmUgc2F0aXNmaWVkLCBpcyd0IGdvb2Qgb3IgYmFkPwoKTnVyc2UKCiAgICBXZWxsLCB5b3UgaGF2ZSBtYWRlIGEgc2ltcGxlIGNob2ljZTsgeW91IGtub3cgbm90CiAgICBob3cgdG8gY2hvb3NlIGEgbWFuOiBSb21lbyEgbm8sIG5vdCBoZTsgdGhvdWdoIGhpcwogICAgZmFjZSBiZSBiZXR0ZXIgdGhhbiBhbnkgbWFuJ3MsIHlldCBoaXMgbGVnIGV4Y2VscwogICAgYWxsIG1lbidzOyBhbmQgZm9yIGEgaGFuZCwgYW5kIGEgZm9vdCwgYW5kIGEgYm9keSwKICAgIHRob3VnaCB0aGV5IGJlIG5vdCB0byBiZSB0YWxrZWQgb24sIHlldCB0aGV5IGFyZQogICAgcGFzdCBjb21wYXJlOiBoZSBpcyBub3QgdGhlIGZsb3dlciBvZiBjb3VydGVzeSwKICAgIGJ1dCwgSSdsbCB3YXJyYW50IGhpbSwgYXMgZ2VudGxlIGFzIGEgbGFtYi4gR28gdGh5CiAgICB3YXlzLCB3ZW5jaDsgc2VydmUgR29kLiBXaGF0LCBoYXZlIHlvdSBkaW5lZCBhdCBob21lPwoKSlVMSUVUCgogICAgTm8sIG5vOiBidXQgYWxsIHRoaXMgZGlkIEkga25vdyBiZWZvcmUuCiAgICBXaGF0IHNheXMgaGUgb2Ygb3VyIG1hcnJpYWdlPyB3aGF0IG9mIHRoYXQCgpOdXJzZQoKICAgIExvcmQsIGhvdyBteSBoZWFkIGFjaGVzISB3aGF0IGEgaGVhZCBoYXZlIEkhCiAgICBJdCBiZWF0cyBhcyBpdCB3b3VsZCBmYWxsIGluIHR3ZW50eSBwaWVjZXMuCiAgICBNeSBiYWNrIG8nIHQnIG90aGVyIHNpZGUsLS1PLCBteSBiYWNrLCBteSBiYWNrIQogICAgQmVzaHJldyB5b3VyIGhlYXJ0IGZvciBzZW5kaW5nIG1lIGFib3V0LAogICAgVG8gY2F0Y2ggbXkgZGVhdGggd2l0aCBqYXVudGluZyB1cCBhbmQgZG93biEKCkpVTElFVAoKICAgIEknIGZhaXRoLCBJIGFtIHNvcnJ5IHRoYXQgdGhvdSBhcnQgbm90IHdlbGwuCiAgICBTd2VldCwgc3dlZXQsIHN3ZWV0IG51cnNlLCB0ZWxsIG1lLCB3aGF0IHNheXMgbXkgbG92ZT8KCk51cnNlCgogICAgWW91ciBsb3ZlIHNheXMsIGxpa2UgYW4gaG9uZXN0IGdlbnRsZW1hbiwgYW5kIGEKICAgIGNvdXJ0ZW91cywgYW5kIGEga2luZCwgYW5kIGEgaGFuZHNvbWUsIGFuZCwgSQogICAgd2FycmFudCwgYSB2aXJ0dW91cywtLVdoZXJlIGlzIHlvdXIgbW90aGVyPwoKSlVMSUVUCgogICAgV2hlcmUgaXMgbXkgbW90aGVyISB3aHksIHNoZSBpcyB3aXRoaW47CiAgICBXaGVyZSBzaG91bGQgc2hlIGJlPyBIb3cgb2RkbHkgdGhvdSByZXBsaWVzdCEKICAgICdZb3VyIGxvdmUgc2F5cywgbGlrZSBhbiBob25lc3QgZ2VudGxlbWFuLAogICAgV2hlcmUgaXMgeW91ciBtb3RoZXIJwoKTnVyc2UKCiAgICBPIEdvZCdzIGxhZHkgZGVhciEKICAgIEFyZSB5b3Ugc28gaG90PyBtYXJyeSwgY29tZSB1cCwgSSB0cm93OwogICAgSXMgdGhpcyB0aGUgcG91bHRpY2UgZm9yIG15IGFjaGluZyBib25lcz8KICAgIEhlbmNlZm9yd2FyZCBkbyB5b3VyIG1lc3NhZ2VzIHlvdXJzZWxmLgoKSlVMSUVUCgogICAgSGVyZSdzIHN1Y2ggYSBjb2lsISBjb21lLCB3aGF0IHNheXMgUm9tZW8CgpOdXJzZQoKICAgIEhhdmUgeW91IGdvdCBsZWF2ZSB0byBnbyB0byBzaHJpZnQgdG8tZGF5PwoKSlVMSUVUCgogICAgSSBoYXZlLgoKTnVyc2UKCiAgICBUaGVuIGhpZSB5b3UgaGVuY2UgdG8gRnJpYXIgTGF1cmVuY2UnIGNlbGw7CiAgICBUaGVyZSBzdGF5cyBhIGh1c2JhbmQgdG8gbWFrZSB5b3UgYSB3aWZlOgogICAgTm93IGNvbWVzIHRoZSB3YW50b24gYmxvb2QgdXAgaW4geW91ciBjaGVla3MsCiAgICBUaGV5J2xsIGJlIGluIHNjYXJsZXQgc3RyYWlnaHQgYXQgYW55IG5ld3MuCiAgICBIaWUgeW91IHRvIGNodXJjaDsgSSBtdXN0IGFub3RoZXIgd2F5LAogICAgVG8gZmV0Y2ggYSBsYWRkZXIsIGJ5IHRoZSB3aGljaCB5b3VyIGxvdmUKICAgIE11c3QgY2xpbWIgYSBiaXJkJ3MgbmVzdCBzb29uIHdoZW4gaXQgaXMgZGFyazoKICAgIEkgYW0gdGhlIGRydWRnZSBhbmQgdG9pbCBpbiB5b3VyIGRlbGlnaHQsCiAgICBCdXQgeW91IHNoYWxsIGJlYXIgdGhlIGJ1cmRlbiBzb29uIGF0IG5pZ2h0LgogICAgR287IEknbGwgdG8gZGlubmVyOiBoaWUgeW91IHRvIHRoZSBjZWxsLgoKSlVMSUVUCgogICAgSGllIHRvIGhpZ2ggZm9ydHVuZSEgSG9uZXN0IG51cnNlLCBmYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIFZJLiBGcmlhciBMYXVyZW5jZSdzIGNlbGwuCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UgYW5kIFJPTUVPIAoKRlJJQVIgTEFVUkVOQ0UKCiAgICBTbyBzbWlsZSB0aGUgaGVhdmVucyB1cG9uIHRoaXMgaG9seSBhY3QsCiAgICBUaGF0IGFmdGVyIGhvdXJzIHdpdGggc29ycm93IGNoaWRlIHVzIG5vdCEKClJPTUVPCgogICAgQW1lbiwgYW1lbiEgYnV0IGNvbWUgd2hhdCBzb3Jyb3cgY2FuLAogICAgSXQgY2Fubm90IGNvdW50ZXJ2YWlsIHRoZSBleGNoYW5nZSBvZiBqb3kKICAgIFRoYXQgb25lIHNob3J0IG1pbnV0ZSBnaXZlcyBtZSBpbiBoZXIgc2lnaHQ6CiAgICBEbyB0aG91IGJ1dCBjbG9zZSBvdXIgaGFuZHMgd2l0aCBob2x5IHdvcmRzLAogICAgVGhlbiBsb3ZlLWRldm91cmluZyBkZWF0aCBkbyB3aGF0IGhlIGRhcmU7CiAgICBJdCBpcyBlbm91Z2ggSSBtYXkgYnV0IGNhbGwgaGVyIG1pbmUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFRoZXNlIHZpb2xlbnQgZGVsaWdodHMgaGF2ZSB2aW9sZW50IGVuZHMKICAgIEFuZCBpbiB0aGVpciB0cml1bXBoIGRpZSwgbGlrZSBmaXJlIGFuZCBwb3dkZXIsCiAgICBXaGljaCBhcyB0aGV5IGtpc3MgY29uc3VtZTogdGhlIHN3ZWV0ZXN0IGhvbmV5CiAgICBJcyBsb2F0aHNvbWUgaW4gaGlzIG93biBkZWxpY2lvdXNuZXNzCiAgICBBbmQgaW4gdGhlIHRhc3RlIGNvbmZvdW5kcyB0aGUgYXBwZXRpdGU6CiAgICBUaGVyZWZvcmUgbG92ZSBtb2RlcmF0ZWx5OyBsb25nIGxvdmUgZG90aCBzbzsKICAgIFRvbyBzd2lmdCBhcnJpdmVzIGFzIHRhcmR5IGFzIHRvbyBzbG93LgoKICAgIEVudGVyIEpVTElFVAogICAgSGVyZSBjb21lcyB0aGUgbGFkeTogTywgc28gbGlnaHQgYSBmb290CiAgICBXaWxsIG5lJ2VyIHdlYXIgb3V0IHRoZSBldmVybGFzdGluZyBmbGludDoKICAgIEEgbG92ZXIgbWF5IGJlc3RyaWRlIHRoZSBnb3NzYW1lcgogICAgVGhhdCBpZGxlcyBpbiB0aGUgd2FudG9uIHN1bW1lciBhaXIsCiAgICBBbmQgeWV0IG5vdCBmYWxsOyBzbyBsaWdodCBpcyB2YW5pdHkuCgpKVUxJRVQKCiAgICBHb29kIGV2ZW4gdG8gbXkgZ2hvc3RseSBjb25mZXNzb3IuCgpGUklBUiBMQVVSRU5DRQoKICAgIFJvbWVvIHNoYWxsIHRoYW5rIHRoZWUsIGRhdWdodGVyLCBmb3IgdXMgYm90aC4KCkpVTElFVAoKICAgIEFzIG11Y2ggdG8gaGltLCBlbHNlIGlzIGhpcyB0aGFua3MgdG9vIG11Y2guCgpST01FTwoKICAgIEFoLCBKdWxpZXQsIGlmIHRoZSBtZWFzdXJlIG9mIHRoeSBqb3kKICAgIEJlIGhlYXAnZCBsaWtlIG1pbmUgYW5kIHRoYXQgdGh5IHNraWxsIGJlIG1vcmUKICAgIFRvIGJsYXpvbiBpdCwgdGhlbiBzd2VldGVuIHdpdGggdGh5IGJyZWF0aAogICAgVGhpcyBuZWlnaGJvdXIgYWlyLCBhbmQgbGV0IHJpY2ggbXVzaWMncyB0b25ndWUKICAgIFVuZm9sZCB0aGUgaW1hZ2luZWQgaGFwcGluZXNzIHRoYXQgYm90aAogICAgUmVjZWl2ZSBpbiBlaXRoZXIgYnkgdGhpcyBkZWFyIGVuY291bnRlci4KCkpVTElFVAoKICAgIENvbmNlaXQsIG1vcmUgcmljaCBpbiBtYXR0ZXIgdGhhbiBpbiB3b3JkcywKICAgIEJyYWdzIG9mIGhpcyBzdWJzdGFuY2UsIG5vdCBvZiBvcm5hbWVudDoKICAgIFRoZXkgYXJlIGJ1dCBiZWdnYXJzIHRoYXQgY2FuIGNvdW50IHRoZWlyIHdvcnRoOwogICAgQnV0IG15IHRydWUgbG92ZSBpcyBncm93biB0byBzdWNoIGV4Y2VzcwogICAgSSBjYW5ub3Qgc3VtIHVwIHN1bSBvZiBoYWxmIG15IHdlYWx0aC4KCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgY29tZSB3aXRoIG1lLCBhbmQgd2Ugd2lsbCBtYWtlIHNob3J0IHdvcms7CiAgICBGb3IsIGJ5IHlvdXIgbGVhdmVzLCB5b3Ugc2hhbGwgbm90IHN0YXkgYWxvbmUKICAgIFRpbGwgaG9seSBjaHVyY2ggaW5jb3Jwb3JhdGUgdHdvIGluIG9uZS4KCiAgICBFeGV1bnQKCkFDVCBJSUkKU0NFTkUgSS4gQSBwdWJsaWMgcGxhY2UuCgogICAgRW50ZXIgTUVSQ1VUSU8sIEJFTlZPTElPLCBQYWdlLCBhbmQgU2VydmFudHMgCgpCRU5WT0xJTwoKICAgIEkgcHJheSB0aGVlLCBnb29kIE1lcmN1dGlvLCBsZXQncyByZXRpcmU6CiAgICBUaGUgZGF5IGlzIGhvdCwgdGhlIENhcHVsZXRzIGFicm9hZCwKICAgIEFuZCwgaWYgd2UgbWVldCwgd2Ugc2hhbGwgbm90IHNjYXBlIGEgYnJhd2w7CiAgICBGb3Igbm93LCB0aGVzZSBob3QgZGF5cywgaXMgdGhlIG1hZCBibG9vZCBzdGlycmluZy4KCk1FUkNVVElPCgogICAgVGhvdSBhcnQgbGlrZSBvbmUgb2YgdGhvc2UgZmVsbG93cyB0aGF0IHdoZW4gaGUKICAgIGVudGVycyB0aGUgY29uZmluZXMgb2YgYSB0YXZlcm4gY2xhcHMgbWUgaGlzIHN3b3JkCiAgICB1cG9uIHRoZSB0YWJsZSBhbmQgc2F5cyAnR29kIHNlbmQgbWUgbm8gbmVlZCBvZgogICAgdGhlZSEnIGFuZCBieSB0aGUgb3BlcmF0aW9uIG9mIHRoZSBzZWNvbmQgY3VwIGRyYXdzCiAgICBpdCBvbiB0aGUgZHJhd2VyLCB3aGVuIGluZGVlZCB0aGVyZSBpcyBubyBuZWVkLgoKQkVOVk9MSU8KCiAgICBBbSBJIGxpa2Ugc3VjaCBhIGZlbGxvdz8KCk1FUkNVVElPCgogICAgQ29tZSwgY29tZSwgdGhvdSBhcnQgYXMgaG90IGEgSmFjayBpbiB0aHkgbW9vZCBhcwogICAgYW55IGluIEl0YWx5LCBhbmQgYXMgc29vbiBtb3ZlZCB0byBiZSBtb29keSwgYW5kIGFzCiAgICBzb29uIG1vb2R5IHRvIGJlIG1vdmVkLgoKQkVOVk9MSU8KCiAgICBBbmQgd2hhdCB0bz8KCk1FUkNVVElPCgogICAgTmF5LCBhbiB0aGVyZSB3ZXJlIHR3byBzdWNoLCB3ZSBzaG91bGQgaGF2ZSBub25lCiAgICBzaG9ydGx5LCBmb3Igb25lIHdvdWxkIGtpbGwgdGhlIG90aGVyLiBUaG91ISB3aHksCiAgICB0aG91IHdpbHQgcXVhcnJlbCB3aXRoIGEgbWFuIHRoYXQgaGF0aCBhIGhhaXIgbW9yZSwKICAgIG9yIGEgaGFpciBsZXNzLCBpbiBoaXMgYmVhcmQsIHRoYW4gdGhvdSBoYXN0OiB0aG91CiAgICB3aWx0IHF1YXJyZWwgd2l0aCBhIG1hbiBmb3IgY3JhY2tpbmcgbnV0cywgaGF2aW5nIG5vCiAgICBvdGhlciByZWFzb24gYnV0IGJlY2F1c2UgdGhvdSBoYXN0IGhhemVsIGV5ZXM6IHdoYXQKICAgIGV5ZSBidXQgc3VjaCBhbiBleWUgd291bGQgc3B5IG91dCBzdWNoIGEgcXVhcnJlbD8KICAgIFRoeSBoZWFkIGlzIGFzIGZ1biBvZiBxdWFycmVscyBhcyBhbiBlZ2cgaXMgZnVsbCBvZgogICAgbWVhdCwgYW5kIHlldCB0aHkgaGVhZCBoYXRoIGJlZW4gYmVhdGVuIGFzIGFkZGxlIGFzCiAgICBhbiBlZ2cgZm9yIHF1YXJyZWxsaW5nOiB0aG91IGhhc3QgcXVhcnJlbGxlZCB3aXRoIGEKICAgIG1hbiBmb3IgY291Z2hpbmcgaW4gdGhlIHN0cmVldCwgYmVjYXVzZSBoZSBoYXRoCiAgICB3YWtlbmVkIHRoeSBkb2cgdGhhdCBoYXRoIGxhaW4gYXNsZWVwIGluIHRoZSBzdW46CiAgICBkaWRzdCB0aG91IG5vdCBmYWxsIG91dCB3aXRoIGEgdGFpbG9yIGZvciB3ZWFyaW5nCiAgICBoaXMgbmV3IGRvdWJsZXQgYmVmb3JlIEVhc3Rlcj8gd2l0aCBhbm90aGVyLCBmb3IKICAgIHR5aW5nIGhpcyBuZXcgc2hvZXMgd2l0aCBvbGQgcmliYW5kPyBhbmQgeWV0IHRob3UKICAgIHdpbHQgdHV0b3IgbWUgZnJvbSBxdWFycmVsbGluZyEKCkJFTlZPTElPCgogICAgQW4gSSB3ZXJlIHNvIGFwdCB0byBxdWFycmVsIGFzIHRob3UgYXJ0LCBhbnkgbWFuCiAgICBzaG91bGQgYnV5IHRoZSBmZWUtc2ltcGxlIG9mIG15IGxpZmUgZm9yIGFuIGhvdXIgYW5kIGEgcXVhcnRlci4KCk1FUkNVVElPCgogICAgVGhlIGZlZS1zaW1wbGUhIE8gc2ltcGxlIQoKQkVOVk9MSU8KCiAgICBCeSBteSBoZWFkLCBoZXJlIGNvbWUgdGhlIENhcHVsZXRzLgoKTUVSQ1VUSU8KCiAgICBCeSBteSBoZWVsLCBJIGNhcmUgbm90LgoKICAgIEVudGVyIFRZQkFMVCBhbmQgb3RoZXJzCgpUWUJBTFQKCiAgICBGb2xsb3cgbWUgY2xvc2UsIGZvciBJIHdpbGwgc3BlYWsgdG8gdGhlbS4KICAgIEdlbnRsZW1lbiwgZ29vZCBkZW46IGEgd29yZCB3aXRoIG9uZSBvZiB5b3UuCgpNRVJDVVRJTwoKICAgIEFuZCBidXQgb25lIHdvcmQgd2l0aCBvbmUgb2YgdXMIGNvdXBsZSBpdCB3aXRoCiAgICBzb21ldGhpbmc7IG1ha2UgaXQgYSB3b3JkIGFuZCBhIGJsb3cuCgpUWUJBTFQKCiAgICBZb3Ugc2hhbGwgZmluZCBtZSBhcHQgZW5vdWdoIHRvIHRoYXQsIHNpciwgYW4geW91CiAgICB3aWxsIGdpdmUgbWUgb2NjYXNpb24uCgpNRVJDVVRJTwoKICAgIENvdWxkIHlvdSBub3QgdGFrZSBzb21lIG9jY2FzaW9uIHdpdGhvdXQgZ2l2aW5nPwoKVFlCQUxUCgogICAgTWVyY3V0aW8sIHRob3UgY29uc29ydCdzdCB3aXRoIFJvbWVvLC0tCgpNRVJDVVRJTwoKICAgIENvbnNvcnQhIHdoYXQsIGRvc3QgdGhvdSBtYWtlIHVzIG1pbnN0cmVscz8gYW4KICAgIHRob3UgbWFrZSBtaW5zdHJlbHMgb2YgdXMsIGxvb2sgdG8gaGVhciBub3RoaW5nIGJ1dAogICAgZGlzY29yZHM6IGhlcmUncyBteSBmaWRkbGVzdGljazsgaGVyZSdzIHRoYXQgc2hhbGwKICAgIG1ha2UgeW91IGRhbmNlLiAnWm91bmRzLCBjb25zb3J0IQoKQkVOVk9MSU8KCiAgICBXZSB0YWxrIGhlcmUgaW4gdGhlIHB1YmxpYyBoYXVudCBvZiBtZW46CiAgICBFaXRoZXIgd2l0aGRyYXcgdW50byBzb21lIHByaXZhdGUgcGxhY2UsCiAgICBBbmQgcmVhc29uIGNvbGRseSBvZiB5b3VyIGdyaWV2YW5jZXMsCiAgICBPciBlbHNlIGRlcGFydDsgaGVyZSBhbGwgZXllcyBnYXplIG9uIHVzLgoKTUVSQ1VUSU8KCiAgICBNZW4ncyBleWVzIHdlcmUgbWFkZSB0byBsb29rLCBhbmQgbGV0IHRoZW0gZ2F6ZTsKICAgIEkgd2lsbCBub3QgYnVkZ2UgZm9yIG5vIG1hbidzIHBsZWFzdXJlLCBJLgoKICAgIEVudGVyIFJPTUVPCgpUWUJBTFQKCiAgICBXZWxsLCBwZWFjZSBiZSB3aXRoIHlvdSwgc2lyOiBoZXJlIGNvbWVzIG15IG1hbi4KCk1FUkNVVElPCgogICAgQnV0IEknbGwgYmUgaGFuZ2VkLCBzaXIsIGlmIGhlIHdlYXIgeW91ciBsaXZlcnk6CiAgICBNYXJyeSwgZ28gYmVmb3JlIHRvIGZpZWxkLCBoZSdsbCBiZSB5b3VyIGZvbGxvd2VyOwogICAgWW91ciB3b3JzaGlwIGluIHRoYXQgc2Vuc2UgbWF5IGNhbGwgaGltICdtYW4uJwoKVFlCQUxUCgogICAgUm9tZW8sIHRoZSBoYXRlIEkgYmVhciB0aGVlIGNhbiBhZmZvcmQKICAgIE5vIGJldHRlciB0ZXJtIHRoYW4gdGhpcywtLXRob3UgYXJ0IGEgdmlsbGFpbi4KClJPTUVPCgogICAgVHliYWx0LCB0aGUgcmVhc29uIHRoYXQgSSBoYXZlIHRvIGxvdmUgdGhlZQogICAgRG90aCBtdWNoIGV4Y3VzZSB0aGUgYXBwZXJ0YWluaW5nIHJhZ2UKICAgIFRvIHN1Y2ggYSBncmVldGluZzogdmlsbGFpbiBhbSBJIG5vbmU7CiAgICBUaGVyZWZvcmUgZmFyZXdlbGw7IEkgc2VlIHRob3Uga25vdydzdCBtZSBub3QuCgpUWUJBTFQKCiAgICBCb3ksIHRoaXMgc2hhbGwgbm90IGV4Y3VzZSB0aGUgaW5qdXJpZXMKICAgIFRoYXQgdGhvdSBoYXN0IGRvbmUgbWU7IHRoZXJlZm9yZSB0dXJuIGFuZCBkcmF3LgoKUk9NRU8KCiAgICBJIGRvIHByb3Rlc3QsIEkgbmV2ZXIgaW5qdXJlZCB0aGVlLAogICAgQnV0IGxvdmUgdGhlZSBiZXR0ZXIgdGhhbiB0aG91IGNhbnN0IGRldmlzZSwKICAgIFRpbGwgdGhvdSBzaGFsdCBrbm93IHRoZSByZWFzb24gb2YgbXkgbG92ZToKICAgIEFuZCBzbywgZ29vZCBDYXB1bGV0LC0td2hpY2ggbmFtZSBJIHRlbmRlcgogICAgQXMgZGVhcmx5IGFzIG15IG93biwtLWJlIHNhdGlzZmllZC4KCk1FUkNVVElPCgogICAgTyBjYWxtLCBkaXNob25vdXJhYmxlLCB2aWxlIHN1Ym1pc3Npb24hCiAgICBBbGxhIHN0b2NjYXRhIGNhcnJpZXMgaXQgYXdheS4KCiAgICBEcmF3cwogICAgVHliYWx0LCB5b3UgcmF0LWNhdGNoZXIsIHdpbGwgeW91IHdhbGsCgpUWUJBTFQKCiAgICBXaGF0IHdvdWxkc3QgdGhvdSBoYXZlIHdpdGggbWUCgpNRVJDVVRJTwoKICAgIEdvb2Qga2luZyBvZiBjYXRzLCBub3RoaW5nIGJ1dCBvbmUgb2YgeW91ciBuaW5lCiAgICBsaXZlczsgdGhhdCBJIG1lYW4gdG8gbWFrZSBib2xkIHdpdGhhbCwgYW5kIGFzIHlvdQogICAgc2hhbGwgdXNlIG1lIGhlcmVhZnRlciwgZHJ5YmVhdCB0aGUgcmVzdCBvZiB0aGUKICAgIGVpZ2h0LiBXaWxsIHlvdSBwbHVjayB5b3VyIHN3b3JkIG91dCBvZiBoaXMgcGl0Y2hlcgogICAgYnkgdGhlIGVhcnMIG1ha2UgaGFzdGUsIGxlc3QgbWluZSBiZSBhYm91dCB5b3VyCiAgICBlYXJzIGVyZSBpdCBiZSBvdXQuCgpUWUJBTFQKCiAgICBJIGFtIGZvciB5b3UuCgogICAgRHJhd2luZwoKUk9NRU8KCiAgICBHZW50bGUgTWVyY3V0aW8sIHB1dCB0aHkgcmFwaWVyIHVwLgoKTUVSQ1VUSU8KCiAgICBDb21lLCBzaXIsIHlvdXIgcGFzc2Fkby4KCiAgICBUaGV5IGZpZ2h0CgpST01FTwoKICAgIERyYXcsIEJlbnZvbGlvOyBiZWF0IGRvd24gdGhlaXIgd2VhcG9ucy4KICAgIEdlbnRsZW1lbiwgZm9yIHNoYW1lLCBmb3JiZWFyIHRoaXMgb3V0cmFnZSEKICAgIFR5YmFsdCwgTWVyY3V0aW8sIHRoZSBwcmluY2UgZXhwcmVzc2x5IGhhdGgKICAgIEZvcmJpZGRlbiBiYW5keWluZyBpbiBWZXJvbmEgc3RyZWV0czoKICAgIEhvbGQsIFR5YmFsdCEgZ29vZCBNZXJjdXRpbyEKCiAgICBUWUJBTFQgdW5kZXIgUk9NRU8ncyBhcm0gc3RhYnMgTUVSQ1VUSU8sIGFuZCBmbGllcyB3aXRoIGhpcyBmb2xsb3dlcnMKCk1FUkNVVElPCgogICAgSSBhbSBodXJ0LgogICAgQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEgSSBhbSBzcGVkLgogICAgSXMgaGUgZ29uZSwgYW5kIGhhdGggbm90aGluZz8KCkJFTlZPTElPCgogICAgV2hhdCwgYXJ0IHRob3UgaHVydD8KCk1FUkNVVElPCgogICAgQXksIGF5LCBhIHNjcmF0Y2gsIGEgc2NyYXRjaDsgbWFycnksICd0aXMgZW5vdWdoLgogICAgV2hlcmUgaXMgbXkgcGFnZT8gR28sIHZpbGxhaW4sIGZldGNoIGEgc3VyZ2Vvbi4KCiAgICBFeGl0IFBhZ2UKClJPTUVPCgogICAgQ291cmFnZSwgbWFuOyB0aGUgaHVydCBjYW5ub3QgYmUgbXVjaC4KCk1FUkNVVElPCgogICAgTm8sICd0aXMgbm90IHNvIGRlZXAgYXMgYSB3ZWxsLCBub3Igc28gd2lkZSBhcyBhCiAgICBjaHVyY2gtZG9vcjsgYnV0ICd0aXMgZW5vdWdoLCd0d2lsbCBzZXJ2ZTogYXNrIGZvcgogICAgbWUgdG8tbW9ycm93LCBhbmQgeW91IHNoYWxsIGZpbmQgbWUgYSBncmF2ZSBtYW4uIEkKICAgIGFtIHBlcHBlcmVkLCBJIHdhcnJhbnQsIGZvciB0aGlzIHdvcmxkLiBBIHBsYWd1ZSBvJwogICAgYm90aCB5b3VyIGhvdXNlcyEgJ1pvdW5kcywgYSBkb2csIGEgcmF0LCBhIG1vdXNlLCBhCiAgICBjYXQsIHRvIHNjcmF0Y2ggYSBtYW4gdG8gZGVhdGghIGEgYnJhZ2dhcnQsIGEKICAgIHJvZ3VlLCBhIHZpbGxhaW4sIHRoYXQgZmlnaHRzIGJ5IHRoZSBib29rIG9mCiAgICBhcml0aG1ldGljISBXaHkgdGhlIGRldmlsIGNhbWUgeW91IGJldHdlZW4gdXMIEkKICAgIHdhcyBodXJ0IHVuZGVyIHlvdXIgYXJtLgoKUk9NRU8KCiAgICBJIHRob3VnaHQgYWxsIGZvciB0aGUgYmVzdC4KCk1FUkNVVElPCgogICAgSGVscCBtZSBpbnRvIHNvbWUgaG91c2UsIEJlbnZvbGlvLAogICAgT3IgSSBzaGFsbCBmYWludC4gQSBwbGFndWUgbycgYm90aCB5b3VyIGhvdXNlcyEKICAgIFRoZXkgaGF2ZSBtYWRlIHdvcm1zJyBtZWF0IG9mIG1lOiBJIGhhdmUgaXQsCiAgICBBbmQgc291bmRseSB0b286IHlvdXIgaG91c2VzIQoKICAgIEV4ZXVudCBNRVJDVVRJTyBhbmQgQkVOVk9MSU8KClJPTUVPCgogICAgVGhpcyBnZW50bGVtYW4sIHRoZSBwcmluY2UncyBuZWFyIGFsbHksCiAgICBNeSB2ZXJ5IGZyaWVuZCwgaGF0aCBnb3QgaGlzIG1vcnRhbCBodXJ0CiAgICBJbiBteSBiZWhhbGY7IG15IHJlcHV0YXRpb24gc3RhaW4nZAogICAgV2l0aCBUeWJhbHQncyBzbGFuZGVyLC0tVHliYWx0LCB0aGF0IGFuIGhvdXIKICAgIEhhdGggYmVlbiBteSBraW5zbWFuISBPIHN3ZWV0IEp1bGlldCwKICAgIFRoeSBiZWF1dHkgaGF0aCBtYWRlIG1lIGVmZmVtaW5hdGUKICAgIEFuZCBpbiBteSB0ZW1wZXIgc29mdGVuJ2QgdmFsb3VyJ3Mgc3RlZWwhCgogICAgUmUtZW50ZXIgQkVOVk9MSU8KCkJFTlZPTElPCgogICAgTyBSb21lbywgUm9tZW8sIGJyYXZlIE1lcmN1dGlvJ3MgZGVhZCEKICAgIFRoYXQgZ2FsbGFudCBzcGlyaXQgaGF0aCBhc3BpcmVkIHRoZSBjbG91ZHMsCiAgICBXaGljaCB0b28gdW50aW1lbHkgaGVyZSBkaWQgc2Nvcm4gdGhlIGVhcnRoLgoKUk9NRU8KCiAgICBUaGlzIGRheSdzIGJsYWNrIGZhdGUgb24gbW9yZSBkYXlzIGRvdGggZGVwZW5kOwogICAgVGhpcyBidXQgYmVnaW5zIHRoZSB3b2UsIG90aGVycyBtdXN0IGVuZC4KCkJFTlZPTElPCgogICAgSGVyZSBjb21lcyB0aGUgZnVyaW91cyBUeWJhbHQgYmFjayBhZ2Fpbi4KClJPTUVPCgogICAgQWxpdmUsIGluIHRyaXVtcGghIGFuZCBNZXJjdXRpbyBzbGFpbiEKICAgIEF3YXkgdG8gaGVhdmVuLCByZXNwZWN0aXZlIGxlbml0eSwKICAgIEFuZCBmaXJlLWV5ZWQgZnVyeSBiZSBteSBjb25kdWN0IG5vdyEKCiAgICBSZS1lbnRlciBUWUJBTFQKICAgIE5vdywgVHliYWx0LCB0YWtlIHRoZSB2aWxsYWluIGJhY2sgYWdhaW4sCiAgICBUaGF0IGxhdGUgdGhvdSBnYXZlc3QgbWU7IGZvciBNZXJjdXRpbydzIHNvdWwKICAgIElzIGJ1dCBhIGxpdHRsZSB3YXkgYWJvdmUgb3VyIGhlYWRzLAogICAgU3RheWluZyBmb3IgdGhpbmUgdG8ga2VlcCBoaW0gY29tcGFueToKICAgIEVpdGhlciB0aG91LCBvciBJLCBvciBib3RoLCBtdXN0IGdvIHdpdGggaGltLgoKVFlCQUxUCgogICAgVGhvdSwgd3JldGNoZWQgYm95LCB0aGF0IGRpZHN0IGNvbnNvcnQgaGltIGhlcmUsCiAgICBTaGFsdCB3aXRoIGhpbSBoZW5jZS4KClJPTUVPCgogICAgVGhpcyBzaGFsbCBkZXRlcm1pbmUgdGhhdC4KCiAgICBUaGV5IGZpZ2h0OyBUWUJBTFQgZmFsbHMKCkJFTlZPTElPCgogICAgUm9tZW8sIGF3YXksIGJlIGdvbmUhCiAgICBUaGUgY2l0aXplbnMgYXJlIHVwLCBhbmQgVHliYWx0IHNsYWluLgogICAgU3RhbmQgbm90IGFtYXplZDogdGhlIHByaW5jZSB3aWxsIGRvb20gdGhlZSBkZWF0aCwKICAgIElmIHRob3UgYXJ0IHRha2VuOiBoZW5jZSwgYmUgZ29uZSwgYXdheSEKClJPTUVPCgogICAgTywgSSBhbSBmb3J0dW5lJ3MgZm9vbCEKCkJFTlZPTElPCgogICAgV2h5IGRvc3QgdGhvdSBzdGF5PwoKICAgIEV4aXQgUk9NRU8KCiAgICBFbnRlciBDaXRpemVucywgJiBjCgpGaXJzdCBDaXRpemVuCgogICAgV2hpY2ggd2F5IHJhbiBoZSB0aGF0IGtpbGwnZCBNZXJjdXRpbz8KICAgIFR5YmFsdCwgdGhhdCBtdXJkZXJlciwgd2hpY2ggd2F5IHJhbiBoZT8KCkJFTlZPTElPCgogICAgVGhlcmUgbGllcyB0aGF0IFR5YmFsdC4KCkZpcnN0IENpdGl6ZW4KCiAgICBVcCwgc2lyLCBnbyB3aXRoIG1lOwogICAgSSBjaGFyZ2UgdGhlZSBpbiB0aGUgcHJpbmNlcyBuYW1lLCBvYmV5LgoKICAgIEVudGVyIFByaW5jZSwgYXR0ZW5kZWQ7IE1PTlRBR1VFLCBDQVBVTEVULCB0aGVpciBXaXZlcywgYW5kIG90aGVycwoKUFJJTkNFCgogICAgV2hlcmUgYXJlIHRoZSB2aWxlIGJlZ2lubmVycyBvZiB0aGlzIGZyYXkCgpCRU5WT0xJTwoKICAgIE8gbm9ibGUgcHJpbmNlLCBJIGNhbiBkaXNjb3ZlciBhbGwKICAgIFRoZSB1bmx1Y2t5IG1hbmFnZSBvZiB0aGlzIGZhdGFsIGJyYXdsOgogICAgVGhlcmUgbGllcyB0aGUgbWFuLCBzbGFpbiBieSB5b3VuZyBSb21lbywKICAgIFRoYXQgc2xldyB0aHkga2luc21hbiwgYnJhdmUgTWVyY3V0aW8uCgpMQURZIENBUFVMRVQKCiAgICBUeWJhbHQsIG15IGNvdXNpbiEgTyBteSBicm90aGVyJ3MgY2hpbGQhCiAgICBPIHByaW5jZSEgTyBjb3VzaW4hIGh1c2JhbmQhIE8sIHRoZSBibG9vZCBpcyBzcGlsdAogICAgTyBteSBkZWFyIGtpbnNtYW4hIFByaW5jZSwgYXMgdGhvdSBhcnQgdHJ1ZSwKICAgIEZvciBibG9vZCBvZiBvdXJzLCBzaGVkIGJsb29kIG9mIE1vbnRhZ3VlLgogICAgTyBjb3VzaW4sIGNvdXNpbiEKClBSSU5DRQoKICAgIEJlbnZvbGlvLCB3aG8gYmVnYW4gdGhpcyBibG9vZHkgZnJheT8KCkJFTlZPTElPCgogICAgVHliYWx0LCBoZXJlIHNsYWluLCB3aG9tIFJvbWVvJ3MgaGFuZCBkaWQgc2xheTsKICAgIFJvbWVvIHRoYXQgc3Bva2UgaGltIGZhaXIsIGJhZGUgaGltIGJldGhpbmsKICAgIEhvdyBuaWNlIHRoZSBxdWFycmVsIHdhcywgYW5kIHVyZ2VkIHdpdGhhbAogICAgWW91ciBoaWdoIGRpc3BsZWFzdXJlOiBhbGwgdGhpcyB1dHRlcmVkCiAgICBXaXRoIGdlbnRsZSBicmVhdGgsIGNhbG0gbG9vaywga25lZXMgaHVtYmx5IGJvdydkLAogICAgQ291bGQgbm90IHRha2UgdHJ1Y2Ugd2l0aCB0aGUgdW5ydWx5IHNwbGVlbgogICAgT2YgVHliYWx0IGRlYWYgdG8gcGVhY2UsIGJ1dCB0aGF0IGhlIHRpbHRzCiAgICBXaXRoIHBpZXJjaW5nIHN0ZWVsIGF0IGJvbGQgTWVyY3V0aW8ncyBicmVhc3QsCiAgICBXaG8gYWxsIGFzIGhvdCwgdHVybnMgZGVhZGx5IHBvaW50IHRvIHBvaW50LAogICAgQW5kLCB3aXRoIGEgbWFydGlhbCBzY29ybiwgd2l0aCBvbmUgaGFuZCBiZWF0cwogICAgQ29sZCBkZWF0aCBhc2lkZSwgYW5kIHdpdGggdGhlIG90aGVyIHNlbmRzCiAgICBJdCBiYWNrIHRvIFR5YmFsdCwgd2hvc2UgZGV4dGVyaXR5LAogICAgUmV0b3J0cyBpdDogUm9tZW8gaGUgY3JpZXMgYWxvdWQsCiAgICAnSG9sZCwgZnJpZW5kcyEgZnJpZW5kcywgcGFydCEnIGFuZCwgc3dpZnRlciB0aGFuCiAgICBoaXMgdG9uZ3VlLAogICAgSGlzIGFnaWxlIGFybSBiZWF0cyBkb3duIHRoZWlyIGZhdGFsIHBvaW50cywKICAgIEFuZCAndHdpeHQgdGhlbSBydXNoZXM7IHVuZGVybmVhdGggd2hvc2UgYXJtCiAgICBBbiBlbnZpb3VzIHRocnVzdCBmcm9tIFR5YmFsdCBoaXQgdGhlIGxpZmUKICAgIE9mIHN0b3V0IE1lcmN1dGlvLCBhbmQgdGhlbiBUeWJhbHQgZmxlZDsKICAgIEJ1dCBieSBhbmQgYnkgY29tZXMgYmFjayB0byBSb21lbywKICAgIFdobyBoYWQgYnV0IG5ld2x5IGVudGVydGFpbidkIHJldmVuZ2UsCiAgICBBbmQgdG8gJ3QgdGhleSBnbyBsaWtlIGxpZ2h0bmluZywgZm9yLCBlcmUgSQogICAgQ291bGQgZHJhdyB0byBwYXJ0IHRoZW0sIHdhcyBzdG91dCBUeWJhbHQgc2xhaW4uCiAgICBBbmQsIGFzIGhlIGZlbGwsIGRpZCBSb21lbyB0dXJuIGFuZCBmbHkuCiAgICBUaGlzIGlzIHRoZSB0cnV0aCwgb3IgbGV0IEJlbnZvbGlvIGRpZS4KCkxBRFkgQ0FQVUxFVAoKICAgIEhlIGlzIGEga2luc21hbiB0byB0aGUgTW9udGFndWU7CiAgICBBZmZlY3Rpb24gbWFrZXMgaGltIGZhbHNlOyBoZSBzcGVha3Mgbm90IHRydWU6CiAgICBTb21lIHR3ZW50eSBvZiB0aGVtIGZvdWdodCBpbiB0aGlzIGJsYWNrIHN0cmlmZSwKICAgIEFuZCBhbGwgdGhvc2UgdHdlbnR5IGNvdWxkIGJ1dCBraWxsIG9uZSBsaWZlLgogICAgSSBiZWcgZm9yIGp1c3RpY2UsIHdoaWNoIHRob3UsIHByaW5jZSwgbXVzdCBnaXZlOwogICAgUm9tZW8gc2xldyBUeWJhbHQsIFJvbWVvIG11c3Qgbm90IGxpdmUuCgpQUklOQ0UKCiAgICBSb21lbyBzbGV3IGhpbSwgaGUgc2xldyBNZXJjdXRpbzsKICAgIFdobyBub3cgdGhlIHByaWNlIG9mIGhpcyBkZWFyIGJsb29kIGRvdGggb3dlPwoKTU9OVEFHVUUKCiAgICBOb3QgUm9tZW8sIHByaW5jZSwgaGUgd2FzIE1lcmN1dGlvJ3MgZnJpZW5kOwogICAgSGlzIGZhdWx0IGNvbmNsdWRlcyBidXQgd2hhdCB0aGUgbGF3IHNob3VsZCBlbmQsCiAgICBUaGUgbGlmZSBvZiBUeWJhbHQuCgpQUklOQ0UKCiAgICBBbmQgZm9yIHRoYXQgb2ZmZW5jZQogICAgSW1tZWRpYXRlbHkgd2UgZG8gZXhpbGUgaGltIGhlbmNlOgogICAgSSBoYXZlIGFuIGludGVyZXN0IGluIHlvdXIgaGF0ZSdzIHByb2NlZWRpbmcsCiAgICBNeSBibG9vZCBmb3IgeW91ciBydWRlIGJyYXdscyBkb3RoIGxpZSBhLWJsZWVkaW5nOwogICAgQnV0IEknbGwgYW1lcmNlIHlvdSB3aXRoIHNvIHN0cm9uZyBhIGZpbmUKICAgIFRoYXQgeW91IHNoYWxsIGFsbCByZXBlbnQgdGhlIGxvc3Mgb2YgbWluZToKICAgIEkgd2lsbCBiZSBkZWFmIHRvIHBsZWFkaW5nIGFuZCBleGN1c2VzOwogICAgTm9yIHRlYXJzIG5vciBwcmF5ZXJzIHNoYWxsIHB1cmNoYXNlIG91dCBhYnVzZXM6CiAgICBUaGVyZWZvcmUgdXNlIG5vbmU6IGxldCBSb21lbyBoZW5jZSBpbiBoYXN0ZSwKICAgIEVsc2UsIHdoZW4gaGUncyBmb3VuZCwgdGhhdCBob3VyIGlzIGhpcyBsYXN0LgogICAgQmVhciBoZW5jZSB0aGlzIGJvZHkgYW5kIGF0dGVuZCBvdXIgd2lsbDoKICAgIE1lcmN5IGJ1dCBtdXJkZXJzLCBwYXJkb25pbmcgdGhvc2UgdGhhdCBraWxsLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIENhcHVsZXQncyBvcmNoYXJkLgoKICAgIEVudGVyIEpVTElFVCAKCkpVTElFVAoKICAgIEdhbGxvcCBhcGFjZSwgeW91IGZpZXJ5LWZvb3RlZCBzdGVlZHMsCiAgICBUb3dhcmRzIFBob2VidXMnIGxvZGdpbmc6IHN1Y2ggYSB3YWdvbmVyCiAgICBBcyBQaGFldGhvbiB3b3VsZCB3aGlwIHlvdSB0byB0aGUgd2VzdCwKICAgIEFuZCBicmluZyBpbiBjbG91ZHkgbmlnaHQgaW1tZWRpYXRlbHkuCiAgICBTcHJlYWQgdGh5IGNsb3NlIGN1cnRhaW4sIGxvdmUtcGVyZm9ybWluZyBuaWdodCwKICAgIFRoYXQgcnVuYXdheSdzIGV5ZXMgbWF5IHdpbmsgYW5kIFJvbWVvCiAgICBMZWFwIHRvIHRoZXNlIGFybXMsIHVudGFsaydkIG9mIGFuZCB1bnNlZW4uCiAgICBMb3ZlcnMgY2FuIHNlZSB0byBkbyB0aGVpciBhbW9yb3VzIHJpdGVzCiAgICBCeSB0aGVpciBvd24gYmVhdXRpZXM7IG9yLCBpZiBsb3ZlIGJlIGJsaW5kLAogICAgSXQgYmVzdCBhZ3JlZXMgd2l0aCBuaWdodC4gQ29tZSwgY2l2aWwgbmlnaHQsCiAgICBUaG91IHNvYmVyLXN1aXRlZCBtYXRyb24sIGFsbCBpbiBibGFjaywKICAgIEFuZCBsZWFybiBtZSBob3cgdG8gbG9zZSBhIHdpbm5pbmcgbWF0Y2gsCiAgICBQbGF5J2QgZm9yIGEgcGFpciBvZiBzdGFpbmxlc3MgbWFpZGVuaG9vZHM6CiAgICBIb29kIG15IHVubWFubidkIGJsb29kLCBiYXRpbmcgaW4gbXkgY2hlZWtzLAogICAgV2l0aCB0aHkgYmxhY2sgbWFudGxlOyB0aWxsIHN0cmFuZ2UgbG92ZSwgZ3Jvd24gYm9sZCwKICAgIFRoaW5rIHRydWUgbG92ZSBhY3RlZCBzaW1wbGUgbW9kZXN0eS4KICAgIENvbWUsIG5pZ2h0OyBjb21lLCBSb21lbzsgY29tZSwgdGhvdSBkYXkgaW4gbmlnaHQ7CiAgICBGb3IgdGhvdSB3aWx0IGxpZSB1cG9uIHRoZSB3aW5ncyBvZiBuaWdodAogICAgV2hpdGVyIHRoYW4gbmV3IHNub3cgb24gYSByYXZlbidzIGJhY2suCiAgICBDb21lLCBnZW50bGUgbmlnaHQsIGNvbWUsIGxvdmluZywgYmxhY2stYnJvdydkIG5pZ2h0LAogICAgR2l2ZSBtZSBteSBSb21lbzsgYW5kLCB3aGVuIGhlIHNoYWxsIGRpZSwKICAgIFRha2UgaGltIGFuZCBjdXQgaGltIG91dCBpbiBsaXR0bGUgc3RhcnMsCiAgICBBbmQgaGUgd2lsbCBtYWtlIHRoZSBmYWNlIG9mIGhlYXZlbiBzbyBmaW5lCiAgICBUaGF0IGFsbCB0aGUgd29ybGQgd2lsbCBiZSBpbiBsb3ZlIHdpdGggbmlnaHQKICAgIEFuZCBwYXkgbm8gd29yc2hpcCB0byB0aGUgZ2FyaXNoIHN1bi4KICAgIE8sIEkgaGF2ZSBib3VnaHQgdGhlIG1hbnNpb24gb2YgYSBsb3ZlLAogICAgQnV0IG5vdCBwb3NzZXNzJ2QgaXQsIGFuZCwgdGhvdWdoIEkgYW0gc29sZCwKICAgIE5vdCB5ZXQgZW5qb3knZDogc28gdGVkaW91cyBpcyB0aGlzIGRheQogICAgQXMgaXMgdGhlIG5pZ2h0IGJlZm9yZSBzb21lIGZlc3RpdmFsCiAgICBUbyBhbiBpbXBhdGllbnQgY2hpbGQgdGhhdCBoYXRoIG5ldyByb2JlcwogICAgQW5kIG1heSBub3Qgd2VhciB0aGVtLiBPLCBoZXJlIGNvbWVzIG15IG51cnNlLAogICAgQW5kIHNoZSBicmluZ3MgbmV3czsgYW5kIGV2ZXJ5IHRvbmd1ZSB0aGF0IHNwZWFrcwogICAgQnV0IFJvbWVvJ3MgbmFtZSBzcGVha3MgaGVhdmVubHkgZWxvcXVlbmNlLgoKICAgIEVudGVyIE51cnNlLCB3aXRoIGNvcmRzCiAgICBOb3csIG51cnNlLCB3aGF0IG5ld3MIFdoYXQgaGFzdCB0aG91IHRoZXJlPyB0aGUgY29yZHMKICAgIFRoYXQgUm9tZW8gYmlkIHRoZWUgZmV0Y2gCgpOdXJzZQoKICAgIEF5LCBheSwgdGhlIGNvcmRzLgoKICAgIFRocm93cyB0aGVtIGRvd24KCkpVTElFVAoKICAgIEF5IG1lISB3aGF0IG5ld3MIHdoeSBkb3N0IHRob3Ugd3JpbmcgdGh5IGhhbmRzPwoKTnVyc2UKCiAgICBBaCwgd2VsbC1hLWRheSEgaGUncyBkZWFkLCBoZSdzIGRlYWQsIGhlJ3MgZGVhZCEKICAgIFdlIGFyZSB1bmRvbmUsIGxhZHksIHdlIGFyZSB1bmRvbmUhCiAgICBBbGFjayB0aGUgZGF5ISBoZSdzIGdvbmUsIGhlJ3Mga2lsbCdkLCBoZSdzIGRlYWQhCgpKVUxJRVQKCiAgICBDYW4gaGVhdmVuIGJlIHNvIGVudmlvdXMCgpOdXJzZQoKICAgIFJvbWVvIGNhbiwKICAgIFRob3VnaCBoZWF2ZW4gY2Fubm90OiBPIFJvbWVvLCBSb21lbyEKICAgIFdobyBldmVyIHdvdWxkIGhhdmUgdGhvdWdodCBpdD8gUm9tZW8hCgpKVUxJRVQKCiAgICBXaGF0IGRldmlsIGFydCB0aG91LCB0aGF0IGRvc3QgdG9ybWVudCBtZSB0aHVzPwogICAgVGhpcyB0b3J0dXJlIHNob3VsZCBiZSByb2FyJ2QgaW4gZGlzbWFsIGhlbGwuCiAgICBIYXRoIFJvbWVvIHNsYWluIGhpbXNlbGYIHNheSB0aG91IGJ1dCAnSSwnCiAgICBBbmQgdGhhdCBiYXJlIHZvd2VsICdJJyBzaGFsbCBwb2lzb24gbW9yZQogICAgVGhhbiB0aGUgZGVhdGgtZGFydGluZyBleWUgb2YgY29ja2F0cmljZToKICAgIEkgYW0gbm90IEksIGlmIHRoZXJlIGJlIHN1Y2ggYW4gSTsKICAgIE9yIHRob3NlIGV5ZXMgc2h1dCwgdGhhdCBtYWtlIHRoZWUgYW5zd2VyICdJLicKICAgIElmIGhlIGJlIHNsYWluLCBzYXkgJ0knOyBvciBpZiBub3QsIG5vOgogICAgQnJpZWYgc291bmRzIGRldGVybWluZSBvZiBteSB3ZWFsIG9yIHdvZS4KCk51cnNlCgogICAgSSBzYXcgdGhlIHdvdW5kLCBJIHNhdyBpdCB3aXRoIG1pbmUgZXllcywtLQogICAgR29kIHNhdmUgdGhlIG1hcmshLS1oZXJlIG9uIGhpcyBtYW5seSBicmVhc3Q6CiAgICBBIHBpdGVvdXMgY29yc2UsIGEgYmxvb2R5IHBpdGVvdXMgY29yc2U7CiAgICBQYWxlLCBwYWxlIGFzIGFzaGVzLCBhbGwgYmVkYXViJ2QgaW4gYmxvb2QsCiAgICBBbGwgaW4gZ29yZS1ibG9vZDsgSSBzd291bmRlZCBhdCB0aGUgc2lnaHQuCgpKVUxJRVQKCiAgICBPLCBicmVhaywgbXkgaGVhcnQhIHBvb3IgYmFua3J1cHQsIGJyZWFrIGF0IG9uY2UhCiAgICBUbyBwcmlzb24sIGV5ZXMsIG5lJ2VyIGxvb2sgb24gbGliZXJ0eSEKICAgIFZpbGUgZWFydGgsIHRvIGVhcnRoIHJlc2lnbjsgZW5kIG1vdGlvbiBoZXJlOwogICAgQW5kIHRob3UgYW5kIFJvbWVvIHByZXNzIG9uZSBoZWF2eSBiaWVyIQoKTnVyc2UKCiAgICBPIFR5YmFsdCwgVHliYWx0LCB0aGUgYmVzdCBmcmllbmQgSSBoYWQhCiAgICBPIGNvdXJ0ZW91cyBUeWJhbHQhIGhvbmVzdCBnZW50bGVtYW4hCiAgICBUaGF0IGV2ZXIgSSBzaG91bGQgbGl2ZSB0byBzZWUgdGhlZSBkZWFkIQoKSlVMSUVUCgogICAgV2hhdCBzdG9ybSBpcyB0aGlzIHRoYXQgYmxvd3Mgc28gY29udHJhcnkCiAgICBJcyBSb21lbyBzbGF1Z2h0ZXInZCwgYW5kIGlzIFR5YmFsdCBkZWFkPwogICAgTXkgZGVhci1sb3ZlZCBjb3VzaW4sIGFuZCBteSBkZWFyZXIgbG9yZD8KICAgIFRoZW4sIGRyZWFkZnVsIHRydW1wZXQsIHNvdW5kIHRoZSBnZW5lcmFsIGRvb20hCiAgICBGb3Igd2hvIGlzIGxpdmluZywgaWYgdGhvc2UgdHdvIGFyZSBnb25lPwoKTnVyc2UKCiAgICBUeWJhbHQgaXMgZ29uZSwgYW5kIFJvbWVvIGJhbmlzaGVkOwogICAgUm9tZW8gdGhhdCBraWxsJ2QgaGltLCBoZSBpcyBiYW5pc2hlZC4KCkpVTElFVAoKICAgIE8gR29kISBkaWQgUm9tZW8ncyBoYW5kIHNoZWQgVHliYWx0J3MgYmxvb2QCgpOdXJzZQoKICAgIEl0IGRpZCwgaXQgZGlkOyBhbGFzIHRoZSBkYXksIGl0IGRpZCEKCkpVTElFVAoKICAgIE8gc2VycGVudCBoZWFydCwgaGlkIHdpdGggYSBmbG93ZXJpbmcgZmFjZSEKICAgIERpZCBldmVyIGRyYWdvbiBrZWVwIHNvIGZhaXIgYSBjYXZlPwogICAgQmVhdXRpZnVsIHR5cmFudCEgZmllbmQgYW5nZWxpY2FsIQogICAgRG92ZS1mZWF0aGVyJ2QgcmF2ZW4hIHdvbHZpc2gtcmF2ZW5pbmcgbGFtYiEKICAgIERlc3Bpc2VkIHN1YnN0YW5jZSBvZiBkaXZpbmVzdCBzaG93IQogICAgSnVzdCBvcHBvc2l0ZSB0byB3aGF0IHRob3UganVzdGx5IHNlZW0nc3QsCiAgICBBIGRhbW5lZCBzYWludCwgYW4gaG9ub3VyYWJsZSB2aWxsYWluIQogICAgTyBuYXR1cmUsIHdoYXQgaGFkc3QgdGhvdSB0byBkbyBpbiBoZWxsLAogICAgV2hlbiB0aG91IGRpZHN0IGJvd2VyIHRoZSBzcGlyaXQgb2YgYSBmaWVuZAogICAgSW4gbW9yYWwgcGFyYWRpc2Ugb2Ygc3VjaCBzd2VldCBmbGVzaD8KICAgIFdhcyBldmVyIGJvb2sgY29udGFpbmluZyBzdWNoIHZpbGUgbWF0dGVyCiAgICBTbyBmYWlybHkgYm91bmQIE8gdGhhdCBkZWNlaXQgc2hvdWxkIGR3ZWxsCiAgICBJbiBzdWNoIGEgZ29yZ2VvdXMgcGFsYWNlIQoKTnVyc2UKCiAgICBUaGVyZSdzIG5vIHRydXN0LAogICAgTm8gZmFpdGgsIG5vIGhvbmVzdHkgaW4gbWVuOyBhbGwgcGVyanVyZWQsCiAgICBBbGwgZm9yc3dvcm4sIGFsbCBuYXVnaHQsIGFsbCBkaXNzZW1ibGVycy4KICAgIEFoLCB3aGVyZSdzIG15IG1hbj8gZ2l2ZSBtZSBzb21lIGFxdWEgdml0YWU6CiAgICBUaGVzZSBncmllZnMsIHRoZXNlIHdvZXMsIHRoZXNlIHNvcnJvd3MgbWFrZSBtZSBvbGQuCiAgICBTaGFtZSBjb21lIHRvIFJvbWVvIQoKSlVMSUVUCgogICAgQmxpc3RlcidkIGJlIHRoeSB0b25ndWUKICAgIEZvciBzdWNoIGEgd2lzaCEgaGUgd2FzIG5vdCBib3JuIHRvIHNoYW1lOgogICAgVXBvbiBoaXMgYnJvdyBzaGFtZSBpcyBhc2hhbWVkIHRvIHNpdDsKICAgIEZvciAndGlzIGEgdGhyb25lIHdoZXJlIGhvbm91ciBtYXkgYmUgY3Jvd24nZAogICAgU29sZSBtb25hcmNoIG9mIHRoZSB1bml2ZXJzYWwgZWFydGguCiAgICBPLCB3aGF0IGEgYmVhc3Qgd2FzIEkgdG8gY2hpZGUgYXQgaGltIQoKTnVyc2UKCiAgICBXaWxsIHlvdSBzcGVhayB3ZWxsIG9mIGhpbSB0aGF0IGtpbGwnZCB5b3VyIGNvdXNpbj8KCkpVTElFVAoKICAgIFNoYWxsIEkgc3BlYWsgaWxsIG9mIGhpbSB0aGF0IGlzIG15IGh1c2JhbmQCiAgICBBaCwgcG9vciBteSBsb3JkLCB3aGF0IHRvbmd1ZSBzaGFsbCBzbW9vdGggdGh5IG5hbWUsCiAgICBXaGVuIEksIHRoeSB0aHJlZS1ob3VycyB3aWZlLCBoYXZlIG1hbmdsZWQgaXQCiAgICBCdXQsIHdoZXJlZm9yZSwgdmlsbGFpbiwgZGlkc3QgdGhvdSBraWxsIG15IGNvdXNpbj8KICAgIFRoYXQgdmlsbGFpbiBjb3VzaW4gd291bGQgaGF2ZSBraWxsJ2QgbXkgaHVzYmFuZDoKICAgIEJhY2ssIGZvb2xpc2ggdGVhcnMsIGJhY2sgdG8geW91ciBuYXRpdmUgc3ByaW5nOwogICAgWW91ciB0cmlidXRhcnkgZHJvcHMgYmVsb25nIHRvIHdvZSwKICAgIFdoaWNoIHlvdSwgbWlzdGFraW5nLCBvZmZlciB1cCB0byBqb3kuCiAgICBNeSBodXNiYW5kIGxpdmVzLCB0aGF0IFR5YmFsdCB3b3VsZCBoYXZlIHNsYWluOwogICAgQW5kIFR5YmFsdCdzIGRlYWQsIHRoYXQgd291bGQgaGF2ZSBzbGFpbiBteSBodXNiYW5kOgogICAgQWxsIHRoaXMgaXMgY29tZm9ydDsgd2hlcmVmb3JlIHdlZXAgSSB0aGVuPwogICAgU29tZSB3b3JkIHRoZXJlIHdhcywgd29yc2VyIHRoYW4gVHliYWx0J3MgZGVhdGgsCiAgICBUaGF0IG11cmRlcidkIG1lOiBJIHdvdWxkIGZvcmdldCBpdCBmYWluOwogICAgQnV0LCBPLCBpdCBwcmVzc2VzIHRvIG15IG1lbW9yeSwKICAgIExpa2UgZGFtbmVkIGd1aWx0eSBkZWVkcyB0byBzaW5uZXJzJyBtaW5kczoKICAgICdUeWJhbHQgaXMgZGVhZCwgYW5kIFJvbWVvLS1iYW5pc2hlZDsnCiAgICBUaGF0ICdiYW5pc2hlZCwnIHRoYXQgb25lIHdvcmQgJ2JhbmlzaGVkLCcKICAgIEhhdGggc2xhaW4gdGVuIHRob3VzYW5kIFR5YmFsdHMuIFR5YmFsdCdzIGRlYXRoCiAgICBXYXMgd29lIGVub3VnaCwgaWYgaXQgaGFkIGVuZGVkIHRoZXJlOgogICAgT3IsIGlmIHNvdXIgd29lIGRlbGlnaHRzIGluIGZlbGxvd3NoaXAKICAgIEFuZCBuZWVkbHkgd2lsbCBiZSByYW5rJ2Qgd2l0aCBvdGhlciBncmllZnMsCiAgICBXaHkgZm9sbG93J2Qgbm90LCB3aGVuIHNoZSBzYWlkICdUeWJhbHQncyBkZWFkLCcKICAgIFRoeSBmYXRoZXIsIG9yIHRoeSBtb3RoZXIsIG5heSwgb3IgYm90aCwKICAgIFdoaWNoIG1vZGVybiBsYW1lbnRhdGlvbnMgbWlnaHQgaGF2ZSBtb3ZlZD8KICAgIEJ1dCB3aXRoIGEgcmVhci13YXJkIGZvbGxvd2luZyBUeWJhbHQncyBkZWF0aCwKICAgICdSb21lbyBpcyBiYW5pc2hlZCwnIHRvIHNwZWFrIHRoYXQgd29yZCwKICAgIElzIGZhdGhlciwgbW90aGVyLCBUeWJhbHQsIFJvbWVvLCBKdWxpZXQsCiAgICBBbGwgc2xhaW4sIGFsbCBkZWFkLiAnUm9tZW8gaXMgYmFuaXNoZWQhJwogICAgVGhlcmUgaXMgbm8gZW5kLCBubyBsaW1pdCwgbWVhc3VyZSwgYm91bmQsCiAgICBJbiB0aGF0IHdvcmQncyBkZWF0aDsgbm8gd29yZHMgY2FuIHRoYXQgd29lIHNvdW5kLgogICAgV2hlcmUgaXMgbXkgZmF0aGVyLCBhbmQgbXkgbW90aGVyLCBudXJzZT8KCk51cnNlCgogICAgV2VlcGluZyBhbmQgd2FpbGluZyBvdmVyIFR5YmFsdCdzIGNvcnNlOgogICAgV2lsbCB5b3UgZ28gdG8gdGhlbT8gSSB3aWxsIGJyaW5nIHlvdSB0aGl0aGVyLgoKSlVMSUVUCgogICAgV2FzaCB0aGV5IGhpcyB3b3VuZHMgd2l0aCB0ZWFyczogbWluZSBzaGFsbCBiZSBzcGVudCwKICAgIFdoZW4gdGhlaXJzIGFyZSBkcnksIGZvciBSb21lbydzIGJhbmlzaG1lbnQuCiAgICBUYWtlIHVwIHRob3NlIGNvcmRzOiBwb29yIHJvcGVzLCB5b3UgYXJlIGJlZ3VpbGVkLAogICAgQm90aCB5b3UgYW5kIEk7IGZvciBSb21lbyBpcyBleGlsZWQ6CiAgICBIZSBtYWRlIHlvdSBmb3IgYSBoaWdod2F5IHRvIG15IGJlZDsKICAgIEJ1dCBJLCBhIG1haWQsIGRpZSBtYWlkZW4td2lkb3dlZC4KICAgIENvbWUsIGNvcmRzLCBjb21lLCBudXJzZTsgSSdsbCB0byBteSB3ZWRkaW5nLWJlZDsKICAgIEFuZCBkZWF0aCwgbm90IFJvbWVvLCB0YWtlIG15IG1haWRlbmhlYWQhCgpOdXJzZQoKICAgIEhpZSB0byB5b3VyIGNoYW1iZXI6IEknbGwgZmluZCBSb21lbwogICAgVG8gY29tZm9ydCB5b3U6IEkgd290IHdlbGwgd2hlcmUgaGUgaXMuCiAgICBIYXJrIHllLCB5b3VyIFJvbWVvIHdpbGwgYmUgaGVyZSBhdCBuaWdodDoKICAgIEknbGwgdG8gaGltOyBoZSBpcyBoaWQgYXQgTGF1cmVuY2UnIGNlbGwuCgpKVUxJRVQKCiAgICBPLCBmaW5kIGhpbSEgZ2l2ZSB0aGlzIHJpbmcgdG8gbXkgdHJ1ZSBrbmlnaHQsCiAgICBBbmQgYmlkIGhpbSBjb21lIHRvIHRha2UgaGlzIGxhc3QgZmFyZXdlbGwuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBMQVVSRU5DRSAKCkZSSUFSIExBVVJFTkNFCgogICAgUm9tZW8sIGNvbWUgZm9ydGg7IGNvbWUgZm9ydGgsIHRob3UgZmVhcmZ1bCBtYW46CiAgICBBZmZsaWN0aW9uIGlzIGVuYW1vdXInZCBvZiB0aHkgcGFydHMsCiAgICBBbmQgdGhvdSBhcnQgd2VkZGVkIHRvIGNhbGFtaXR5LgoKICAgIEVudGVyIFJPTUVPCgpST01FTwoKICAgIEZhdGhlciwgd2hhdCBuZXdzPyB3aGF0IGlzIHRoZSBwcmluY2UncyBkb29tPwogICAgV2hhdCBzb3Jyb3cgY3JhdmVzIGFjcXVhaW50YW5jZSBhdCBteSBoYW5kLAogICAgVGhhdCBJIHlldCBrbm93IG5vdD8KCkZSSUFSIExBVVJFTkNFCgogICAgVG9vIGZhbWlsaWFyCiAgICBJcyBteSBkZWFyIHNvbiB3aXRoIHN1Y2ggc291ciBjb21wYW55OgogICAgSSBicmluZyB0aGVlIHRpZGluZ3Mgb2YgdGhlIHByaW5jZSdzIGRvb20uCgpST01FTwoKICAgIFdoYXQgbGVzcyB0aGFuIGRvb21zLWRheSBpcyB0aGUgcHJpbmNlJ3MgZG9vbT8KCkZSSUFSIExBVVJFTkNFCgogICAgQSBnZW50bGVyIGp1ZGdtZW50IHZhbmlzaCdkIGZyb20gaGlzIGxpcHMsCiAgICBOb3QgYm9keSdzIGRlYXRoLCBidXQgYm9keSdzIGJhbmlzaG1lbnQuCgpST01FTwoKICAgIEhhLCBiYW5pc2htZW50ISBiZSBtZXJjaWZ1bCwgc2F5ICdkZWF0aDsnCiAgICBGb3IgZXhpbGUgaGF0aCBtb3JlIHRlcnJvciBpbiBoaXMgbG9vaywKICAgIE11Y2ggbW9yZSB0aGFuIGRlYXRoOiBkbyBub3Qgc2F5ICdiYW5pc2htZW50LicKCkZSSUFSIExBVVJFTkNFCgogICAgSGVuY2UgZnJvbSBWZXJvbmEgYXJ0IHRob3UgYmFuaXNoZWQ6CiAgICBCZSBwYXRpZW50LCBmb3IgdGhlIHdvcmxkIGlzIGJyb2FkIGFuZCB3aWRlLgoKUk9NRU8KCiAgICBUaGVyZSBpcyBubyB3b3JsZCB3aXRob3V0IFZlcm9uYSB3YWxscywKICAgIEJ1dCBwdXJnYXRvcnksIHRvcnR1cmUsIGhlbGwgaXRzZWxmLgogICAgSGVuY2UtYmFuaXNoZWQgaXMgYmFuaXNoJ2QgZnJvbSB0aGUgd29ybGQsCiAgICBBbmQgd29ybGQncyBleGlsZSBpcyBkZWF0aDogdGhlbiBiYW5pc2hlZCwKICAgIElzIGRlYXRoIG1pcy10ZXJtJ2Q6IGNhbGxpbmcgZGVhdGggYmFuaXNobWVudCwKICAgIFRob3UgY3V0dCdzdCBteSBoZWFkIG9mZiB3aXRoIGEgZ29sZGVuIGF4ZSwKICAgIEFuZCBzbWlsZXN0IHVwb24gdGhlIHN0cm9rZSB0aGF0IG11cmRlcnMgbWUuCgpGUklBUiBMQVVSRU5DRQoKICAgIE8gZGVhZGx5IHNpbiEgTyBydWRlIHVudGhhbmtmdWxuZXNzIQogICAgVGh5IGZhdWx0IG91ciBsYXcgY2FsbHMgZGVhdGg7IGJ1dCB0aGUga2luZCBwcmluY2UsCiAgICBUYWtpbmcgdGh5IHBhcnQsIGhhdGggcnVzaCdkIGFzaWRlIHRoZSBsYXcsCiAgICBBbmQgdHVybidkIHRoYXQgYmxhY2sgd29yZCBkZWF0aCB0byBiYW5pc2htZW50OgogICAgVGhpcyBpcyBkZWFyIG1lcmN5LCBhbmQgdGhvdSBzZWVzdCBpdCBub3QuCgpST01FTwoKICAgICdUaXMgdG9ydHVyZSwgYW5kIG5vdCBtZXJjeTogaGVhdmVuIGlzIGhlcmUsCiAgICBXaGVyZSBKdWxpZXQgbGl2ZXM7IGFuZCBldmVyeSBjYXQgYW5kIGRvZwogICAgQW5kIGxpdHRsZSBtb3VzZSwgZXZlcnkgdW53b3J0aHkgdGhpbmcsCiAgICBMaXZlIGhlcmUgaW4gaGVhdmVuIGFuZCBtYXkgbG9vayBvbiBoZXI7CiAgICBCdXQgUm9tZW8gbWF5IG5vdDogbW9yZSB2YWxpZGl0eSwKICAgIE1vcmUgaG9ub3VyYWJsZSBzdGF0ZSwgbW9yZSBjb3VydHNoaXAgbGl2ZXMKICAgIEluIGNhcnJpb24tZmxpZXMgdGhhbiBSb21lbzogdGhleSBteSBzZWl6ZQogICAgT24gdGhlIHdoaXRlIHdvbmRlciBvZiBkZWFyIEp1bGlldCdzIGhhbmQKICAgIEFuZCBzdGVhbCBpbW1vcnRhbCBibGVzc2luZyBmcm9tIGhlciBsaXBzLAogICAgV2hvIGV2ZW4gaW4gcHVyZSBhbmQgdmVzdGFsIG1vZGVzdHksCiAgICBTdGlsbCBibHVzaCwgYXMgdGhpbmtpbmcgdGhlaXIgb3duIGtpc3NlcyBzaW47CiAgICBCdXQgUm9tZW8gbWF5IG5vdDsgaGUgaXMgYmFuaXNoZWQ6CiAgICBGbGllcyBtYXkgZG8gdGhpcywgYnV0IEkgZnJvbSB0aGlzIG11c3QgZmx5OgogICAgVGhleSBhcmUgZnJlZSBtZW4sIGJ1dCBJIGFtIGJhbmlzaGVkLgogICAgQW5kIHNheSdzdCB0aG91IHlldCB0aGF0IGV4aWxlIGlzIG5vdCBkZWF0aD8KICAgIEhhZHN0IHRob3Ugbm8gcG9pc29uIG1peCdkLCBubyBzaGFycC1ncm91bmQga25pZmUsCiAgICBObyBzdWRkZW4gbWVhbiBvZiBkZWF0aCwgdGhvdWdoIG5lJ2VyIHNvIG1lYW4sCiAgICBCdXQgJ2JhbmlzaGVkJyB0byBraWxsIG1lPy0tJ2JhbmlzaGVkJz8KICAgIE8gZnJpYXIsIHRoZSBkYW1uZWQgdXNlIHRoYXQgd29yZCBpbiBoZWxsOwogICAgSG93bGluZ3MgYXR0ZW5kIGl0OiBob3cgaGFzdCB0aG91IHRoZSBoZWFydCwKICAgIEJlaW5nIGEgZGl2aW5lLCBhIGdob3N0bHkgY29uZmVzc29yLAogICAgQSBzaW4tYWJzb2x2ZXIsIGFuZCBteSBmcmllbmQgcHJvZmVzcydkLAogICAgVG8gbWFuZ2xlIG1lIHdpdGggdGhhdCB3b3JkICdiYW5pc2hlZCcCgpGUklBUiBMQVVSRU5DRQoKICAgIFRob3UgZm9uZCBtYWQgbWFuLCBoZWFyIG1lIGJ1dCBzcGVhayBhIHdvcmQuCgpST01FTwoKICAgIE8sIHRob3Ugd2lsdCBzcGVhayBhZ2FpbiBvZiBiYW5pc2htZW50LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJJ2xsIGdpdmUgdGhlZSBhcm1vdXIgdG8ga2VlcCBvZmYgdGhhdCB3b3JkOgogICAgQWR2ZXJzaXR5J3Mgc3dlZXQgbWlsaywgcGhpbG9zb3BoeSwKICAgIFRvIGNvbWZvcnQgdGhlZSwgdGhvdWdoIHRob3UgYXJ0IGJhbmlzaGVkLgoKUk9NRU8KCiAgICBZZXQgJ2JhbmlzaGVkJz8gSGFuZyB1cCBwaGlsb3NvcGh5IQogICAgVW5sZXNzIHBoaWxvc29waHkgY2FuIG1ha2UgYSBKdWxpZXQsCiAgICBEaXNwbGFudCBhIHRvd24sIHJldmVyc2UgYSBwcmluY2UncyBkb29tLAogICAgSXQgaGVscHMgbm90LCBpdCBwcmV2YWlscyBub3Q6IHRhbGsgbm8gbW9yZS4KCkZSSUFSIExBVVJFTkNFCgogICAgTywgdGhlbiBJIHNlZSB0aGF0IG1hZG1lbiBoYXZlIG5vIGVhcnMuCgpST01FTwoKICAgIEhvdyBzaG91bGQgdGhleSwgd2hlbiB0aGF0IHdpc2UgbWVuIGhhdmUgbm8gZXllcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTGV0IG1lIGRpc3B1dGUgd2l0aCB0aGVlIG9mIHRoeSBlc3RhdGUuCgpST01FTwoKICAgIFRob3UgY2Fuc3Qgbm90IHNwZWFrIG9mIHRoYXQgdGhvdSBkb3N0IG5vdCBmZWVsOgogICAgV2VydCB0aG91IGFzIHlvdW5nIGFzIEksIEp1bGlldCB0aHkgbG92ZSwKICAgIEFuIGhvdXIgYnV0IG1hcnJpZWQsIFR5YmFsdCBtdXJkZXJlZCwKICAgIERvdGluZyBsaWtlIG1lIGFuZCBsaWtlIG1lIGJhbmlzaGVkLAogICAgVGhlbiBtaWdodHN0IHRob3Ugc3BlYWssIHRoZW4gbWlnaHRzdCB0aG91IHRlYXIgdGh5IGhhaXIsCiAgICBBbmQgZmFsbCB1cG9uIHRoZSBncm91bmQsIGFzIEkgZG8gbm93LAogICAgVGFraW5nIHRoZSBtZWFzdXJlIG9mIGFuIHVubWFkZSBncmF2ZS4KCiAgICBLbm9ja2luZyB3aXRoaW4KCkZSSUFSIExBVVJFTkNFCgogICAgQXJpc2U7IG9uZSBrbm9ja3M7IGdvb2QgUm9tZW8sIGhpZGUgdGh5c2VsZi4KClJPTUVPCgogICAgTm90IEk7IHVubGVzcyB0aGUgYnJlYXRoIG9mIGhlYXJ0c2ljayBncm9hbnMsCiAgICBNaXN0LWxpa2UsIGluZm9sZCBtZSBmcm9tIHRoZSBzZWFyY2ggb2YgZXllcy4KCiAgICBLbm9ja2luZwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIYXJrLCBob3cgdGhleSBrbm9jayEgV2hvJ3MgdGhlcmUIFJvbWVvLCBhcmlzZTsKICAgIFRob3Ugd2lsdCBiZSB0YWtlbi4gU3RheSBhd2hpbGUhIFN0YW5kIHVwOwoKICAgIEtub2NraW5nCiAgICBSdW4gdG8gbXkgc3R1ZHkuIEJ5IGFuZCBieSEgR29kJ3Mgd2lsbCwKICAgIFdoYXQgc2ltcGxlbmVzcyBpcyB0aGlzISBJIGNvbWUsIEkgY29tZSEKCiAgICBLbm9ja2luZwogICAgV2hvIGtub2NrcyBzbyBoYXJkPyB3aGVuY2UgY29tZSB5b3UIHdoYXQncyB5b3VyIHdpbGwCgpOdXJzZQoKICAgIFtXaXRoaW5dIExldCBtZSBjb21lIGluLCBhbmQgeW91IHNoYWxsIGtub3cKICAgIG15IGVycmFuZDsKICAgIEkgY29tZSBmcm9tIExhZHkgSnVsaWV0LgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXZWxjb21lLCB0aGVuLgoKICAgIEVudGVyIE51cnNlCgpOdXJzZQoKICAgIE8gaG9seSBmcmlhciwgTywgdGVsbCBtZSwgaG9seSBmcmlhciwKICAgIFdoZXJlIGlzIG15IGxhZHkncyBsb3JkLCB3aGVyZSdzIFJvbWVvPwoKRlJJQVIgTEFVUkVOQ0UKCiAgICBUaGVyZSBvbiB0aGUgZ3JvdW5kLCB3aXRoIGhpcyBvd24gdGVhcnMgbWFkZSBkcnVuay4KCk51cnNlCgogICAgTywgaGUgaXMgZXZlbiBpbiBteSBtaXN0cmVzcycgY2FzZSwKICAgIEp1c3QgaW4gaGVyIGNhc2UhIE8gd29mdWwgc3ltcGF0aHkhCiAgICBQaXRlb3VzIHByZWRpY2FtZW50ISBFdmVuIHNvIGxpZXMgc2hlLAogICAgQmx1YmJlcmluZyBhbmQgd2VlcGluZywgd2VlcGluZyBhbmQgYmx1YmJlcmluZy4KICAgIFN0YW5kIHVwLCBzdGFuZCB1cDsgc3RhbmQsIGFuZCB5b3UgYmUgYSBtYW46CiAgICBGb3IgSnVsaWV0J3Mgc2FrZSwgZm9yIGhlciBzYWtlLCByaXNlIGFuZCBzdGFuZDsKICAgIFdoeSBzaG91bGQgeW91IGZhbGwgaW50byBzbyBkZWVwIGFuIE8CgpST01FTwoKICAgIE51cnNlIQoKTnVyc2UKCiAgICBBaCBzaXIhIGFoIHNpciEgV2VsbCwgZGVhdGgncyB0aGUgZW5kIG9mIGFsbC4KClJPTUVPCgogICAgU3Bha2VzdCB0aG91IG9mIEp1bGlldD8gaG93IGlzIGl0IHdpdGggaGVyPwogICAgRG90aCBzaGUgbm90IHRoaW5rIG1lIGFuIG9sZCBtdXJkZXJlciwKICAgIE5vdyBJIGhhdmUgc3RhaW4nZCB0aGUgY2hpbGRob29kIG9mIG91ciBqb3kKICAgIFdpdGggYmxvb2QgcmVtb3ZlZCBidXQgbGl0dGxlIGZyb20gaGVyIG93bj8KICAgIFdoZXJlIGlzIHNoZT8gYW5kIGhvdyBkb3RoIHNoZT8gYW5kIHdoYXQgc2F5cwogICAgTXkgY29uY2VhbCdkIGxhZHkgdG8gb3VyIGNhbmNlbGwnZCBsb3ZlPwoKTnVyc2UKCiAgICBPLCBzaGUgc2F5cyBub3RoaW5nLCBzaXIsIGJ1dCB3ZWVwcyBhbmQgd2VlcHM7CiAgICBBbmQgbm93IGZhbGxzIG9uIGhlciBiZWQ7IGFuZCB0aGVuIHN0YXJ0cyB1cCwKICAgIEFuZCBUeWJhbHQgY2FsbHM7IGFuZCB0aGVuIG9uIFJvbWVvIGNyaWVzLAogICAgQW5kIHRoZW4gZG93biBmYWxscyBhZ2Fpbi4KClJPTUVPCgogICAgQXMgaWYgdGhhdCBuYW1lLAogICAgU2hvdCBmcm9tIHRoZSBkZWFkbHkgbGV2ZWwgb2YgYSBndW4sCiAgICBEaWQgbXVyZGVyIGhlcjsgYXMgdGhhdCBuYW1lJ3MgY3Vyc2VkIGhhbmQKICAgIE11cmRlcidkIGhlciBraW5zbWFuLiBPLCB0ZWxsIG1lLCBmcmlhciwgdGVsbCBtZSwKICAgIEluIHdoYXQgdmlsZSBwYXJ0IG9mIHRoaXMgYW5hdG9teQogICAgRG90aCBteSBuYW1lIGxvZGdlPyB0ZWxsIG1lLCB0aGF0IEkgbWF5IHNhY2sKICAgIFRoZSBoYXRlZnVsIG1hbnNpb24uCgogICAgRHJhd2luZyBoaXMgc3dvcmQKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZCB0aHkgZGVzcGVyYXRlIGhhbmQ6CiAgICBBcnQgdGhvdSBhIG1hbj8gdGh5IGZvcm0gY3JpZXMgb3V0IHRob3UgYXJ0OgogICAgVGh5IHRlYXJzIGFyZSB3b21hbmlzaDsgdGh5IHdpbGQgYWN0cyBkZW5vdGUKICAgIFRoZSB1bnJlYXNvbmFibGUgZnVyeSBvZiBhIGJlYXN0OgogICAgVW5zZWVtbHkgd29tYW4gaW4gYSBzZWVtaW5nIG1hbiEKICAgIE9yIGlsbC1iZXNlZW1pbmcgYmVhc3QgaW4gc2VlbWluZyBib3RoIQogICAgVGhvdSBoYXN0IGFtYXplZCBtZTogYnkgbXkgaG9seSBvcmRlciwKICAgIEkgdGhvdWdodCB0aHkgZGlzcG9zaXRpb24gYmV0dGVyIHRlbXBlcidkLgogICAgSGFzdCB0aG91IHNsYWluIFR5YmFsdD8gd2lsdCB0aG91IHNsYXkgdGh5c2VsZj8KICAgIEFuZCBzdGF5IHRoeSBsYWR5IHRvbyB0aGF0IGxpdmVzIGluIHRoZWUsCiAgICBCeSBkb2luZyBkYW1uZWQgaGF0ZSB1cG9uIHRoeXNlbGYCiAgICBXaHkgcmFpbCdzdCB0aG91IG9uIHRoeSBiaXJ0aCwgdGhlIGhlYXZlbiwgYW5kIGVhcnRoPwogICAgU2luY2UgYmlydGgsIGFuZCBoZWF2ZW4sIGFuZCBlYXJ0aCwgYWxsIHRocmVlIGRvIG1lZXQKICAgIEluIHRoZWUgYXQgb25jZTsgd2hpY2ggdGhvdSBhdCBvbmNlIHdvdWxkc3QgbG9zZS4KICAgIEZpZSwgZmllLCB0aG91IHNoYW1lc3QgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDsKICAgIFdoaWNoLCBsaWtlIGEgdXN1cmVyLCBhYm91bmQnc3QgaW4gYWxsLAogICAgQW5kIHVzZXN0IG5vbmUgaW4gdGhhdCB0cnVlIHVzZSBpbmRlZWQKICAgIFdoaWNoIHNob3VsZCBiZWRlY2sgdGh5IHNoYXBlLCB0aHkgbG92ZSwgdGh5IHdpdDoKICAgIFRoeSBub2JsZSBzaGFwZSBpcyBidXQgYSBmb3JtIG9mIHdheCwKICAgIERpZ3Jlc3NpbmcgZnJvbSB0aGUgdmFsb3VyIG9mIGEgbWFuOwogICAgVGh5IGRlYXIgbG92ZSBzd29ybiBidXQgaG9sbG93IHBlcmp1cnksCiAgICBLaWxsaW5nIHRoYXQgbG92ZSB3aGljaCB0aG91IGhhc3Qgdm93J2QgdG8gY2hlcmlzaDsKICAgIFRoeSB3aXQsIHRoYXQgb3JuYW1lbnQgdG8gc2hhcGUgYW5kIGxvdmUsCiAgICBNaXNzaGFwZW4gaW4gdGhlIGNvbmR1Y3Qgb2YgdGhlbSBib3RoLAogICAgTGlrZSBwb3dkZXIgaW4gYSBza2l0bGVzcyBzb2xkaWVyJ3MgZmxhc2ssCiAgICBJcyBzZXQgYWZpcmUgYnkgdGhpbmUgb3duIGlnbm9yYW5jZSwKICAgIEFuZCB0aG91IGRpc21lbWJlcidkIHdpdGggdGhpbmUgb3duIGRlZmVuY2UuCiAgICBXaGF0LCByb3VzZSB0aGVlLCBtYW4hIHRoeSBKdWxpZXQgaXMgYWxpdmUsCiAgICBGb3Igd2hvc2UgZGVhciBzYWtlIHRob3Ugd2FzdCBidXQgbGF0ZWx5IGRlYWQ7CiAgICBUaGVyZSBhcnQgdGhvdSBoYXBweTogVHliYWx0IHdvdWxkIGtpbGwgdGhlZSwKICAgIEJ1dCB0aG91IHNsZXcnc3QgVHliYWx0OyB0aGVyZSBhcmUgdGhvdSBoYXBweSB0b286CiAgICBUaGUgbGF3IHRoYXQgdGhyZWF0ZW4nZCBkZWF0aCBiZWNvbWVzIHRoeSBmcmllbmQKICAgIEFuZCB0dXJucyBpdCB0byBleGlsZTsgdGhlcmUgYXJ0IHRob3UgaGFwcHk6CiAgICBBIHBhY2sgb2YgYmxlc3NpbmdzIGxpZ2h0cyB1cCB1cG9uIHRoeSBiYWNrOwogICAgSGFwcGluZXNzIGNvdXJ0cyB0aGVlIGluIGhlciBiZXN0IGFycmF5OwogICAgQnV0LCBsaWtlIGEgbWlzYmVoYXZlZCBhbmQgc3VsbGVuIHdlbmNoLAogICAgVGhvdSBwb3V0J3N0IHVwb24gdGh5IGZvcnR1bmUgYW5kIHRoeSBsb3ZlOgogICAgVGFrZSBoZWVkLCB0YWtlIGhlZWQsIGZvciBzdWNoIGRpZSBtaXNlcmFibGUuCiAgICBHbywgZ2V0IHRoZWUgdG8gdGh5IGxvdmUsIGFzIHdhcyBkZWNyZWVkLAogICAgQXNjZW5kIGhlciBjaGFtYmVyLCBoZW5jZSBhbmQgY29tZm9ydCBoZXI6CiAgICBCdXQgbG9vayB0aG91IHN0YXkgbm90IHRpbGwgdGhlIHdhdGNoIGJlIHNldCwKICAgIEZvciB0aGVuIHRob3UgY2Fuc3Qgbm90IHBhc3MgdG8gTWFudHVhOwogICAgV2hlcmUgdGhvdSBzaGFsdCBsaXZlLCB0aWxsIHdlIGNhbiBmaW5kIGEgdGltZQogICAgVG8gYmxhemUgeW91ciBtYXJyaWFnZSwgcmVjb25jaWxlIHlvdXIgZnJpZW5kcywKICAgIEJlZyBwYXJkb24gb2YgdGhlIHByaW5jZSwgYW5kIGNhbGwgdGhlZSBiYWNrCiAgICBXaXRoIHR3ZW50eSBodW5kcmVkIHRob3VzYW5kIHRpbWVzIG1vcmUgam95CiAgICBUaGFuIHRob3Ugd2VudCdzdCBmb3J0aCBpbiBsYW1lbnRhdGlvbi4KICAgIEdvIGJlZm9yZSwgbnVyc2U6IGNvbW1lbmQgbWUgdG8gdGh5IGxhZHk7CiAgICBBbmQgYmlkIGhlciBoYXN0ZW4gYWxsIHRoZSBob3VzZSB0byBiZWQsCiAgICBXaGljaCBoZWF2eSBzb3Jyb3cgbWFrZXMgdGhlbSBhcHQgdW50bzoKICAgIFJvbWVvIGlzIGNvbWluZy4KCk51cnNlCgogICAgTyBMb3JkLCBJIGNvdWxkIGhhdmUgc3RheSdkIGhlcmUgYWxsIHRoZSBuaWdodAogICAgVG8gaGVhciBnb29kIGNvdW5zZWw6IE8sIHdoYXQgbGVhcm5pbmcgaXMhCiAgICBNeSBsb3JkLCBJJ2xsIHRlbGwgbXkgbGFkeSB5b3Ugd2lsbCBjb21lLgoKUk9NRU8KCiAgICBEbyBzbywgYW5kIGJpZCBteSBzd2VldCBwcmVwYXJlIHRvIGNoaWRlLgoKTnVyc2UKCiAgICBIZXJlLCBzaXIsIGEgcmluZyBzaGUgYmlkIG1lIGdpdmUgeW91LCBzaXI6CiAgICBIaWUgeW91LCBtYWtlIGhhc3RlLCBmb3IgaXQgZ3Jvd3MgdmVyeSBsYXRlLgoKICAgIEV4aXQKClJPTUVPCgogICAgSG93IHdlbGwgbXkgY29tZm9ydCBpcyByZXZpdmVkIGJ5IHRoaXMhCgpGUklBUiBMQVVSRU5DRQoKICAgIEdvIGhlbmNlOyBnb29kIG5pZ2h0OyBhbmQgaGVyZSBzdGFuZHMgYWxsIHlvdXIgc3RhdGU6CiAgICBFaXRoZXIgYmUgZ29uZSBiZWZvcmUgdGhlIHdhdGNoIGJlIHNldCwKICAgIE9yIGJ5IHRoZSBicmVhayBvZiBkYXkgZGlzZ3Vpc2VkIGZyb20gaGVuY2U6CiAgICBTb2pvdXJuIGluIE1hbnR1YTsgSSdsbCBmaW5kIG91dCB5b3VyIG1hbiwKICAgIEFuZCBoZSBzaGFsbCBzaWduaWZ5IGZyb20gdGltZSB0byB0aW1lCiAgICBFdmVyeSBnb29kIGhhcCB0byB5b3UgdGhhdCBjaGFuY2VzIGhlcmU6CiAgICBHaXZlIG1lIHRoeSBoYW5kOyAndGlzIGxhdGU6IGZhcmV3ZWxsOyBnb29kIG5pZ2h0LgoKUk9NRU8KCiAgICBCdXQgdGhhdCBhIGpveSBwYXN0IGpveSBjYWxscyBvdXQgb24gbWUsCiAgICBJdCB3ZXJlIGEgZ3JpZWYsIHNvIGJyaWVmIHRvIHBhcnQgd2l0aCB0aGVlOiBGYXJld2VsbC4KCiAgICBFeGV1bnQKClNDRU5FIElWLiBBIHJvb20gaW4gQ2FwdWxldCdzIGhvdXNlLgoKICAgIEVudGVyIENBUFVMRVQsIExBRFkgQ0FQVUxFVCwgYW5kIFBBUklTIAoKQ0FQVUxFVAoKICAgIFRoaW5ncyBoYXZlIGZhbGwnbiBvdXQsIHNpciwgc28gdW5sdWNraWx5LAogICAgVGhhdCB3ZSBoYXZlIGhhZCBubyB0aW1lIHRvIG1vdmUgb3VyIGRhdWdodGVyOgogICAgTG9vayB5b3UsIHNoZSBsb3ZlZCBoZXIga2luc21hbiBUeWJhbHQgZGVhcmx5LAogICAgQW5kIHNvIGRpZCBJOi0tV2VsbCwgd2Ugd2VyZSBib3JuIHRvIGRpZS4KICAgICdUaXMgdmVyeSBsYXRlLCBzaGUnbGwgbm90IGNvbWUgZG93biB0by1uaWdodDoKICAgIEkgcHJvbWlzZSB5b3UsIGJ1dCBmb3IgeW91ciBjb21wYW55LAogICAgSSB3b3VsZCBoYXZlIGJlZW4gYS1iZWQgYW4gaG91ciBhZ28uCgpQQVJJUwoKICAgIFRoZXNlIHRpbWVzIG9mIHdvZSBhZmZvcmQgbm8gdGltZSB0byB3b28uCiAgICBNYWRhbSwgZ29vZCBuaWdodDogY29tbWVuZCBtZSB0byB5b3VyIGRhdWdodGVyLgoKTEFEWSBDQVBVTEVUCgogICAgSSB3aWxsLCBhbmQga25vdyBoZXIgbWluZCBlYXJseSB0by1tb3Jyb3c7CiAgICBUby1uaWdodCBzaGUgaXMgbWV3J2QgdXAgdG8gaGVyIGhlYXZpbmVzcy4KCkNBUFVMRVQKCiAgICBTaXIgUGFyaXMsIEkgd2lsbCBtYWtlIGEgZGVzcGVyYXRlIHRlbmRlcgogICAgT2YgbXkgY2hpbGQncyBsb3ZlOiBJIHRoaW5rIHNoZSB3aWxsIGJlIHJ1bGVkCiAgICBJbiBhbGwgcmVzcGVjdHMgYnkgbWU7IG5heSwgbW9yZSwgSSBkb3VidCBpdCBub3QuCiAgICBXaWZlLCBnbyB5b3UgdG8gaGVyIGVyZSB5b3UgZ28gdG8gYmVkOwogICAgQWNxdWFpbnQgaGVyIGhlcmUgb2YgbXkgc29uIFBhcmlzJyBsb3ZlOwogICAgQW5kIGJpZCBoZXIsIG1hcmsgeW91IG1lLCBvbiBXZWRuZXNkYXkgbmV4dC0tCiAgICBCdXQsIHNvZnQhIHdoYXQgZGF5IGlzIHRoaXMCgpQQVJJUwoKICAgIE1vbmRheSwgbXkgbG9yZCwKCkNBUFVMRVQKCiAgICBNb25kYXkhIGhhLCBoYSEgV2VsbCwgV2VkbmVzZGF5IGlzIHRvbyBzb29uLAogICAgTycgVGh1cnNkYXkgbGV0IGl0IGJlOiBvJyBUaHVyc2RheSwgdGVsbCBoZXIsCiAgICBTaGUgc2hhbGwgYmUgbWFycmllZCB0byB0aGlzIG5vYmxlIGVhcmwuCiAgICBXaWxsIHlvdSBiZSByZWFkeT8gZG8geW91IGxpa2UgdGhpcyBoYXN0ZT8KICAgIFdlJ2xsIGtlZXAgbm8gZ3JlYXQgYWRvLC0tYSBmcmllbmQgb3IgdHdvOwogICAgRm9yLCBoYXJrIHlvdSwgVHliYWx0IGJlaW5nIHNsYWluIHNvIGxhdGUsCiAgICBJdCBtYXkgYmUgdGhvdWdodCB3ZSBoZWxkIGhpbSBjYXJlbGVzc2x5LAogICAgQmVpbmcgb3VyIGtpbnNtYW4sIGlmIHdlIHJldmVsIG11Y2g6CiAgICBUaGVyZWZvcmUgd2UnbGwgaGF2ZSBzb21lIGhhbGYgYSBkb3plbiBmcmllbmRzLAogICAgQW5kIHRoZXJlIGFuIGVuZC4gQnV0IHdoYXQgc2F5IHlvdSB0byBUaHVyc2RheT8KClBBUklTCgogICAgTXkgbG9yZCwgSSB3b3VsZCB0aGF0IFRodXJzZGF5IHdlcmUgdG8tbW9ycm93LgoKQ0FQVUxFVAoKICAgIFdlbGwgZ2V0IHlvdSBnb25lOiBvJyBUaHVyc2RheSBiZSBpdCwgdGhlbi4KICAgIEdvIHlvdSB0byBKdWxpZXQgZXJlIHlvdSBnbyB0byBiZWQsCiAgICBQcmVwYXJlIGhlciwgd2lmZSwgYWdhaW5zdCB0aGlzIHdlZGRpbmctZGF5LgogICAgRmFyZXdlbGwsIG15IGxvcmQuIExpZ2h0IHRvIG15IGNoYW1iZXIsIGhvIQogICAgQWZvcmUgbWUhIGl0IGlzIHNvIHZlcnkgdmVyeSBsYXRlLAogICAgVGhhdCB3ZSBtYXkgY2FsbCBpdCBlYXJseSBieSBhbmQgYnkuCiAgICBHb29kIG5pZ2h0LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gQ2FwdWxldCdzIG9yY2hhcmQuCgogICAgRW50ZXIgUk9NRU8gYW5kIEpVTElFVCBhYm92ZSwgYXQgdGhlIHdpbmRvdyAKCkpVTElFVAoKICAgIFdpbHQgdGhvdSBiZSBnb25lPyBpdCBpcyBub3QgeWV0IG5lYXIgZGF5OgogICAgSXQgd2FzIHRoZSBuaWdodGluZ2FsZSwgYW5kIG5vdCB0aGUgbGFyaywKICAgIFRoYXQgcGllcmNlZCB0aGUgZmVhcmZ1bCBob2xsb3cgb2YgdGhpbmUgZWFyOwogICAgTmlnaHRseSBzaGUgc2luZ3Mgb24geW9uIHBvbWVncmFuYXRlLXRyZWU6CiAgICBCZWxpZXZlIG1lLCBsb3ZlLCBpdCB3YXMgdGhlIG5pZ2h0aW5nYWxlLgoKUk9NRU8KCiAgICBJdCB3YXMgdGhlIGxhcmssIHRoZSBoZXJhbGQgb2YgdGhlIG1vcm4sCiAgICBObyBuaWdodGluZ2FsZTogbG9vaywgbG92ZSwgd2hhdCBlbnZpb3VzIHN0cmVha3MKICAgIERvIGxhY2UgdGhlIHNldmVyaW5nIGNsb3VkcyBpbiB5b25kZXIgZWFzdDoKICAgIE5pZ2h0J3MgY2FuZGxlcyBhcmUgYnVybnQgb3V0LCBhbmQgam9jdW5kIGRheQogICAgU3RhbmRzIHRpcHRvZSBvbiB0aGUgbWlzdHkgbW91bnRhaW4gdG9wcy4KICAgIEkgbXVzdCBiZSBnb25lIGFuZCBsaXZlLCBvciBzdGF5IGFuZCBkaWUuCgpKVUxJRVQKCiAgICBZb24gbGlnaHQgaXMgbm90IGRheS1saWdodCwgSSBrbm93IGl0LCBJOgogICAgSXQgaXMgc29tZSBtZXRlb3IgdGhhdCB0aGUgc3VuIGV4aGFsZXMsCiAgICBUbyBiZSB0byB0aGVlIHRoaXMgbmlnaHQgYSB0b3JjaC1iZWFyZXIsCiAgICBBbmQgbGlnaHQgdGhlZSBvbiB0aHkgd2F5IHRvIE1hbnR1YToKICAgIFRoZXJlZm9yZSBzdGF5IHlldDsgdGhvdSBuZWVkJ3N0IG5vdCB0byBiZSBnb25lLgoKUk9NRU8KCiAgICBMZXQgbWUgYmUgdGEnZW4sIGxldCBtZSBiZSBwdXQgdG8gZGVhdGg7CiAgICBJIGFtIGNvbnRlbnQsIHNvIHRob3Ugd2lsdCBoYXZlIGl0IHNvLgogICAgSSdsbCBzYXkgeW9uIGdyZXkgaXMgbm90IHRoZSBtb3JuaW5nJ3MgZXllLAogICAgJ1RpcyBidXQgdGhlIHBhbGUgcmVmbGV4IG9mIEN5bnRoaWEncyBicm93OwogICAgTm9yIHRoYXQgaXMgbm90IHRoZSBsYXJrLCB3aG9zZSBub3RlcyBkbyBiZWF0CiAgICBUaGUgdmF1bHR5IGhlYXZlbiBzbyBoaWdoIGFib3ZlIG91ciBoZWFkczoKICAgIEkgaGF2ZSBtb3JlIGNhcmUgdG8gc3RheSB0aGFuIHdpbGwgdG8gZ286CiAgICBDb21lLCBkZWF0aCwgYW5kIHdlbGNvbWUhIEp1bGlldCB3aWxscyBpdCBzby4KICAgIEhvdyBpcyd0LCBteSBzb3VsPyBsZXQncyB0YWxrOyBpdCBpcyBub3QgZGF5LgoKSlVMSUVUCgogICAgSXQgaXMsIGl0IGlzOiBoaWUgaGVuY2UsIGJlIGdvbmUsIGF3YXkhCiAgICBJdCBpcyB0aGUgbGFyayB0aGF0IHNpbmdzIHNvIG91dCBvZiB0dW5lLAogICAgU3RyYWluaW5nIGhhcnNoIGRpc2NvcmRzIGFuZCB1bnBsZWFzaW5nIHNoYXJwcy4KICAgIFNvbWUgc2F5IHRoZSBsYXJrIG1ha2VzIHN3ZWV0IGRpdmlzaW9uOwogICAgVGhpcyBkb3RoIG5vdCBzbywgZm9yIHNoZSBkaXZpZGV0aCB1czoKICAgIFNvbWUgc2F5IHRoZSBsYXJrIGFuZCBsb2F0aGVkIHRvYWQgY2hhbmdlIGV5ZXMsCiAgICBPLCBub3cgSSB3b3VsZCB0aGV5IGhhZCBjaGFuZ2VkIHZvaWNlcyB0b28hCiAgICBTaW5jZSBhcm0gZnJvbSBhcm0gdGhhdCB2b2ljZSBkb3RoIHVzIGFmZnJheSwKICAgIEh1bnRpbmcgdGhlZSBoZW5jZSB3aXRoIGh1bnQnc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cmUgd2VlcGluZyBmb3IgeW91ciBjb3VzaW4ncyBkZWF0aD8KICAgIFdoYXQsIHdpbHQgdGhvdSB3YXNoIGhpbSBmcm9tIGhpcyBncmF2ZSB3aXRoIHRlYXJzPwogICAgQW4gaWYgdGhvdSBjb3VsZHN0LCB0aG91IGNvdWxkc3Qgbm90IG1ha2UgaGltIGxpdmU7CiAgICBUaGVyZWZvcmUsIGhhdmUgZG9uZTogc29tZSBncmllZiBzaG93cyBtdWNoIG9mIGxvdmU7CiAgICBCdXQgbXVjaCBvZiBncmllZiBzaG93cyBzdGlsbCBzb21lIHdhbnQgb2Ygd2l0LgoKSlVMSUVUCgogICAgWWV0IGxldCBtZSB3ZWVwIGZvciBzdWNoIGEgZmVlbGluZyBsb3NzLgoKTEFEWSBDQVBVTEVUCgogICAgU28gc2hhbGwgeW91IGZlZWwgdGhlIGxvc3MsIGJ1dCBub3QgdGhlIGZyaWVuZAogICAgV2hpY2ggeW91IHdlZXAgZm9yLgoKSlVMSUVUCgogICAgRmVlbGluZyBzbyB0aGUgbG9zcywKICAgIENhbm5vdCBjaG9vc2UgYnV0IGV2ZXIgd2VlcCB0aGUgZnJpZW5kLgoKTEFEWSBDQVBVTEVUCgogICAgV2VsbCwgZ2lybCwgdGhvdSB3ZWVwJ3N0IG5vdCBzbyBtdWNoIGZvciBoaXMgZGVhdGgsCiAgICBBcyB0aGF0IHRoZSB2aWxsYWluIGxpdmVzIHdoaWNoIHNsYXVnaHRlcidkIGhpbS4KCkpVTElFVAoKICAgIFdoYXQgdmlsbGFpbiBtYWRhbT8KCkxBRFkgQ0FQVUxFVAoKICAgIFRoYXQgc2FtZSB2aWxsYWluLCBSb21lby4KCkpVTElFVAoKICAgIFtBc2lkZV0gVmlsbGFpbiBhbmQgaGUgYmUgbWFueSBtaWxlcyBhc3VuZGVyLi0tCiAgICBHb2QgUGFyZG9uIGhpbSEgSSBkbywgd2l0aCBhbGwgbXkgaGVhcnQ7CiAgICBBbmQgeWV0IG5vIG1hbiBsaWtlIGhlIGRvdGggZ3JpZXZlIG15IGhlYXJ0LgoKTEFEWSBDQVBVTEVUCgogICAgVGhhdCBpcywgYmVjYXVzZSB0aGUgdHJhaXRvciBtdXJkZXJlciBsaXZlcy4KCkpVTElFVAoKICAgIEF5LCBtYWRhbSwgZnJvbSB0aGUgcmVhY2ggb2YgdGhlc2UgbXkgaGFuZHM6CiAgICBXb3VsZCBub25lIGJ1dCBJIG1pZ2h0IHZlbmdlIG15IGNvdXNpbidzIGRlYXRoIQoKTEFEWSBDQVBVTEVUCgogICAgV2Ugd2lsbCBoYXZlIHZlbmdlYW5jZSBmb3IgaXQsIGZlYXIgdGhvdSBub3Q6CiAgICBUaGVuIHdlZXAgbm8gbW9yZS4gSSdsbCBzZW5kIHRvIG9uZSBpbiBNYW50dWEsCiAgICBXaGVyZSB0aGF0IHNhbWUgYmFuaXNoJ2QgcnVuYWdhdGUgZG90aCBsaXZlLAogICAgU2hhbGwgZ2l2ZSBoaW0gc3VjaCBhbiB1bmFjY3VzdG9tJ2QgZHJhbSwKICAgIFRoYXQgaGUgc2hhbGwgc29vbiBrZWVwIFR5YmFsdCBjb21wYW55OgogICAgQW5kIHRoZW4sIEkgaG9wZSwgdGhvdSB3aWx0IGJlIHNhdGlzZmllZC4KCkpVTElFVAoKICAgIEluZGVlZCwgSSBuZXZlciBzaGFsbCBiZSBzYXRpc2ZpZWQKICAgIFdpdGggUm9tZW8sIHRpbGwgSSBiZWhvbGQgaGltLS1kZWFkLS0KICAgIElzIG15IHBvb3IgaGVhcnQgZm9yIGEga2luc21hbiB2ZXgnZC4KICAgIE1hZGFtLCBpZiB5b3UgY291bGQgZmluZCBvdXQgYnV0IGEgbWFuCiAgICBUbyBiZWFyIGEgcG9pc29uLCBJIHdvdWxkIHRlbXBlciBpdDsKICAgIFRoYXQgUm9tZW8gc2hvdWxkLCB1cG9uIHJlY2VpcHQgdGhlcmVvZiwKICAgIFNvb24gc2xlZXAgaW4gcXVpZXQuIE8sIGhvdyBteSBoZWFydCBhYmhvcnMKICAgIFRvIGhlYXIgaGltIG5hbWVkLCBhbmQgY2Fubm90IGNvbWUgdG8gaGltLgogICAgVG8gd3JlYWsgdGhlIGxvdmUgSSBib3JlIG15IGNvdXNpbgogICAgVXBvbiBoaXMgYm9keSB0aGF0IHNsYXVnaHRlcidkIGhpbSEKCkxBRFkgQ0FQVUxFVAoKICAgIEZpbmQgdGhvdSB0aGUgbWVhbnMsIGFuZCBJJ2xsIGZpbmQgc3VjaCBhIG1hbi4KICAgIEJ1dCBub3cgSSdsbCB0ZWxsIHRoZWUgam95ZnVsIHRpZGluZ3MsIGdpcmwuCgpKVUxJRVQKCiAgICBBbmQgam95IGNvbWVzIHdlbGwgaW4gc3VjaCBhIG5lZWR5IHRpbWU6CiAgICBXaGF0IGFyZSB0aGV5LCBJIGJlc2VlY2ggeW91ciBsYWR5c2hpcD8KCkxBRFkgQ0FQVUxFVAoKICAgIFdlbGwsIHdlbGwsIHRob3UgaGFzdCBhIGNhcmVmdWwgZmF0aGVyLCBjaGlsZDsKICAgIE9uZSB3aG8sIHRvIHB1dCB0aGVlIGZyb20gdGh5IGhlYXZpbmVzcywKICAgIEhhdGggc29ydGVkIG91dCBhIHN1ZGRlbiBkYXkgb2Ygam95LAogICAgVGhhdCB0aG91IGV4cGVjdCdzdCBub3Qgbm9yIEkgbG9vaydkIG5vdCBmb3IuCgpKVUxJRVQKCiAgICBNYWRhbSwgaW4gaGFwcHkgdGltZSwgd2hhdCBkYXkgaXMgdGhhdD8KCkxBRFkgQ0FQVUxFVAoKICAgIE1hcnJ5LCBteSBjaGlsZCwgZWFybHkgbmV4dCBUaHVyc2RheSBtb3JuLAogICAgVGhlIGdhbGxhbnQsIHlvdW5nIGFuZCBub2JsZSBnZW50bGVtYW4sCiAgICBUaGUgQ291bnR5IFBhcmlzLCBhdCBTYWludCBQZXRlcidzIENodXJjaCwKICAgIFNoYWxsIGhhcHBpbHkgbWFrZSB0aGVlIHRoZXJlIGEgam95ZnVsIGJyaWRlLgoKSlVMSUVUCgogICAgTm93LCBieSBTYWludCBQZXRlcidzIENodXJjaCBhbmQgUGV0ZXIgdG9vLAogICAgSGUgc2hhbGwgbm90IG1ha2UgbWUgdGhlcmUgYSBqb3lmdWwgYnJpZGUuCiAgICBJIHdvbmRlciBhdCB0aGlzIGhhc3RlOyB0aGF0IEkgbXVzdCB3ZWQKICAgIEVyZSBoZSwgdGhhdCBzaG91bGQgYmUgaHVzYmFuZCwgY29tZXMgdG8gd29vLgogICAgSSBwcmF5IHlvdSwgdGVsbCBteSBsb3JkIGFuZCBmYXRoZXIsIG1hZGFtLAogICAgSSB3aWxsIG5vdCBtYXJyeSB5ZXQ7IGFuZCwgd2hlbiBJIGRvLCBJIHN3ZWFyLAogICAgSXQgc2hhbGwgYmUgUm9tZW8sIHdob20geW91IGtub3cgSSBoYXRlLAogICAgUmF0aGVyIHRoYW4gUGFyaXMuIFRoZXNlIGFyZSBuZXdzIGluZGVlZCEKCkxBRFkgQ0FQVUxFVAoKICAgIEhlcmUgY29tZXMgeW91ciBmYXRoZXI7IHRlbGwgaGltIHNvIHlvdXJzZWxmLAogICAgQW5kIHNlZSBob3cgaGUgd2lsbCB0YWtlIGl0IGF0IHlvdXIgaGFuZHMuCgogICAgRW50ZXIgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBXaGVuIHRoZSBzdW4gc2V0cywgdGhlIGFpciBkb3RoIGRyaXp6bGUgZGV3OwogICAgQnV0IGZvciB0aGUgc3Vuc2V0IG9mIG15IGJyb3RoZXIncyBzb24KICAgIEl0IHJhaW5zIGRvd25yaWdodC4KICAgIEhvdyBub3chIGEgY29uZHVpdCwgZ2lybD8gd2hhdCwgc3RpbGwgaW4gdGVhcnMCiAgICBFdmVybW9yZSBzaG93ZXJpbmcIEluIG9uZSBsaXR0bGUgYm9keQogICAgVGhvdSBjb3VudGVyZmVpdCdzdCBhIGJhcmssIGEgc2VhLCBhIHdpbmQ7CiAgICBGb3Igc3RpbGwgdGh5IGV5ZXMsIHdoaWNoIEkgbWF5IGNhbGwgdGhlIHNlYSwKICAgIERvIGViYiBhbmQgZmxvdyB3aXRoIHRlYXJzOyB0aGUgYmFyayB0aHkgYm9keSBpcywKICAgIFNhaWxpbmcgaW4gdGhpcyBzYWx0IGZsb29kOyB0aGUgd2luZHMsIHRoeSBzaWdoczsKICAgIFdobywgcmFnaW5nIHdpdGggdGh5IHRlYXJzLCBhbmQgdGhleSB3aXRoIHRoZW0sCiAgICBXaXRob3V0IGEgc3VkZGVuIGNhbG0sIHdpbGwgb3ZlcnNldAogICAgVGh5IHRlbXBlc3QtdG9zc2VkIGJvZHkuIEhvdyBub3csIHdpZmUhCiAgICBIYXZlIHlvdSBkZWxpdmVyJ2QgdG8gaGVyIG91ciBkZWNyZWUCgpMQURZIENBUFVMRVQKCiAgICBBeSwgc2lyOyBidXQgc2hlIHdpbGwgbm9uZSwgc2hlIGdpdmVzIHlvdSB0aGFua3MuCiAgICBJIHdvdWxkIHRoZSBmb29sIHdlcmUgbWFycmllZCB0byBoZXIgZ3JhdmUhCgpDQVBVTEVUCgogICAgU29mdCEgdGFrZSBtZSB3aXRoIHlvdSwgdGFrZSBtZSB3aXRoIHlvdSwgd2lmZS4KICAgIEhvdyEgd2lsbCBzaGUgbm9uZT8gZG90aCBzaGUgbm90IGdpdmUgdXMgdGhhbmtzPwogICAgSXMgc2hlIG5vdCBwcm91ZD8gZG90aCBzaGUgbm90IGNvdW50IGhlciBibGVzdCwKICAgIFVud29ydGh5IGFzIHNoZSBpcywgdGhhdCB3ZSBoYXZlIHdyb3VnaHQKICAgIFNvIHdvcnRoeSBhIGdlbnRsZW1hbiB0byBiZSBoZXIgYnJpZGVncm9vbT8KCkpVTElFVAoKICAgIE5vdCBwcm91ZCwgeW91IGhhdmU7IGJ1dCB0aGFua2Z1bCwgdGhhdCB5b3UgaGF2ZToKICAgIFByb3VkIGNhbiBJIG5ldmVyIGJlIG9mIHdoYXQgSSBoYXRlOwogICAgQnV0IHRoYW5rZnVsIGV2ZW4gZm9yIGhhdGUsIHRoYXQgaXMgbWVhbnQgbG92ZS4KCkNBUFVMRVQKCiAgICBIb3cgbm93LCBob3cgbm93LCBjaG9wLWxvZ2ljISBXaGF0IGlzIHRoaXMCiAgICAnUHJvdWQsJyBhbmQgJ0kgdGhhbmsgeW91LCcgYW5kICdJIHRoYW5rIHlvdSBub3Q7JwogICAgQW5kIHlldCAnbm90IHByb3VkLCcgbWlzdHJlc3MgbWluaW9uLCB5b3UsCiAgICBUaGFuayBtZSBubyB0aGFua2luZ3MsIG5vciwgcHJvdWQgbWUgbm8gcHJvdWRzLAogICAgQnV0IGZldHRsZSB5b3VyIGZpbmUgam9pbnRzICdnYWluc3QgVGh1cnNkYXkgbmV4dCwKICAgIFRvIGdvIHdpdGggUGFyaXMgdG8gU2FpbnQgUGV0ZXIncyBDaHVyY2gsCiAgICBPciBJIHdpbGwgZHJhZyB0aGVlIG9uIGEgaHVyZGxlIHRoaXRoZXIuCiAgICBPdXQsIHlvdSBncmVlbi1zaWNrbmVzcyBjYXJyaW9uISBvdXQsIHlvdSBiYWdnYWdlIQogICAgWW91IHRhbGxvdy1mYWNlIQoKTEFEWSBDQVBVTEVUCgogICAgRmllLCBmaWUhIHdoYXQsIGFyZSB5b3UgbWFkPwoKSlVMSUVUCgogICAgR29vZCBmYXRoZXIsIEkgYmVzZWVjaCB5b3Ugb24gbXkga25lZXMsCiAgICBIZWFyIG1lIHdpdGggcGF0aWVuY2UgYnV0IHRvIHNwZWFrIGEgd29yZC4KCkNBUFVMRVQKCiAgICBIYW5nIHRoZWUsIHlvdW5nIGJhZ2dhZ2UhIGRpc29iZWRpZW50IHdyZXRjaCEKICAgIEkgdGVsbCB0aGVlIHdoYXQ6IGdldCB0aGVlIHRvIGNodXJjaCBvJyBUaHVyc2RheSwKICAgIE9yIG5ldmVyIGFmdGVyIGxvb2sgbWUgaW4gdGhlIGZhY2U6CiAgICBTcGVhayBub3QsIHJlcGx5IG5vdCwgZG8gbm90IGFuc3dlciBtZTsKICAgIE15IGZpbmdlcnMgaXRjaC4gV2lmZSwgd2Ugc2NhcmNlIHRob3VnaHQgdXMgYmxlc3QKICAgIFRoYXQgR29kIGhhZCBsZW50IHVzIGJ1dCB0aGlzIG9ubHkgY2hpbGQ7CiAgICBCdXQgbm93IEkgc2VlIHRoaXMgb25lIGlzIG9uZSB0b28gbXVjaCwKICAgIEFuZCB0aGF0IHdlIGhhdmUgYSBjdXJzZSBpbiBoYXZpbmcgaGVyOgogICAgT3V0IG9uIGhlciwgaGlsZGluZyEKCk51cnNlCgogICAgR29kIGluIGhlYXZlbiBibGVzcyBoZXIhCiAgICBZb3UgYXJlIHRvIGJsYW1lLCBteSBsb3JkLCB0byByYXRlIGhlciBzby4KCkNBUFVMRVQKCiAgICBBbmQgd2h5LCBteSBsYWR5IHdpc2RvbT8gaG9sZCB5b3VyIHRvbmd1ZSwKICAgIEdvb2QgcHJ1ZGVuY2U7IHNtYXR0ZXIgd2l0aCB5b3VyIGdvc3NpcHMsIGdvLgoKTnVyc2UKCiAgICBJIHNwZWFrIG5vIHRyZWFzb24uCgpDQVBVTEVUCgogICAgTywgR29kIHllIGdvZC1kZW4uCgpOdXJzZQoKICAgIE1heSBub3Qgb25lIHNwZWFrPwoKQ0FQVUxFVAoKICAgIFBlYWNlLCB5b3UgbXVtYmxpbmcgZm9vbCEKICAgIFV0dGVyIHlvdXIgZ3Jhdml0eSBvJ2VyIGEgZ29zc2lwJ3MgYm93bDsKICAgIEZvciBoZXJlIHdlIG5lZWQgaXQgbm90LgoKTEFEWSBDQVBVTEVUCgogICAgWW91IGFyZSB0b28gaG90LgoKQ0FQVUxFVAoKICAgIEdvZCdzIGJyZWFkISBpdCBtYWtlcyBtZSBtYWQ6CiAgICBEYXksIG5pZ2h0LCBob3VyLCB0aWRlLCB0aW1lLCB3b3JrLCBwbGF5LAogICAgQWxvbmUsIGluIGNvbXBhbnksIHN0aWxsIG15IGNhcmUgaGF0aCBiZWVuCiAgICBUbyBoYXZlIGhlciBtYXRjaCdkOiBhbmQgaGF2aW5nIG5vdyBwcm92aWRlZAogICAgQSBnZW50bGVtYW4gb2Ygbm9ibGUgcGFyZW50YWdlLAogICAgT2YgZmFpciBkZW1lc25lcywgeW91dGhmdWwsIGFuZCBub2JseSB0cmFpbidkLAogICAgU3R1ZmYnZCwgYXMgdGhleSBzYXksIHdpdGggaG9ub3VyYWJsZSBwYXJ0cywKICAgIFByb3BvcnRpb24nZCBhcyBvbmUncyB0aG91Z2h0IHdvdWxkIHdpc2ggYSBtYW47CiAgICBBbmQgdGhlbiB0byBoYXZlIGEgd3JldGNoZWQgcHVsaW5nIGZvb2wsCiAgICBBIHdoaW5pbmcgbWFtbWV0LCBpbiBoZXIgZm9ydHVuZSdzIHRlbmRlciwKICAgIFRvIGFuc3dlciAnSSdsbCBub3Qgd2VkOyBJIGNhbm5vdCBsb3ZlLAogICAgSSBhbSB0b28geW91bmc7IEkgcHJheSB5b3UsIHBhcmRvbiBtZS4nCiAgICBCdXQsIGFzIHlvdSB3aWxsIG5vdCB3ZWQsIEknbGwgcGFyZG9uIHlvdToKICAgIEdyYXplIHdoZXJlIHlvdSB3aWxsIHlvdSBzaGFsbCBub3QgaG91c2Ugd2l0aCBtZToKICAgIExvb2sgdG8ndCwgdGhpbmsgb24ndCwgSSBkbyBub3QgdXNlIHRvIGplc3QuCiAgICBUaHVyc2RheSBpcyBuZWFyOyBsYXkgaGFuZCBvbiBoZWFydCwgYWR2aXNlOgogICAgQW4geW91IGJlIG1pbmUsIEknbGwgZ2l2ZSB5b3UgdG8gbXkgZnJpZW5kOwogICAgQW5kIHlvdSBiZSBub3QsIGhhbmcsIGJlZywgc3RhcnZlLCBkaWUgaW4KICAgIHRoZSBzdHJlZXRzLAogICAgRm9yLCBieSBteSBzb3VsLCBJJ2xsIG5lJ2VyIGFja25vd2xlZGdlIHRoZWUsCiAgICBOb3Igd2hhdCBpcyBtaW5lIHNoYWxsIG5ldmVyIGRvIHRoZWUgZ29vZDoKICAgIFRydXN0IHRvJ3QsIGJldGhpbmsgeW91OyBJJ2xsIG5vdCBiZSBmb3Jzd29ybi4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBJcyB0aGVyZSBubyBwaXR5IHNpdHRpbmcgaW4gdGhlIGNsb3VkcywKICAgIFRoYXQgc2VlcyBpbnRvIHRoZSBib3R0b20gb2YgbXkgZ3JpZWYCiAgICBPLCBzd2VldCBteSBtb3RoZXIsIGNhc3QgbWUgbm90IGF3YXkhCiAgICBEZWxheSB0aGlzIG1hcnJpYWdlIGZvciBhIG1vbnRoLCBhIHdlZWs7CiAgICBPciwgaWYgeW91IGRvIG5vdCwgbWFrZSB0aGUgYnJpZGFsIGJlZAogICAgSW4gdGhhdCBkaW0gbW9udW1lbnQgd2hlcmUgVHliYWx0IGxpZXMuCgpMQURZIENBUFVMRVQKCiAgICBUYWxrIG5vdCB0byBtZSwgZm9yIEknbGwgbm90IHNwZWFrIGEgd29yZDoKICAgIERvIGFzIHRob3Ugd2lsdCwgZm9yIEkgaGF2ZSBkb25lIHdpdGggdGhlZS4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIEdvZCEtLU8gbnVyc2UsIGhvdyBzaGFsbCB0aGlzIGJlIHByZXZlbnRlZD8KICAgIE15IGh1c2JhbmQgaXMgb24gZWFydGgsIG15IGZhaXRoIGluIGhlYXZlbjsKICAgIEhvdyBzaGFsbCB0aGF0IGZhaXRoIHJldHVybiBhZ2FpbiB0byBlYXJ0aCwKICAgIFVubGVzcyB0aGF0IGh1c2JhbmQgc2VuZCBpdCBtZSBmcm9tIGhlYXZlbgogICAgQnkgbGVhdmluZyBlYXJ0aD8gY29tZm9ydCBtZSwgY291bnNlbCBtZS4KICAgIEFsYWNrLCBhbGFjaywgdGhhdCBoZWF2ZW4gc2hvdWxkIHByYWN0aXNlIHN0cmF0YWdlbXMKICAgIFVwb24gc28gc29mdCBhIHN1YmplY3QgYXMgbXlzZWxmIQogICAgV2hhdCBzYXknc3QgdGhvdT8gaGFzdCB0aG91IG5vdCBhIHdvcmQgb2Ygam95PwogICAgU29tZSBjb21mb3J0LCBudXJzZS4KCk51cnNlCgogICAgRmFpdGgsIGhlcmUgaXQgaXMuCiAgICBSb21lbyBpcyBiYW5pc2gnZDsgYW5kIGFsbCB0aGUgd29ybGQgdG8gbm90aGluZywKICAgIFRoYXQgaGUgZGFyZXMgbmUnZXIgY29tZSBiYWNrIHRvIGNoYWxsZW5nZSB5b3U7CiAgICBPciwgaWYgaGUgZG8sIGl0IG5lZWRzIG11c3QgYmUgYnkgc3RlYWx0aC4KICAgIFRoZW4sIHNpbmNlIHRoZSBjYXNlIHNvIHN0YW5kcyBhcyBub3cgaXQgZG90aCwKICAgIEkgdGhpbmsgaXQgYmVzdCB5b3UgbWFycmllZCB3aXRoIHRoZSBjb3VudHkuCiAgICBPLCBoZSdzIGEgbG92ZWx5IGdlbnRsZW1hbiEKICAgIFJvbWVvJ3MgYSBkaXNoY2xvdXQgdG8gaGltOiBhbiBlYWdsZSwgbWFkYW0sCiAgICBIYXRoIG5vdCBzbyBncmVlbiwgc28gcXVpY2ssIHNvIGZhaXIgYW4gZXllCiAgICBBcyBQYXJpcyBoYXRoLiBCZXNocmV3IG15IHZlcnkgaGVhcnQsCiAgICBJIHRoaW5rIHlvdSBhcmUgaGFwcHkgaW4gdGhpcyBzZWNvbmQgbWF0Y2gsCiAgICBGb3IgaXQgZXhjZWxzIHlvdXIgZmlyc3Q6IG9yIGlmIGl0IGRpZCBub3QsCiAgICBZb3VyIGZpcnN0IGlzIGRlYWQ7IG9yICd0d2VyZSBhcyBnb29kIGhlIHdlcmUsCiAgICBBcyBsaXZpbmcgaGVyZSBhbmQgeW91IG5vIHVzZSBvZiBoaW0uCgpKVUxJRVQKCiAgICBTcGVha2VzdCB0aG91IGZyb20gdGh5IGhlYXJ0PwoKTnVyc2UKCiAgICBBbmQgZnJvbSBteSBzb3VsIHRvbzsKICAgIE9yIGVsc2UgYmVzaHJldyB0aGVtIGJvdGguCgpKVUxJRVQKCiAgICBBbWVuIQoKTnVyc2UKCiAgICBXaGF0PwoKSlVMSUVUCgogICAgV2VsbCwgdGhvdSBoYXN0IGNvbWZvcnRlZCBtZSBtYXJ2ZWxsb3VzIG11Y2guCiAgICBHbyBpbjogYW5kIHRlbGwgbXkgbGFkeSBJIGFtIGdvbmUsCiAgICBIYXZpbmcgZGlzcGxlYXNlZCBteSBmYXRoZXIsIHRvIExhdXJlbmNlJyBjZWxsLAogICAgVG8gbWFrZSBjb25mZXNzaW9uIGFuZCB0byBiZSBhYnNvbHZlZC4KCk51cnNlCgogICAgTWFycnksIEkgd2lsbDsgYW5kIHRoaXMgaXMgd2lzZWx5IGRvbmUuCgogICAgRXhpdAoKSlVMSUVUCgogICAgQW5jaWVudCBkYW1uYXRpb24hIE8gbW9zdCB3aWNrZWQgZmllbmQhCiAgICBJcyBpdCBtb3JlIHNpbiB0byB3aXNoIG1lIHRodXMgZm9yc3dvcm4sCiAgICBPciB0byBkaXNwcmFpc2UgbXkgbG9yZCB3aXRoIHRoYXQgc2FtZSB0b25ndWUKICAgIFdoaWNoIHNoZSBoYXRoIHByYWlzZWQgaGltIHdpdGggYWJvdmUgY29tcGFyZQogICAgU28gbWFueSB0aG91c2FuZCB0aW1lcz8gR28sIGNvdW5zZWxsb3I7CiAgICBUaG91IGFuZCBteSBib3NvbSBoZW5jZWZvcnRoIHNoYWxsIGJlIHR3YWluLgogICAgSSdsbCB0byB0aGUgZnJpYXIsIHRvIGtub3cgaGlzIHJlbWVkeToKICAgIElmIGFsbCBlbHNlIGZhaWwsIG15c2VsZiBoYXZlIHBvd2VyIHRvIGRpZS4KCiAgICBFeGl0CgpBQ1QgSVYKU0NFTkUgSS4gRnJpYXIgTGF1cmVuY2UncyBjZWxsLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUyAKCkZSSUFSIExBVVJFTkNFCgogICAgT24gVGh1cnNkYXksIHNpcj8gdGhlIHRpbWUgaXMgdmVyeSBzaG9ydC4KClBBUklTCgogICAgTXkgZmF0aGVyIENhcHVsZXQgd2lsbCBoYXZlIGl0IHNvOwogICAgQW5kIEkgYW0gbm90aGluZyBzbG93IHRvIHNsYWNrIGhpcyBoYXN0ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgWW91IHNheSB5b3UgZG8gbm90IGtub3cgdGhlIGxhZHkncyBtaW5kOgogICAgVW5ldmVuIGlzIHRoZSBjb3Vyc2UsIEkgbGlrZSBpdCBub3QuCgpQQVJJUwoKICAgIEltbW9kZXJhdGVseSBzaGUgd2VlcHMgZm9yIFR5YmFsdCdzIGRlYXRoLAogICAgQW5kIHRoZXJlZm9yZSBoYXZlIEkgbGl0dGxlIHRhbGsnZCBvZiBsb3ZlOwogICAgRm9yIFZlbnVzIHNtaWxlcyBub3QgaW4gYSBob3VzZSBvZiB0ZWFycy4KICAgIE5vdywgc2lyLCBoZXIgZmF0aGVyIGNvdW50cyBpdCBkYW5nZXJvdXMKICAgIFRoYXQgc2hlIGRvdGggZ2l2ZSBoZXIgc29ycm93IHNvIG11Y2ggc3dheSwKICAgIEFuZCBpbiBoaXMgd2lzZG9tIGhhc3RlcyBvdXIgbWFycmlhZ2UsCiAgICBUbyBzdG9wIHRoZSBpbnVuZGF0aW9uIG9mIGhlciB0ZWFyczsKICAgIFdoaWNoLCB0b28gbXVjaCBtaW5kZWQgYnkgaGVyc2VsZiBhbG9uZSwKICAgIE1heSBiZSBwdXQgZnJvbSBoZXIgYnkgc29jaWV0eToKICAgIE5vdyBkbyB5b3Uga25vdyB0aGUgcmVhc29uIG9mIHRoaXMgaGFzdGUuCgpGUklBUiBMQVVSRU5DRQoKICAgIFtBc2lkZV0gSSB3b3VsZCBJIGtuZXcgbm90IHdoeSBpdCBzaG91bGQgYmUgc2xvdydkLgogICAgTG9vaywgc2lyLCBoZXJlIGNvbWVzIHRoZSBsYWR5IHRvd2FyZHMgbXkgY2VsbC4KCiAgICBFbnRlciBKVUxJRVQKClBBUklTCgogICAgSGFwcGlseSBtZXQsIG15IGxhZHkgYW5kIG15IHdpZmUhCgpKVUxJRVQKCiAgICBUaGF0IG1heSBiZSwgc2lyLCB3aGVuIEkgbWF5IGJlIGEgd2lmZS4KClBBUklTCgogICAgVGhhdCBtYXkgYmUgbXVzdCBiZSwgbG92ZSwgb24gVGh1cnNkYXkgbmV4dC4KCkpVTElFVAoKICAgIFdoYXQgbXVzdCBiZSBzaGFsbCBiZS4KCkZSSUFSIExBVVJFTkNFCgogICAgVGhhdCdzIGEgY2VydGFpbiB0ZXh0LgoKUEFSSVMKCiAgICBDb21lIHlvdSB0byBtYWtlIGNvbmZlc3Npb24gdG8gdGhpcyBmYXRoZXICgpKVUxJRVQKCiAgICBUbyBhbnN3ZXIgdGhhdCwgSSBzaG91bGQgY29uZmVzcyB0byB5b3UuCgpQQVJJUwoKICAgIERvIG5vdCBkZW55IHRvIGhpbSB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSSB3aWxsIGNvbmZlc3MgdG8geW91IHRoYXQgSSBsb3ZlIGhpbS4KClBBUklTCgogICAgU28gd2lsbCB5ZSwgSSBhbSBzdXJlLCB0aGF0IHlvdSBsb3ZlIG1lLgoKSlVMSUVUCgogICAgSWYgSSBkbyBzbywgaXQgd2lsbCBiZSBvZiBtb3JlIHByaWNlLAogICAgQmVpbmcgc3Bva2UgYmVoaW5kIHlvdXIgYmFjaywgdGhhbiB0byB5b3VyIGZhY2UuCgpQQVJJUwoKICAgIFBvb3Igc291bCwgdGh5IGZhY2UgaXMgbXVjaCBhYnVzZWQgd2l0aCB0ZWFycy4KCkpVTElFVAoKICAgIFRoZSB0ZWFycyBoYXZlIGdvdCBzbWFsbCB2aWN0b3J5IGJ5IHRoYXQ7CiAgICBGb3IgaXQgd2FzIGJhZCBlbm91Z2ggYmVmb3JlIHRoZWlyIHNwaXRlLgoKUEFSSVMKCiAgICBUaG91IHdyb25nJ3N0IGl0LCBtb3JlIHRoYW4gdGVhcnMsIHdpdGggdGhhdCByZXBvcnQuCgpKVUxJRVQKCiAgICBUaGF0IGlzIG5vIHNsYW5kZXIsIHNpciwgd2hpY2ggaXMgYSB0cnV0aDsKICAgIEFuZCB3aGF0IEkgc3Bha2UsIEkgc3Bha2UgaXQgdG8gbXkgZmFjZS4KClBBUklTCgogICAgVGh5IGZhY2UgaXMgbWluZSwgYW5kIHRob3UgaGFzdCBzbGFuZGVyJ2QgaXQuCgpKVUxJRVQKCiAgICBJdCBtYXkgYmUgc28sIGZvciBpdCBpcyBub3QgbWluZSBvd24uCiAgICBBcmUgeW91IGF0IGxlaXN1cmUsIGhvbHkgZmF0aGVyLCBub3c7CiAgICBPciBzaGFsbCBJIGNvbWUgdG8geW91IGF0IGV2ZW5pbmcgbWFzcz8KCkZSSUFSIExBVVJFTkNFCgogICAgTXkgbGVpc3VyZSBzZXJ2ZXMgbWUsIHBlbnNpdmUgZGF1Z2h0ZXIsIG5vdy4KICAgIE15IGxvcmQsIHdlIG11c3QgZW50cmVhdCB0aGUgdGltZSBhbG9uZS4KClBBUklTCgogICAgR29kIHNoaWVsZCBJIHNob3VsZCBkaXN0dXJiIGRldm90aW9uIQogICAgSnVsaWV0LCBvbiBUaHVyc2RheSBlYXJseSB3aWxsIEkgcm91c2UgeWU6CiAgICBUaWxsIHRoZW4sIGFkaWV1OyBhbmQga2VlcCB0aGlzIGhvbHkga2lzcy4KCiAgICBFeGl0CgpKVUxJRVQKCiAgICBPIHNodXQgdGhlIGRvb3IhIGFuZCB3aGVuIHRob3UgaGFzdCBkb25lIHNvLAogICAgQ29tZSB3ZWVwIHdpdGggbWU7IHBhc3QgaG9wZSwgcGFzdCBjdXJlLCBwYXN0IGhlbHAhCgpGUklBUiBMQVVSRU5DRQoKICAgIEFoLCBKdWxpZXQsIEkgYWxyZWFkeSBrbm93IHRoeSBncmllZjsKICAgIEl0IHN0cmFpbnMgbWUgcGFzdCB0aGUgY29tcGFzcyBvZiBteSB3aXRzOgogICAgSSBoZWFyIHRob3UgbXVzdCwgYW5kIG5vdGhpbmcgbWF5IHByb3JvZ3VlIGl0LAogICAgT24gVGh1cnNkYXkgbmV4dCBiZSBtYXJyaWVkIHRvIHRoaXMgY291bnR5LgoKSlVMSUVUCgogICAgVGVsbCBtZSBub3QsIGZyaWFyLCB0aGF0IHRob3UgaGVhcidzdCBvZiB0aGlzLAogICAgVW5sZXNzIHRob3UgdGVsbCBtZSBob3cgSSBtYXkgcHJldmVudCBpdDoKICAgIElmLCBpbiB0aHkgd2lzZG9tLCB0aG91IGNhbnN0IGdpdmUgbm8gaGVscCwKICAgIERvIHRob3UgYnV0IGNhbGwgbXkgcmVzb2x1dGlvbiB3aXNlLAogICAgQW5kIHdpdGggdGhpcyBrbmlmZSBJJ2xsIGhlbHAgaXQgcHJlc2VudGx5LgogICAgR29kIGpvaW4nZCBteSBoZWFydCBhbmQgUm9tZW8ncywgdGhvdSBvdXIgaGFuZHM7CiAgICBBbmQgZXJlIHRoaXMgaGFuZCwgYnkgdGhlZSB0byBSb21lbyBzZWFsJ2QsCiAgICBTaGFsbCBiZSB0aGUgbGFiZWwgdG8gYW5vdGhlciBkZWVkLAogICAgT3IgbXkgdHJ1ZSBoZWFydCB3aXRoIHRyZWFjaGVyb3VzIHJldm9sdAogICAgVHVybiB0byBhbm90aGVyLCB0aGlzIHNoYWxsIHNsYXkgdGhlbSBib3RoOgogICAgVGhlcmVmb3JlLCBvdXQgb2YgdGh5IGxvbmctZXhwZXJpZW5jZWQgdGltZSwKICAgIEdpdmUgbWUgc29tZSBwcmVzZW50IGNvdW5zZWwsIG9yLCBiZWhvbGQsCiAgICAnVHdpeHQgbXkgZXh0cmVtZXMgYW5kIG1lIHRoaXMgYmxvb2R5IGtuaWZlCiAgICBTaGFsbCBwbGF5IHRoZSB1bXBpcmUsIGFyYml0cmF0aW5nIHRoYXQKICAgIFdoaWNoIHRoZSBjb21taXNzaW9uIG9mIHRoeSB5ZWFycyBhbmQgYXJ0CiAgICBDb3VsZCB0byBubyBpc3N1ZSBvZiB0cnVlIGhvbm91ciBicmluZy4KICAgIEJlIG5vdCBzbyBsb25nIHRvIHNwZWFrOyBJIGxvbmcgdG8gZGllLAogICAgSWYgd2hhdCB0aG91IHNwZWFrJ3N0IHNwZWFrIG5vdCBvZiByZW1lZHkuCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvbGQsIGRhdWdodGVyOiBJIGRvIHNweSBhIGtpbmQgb2YgaG9wZSwKICAgIFdoaWNoIGNyYXZlcyBhcyBkZXNwZXJhdGUgYW4gZXhlY3V0aW9uLgogICAgQXMgdGhhdCBpcyBkZXNwZXJhdGUgd2hpY2ggd2Ugd291bGQgcHJldmVudC4KICAgIElmLCByYXRoZXIgdGhhbiB0byBtYXJyeSBDb3VudHkgUGFyaXMsCiAgICBUaG91IGhhc3QgdGhlIHN0cmVuZ3RoIG9mIHdpbGwgdG8gc2xheSB0aHlzZWxmLAogICAgVGhlbiBpcyBpdCBsaWtlbHkgdGhvdSB3aWx0IHVuZGVydGFrZQogICAgQSB0aGluZyBsaWtlIGRlYXRoIHRvIGNoaWRlIGF3YXkgdGhpcyBzaGFtZSwKICAgIFRoYXQgY29wZXN0IHdpdGggZGVhdGggaGltc2VsZiB0byBzY2FwZSBmcm9tIGl0OgogICAgQW5kLCBpZiB0aG91IGRhcmVzdCwgSSdsbCBnaXZlIHRoZWUgcmVtZWR5LgoKSlVMSUVUCgogICAgTywgYmlkIG1lIGxlYXAsIHJhdGhlciB0aGFuIG1hcnJ5IFBhcmlzLAogICAgRnJvbSBvZmYgdGhlIGJhdHRsZW1lbnRzIG9mIHlvbmRlciB0b3dlcjsKICAgIE9yIHdhbGsgaW4gdGhpZXZpc2ggd2F5czsgb3IgYmlkIG1lIGx1cmsKICAgIFdoZXJlIHNlcnBlbnRzIGFyZTsgY2hhaW4gbWUgd2l0aCByb2FyaW5nIGJlYXJzOwogICAgT3Igc2h1dCBtZSBuaWdodGx5IGluIGEgY2hhcm5lbC1ob3VzZSwKICAgIE8nZXItY292ZXInZCBxdWl0ZSB3aXRoIGRlYWQgbWVuJ3MgcmF0dGxpbmcgYm9uZXMsCiAgICBXaXRoIHJlZWt5IHNoYW5rcyBhbmQgeWVsbG93IGNoYXBsZXNzIHNrdWxsczsKICAgIE9yIGJpZCBtZSBnbyBpbnRvIGEgbmV3LW1hZGUgZ3JhdmUKICAgIEFuZCBoaWRlIG1lIHdpdGggYSBkZWFkIG1hbiBpbiBoaXMgc2hyb3VkOwogICAgVGhpbmdzIHRoYXQsIHRvIGhlYXIgdGhlbSB0b2xkLCBoYXZlIG1hZGUgbWUgdHJlbWJsZTsKICAgIEFuZCBJIHdpbGwgZG8gaXQgd2l0aG91dCBmZWFyIG9yIGRvdWJ0LAogICAgVG8gbGl2ZSBhbiB1bnN0YWluJ2Qgd2lmZSB0byBteSBzd2VldCBsb3ZlLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBIb2xkLCB0aGVuOyBnbyBob21lLCBiZSBtZXJyeSwgZ2l2ZSBjb25zZW50CiAgICBUbyBtYXJyeSBQYXJpczogV2VkbmVzZGF5IGlzIHRvLW1vcnJvdzoKICAgIFRvLW1vcnJvdyBuaWdodCBsb29rIHRoYXQgdGhvdSBsaWUgYWxvbmU7CiAgICBMZXQgbm90IHRoeSBudXJzZSBsaWUgd2l0aCB0aGVlIGluIHRoeSBjaGFtYmVyOgogICAgVGFrZSB0aG91IHRoaXMgdmlhbCwgYmVpbmcgdGhlbiBpbiBiZWQsCiAgICBBbmQgdGhpcyBkaXN0aWxsZWQgbGlxdW9yIGRyaW5rIHRob3Ugb2ZmOwogICAgV2hlbiBwcmVzZW50bHkgdGhyb3VnaCBhbGwgdGh5IHZlaW5zIHNoYWxsIHJ1bgogICAgQSBjb2xkIGFuZCBkcm93c3kgaHVtb3VyLCBmb3Igbm8gcHVsc2UKICAgIFNoYWxsIGtlZXAgaGlzIG5hdGl2ZSBwcm9ncmVzcywgYnV0IHN1cmNlYXNlOgogICAgTm8gd2FybXRoLCBubyBicmVhdGgsIHNoYWxsIHRlc3RpZnkgdGhvdSBsaXZlc3Q7CiAgICBUaGUgcm9zZXMgaW4gdGh5IGxpcHMgYW5kIGNoZWVrcyBzaGFsbCBmYWRlCiAgICBUbyBwYWx5IGFzaGVzLCB0aHkgZXllcycgd2luZG93cyBmYWxsLAogICAgTGlrZSBkZWF0aCwgd2hlbiBoZSBzaHV0cyB1cCB0aGUgZGF5IG9mIGxpZmU7CiAgICBFYWNoIHBhcnQsIGRlcHJpdmVkIG9mIHN1cHBsZSBnb3Zlcm5tZW50LAogICAgU2hhbGwsIHN0aWZmIGFuZCBzdGFyayBhbmQgY29sZCwgYXBwZWFyIGxpa2UgZGVhdGg6CiAgICBBbmQgaW4gdGhpcyBib3Jyb3cnZCBsaWtlbmVzcyBvZiBzaHJ1bmsgZGVhdGgKICAgIFRob3Ugc2hhbHQgY29udGludWUgdHdvIGFuZCBmb3J0eSBob3VycywKICAgIEFuZCB0aGVuIGF3YWtlIGFzIGZyb20gYSBwbGVhc2FudCBzbGVlcC4KICAgIE5vdywgd2hlbiB0aGUgYnJpZGVncm9vbSBpbiB0aGUgbW9ybmluZyBjb21lcwogICAgVG8gcm91c2UgdGhlZSBmcm9tIHRoeSBiZWQsIHRoZXJlIGFydCB0aG91IGRlYWQ6CiAgICBUaGVuLCBhcyB0aGUgbWFubmVyIG9mIG91ciBjb3VudHJ5IGlzLAogICAgSW4gdGh5IGJlc3Qgcm9iZXMgdW5jb3ZlcidkIG9uIHRoZSBiaWVyCiAgICBUaG91IHNoYWx0IGJlIGJvcm5lIHRvIHRoYXQgc2FtZSBhbmNpZW50IHZhdWx0CiAgICBXaGVyZSBhbGwgdGhlIGtpbmRyZWQgb2YgdGhlIENhcHVsZXRzIGxpZS4KICAgIEluIHRoZSBtZWFuIHRpbWUsIGFnYWluc3QgdGhvdSBzaGFsdCBhd2FrZSwKICAgIFNoYWxsIFJvbWVvIGJ5IG15IGxldHRlcnMga25vdyBvdXIgZHJpZnQsCiAgICBBbmQgaGl0aGVyIHNoYWxsIGhlIGNvbWU6IGFuZCBoZSBhbmQgSQogICAgV2lsbCB3YXRjaCB0aHkgd2FraW5nLCBhbmQgdGhhdCB2ZXJ5IG5pZ2h0CiAgICBTaGFsbCBSb21lbyBiZWFyIHRoZWUgaGVuY2UgdG8gTWFudHVhLgogICAgQW5kIHRoaXMgc2hhbGwgZnJlZSB0aGVlIGZyb20gdGhpcyBwcmVzZW50IHNoYW1lOwogICAgSWYgbm8gaW5jb25zdGFudCB0b3ksIG5vciB3b21hbmlzaCBmZWFyLAogICAgQWJhdGUgdGh5IHZhbG91ciBpbiB0aGUgYWN0aW5nIGl0LgoKSlVMSUVUCgogICAgR2l2ZSBtZSwgZ2l2ZSBtZSEgTywgdGVsbCBub3QgbWUgb2YgZmVhciEKCkZSSUFSIExBVVJFTkNFCgogICAgSG9sZDsgZ2V0IHlvdSBnb25lLCBiZSBzdHJvbmcgYW5kIHByb3NwZXJvdXMKICAgIEluIHRoaXMgcmVzb2x2ZTogSSdsbCBzZW5kIGEgZnJpYXIgd2l0aCBzcGVlZAogICAgVG8gTWFudHVhLCB3aXRoIG15IGxldHRlcnMgdG8gdGh5IGxvcmQuCgpKVUxJRVQKCiAgICBMb3ZlIGdpdmUgbWUgc3RyZW5ndGghIGFuZCBzdHJlbmd0aCBzaGFsbCBoZWxwIGFmZm9yZC4KICAgIEZhcmV3ZWxsLCBkZWFyIGZhdGhlciEKCiAgICBFeGV1bnQKClNDRU5FIElJLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIE51cnNlLCBhbmQgdHdvIFNlcnZpbmdtZW4gCgpDQVBVTEVUCgogICAgU28gbWFueSBndWVzdHMgaW52aXRlIGFzIGhlcmUgYXJlIHdyaXQuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGdvIGhpcmUgbWUgdHdlbnR5IGN1bm5pbmcgY29va3MuCgpTZWNvbmQgU2VydmFudAoKICAgIFlvdSBzaGFsbCBoYXZlIG5vbmUgaWxsLCBzaXI7IGZvciBJJ2xsIHRyeSBpZiB0aGV5CiAgICBjYW4gbGljayB0aGVpciBmaW5nZXJzLgoKQ0FQVUxFVAoKICAgIEhvdyBjYW5zdCB0aG91IHRyeSB0aGVtIHNvPwoKU2Vjb25kIFNlcnZhbnQKCiAgICBNYXJyeSwgc2lyLCAndGlzIGFuIGlsbCBjb29rIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBvd24gZmluZ2VyczogdGhlcmVmb3JlIGhlIHRoYXQgY2Fubm90IGxpY2sgaGlzCiAgICBmaW5nZXJzIGdvZXMgbm90IHdpdGggbWUuCgpDQVBVTEVUCgogICAgR28sIGJlIGdvbmUuCgogICAgRXhpdCBTZWNvbmQgU2VydmFudAogICAgV2Ugc2hhbGwgYmUgbXVjaCB1bmZ1cm5pc2hlZCBmb3IgdGhpcyB0aW1lLgogICAgV2hhdCwgaXMgbXkgZGF1Z2h0ZXIgZ29uZSB0byBGcmlhciBMYXVyZW5jZT8KCk51cnNlCgogICAgQXksIGZvcnNvb3RoLgoKQ0FQVUxFVAoKICAgIFdlbGwsIGhlIG1heSBjaGFuY2UgdG8gZG8gc29tZSBnb29kIG9uIGhlcjoKICAgIEEgcGVldmlzaCBzZWxmLXdpbGwnZCBoYXJsb3RyeSBpdCBpcy4KCk51cnNlCgogICAgU2VlIHdoZXJlIHNoZSBjb21lcyBmcm9tIHNocmlmdCB3aXRoIG1lcnJ5IGxvb2suCgogICAgRW50ZXIgSlVMSUVUCgpDQVBVTEVUCgogICAgSG93IG5vdywgbXkgaGVhZHN0cm9uZyEgd2hlcmUgaGF2ZSB5b3UgYmVlbiBnYWRkaW5nPwoKSlVMSUVUCgogICAgV2hlcmUgSSBoYXZlIGxlYXJuJ2QgbWUgdG8gcmVwZW50IHRoZSBzaW4KICAgIE9mIGRpc29iZWRpZW50IG9wcG9zaXRpb24KICAgIFRvIHlvdSBhbmQgeW91ciBiZWhlc3RzLCBhbmQgYW0gZW5qb2luJ2QKICAgIEJ5IGhvbHkgTGF1cmVuY2UgdG8gZmFsbCBwcm9zdHJhdGUgaGVyZSwKICAgIEFuZCBiZWcgeW91ciBwYXJkb246IHBhcmRvbiwgSSBiZXNlZWNoIHlvdSEKICAgIEhlbmNlZm9yd2FyZCBJIGFtIGV2ZXIgcnVsZWQgYnkgeW91LgoKQ0FQVUxFVAoKICAgIFNlbmQgZm9yIHRoZSBjb3VudHk7IGdvIHRlbGwgaGltIG9mIHRoaXM6CiAgICBJJ2xsIGhhdmUgdGhpcyBrbm90IGtuaXQgdXAgdG8tbW9ycm93IG1vcm5pbmcuCgpKVUxJRVQKCiAgICBJIG1ldCB0aGUgeW91dGhmdWwgbG9yZCBhdCBMYXVyZW5jZScgY2VsbDsKICAgIEFuZCBnYXZlIGhpbSB3aGF0IGJlY29tZWQgbG92ZSBJIG1pZ2h0LAogICAgTm90IHN0ZXAgbydlciB0aGUgYm91bmRzIG9mIG1vZGVzdHkuCgpDQVBVTEVUCgogICAgV2h5LCBJIGFtIGdsYWQgb24ndDsgdGhpcyBpcyB3ZWxsOiBzdGFuZCB1cDoKICAgIFRoaXMgaXMgYXMndCBzaG91bGQgYmUuIExldCBtZSBzZWUgdGhlIGNvdW50eTsKICAgIEF5LCBtYXJyeSwgZ28sIEkgc2F5LCBhbmQgZmV0Y2ggaGltIGhpdGhlci4KICAgIE5vdywgYWZvcmUgR29kISB0aGlzIHJldmVyZW5kIGhvbHkgZnJpYXIsCiAgICBPdXIgd2hvbGUgY2l0eSBpcyBtdWNoIGJvdW5kIHRvIGhpbS4KCkpVTElFVAoKICAgIE51cnNlLCB3aWxsIHlvdSBnbyB3aXRoIG1lIGludG8gbXkgY2xvc2V0LAogICAgVG8gaGVscCBtZSBzb3J0IHN1Y2ggbmVlZGZ1bCBvcm5hbWVudHMKICAgIEFzIHlvdSB0aGluayBmaXQgdG8gZnVybmlzaCBtZSB0by1tb3Jyb3cCgpMQURZIENBUFVMRVQKCiAgICBObywgbm90IHRpbGwgVGh1cnNkYXk7IHRoZXJlIGlzIHRpbWUgZW5vdWdoLgoKQ0FQVUxFVAoKICAgIEdvLCBudXJzZSwgZ28gd2l0aCBoZXI6IHdlJ2xsIHRvIGNodXJjaCB0by1tb3Jyb3cuCgogICAgRXhldW50IEpVTElFVCBhbmQgTnVyc2UKCkxBRFkgQ0FQVUxFVAoKICAgIFdlIHNoYWxsIGJlIHNob3J0IGluIG91ciBwcm92aXNpb246CiAgICAnVGlzIG5vdyBuZWFyIG5pZ2h0LgoKQ0FQVUxFVAoKICAgIFR1c2gsIEkgd2lsbCBzdGlyIGFib3V0LAogICAgQW5kIGFsbCB0aGluZ3Mgc2hhbGwgYmUgd2VsbCwgSSB3YXJyYW50IHRoZWUsIHdpZmU6CiAgICBHbyB0aG91IHRvIEp1bGlldCwgaGVscCB0byBkZWNrIHVwIGhlcjsKICAgIEknbGwgbm90IHRvIGJlZCB0by1uaWdodDsgbGV0IG1lIGFsb25lOwogICAgSSdsbCBwbGF5IHRoZSBob3VzZXdpZmUgZm9yIHRoaXMgb25jZS4gV2hhdCwgaG8hCiAgICBUaGV5IGFyZSBhbGwgZm9ydGguIFdlbGwsIEkgd2lsbCB3YWxrIG15c2VsZgogICAgVG8gQ291bnR5IFBhcmlzLCB0byBwcmVwYXJlIGhpbSB1cAogICAgQWdhaW5zdCB0by1tb3Jyb3c6IG15IGhlYXJ0IGlzIHdvbmRyb3VzIGxpZ2h0LAogICAgU2luY2UgdGhpcyBzYW1lIHdheXdhcmQgZ2lybCBpcyBzbyByZWNsYWltJ2QuCgogICAgRXhldW50CgpTQ0VORSBJSUkuIEp1bGlldCdzIGNoYW1iZXIuCgogICAgRW50ZXIgSlVMSUVUIGFuZCBOdXJzZSAKCkpVTElFVAoKICAgIEF5LCB0aG9zZSBhdHRpcmVzIGFyZSBiZXN0OiBidXQsIGdlbnRsZSBudXJzZSwKICAgIEkgcHJheSB0aGVlLCBsZWF2ZSBtZSB0byBteSBzZWxmIHRvLW5pZ2h0LAogICAgRm9yIEkgaGF2ZSBuZWVkIG9mIG1hbnkgb3Jpc29ucwogICAgVG8gbW92ZSB0aGUgaGVhdmVucyB0byBzbWlsZSB1cG9uIG15IHN0YXRlLAogICAgV2hpY2gsIHdlbGwgdGhvdSBrbm93J3N0LCBpcyBjcm9zcywgYW5kIGZ1bGwgb2Ygc2luLgoKICAgIEVudGVyIExBRFkgQ0FQVUxFVAoKTEFEWSBDQVBVTEVUCgogICAgV2hhdCwgYXJlIHlvdSBidXN5LCBobz8gbmVlZCB5b3UgbXkgaGVscD8KCkpVTElFVAoKICAgIE5vLCBtYWRhbTsgd2UgaGF2ZSBjdWxsJ2Qgc3VjaCBuZWNlc3NhcmllcwogICAgQXMgYXJlIGJlaG92ZWZ1bCBmb3Igb3VyIHN0YXRlIHRvLW1vcnJvdzoKICAgIFNvIHBsZWFzZSB5b3UsIGxldCBtZSBub3cgYmUgbGVmdCBhbG9uZSwKICAgIEFuZCBsZXQgdGhlIG51cnNlIHRoaXMgbmlnaHQgc2l0IHVwIHdpdGggeW91OwogICAgRm9yLCBJIGFtIHN1cmUsIHlvdSBoYXZlIHlvdXIgaGFuZHMgZnVsbCBhbGwsCiAgICBJbiB0aGlzIHNvIHN1ZGRlbiBidXNpbmVzcy4KCkxBRFkgQ0FQVUxFVAoKICAgIEdvb2QgbmlnaHQ6CiAgICBHZXQgdGhlZSB0byBiZWQsIGFuZCByZXN0OyBmb3IgdGhvdSBoYXN0IG5lZWQuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkpVTElFVAoKICAgIEZhcmV3ZWxsISBHb2Qga25vd3Mgd2hlbiB3ZSBzaGFsbCBtZWV0IGFnYWluLgogICAgSSBoYXZlIGEgZmFpbnQgY29sZCBmZWFyIHRocmlsbHMgdGhyb3VnaCBteSB2ZWlucywKICAgIFRoYXQgYWxtb3N0IGZyZWV6ZXMgdXAgdGhlIGhlYXQgb2YgbGlmZToKICAgIEknbGwgY2FsbCB0aGVtIGJhY2sgYWdhaW4gdG8gY29tZm9ydCBtZToKICAgIE51cnNlISBXaGF0IHNob3VsZCBzaGUgZG8gaGVyZT8KICAgIE15IGRpc21hbCBzY2VuZSBJIG5lZWRzIG11c3QgYWN0IGFsb25lLgogICAgQ29tZSwgdmlhbC4KICAgIFdoYXQgaWYgdGhpcyBtaXh0dXJlIGRvIG5vdCB3b3JrIGF0IGFsbD8KICAgIFNoYWxsIEkgYmUgbWFycmllZCB0aGVuIHRvLW1vcnJvdyBtb3JuaW5nPwogICAgTm8sIG5vOiB0aGlzIHNoYWxsIGZvcmJpZCBpdDogbGllIHRob3UgdGhlcmUuCgogICAgTGF5aW5nIGRvd24gaGVyIGRhZ2dlcgogICAgV2hhdCBpZiBpdCBiZSBhIHBvaXNvbiwgd2hpY2ggdGhlIGZyaWFyCiAgICBTdWJ0bHkgaGF0aCBtaW5pc3RlcidkIHRvIGhhdmUgbWUgZGVhZCwKICAgIExlc3QgaW4gdGhpcyBtYXJyaWFnZSBoZSBzaG91bGQgYmUgZGlzaG9ub3VyJ2QsCiAgICBCZWNhdXNlIGhlIG1hcnJpZWQgbWUgYmVmb3JlIHRvIFJvbWVvPwogICAgSSBmZWFyIGl0IGlzOiBhbmQgeWV0LCBtZXRoaW5rcywgaXQgc2hvdWxkIG5vdCwKICAgIEZvciBoZSBoYXRoIHN0aWxsIGJlZW4gdHJpZWQgYSBob2x5IG1hbi4KICAgIEhvdyBpZiwgd2hlbiBJIGFtIGxhaWQgaW50byB0aGUgdG9tYiwKICAgIEkgd2FrZSBiZWZvcmUgdGhlIHRpbWUgdGhhdCBSb21lbwogICAgQ29tZSB0byByZWRlZW0gbWUIHRoZXJlJ3MgYSBmZWFyZnVsIHBvaW50IQogICAgU2hhbGwgSSBub3QsIHRoZW4sIGJlIHN0aWZsZWQgaW4gdGhlIHZhdWx0LAogICAgVG8gd2hvc2UgZm91bCBtb3V0aCBubyBoZWFsdGhzb21lIGFpciBicmVhdGhlcyBpbiwKICAgIEFuZCB0aGVyZSBkaWUgc3RyYW5nbGVkIGVyZSBteSBSb21lbyBjb21lcz8KICAgIE9yLCBpZiBJIGxpdmUsIGlzIGl0IG5vdCB2ZXJ5IGxpa2UsCiAgICBUaGUgaG9ycmlibGUgY29uY2VpdCBvZiBkZWF0aCBhbmQgbmlnaHQsCiAgICBUb2dldGhlciB3aXRoIHRoZSB0ZXJyb3Igb2YgdGhlIHBsYWNlLC0tCiAgICBBcyBpbiBhIHZhdWx0LCBhbiBhbmNpZW50IHJlY2VwdGFjbGUsCiAgICBXaGVyZSwgZm9yIHRoZXNlIG1hbnkgaHVuZHJlZCB5ZWFycywgdGhlIGJvbmVzCiAgICBPZiBhbGwgbXkgYnVyaWVkIGFuY2VzdG9ycyBhcmUgcGFja2VkOgogICAgV2hlcmUgYmxvb2R5IFR5YmFsdCwgeWV0IGJ1dCBncmVlbiBpbiBlYXJ0aCwKICAgIExpZXMgZmVzdGVyaW5nIGluIGhpcyBzaHJvdWQ7IHdoZXJlLCBhcyB0aGV5IHNheSwKICAgIEF0IHNvbWUgaG91cnMgaW4gdGhlIG5pZ2h0IHNwaXJpdHMgcmVzb3J0Oy0tCiAgICBBbGFjaywgYWxhY2ssIGlzIGl0IG5vdCBsaWtlIHRoYXQgSSwKICAgIFNvIGVhcmx5IHdha2luZywgd2hhdCB3aXRoIGxvYXRoc29tZSBzbWVsbHMsCiAgICBBbmQgc2hyaWVrcyBsaWtlIG1hbmRyYWtlcycgdG9ybiBvdXQgb2YgdGhlIGVhcnRoLAogICAgVGhhdCBsaXZpbmcgbW9ydGFscywgaGVhcmluZyB0aGVtLCBydW4gbWFkOi0tCiAgICBPLCBpZiBJIHdha2UsIHNoYWxsIEkgbm90IGJlIGRpc3RyYXVnaHQsCiAgICBFbnZpcm9uZWQgd2l0aCBhbGwgdGhlc2UgaGlkZW91cyBmZWFycz8KICAgIEFuZCBtYWRseSBwbGF5IHdpdGggbXkgZm9yZWZhdGhlcidzIGpvaW50cz8KICAgIEFuZCBwbHVjayB0aGUgbWFuZ2xlZCBUeWJhbHQgZnJvbSBoaXMgc2hyb3VkPwogICAgQW5kLCBpbiB0aGlzIHJhZ2UsIHdpdGggc29tZSBncmVhdCBraW5zbWFuJ3MgYm9uZSwKICAgIEFzIHdpdGggYSBjbHViLCBkYXNoIG91dCBteSBkZXNwZXJhdGUgYnJhaW5zPwogICAgTywgbG9vayEgbWV0aGlua3MgSSBzZWUgbXkgY291c2luJ3MgZ2hvc3QKICAgIFNlZWtpbmcgb3V0IFJvbWVvLCB0aGF0IGRpZCBzcGl0IGhpcyBib2R5CiAgICBVcG9uIGEgcmFwaWVyJ3MgcG9pbnQ6IHN0YXksIFR5YmFsdCwgc3RheSEKICAgIFJvbWVvLCBJIGNvbWUhIHRoaXMgZG8gSSBkcmluayB0byB0aGVlLgoKICAgIFNoZSBmYWxscyB1cG9uIGhlciBiZWQsIHdpdGhpbiB0aGUgY3VydGFpbnMKClNDRU5FIElWLiBIYWxsIGluIENhcHVsZXQncyBob3VzZS4KCiAgICBFbnRlciBMQURZIENBUFVMRVQgYW5kIE51cnNlIAoKTEFEWSBDQVBVTEVUCgogICAgSG9sZCwgdGFrZSB0aGVzZSBrZXlzLCBhbmQgZmV0Y2ggbW9yZSBzcGljZXMsIG51cnNlLgoKTnVyc2UKCiAgICBUaGV5IGNhbGwgZm9yIGRhdGVzIGFuZCBxdWluY2VzIGluIHRoZSBwYXN0cnkuCgogICAgRW50ZXIgQ0FQVUxFVAoKQ0FQVUxFVAoKICAgIENvbWUsIHN0aXIsIHN0aXIsIHN0aXIhIHRoZSBzZWNvbmQgY29jayBoYXRoIGNyb3cnZCwKICAgIFRoZSBjdXJmZXctYmVsbCBoYXRoIHJ1bmcsICd0aXMgdGhyZWUgbydjbG9jazoKICAgIExvb2sgdG8gdGhlIGJha2VkIG1lYXRzLCBnb29kIEFuZ2VsaWNhOgogICAgU3BhcmUgbm90IGZvciB0aGUgY29zdC4KCk51cnNlCgogICAgR28sIHlvdSBjb3QtcXVlYW4sIGdvLAogICAgR2V0IHlvdSB0byBiZWQ7IGZhaXRoLCBZb3UnbGwgYmUgc2ljayB0by1tb3Jyb3cKICAgIEZvciB0aGlzIG5pZ2h0J3Mgd2F0Y2hpbmcuCgpDQVBVTEVUCgogICAgTm8sIG5vdCBhIHdoaXQ6IHdoYXQhIEkgaGF2ZSB3YXRjaCdkIGVyZSBub3cKICAgIEFsbCBuaWdodCBmb3IgbGVzc2VyIGNhdXNlLCBhbmQgbmUnZXIgYmVlbiBzaWNrLgoKTEFEWSBDQVBVTEVUCgogICAgQXksIHlvdSBoYXZlIGJlZW4gYSBtb3VzZS1odW50IGluIHlvdXIgdGltZTsKICAgIEJ1dCBJIHdpbGwgd2F0Y2ggeW91IGZyb20gc3VjaCB3YXRjaGluZyBub3cuCgogICAgRXhldW50IExBRFkgQ0FQVUxFVCBhbmQgTnVyc2UKCkNBUFVMRVQKCiAgICBBIGplYWxvdXMgaG9vZCwgYSBqZWFsb3VzIGhvb2QhCgogICAgRW50ZXIgdGhyZWUgb3IgZm91ciBTZXJ2aW5nbWVuLCB3aXRoIHNwaXRzLCBsb2dzLCBhbmQgYmFza2V0cwogICAgTm93LCBmZWxsb3csCiAgICBXaGF0J3MgdGhlcmUCgpGaXJzdCBTZXJ2YW50CgogICAgVGhpbmdzIGZvciB0aGUgY29vaywgc2lyOyBidXQgSSBrbm93IG5vdCB3aGF0LgoKQ0FQVUxFVAoKICAgIE1ha2UgaGFzdGUsIG1ha2UgaGFzdGUuCgogICAgRXhpdCBGaXJzdCBTZXJ2YW50CiAgICBTaXJyYWgsIGZldGNoIGRyaWVyIGxvZ3M6CiAgICBDYWxsIFBldGVyLCBoZSB3aWxsIHNob3cgdGhlZSB3aGVyZSB0aGV5IGFyZS4KClNlY29uZCBTZXJ2YW50CgogICAgSSBoYXZlIGEgaGVhZCwgc2lyLCB0aGF0IHdpbGwgZmluZCBvdXQgbG9ncywKICAgIEFuZCBuZXZlciB0cm91YmxlIFBldGVyIGZvciB0aGUgbWF0dGVyLgoKICAgIEV4aXQKCkNBUFVMRVQKCiAgICBNYXNzLCBhbmQgd2VsbCBzYWlkOyBhIG1lcnJ5IHdob3Jlc29uLCBoYSEKICAgIFRob3Ugc2hhbHQgYmUgbG9nZ2VyLWhlYWQuIEdvb2QgZmFpdGgsICd0aXMgZGF5OgogICAgVGhlIGNvdW50eSB3aWxsIGJlIGhlcmUgd2l0aCBtdXNpYyBzdHJhaWdodCwKICAgIEZvciBzbyBoZSBzYWlkIGhlIHdvdWxkOiBJIGhlYXIgaGltIG5lYXIuCgogICAgTXVzaWMgd2l0aGluCiAgICBOdXJzZSEgV2lmZSEgV2hhdCwgaG8hIFdoYXQsIG51cnNlLCBJIHNheSEKCiAgICBSZS1lbnRlciBOdXJzZQogICAgR28gd2FrZW4gSnVsaWV0LCBnbyBhbmQgdHJpbSBoZXIgdXA7CiAgICBJJ2xsIGdvIGFuZCBjaGF0IHdpdGggUGFyaXM6IGhpZSwgbWFrZSBoYXN0ZSwKICAgIE1ha2UgaGFzdGU7IHRoZSBicmlkZWdyb29tIGhlIGlzIGNvbWUgYWxyZWFkeToKICAgIE1ha2UgaGFzdGUsIEkgc2F5LgoKICAgIEV4ZXVudAoKU0NFTkUgVi4gSnVsaWV0J3MgY2hhbWJlci4KCiAgICBFbnRlciBOdXJzZSAKCk51cnNlCgogICAgTWlzdHJlc3MhIHdoYXQsIG1pc3RyZXNzISBKdWxpZXQhIGZhc3QsIEkgd2FycmFudCBoZXIsIHNoZToKICAgIFdoeSwgbGFtYiEgd2h5LCBsYWR5ISBmaWUsIHlvdSBzbHVnLWEtYmVkIQogICAgV2h5LCBsb3ZlLCBJIHNheSEgbWFkYW0hIHN3ZWV0LWhlYXJ0ISB3aHksIGJyaWRlIQogICAgV2hhdCwgbm90IGEgd29yZD8geW91IHRha2UgeW91ciBwZW5ueXdvcnRocyBub3c7CiAgICBTbGVlcCBmb3IgYSB3ZWVrOyBmb3IgdGhlIG5leHQgbmlnaHQsIEkgd2FycmFudCwKICAgIFRoZSBDb3VudHkgUGFyaXMgaGF0aCBzZXQgdXAgaGlzIHJlc3QsCiAgICBUaGF0IHlvdSBzaGFsbCByZXN0IGJ1dCBsaXR0bGUuIEdvZCBmb3JnaXZlIG1lLAogICAgTWFycnksIGFuZCBhbWVuLCBob3cgc291bmQgaXMgc2hlIGFzbGVlcCEKICAgIEkgbXVzdCBuZWVkcyB3YWtlIGhlci4gTWFkYW0sIG1hZGFtLCBtYWRhbSEKICAgIEF5LCBsZXQgdGhlIGNvdW50eSB0YWtlIHlvdSBpbiB5b3VyIGJlZDsKICAgIEhlJ2xsIGZyaWdodCB5b3UgdXAsIGknIGZhaXRoLiBXaWxsIGl0IG5vdCBiZT8KCiAgICBVbmRyYXdzIHRoZSBjdXJ0YWlucwogICAgV2hhdCwgZHJlc3MnZCEgYW5kIGluIHlvdXIgY2xvdGhlcyEgYW5kIGRvd24gYWdhaW4hCiAgICBJIG11c3QgbmVlZHMgd2FrZSB5b3U7IExhZHkhIGxhZHkhIGxhZHkhCiAgICBBbGFzLCBhbGFzISBIZWxwLCBoZWxwISBteSBsYWR5J3MgZGVhZCEKICAgIE8sIHdlbGwtYS1kYXksIHRoYXQgZXZlciBJIHdhcyBib3JuIQogICAgU29tZSBhcXVhIHZpdGFlLCBobyEgTXkgbG9yZCEgbXkgbGFkeSEKCiAgICBFbnRlciBMQURZIENBUFVMRVQKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgbm9pc2UgaXMgaGVyZT8KCk51cnNlCgogICAgTyBsYW1lbnRhYmxlIGRheSEKCkxBRFkgQ0FQVUxFVAoKICAgIFdoYXQgaXMgdGhlIG1hdHRlcj8KCk51cnNlCgogICAgTG9vaywgbG9vayEgTyBoZWF2eSBkYXkhCgpMQURZIENBUFVMRVQKCiAgICBPIG1lLCBPIG1lISBNeSBjaGlsZCwgbXkgb25seSBsaWZlLAogICAgUmV2aXZlLCBsb29rIHVwLCBvciBJIHdpbGwgZGllIHdpdGggdGhlZSEKICAgIEhlbHAsIGhlbHAhIENhbGwgaGVscC4KCiAgICBFbnRlciBDQVBVTEVUCgpDQVBVTEVUCgogICAgRm9yIHNoYW1lLCBicmluZyBKdWxpZXQgZm9ydGg7IGhlciBsb3JkIGlzIGNvbWUuCgpOdXJzZQoKICAgIFNoZSdzIGRlYWQsIGRlY2Vhc2VkLCBzaGUncyBkZWFkOyBhbGFjayB0aGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgQWxhY2sgdGhlIGRheSwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCwgc2hlJ3MgZGVhZCEKCkNBUFVMRVQKCiAgICBIYSEgbGV0IG1lIHNlZSBoZXI6IG91dCwgYWxhcyEgc2hlJ3MgY29sZDoKICAgIEhlciBibG9vZCBpcyBzZXR0bGVkLCBhbmQgaGVyIGpvaW50cyBhcmUgc3RpZmY7CiAgICBMaWZlIGFuZCB0aGVzZSBsaXBzIGhhdmUgbG9uZyBiZWVuIHNlcGFyYXRlZDoKICAgIERlYXRoIGxpZXMgb24gaGVyIGxpa2UgYW4gdW50aW1lbHkgZnJvc3QKICAgIFVwb24gdGhlIHN3ZWV0ZXN0IGZsb3dlciBvZiBhbGwgdGhlIGZpZWxkLgoKTnVyc2UKCiAgICBPIGxhbWVudGFibGUgZGF5IQoKTEFEWSBDQVBVTEVUCgogICAgTyB3b2Z1bCB0aW1lIQoKQ0FQVUxFVAoKICAgIERlYXRoLCB0aGF0IGhhdGggdGEnZW4gaGVyIGhlbmNlIHRvIG1ha2UgbWUgd2FpbCwKICAgIFRpZXMgdXAgbXkgdG9uZ3VlLCBhbmQgd2lsbCBub3QgbGV0IG1lIHNwZWFrLgoKICAgIEVudGVyIEZSSUFSIExBVVJFTkNFIGFuZCBQQVJJUywgd2l0aCBNdXNpY2lhbnMKCkZSSUFSIExBVVJFTkNFCgogICAgQ29tZSwgaXMgdGhlIGJyaWRlIHJlYWR5IHRvIGdvIHRvIGNodXJjaD8KCkNBUFVMRVQKCiAgICBSZWFkeSB0byBnbywgYnV0IG5ldmVyIHRvIHJldHVybi4KICAgIE8gc29uISB0aGUgbmlnaHQgYmVmb3JlIHRoeSB3ZWRkaW5nLWRheQogICAgSGF0aCBEZWF0aCBsYWluIHdpdGggdGh5IHdpZmUuIFRoZXJlIHNoZSBsaWVzLAogICAgRmxvd2VyIGFzIHNoZSB3YXMsIGRlZmxvd2VyZWQgYnkgaGltLgogICAgRGVhdGggaXMgbXkgc29uLWluLWxhdywgRGVhdGggaXMgbXkgaGVpcjsKICAgIE15IGRhdWdodGVyIGhlIGhhdGggd2VkZGVkOiBJIHdpbGwgZGllLAogICAgQW5kIGxlYXZlIGhpbSBhbGw7IGxpZmUsIGxpdmluZywgYWxsIGlzIERlYXRoJ3MuCgpQQVJJUwoKICAgIEhhdmUgSSB0aG91Z2h0IGxvbmcgdG8gc2VlIHRoaXMgbW9ybmluZydzIGZhY2UsCiAgICBBbmQgZG90aCBpdCBnaXZlIG1lIHN1Y2ggYSBzaWdodCBhcyB0aGlzPwoKTEFEWSBDQVBVTEVUCgogICAgQWNjdXJzZWQsIHVuaGFwcHksIHdyZXRjaGVkLCBoYXRlZnVsIGRheSEKICAgIE1vc3QgbWlzZXJhYmxlIGhvdXIgdGhhdCBlJ2VyIHRpbWUgc2F3CiAgICBJbiBsYXN0aW5nIGxhYm91ciBvZiBoaXMgcGlsZ3JpbWFnZSEKICAgIEJ1dCBvbmUsIHBvb3Igb25lLCBvbmUgcG9vciBhbmQgbG92aW5nIGNoaWxkLAogICAgQnV0IG9uZSB0aGluZyB0byByZWpvaWNlIGFuZCBzb2xhY2UgaW4sCiAgICBBbmQgY3J1ZWwgZGVhdGggaGF0aCBjYXRjaCdkIGl0IGZyb20gbXkgc2lnaHQhCgpOdXJzZQoKICAgIE8gd29lISBPIHdvZnVsLCB3b2Z1bCwgd29mdWwgZGF5IQogICAgTW9zdCBsYW1lbnRhYmxlIGRheSwgbW9zdCB3b2Z1bCBkYXksCiAgICBUaGF0IGV2ZXIsIGV2ZXIsIEkgZGlkIHlldCBiZWhvbGQhCiAgICBPIGRheSEgTyBkYXkhIE8gZGF5ISBPIGhhdGVmdWwgZGF5IQogICAgTmV2ZXIgd2FzIHNlZW4gc28gYmxhY2sgYSBkYXkgYXMgdGhpczoKICAgIE8gd29mdWwgZGF5LCBPIHdvZnVsIGRheSEKClBBUklTCgogICAgQmVndWlsZWQsIGRpdm9yY2VkLCB3cm9uZ2VkLCBzcGl0ZWQsIHNsYWluIQogICAgTW9zdCBkZXRlc3RhYmxlIGRlYXRoLCBieSB0aGVlIGJlZ3VpbCdkLAogICAgQnkgY3J1ZWwgY3J1ZWwgdGhlZSBxdWl0ZSBvdmVydGhyb3duIQogICAgTyBsb3ZlISBPIGxpZmUhIG5vdCBsaWZlLCBidXQgbG92ZSBpbiBkZWF0aCEKCkNBUFVMRVQKCiAgICBEZXNwaXNlZCwgZGlzdHJlc3NlZCwgaGF0ZWQsIG1hcnR5cidkLCBraWxsJ2QhCiAgICBVbmNvbWZvcnRhYmxlIHRpbWUsIHdoeSBjYW1lc3QgdGhvdSBub3cKICAgIFRvIG11cmRlciwgbXVyZGVyIG91ciBzb2xlbW5pdHkCiAgICBPIGNoaWxkISBPIGNoaWxkISBteSBzb3VsLCBhbmQgbm90IG15IGNoaWxkIQogICAgRGVhZCBhcnQgdGhvdSEgQWxhY2shIG15IGNoaWxkIGlzIGRlYWQ7CiAgICBBbmQgd2l0aCBteSBjaGlsZCBteSBqb3lzIGFyZSBidXJpZWQuCgpGUklBUiBMQVVSRU5DRQoKICAgIFBlYWNlLCBobywgZm9yIHNoYW1lISBjb25mdXNpb24ncyBjdXJlIGxpdmVzIG5vdAogICAgSW4gdGhlc2UgY29uZnVzaW9ucy4gSGVhdmVuIGFuZCB5b3Vyc2VsZgogICAgSGFkIHBhcnQgaW4gdGhpcyBmYWlyIG1haWQ7IG5vdyBoZWF2ZW4gaGF0aCBhbGwsCiAgICBBbmQgYWxsIHRoZSBiZXR0ZXIgaXMgaXQgZm9yIHRoZSBtYWlkOgogICAgWW91ciBwYXJ0IGluIGhlciB5b3UgY291bGQgbm90IGtlZXAgZnJvbSBkZWF0aCwKICAgIEJ1dCBoZWF2ZW4ga2VlcHMgaGlzIHBhcnQgaW4gZXRlcm5hbCBsaWZlLgogICAgVGhlIG1vc3QgeW91IHNvdWdodCB3YXMgaGVyIHByb21vdGlvbjsKICAgIEZvciAndHdhcyB5b3VyIGhlYXZlbiBzaGUgc2hvdWxkIGJlIGFkdmFuY2VkOgogICAgQW5kIHdlZXAgeWUgbm93LCBzZWVpbmcgc2hlIGlzIGFkdmFuY2VkCiAgICBBYm92ZSB0aGUgY2xvdWRzLCBhcyBoaWdoIGFzIGhlYXZlbiBpdHNlbGYCiAgICBPLCBpbiB0aGlzIGxvdmUsIHlvdSBsb3ZlIHlvdXIgY2hpbGQgc28gaWxsLAogICAgVGhhdCB5b3UgcnVuIG1hZCwgc2VlaW5nIHRoYXQgc2hlIGlzIHdlbGw6CiAgICBTaGUncyBub3Qgd2VsbCBtYXJyaWVkIHRoYXQgbGl2ZXMgbWFycmllZCBsb25nOwogICAgQnV0IHNoZSdzIGJlc3QgbWFycmllZCB0aGF0IGRpZXMgbWFycmllZCB5b3VuZy4KICAgIERyeSB1cCB5b3VyIHRlYXJzLCBhbmQgc3RpY2sgeW91ciByb3NlbWFyeQogICAgT24gdGhpcyBmYWlyIGNvcnNlOyBhbmQsIGFzIHRoZSBjdXN0b20gaXMsCiAgICBJbiBhbGwgaGVyIGJlc3QgYXJyYXkgYmVhciBoZXIgdG8gY2h1cmNoOgogICAgRm9yIHRob3VnaCBmb25kIG5hdHVyZSBiaWRzIHVzIGFuIGxhbWVudCwKICAgIFlldCBuYXR1cmUncyB0ZWFycyBhcmUgcmVhc29uJ3MgbWVycmltZW50LgoKQ0FQVUxFVAoKICAgIEFsbCB0aGluZ3MgdGhhdCB3ZSBvcmRhaW5lZCBmZXN0aXZhbCwKICAgIFR1cm4gZnJvbSB0aGVpciBvZmZpY2UgdG8gYmxhY2sgZnVuZXJhbDsKICAgIE91ciBpbnN0cnVtZW50cyB0byBtZWxhbmNob2x5IGJlbGxzLAogICAgT3VyIHdlZGRpbmcgY2hlZXIgdG8gYSBzYWQgYnVyaWFsIGZlYXN0LAogICAgT3VyIHNvbGVtbiBoeW1ucyB0byBzdWxsZW4gZGlyZ2VzIGNoYW5nZSwKICAgIE91ciBicmlkYWwgZmxvd2VycyBzZXJ2ZSBmb3IgYSBidXJpZWQgY29yc2UsCiAgICBBbmQgYWxsIHRoaW5ncyBjaGFuZ2UgdGhlbSB0byB0aGUgY29udHJhcnkuCgpGUklBUiBMQVVSRU5DRQoKICAgIFNpciwgZ28geW91IGluOyBhbmQsIG1hZGFtLCBnbyB3aXRoIGhpbTsKICAgIEFuZCBnbywgU2lyIFBhcmlzOyBldmVyeSBvbmUgcHJlcGFyZQogICAgVG8gZm9sbG93IHRoaXMgZmFpciBjb3JzZSB1bnRvIGhlciBncmF2ZToKICAgIFRoZSBoZWF2ZW5zIGRvIGxvdXIgdXBvbiB5b3UgZm9yIHNvbWUgaWxsOwogICAgTW92ZSB0aGVtIG5vIG1vcmUgYnkgY3Jvc3NpbmcgdGhlaXIgaGlnaCB3aWxsLgoKICAgIEV4ZXVudCBDQVBVTEVULCBMQURZIENBUFVMRVQsIFBBUklTLCBhbmQgRlJJQVIgTEFVUkVOQ0UKCkZpcnN0IE11c2ljaWFuCgogICAgRmFpdGgsIHdlIG1heSBwdXQgdXAgb3VyIHBpcGVzLCBhbmQgYmUgZ29uZS4KCk51cnNlCgogICAgSG9uZXN0IGdvb2RmZWxsb3dzLCBhaCwgcHV0IHVwLCBwdXQgdXA7CiAgICBGb3IsIHdlbGwgeW91IGtub3csIHRoaXMgaXMgYSBwaXRpZnVsIGNhc2UuCgogICAgRXhpdAoKRmlyc3QgTXVzaWNpYW4KCiAgICBBeSwgYnkgbXkgdHJvdGgsIHRoZSBjYXNlIG1heSBiZSBhbWVuZGVkLgoKICAgIEVudGVyIFBFVEVSCgpQRVRFUgoKICAgIE11c2ljaWFucywgTywgbXVzaWNpYW5zLCAnSGVhcnQncyBlYXNlLCBIZWFydCdzCiAgICBlYXNlOicgTywgYW4geW91IHdpbGwgaGF2ZSBtZSBsaXZlLCBwbGF5ICdIZWFydCdzIGVhc2UuJwoKRmlyc3QgTXVzaWNpYW4KCiAgICBXaHkgJ0hlYXJ0J3MgZWFzZT8nCgpQRVRFUgoKICAgIE8sIG11c2ljaWFucywgYmVjYXVzZSBteSBoZWFydCBpdHNlbGYgcGxheXMgJ015CiAgICBoZWFydCBpcyBmdWxsIG9mIHdvZTonIE8sIHBsYXkgbWUgc29tZSBtZXJyeSBkdW1wLAogICAgdG8gY29tZm9ydCBtZS4KCkZpcnN0IE11c2ljaWFuCgogICAgTm90IGEgZHVtcCB3ZTsgJ3RpcyBubyB0aW1lIHRvIHBsYXkgbm93LgoKUEVURVIKCiAgICBZb3Ugd2lsbCBub3QsIHRoZW4CgpGaXJzdCBNdXNp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Rocm9uZTsKICAgIEFuZCBhbGwgdGhpcyBkYXkgYW4gdW5hY2N1c3RvbSdkIHNwaXJpdAogICAgTGlmdHMgbWUgYWJvdmUgdGhlIGdyb3VuZCB3aXRoIGNoZWVyZnVsIHRob3VnaHRzLgogICAgSSBkcmVhbXQgbXkgbGFkeSBjYW1lIGFuZCBmb3VuZCBtZSBkZWFkLS0KICAgIFN0cmFuZ2UgZHJlYW0sIHRoYXQgZ2l2ZXMgYSBkZWFkIG1hbiBsZWF2ZQogICAgdG8gdGhpbmshLS0KICAgIEFuZCBicmVhdGhlZCBzdWNoIGxpZmUgd2l0aCBraXNzZXMgaW4gbXkgbGlwcywKICAgIFRoYXQgSSByZXZpdmVkLCBhbmQgd2FzIGFuIGVtcGVyb3IuCiAgICBBaCBtZSEgaG93IHN3ZWV0IGlzIGxvdmUgaXRzZWxmIHBvc3Nlc3MnZCwKICAgIFdoZW4gYnV0IGxvdmUncyBzaGFkb3dzIGFyZSBzbyByaWNoIGluIGpveSEKCiAgICBFbnRlciBCQUxUSEFTQVIsIGJvb3RlZAogICAgTmV3cyBmcm9tIFZlcm9uYSEtLUhvdyBub3csIEJhbHRoYXNhciEKICAgIERvc3QgdGhvdSBub3QgYnJpbmcgbWUgbGV0dGVycyBmcm9tIHRoZSBmcmlhcj8KICAgIEhvdyBkb3RoIG15IGxhZHkIElzIG15IGZhdGhlciB3ZWxsPwogICAgSG93IGZhcmVzIG15IEp1bGlldD8gdGhhdCBJIGFzayBhZ2FpbjsKICAgIEZvciBub3RoaW5nIGNhbiBiZSBpbGwsIGlmIHNoZSBiZSB3ZWxsLgoKQkFMVEhBU0FSCgogICAgVGhlbiBzaGUgaXMgd2VsbCwgYW5kIG5vdGhpbmcgY2FuIGJlIGlsbDoKICAgIEhlciBib2R5IHNsZWVwcyBpbiBDYXBlbCdzIG1vbnVtZW50LAogICAgQW5kIGhlciBpbW1vcnRhbCBwYXJ0IHdpdGggYW5nZWxzIGxpdmVzLgogICAgSSBzYXcgaGVyIGxhaWQgbG93IGluIGhlciBraW5kcmVkJ3MgdmF1bHQsCiAgICBBbmQgcHJlc2VudGx5IHRvb2sgcG9zdCB0byB0ZWxsIGl0IHlvdToKICAgIE8sIHBhcmRvbiBtZSBmb3IgYnJpbmdpbmcgdGhlc2UgaWxsIG5ld3MsCiAgICBTaW5jZSB5b3UgZGlkIGxlYXZlIGl0IGZvciBteSBvZmZpY2UsIHNpci4KClJPTUVPCgogICAgSXMgaXQgZXZlbiBzbz8gdGhlbiBJIGRlZnkgeW91LCBzdGFycyEKICAgIFRob3Uga25vdydzdCBteSBsb2RnaW5nOiBnZXQgbWUgaW5rIGFuZCBwYXBlciwKICAgIEFuZCBoaXJlIHBvc3QtaG9yc2VzOyBJIHdpbGwgaGVuY2UgdG8tbmlnaHQuCgpCQUxUSEFTQVIKCiAgICBJIGRvIGJlc2VlY2ggeW91LCBzaXIsIGhhdmUgcGF0aWVuY2U6CiAgICBZb3VyIGxvb2tzIGFyZSBwYWxlIGFuZCB3aWxkLCBhbmQgZG8gaW1wb3J0CiAgICBTb21lIG1pc2FkdmVudHVyZS4KClJPTUVPCgogICAgVHVzaCwgdGhvdSBhcnQgZGVjZWl2ZWQ6CiAgICBMZWF2ZSBtZSwgYW5kIGRvIHRoZSB0aGluZyBJIGJpZCB0aGVlIGRvLgogICAgSGFzdCB0aG91IG5vIGxldHRlcnMgdG8gbWUgZnJvbSB0aGUgZnJpYXICgpCQUxUSEFTQVIKCiAgICBObywgbXkgZ29vZCBsb3JkLgoKUk9NRU8KCiAgICBObyBtYXR0ZXI6IGdldCB0aGVlIGdvbmUsCiAgICBBbmQgaGlyZSB0aG9zZSBob3JzZXM7IEknbGwgYmUgd2l0aCB0aGVlIHN0cmFpZ2h0LgoKICAgIEV4aXQgQkFMVEhBU0FSCiAgICBXZWxsLCBKdWxpZXQsIEkgd2lsbCBsaWUgd2l0aCB0aGVlIHRvLW5pZ2h0LgogICAgTGV0J3Mgc2VlIGZvciBtZWFuczogTyBtaXNjaGllZiwgdGhvdSBhcnQgc3dpZnQKICAgIFRvIGVudGVyIGluIHRoZSB0aG91Z2h0cyBvZiBkZXNwZXJhdGUgbWVuIQogICAgSSBkbyByZW1lbWJlciBhbiBhcG90aGVjYXJ5LC0tCiAgICBBbmQgaGVyZWFib3V0cyBoZSBkd2VsbHMsLS13aGljaCBsYXRlIEkgbm90ZWQKICAgIEluIHRhdHRlcidkIHdlZWRzLCB3aXRoIG92ZXJ3aGVsbWluZyBicm93cywKICAgIEN1bGxpbmcgb2Ygc2ltcGxlczsgbWVhZ3JlIHdlcmUgaGlzIGxvb2tzLAogICAgU2hhcnAgbWlzZXJ5IGhhZCB3b3JuIGhpbSB0byB0aGUgYm9uZXM6CiAgICBBbmQgaW4gaGlzIG5lZWR5IHNob3AgYSB0b3J0b2lzZSBodW5nLAogICAgQW4gYWxsaWdhdG9yIHN0dWZmJ2QsIGFuZCBvdGhlciBza2lucwogICAgT2YgaWxsLXNoYXBlZCBmaXNoZXM7IGFuZCBhYm91dCBoaXMgc2hlbHZlcwogICAgQSBiZWdnYXJseSBhY2NvdW50IG9mIGVtcHR5IGJveGVzLAogICAgR3JlZW4gZWFydGhlbiBwb3RzLCBibGFkZGVycyBhbmQgbXVzdHkgc2VlZHMsCiAgICBSZW1uYW50cyBvZiBwYWNrdGhyZWFkIGFuZCBvbGQgY2FrZXMgb2Ygcm9zZXMsCiAgICBXZXJlIHRoaW5seSBzY2F0dGVyJ2QsIHRvIG1ha2UgdXAgYSBzaG93LgogICAgTm90aW5nIHRoaXMgcGVudXJ5LCB0byBteXNlbGYgSSBzYWlkCiAgICAnQW4gaWYgYSBtYW4gZGlkIG5lZWQgYSBwb2lzb24gbm93LAogICAgV2hvc2Ugc2FsZSBpcyBwcmVzZW50IGRlYXRoIGluIE1hbnR1YSwKICAgIEhlcmUgbGl2ZXMgYSBjYWl0aWZmIHdyZXRjaCB3b3VsZCBzZWxsIGl0IGhpbS4nCiAgICBPLCB0aGlzIHNhbWUgdGhvdWdodCBkaWQgYnV0IGZvcmVydW4gbXkgbmVlZDsKICAgIEFuZCB0aGlzIHNhbWUgbmVlZHkgbWFuIG11c3Qgc2VsbCBpdCBtZS4KICAgIEFzIEkgcmVtZW1iZXIsIHRoaXMgc2hvdWxkIGJlIHRoZSBob3VzZS4KICAgIEJlaW5nIGhvbGlkYXksIHRoZSBiZWdnYXIncyBzaG9wIGlzIHNodXQuCiAgICBXaGF0LCBobyEgYXBvdGhlY2FyeSEKCiAgICBFbnRlciBBcG90aGVjYXJ5CgpBcG90aGVjYXJ5CgogICAgV2hvIGNhbGxzIHNvIGxvdWQCgpST01FTwoKICAgIENvbWUgaGl0aGVyLCBtYW4uIEkgc2VlIHRoYXQgdGhvdSBhcnQgcG9vcjoKICAgIEhvbGQsIHRoZXJlIGlzIGZvcnR5IGR1Y2F0czogbGV0IG1lIGhhdmUKICAgIEEgZHJhbSBvZiBwb2lzb24sIHN1Y2ggc29vbi1zcGVlZGluZyBnZWFyCiAgICBBcyB3aWxsIGRpc3BlcnNlIGl0c2VsZiB0aHJvdWdoIGFsbCB0aGUgdmVpbnMKICAgIFRoYXQgdGhlIGxpZmUtd2VhcnkgdGFrZXIgbWF5IGZhbGwgZGVhZAogICAgQW5kIHRoYXQgdGhlIHRydW5rIG1heSBiZSBkaXNjaGFyZ2VkIG9mIGJyZWF0aAogICAgQXMgdmlvbGVudGx5IGFzIGhhc3R5IHBvd2RlciBmaXJlZAogICAgRG90aCBodXJyeSBmcm9tIHRoZSBmYXRhbCBjYW5ub24ncyB3b21iLgoKQXBvdGhlY2FyeQoKICAgIFN1Y2ggbW9ydGFsIGRydWdzIEkgaGF2ZTsgYnV0IE1hbnR1YSdzIGxhdwogICAgSXMgZGVhdGggdG8gYW55IGhlIHRoYXQgdXR0ZXJzIHRoZW0uCgpST01FTwoKICAgIEFydCB0aG91IHNvIGJhcmUgYW5kIGZ1bGwgb2Ygd3JldGNoZWRuZXNzLAogICAgQW5kIGZlYXInc3QgdG8gZGllPyBmYW1pbmUgaXMgaW4gdGh5IGNoZWVrcywKICAgIE5lZWQgYW5kIG9wcHJlc3Npb24gc3RhcnZldGggaW4gdGhpbmUgZXllcywKICAgIENvbnRlbXB0IGFuZCBiZWdnYXJ5IGhhbmdzIHVwb24gdGh5IGJhY2s7CiAgICBUaGUgd29ybGQgaXMgbm90IHRoeSBmcmllbmQgbm9yIHRoZSB3b3JsZCdzIGxhdzsKICAgIFRoZSB3b3JsZCBhZmZvcmRzIG5vIGxhdyB0byBtYWtlIHRoZWUgcmljaDsKICAgIFRoZW4gYmUgbm90IHBvb3IsIGJ1dCBicmVhayBpdCwgYW5kIHRha2UgdGhpcy4KCkFwb3RoZWNhcnkKCiAgICBNeSBwb3ZlcnR5LCBidXQgbm90IG15IHdpbGwsIGNvbnNlbnRzLgoKUk9NRU8KCiAgICBJIHBheSB0aHkgcG92ZXJ0eSwgYW5kIG5vdCB0aHkgd2lsbC4KCkFwb3RoZWNhcnkKCiAgICBQdXQgdGhpcyBpbiBhbnkgbGlxdWlkIHRoaW5nIHlvdSB3aWxsLAogICAgQW5kIGRyaW5rIGl0IG9mZjsgYW5kLCBpZiB5b3UgaGFkIHRoZSBzdHJlbmd0aAogICAgT2YgdHdlbnR5IG1lbiwgaXQgd291bGQgZGlzcGF0Y2ggeW91IHN0cmFpZ2h0LgoKUk9NRU8KCiAgICBUaGVyZSBpcyB0aHkgZ29sZCwgd29yc2UgcG9pc29uIHRvIG1lbidzIHNvdWxzLAogICAgRG9pbmcgbW9yZSBtdXJkZXJzIGluIHRoaXMgbG9hdGhzb21lIHdvcmxkLAogICAgVGhhbiB0aGVzZSBwb29yIGNvbXBvdW5kcyB0aGF0IHRob3UgbWF5c3Qgbm90IHNlbGwuCiAgICBJIHNlbGwgdGhlZSBwb2lzb247IHRob3UgaGFzdCBzb2xkIG1lIG5vbmUuCiAgICBGYXJld2VsbDogYnV5IGZvb2QsIGFuZCBnZXQgdGh5c2VsZiBpbiBmbGVzaC4KICAgIENvbWUsIGNvcmRpYWwgYW5kIG5vdCBwb2lzb24sIGdvIHdpdGggbWUKICAgIFRvIEp1bGlldCdzIGdyYXZlOyBmb3IgdGhlcmUgbXVzdCBJIHVzZSB0aGVlLgoKICAgIEV4ZXVudAoKU0NFTkUgSUkuIEZyaWFyIExhdXJlbmNlJ3MgY2VsbC4KCiAgICBFbnRlciBGUklBUiBKT0hOIAoKRlJJQVIgSk9ITgoKICAgIEhvbHkgRnJhbmNpc2NhbiBmcmlhciEgYnJvdGhlciwgaG8hCgogICAgRW50ZXIgRlJJQVIgTEFVUkVOQ0UKCkZSSUFSIExBVVJFTkNFCgogICAgVGhpcyBzYW1lIHNob3VsZCBiZSB0aGUgdm9pY2Ugb2YgRnJpYXIgSm9obi4KICAgIFdlbGNvbWUgZnJvbSBNYW50dWE6IHdoYXQgc2F5cyBSb21lbz8KICAgIE9yLCBpZiBoaXMgbWluZCBiZSB3cml0LCBnaXZlIG1lIGhpcyBsZXR0ZXIuCgpGUklBUiBKT0hOCgogICAgR29pbmcgdG8gZmluZCBhIGJhcmUtZm9vdCBicm90aGVyIG91dAogICAgT25lIG9mIG91ciBvcmRlciwgdG8gYXNzb2NpYXRlIG1lLAogICAgSGVyZSBpbiB0aGlzIGNpdHkgdmlzaXRpbmcgdGhlIHNpY2ssCiAgICBBbmQgZmluZGluZyBoaW0sIHRoZSBzZWFyY2hlcnMgb2YgdGhlIHRvd24sCiAgICBTdXNwZWN0aW5nIHRoYXQgd2UgYm90aCB3ZXJlIGluIGEgaG91c2UKICAgIFdoZXJlIHRoZSBpbmZlY3Rpb3VzIHBlc3RpbGVuY2UgZGlkIHJlaWduLAogICAgU2VhbCdkIHVwIHRoZSBkb29ycywgYW5kIHdvdWxkIG5vdCBsZXQgdXMgZm9ydGg7CiAgICBTbyB0aGF0IG15IHNwZWVkIHRvIE1hbnR1YSB0aGVyZSB3YXMgc3RheSdkLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBXaG8gYmFyZSBteSBsZXR0ZXIsIHRoZW4sIHRvIFJvbWVvPwoKRlJJQVIgSk9ITgoKICAgIEkgY291bGQgbm90IHNlbmQgaXQsLS1oZXJlIGl0IGlzIGFnYWluLC0tCiAgICBOb3IgZ2V0IGEgbWVzc2VuZ2VyIHRvIGJyaW5nIGl0IHRoZWUsCiAgICBTbyBmZWFyZnVsIHdlcmUgdGhleSBvZiBpbmZlY3Rpb24uCgpGUklBUiBMQVVSRU5DRQoKICAgIFVuaGFwcHkgZm9ydHVuZSEgYnkgbXkgYnJvdGhlcmhvb2QsCiAgICBUaGUgbGV0dGVyIHdhcyBub3QgbmljZSBidXQgZnVsbCBvZiBjaGFyZ2UKICAgIE9mIGRlYXIgaW1wb3J0LCBhbmQgdGhlIG5lZ2xlY3RpbmcgaXQKICAgIE1heSBkbyBtdWNoIGRhbmdlci4gRnJpYXIgSm9obiwgZ28gaGVuY2U7CiAgICBHZXQgbWUgYW4gaXJvbiBjcm93LCBhbmQgYnJpbmcgaXQgc3RyYWlnaHQKICAgIFVudG8gbXkgY2VsbC4KCkZSSUFSIEpPSE4KCiAgICBCcm90aGVyLCBJJ2xsIGdvIGFuZCBicmluZyBpdCB0aGVlLgoKICAgIEV4aXQKCkZSSUFSIExBVVJFTkNFCgogICAgTm93IG11c3QgSSB0byB0aGUgbW9udW1lbnQgYWxvbmU7CiAgICBXaXRoaW4gdGhyZWUgaG91cnMgd2lsbCBmYWlyIEp1bGlldCB3YWtlOgogICAgU2hlIHdpbGwgYmVzaHJldyBtZSBtdWNoIHRoYXQgUm9tZW8KICAgIEhhdGggaGFkIG5vIG5vdGljZSBvZiB0aGVzZSBhY2NpZGVudHM7CiAgICBCdXQgSSB3aWxsIHdyaXRlIGFnYWluIHRvIE1hbnR1YSwKICAgIEFuZCBrZWVwIGhlciBhdCBteSBjZWxsIHRpbGwgUm9tZW8gY29tZTsKICAgIFBvb3IgbGl2aW5nIGNvcnNlLCBjbG9zZWQgaW4gYSBkZWFkIG1hbidzIHRvbWIhCgogICAgRXhpdAoKU0NFTkUgSUlJLiBBIGNodXJjaHlhcmQ7IGluIGl0IGEgdG9tYiBiZWxvbmdpbmcgdG8gdGhlIENhcHVsZXRzLgoKICAgIEVudGVyIFBBUklTLCBhbmQgaGlzIFBhZ2UgYmVhcmluZyBmbG93ZXJzIGFuZCBhIHRvcmNoIAoKUEFSSVMKCiAgICBHaXZlIG1lIHRoeSB0b3JjaCwgYm95OiBoZW5jZSwgYW5kIHN0YW5kIGFsb29mOgogICAgWWV0IHB1dCBpdCBvdXQsIGZvciBJIHdvdWxkIG5vdCBiZSBzZWVuLgogICAgVW5kZXIgeW9uZCB5ZXctdHJlZXMgbGF5IHRoZWUgYWxsIGFsb25nLAogICAgSG9sZGluZyB0aGluZSBlYXIgY2xvc2UgdG8gdGhlIGhvbGxvdyBncm91bmQ7CiAgICBTbyBzaGFsbCBubyBmb290IHVwb24gdGhlIGNodXJjaHlhcmQgdHJlYWQsCiAgICBCZWluZyBsb29zZSwgdW5maXJtLCB3aXRoIGRpZ2dpbmcgdXAgb2YgZ3JhdmVzLAogICAgQnV0IHRob3Ugc2hhbHQgaGVhciBpdDogd2hpc3RsZSB0aGVuIHRvIG1lLAogICAgQXMgc2lnbmFsIHRoYXQgdGhvdSBoZWFyJ3N0IHNvbWV0aGluZyBhcHByb2FjaC4KICAgIEdpdmUgbWUgdGhvc2UgZmxvd2Vycy4gRG8gYXMgSSBiaWQgdGhlZSwgZ28uCgpQQUdFCgogICAgW0FzaWRlXSBJIGFtIGFsbW9zdCBhZnJhaWQgdG8gc3RhbmQgYWxvbmUKICAgIEhlcmUgaW4gdGhlIGNodXJjaHlhcmQ7IHlldCBJIHdpbGwgYWR2ZW50dXJlLgoKICAgIFJldGlyZXMKClBBUklTCgogICAgU3dlZXQgZmxvd2VyLCB3aXRoIGZsb3dlcnMgdGh5IGJyaWRhbCBiZWQgSSBzdHJldywtLQogICAgTyB3b2UhIHRoeSBjYW5vcHkgaXMgZHVzdCBhbmQgc3RvbmVzOy0tCiAgICBXaGljaCB3aXRoIHN3ZWV0IHdhdGVyIG5pZ2h0bHkgSSB3aWxsIGRldywKICAgIE9yLCB3YW50aW5nIHRoYXQsIHdpdGggdGVhcnMgZGlzdGlsbCdkIGJ5IG1vYW5zOgogICAgVGhlIG9ic2VxdWllcyB0aGF0IEkgZm9yIHRoZWUgd2lsbCBrZWVwCiAgICBOaWdodGx5IHNoYWxsIGJlIHRvIHN0cmV3IHRoeSBncmF2ZSBhbmQgd2VlcC4KCiAgICBUaGUgUGFnZSB3aGlzdGxlcwogICAgVGhlIGJveSBnaXZlcyB3YXJuaW5nIHNvbWV0aGluZyBkb3RoIGFwcHJvYWNoLgogICAgV2hhdCBjdXJzZWQgZm9vdCB3YW5kZXJzIHRoaXMgd2F5IHRvLW5pZ2h0LAogICAgVG8gY3Jvc3MgbXkgb2JzZXF1aWVzIGFuZCB0cnVlIGxvdmUncyByaXRlPwogICAgV2hhdCB3aXRoIGEgdG9yY2ghIG11ZmZsZSBtZSwgbmlnaHQsIGF3aGlsZS4KCiAgICBSZXRpcmVzCgogICAgRW50ZXIgUk9NRU8gYW5kIEJBTFRIQVNBUiwgd2l0aCBhIHRvcmNoLCBtYXR0b2NrLCAmIGMKClJPTUVPCgogICAgR2l2ZSBtZSB0aGF0IG1hdHRvY2sgYW5kIHRoZSB3cmVuY2hpbmcgaXJvbi4KICAgIEhvbGQsIHRha2UgdGhpcyBsZXR0ZXI7IGVhcmx5IGluIHRoZSBtb3JuaW5nCiAgICBTZWUgdGhvdSBkZWxpdmVyIGl0IHRvIG15IGxvcmQgYW5kIGZhdGhlci4KICAgIEdpdmUgbWUgdGhlIGxpZ2h0OiB1cG9uIHRoeSBsaWZlLCBJIGNoYXJnZSB0aGVlLAogICAgV2hhdGUnZXIgdGhvdSBoZWFyJ3N0IG9yIHNlZXN0LCBzdGFuZCBhbGwgYWxvb2YsCiAgICBBbmQgZG8gbm90IGludGVycnVwdCBtZSBpbiBteSBjb3Vyc2UuCiAgICBXaHkgSSBkZXNjZW5kIGludG8gdGhpcyBiZWQgb2YgZGVhdGgsCiAgICBJcyBwYXJ0bHkgdG8gYmVob2xkIG15IGxhZHkncyBmYWNlOwogICAgQnV0IGNoaWVmbHkgdG8gdGFrZSB0aGVuY2UgZnJvbSBoZXIgZGVhZCBmaW5nZXIKICAgIEEgcHJlY2lvdXMgcmluZywgYSByaW5nIHRoYXQgSSBtdXN0IHVzZQogICAgSW4gZGVhciBlbXBsb3ltZW50OiB0aGVyZWZvcmUgaGVuY2UsIGJlIGdvbmU6CiAgICBCdXQgaWYgdGhvdSwgamVhbG91cywgZG9zdCByZXR1cm4gdG8gcHJ5CiAgICBJbiB3aGF0IEkgZnVydGhlciBzaGFsbCBpbnRlbmQgdG8gZG8sCiAgICBCeSBoZWF2ZW4sIEkgd2lsbCB0ZWFyIHRoZWUgam9pbnQgYnkgam9pbnQKICAgIEFuZCBzdHJldyB0aGlzIGh1bmdyeSBjaHVyY2h5YXJkIHdpdGggdGh5IGxpbWJzOgogICAgVGhlIHRpbWUgYW5kIG15IGludGVudHMgYXJlIHNhdmFnZS13aWxkLAogICAgTW9yZSBmaWVyY2UgYW5kIG1vcmUgaW5leG9yYWJsZSBmYXIKICAgIFRoYW4gZW1wdHkgdGlnZXJzIG9yIHRoZSByb2FyaW5nIHNlYS4KCkJBTFRIQVNBUgoKICAgIEkgd2lsbCBiZSBnb25lLCBzaXIsIGFuZCBub3QgdHJvdWJsZSB5b3UuCgpST01FTwoKICAgIFNvIHNoYWx0IHRob3Ugc2hvdyBtZSBmcmllbmRzaGlwLiBUYWtlIHRob3UgdGhhdDoKICAgIExpdmUsIGFuZCBiZSBwcm9zcGVyb3VzOiBhbmQgZmFyZXdlbGwsIGdvb2QgZmVsbG93LgoKQkFMVEhBU0FSCgogICAgW0FzaWRlXSBGb3IgYWxsIHRoaXMgc2FtZSwgSSdsbCBoaWRlIG1lIGhlcmVhYm91dDoKICAgIEhpcyBsb29rcyBJIGZlYXIsIGFuZCBoaXMgaW50ZW50cyBJIGRvdWJ0LgoKICAgIFJldGlyZXMKClJPTUVPCgogICAgVGhvdSBkZXRlc3RhYmxlIG1hdywgdGhvdSB3b21iIG9mIGRlYXRoLAogICAgR29yZ2VkIHdpdGggdGhlIGRlYXJlc3QgbW9yc2VsIG9mIHRoZSBlYXJ0aCwKICAgIFRodXMgSSBlbmZvcmNlIHRoeSByb3R0ZW4gamF3cyB0byBvcGVuLAogICAgQW5kLCBpbiBkZXNwaXRlLCBJJ2xsIGNyYW0gdGhlZSB3aXRoIG1vcmUgZm9vZCEKCiAgICBPcGVucyB0aGUgdG9tYgoKUEFSSVMKCiAgICBUaGlzIGlzIHRoYXQgYmFuaXNoJ2QgaGF1Z2h0eSBNb250YWd1ZSwKICAgIFRoYXQgbXVyZGVyJ2QgbXkgbG92ZSdzIGNvdXNpbiwgd2l0aCB3aGljaCBncmllZiwKICAgIEl0IGlzIHN1cHBvc2VkLCB0aGUgZmFpciBjcmVhdHVyZSBkaWVkOwogICAgQW5kIGhlcmUgaXMgY29tZSB0byBkbyBzb21lIHZpbGxhbm91cyBzaGFtZQogICAgVG8gdGhlIGRlYWQgYm9kaWVzOiBJIHdpbGwgYXBwcmVoZW5kIGhpbS4KCiAgICBDb21lcyBmb3J3YXJkCiAgICBTdG9wIHRoeSB1bmhhbGxvdydkIHRvaWwsIHZpbGUgTW9udGFndWUhCiAgICBDYW4gdmVuZ2VhbmNlIGJlIHB1cnN1ZWQgZnVydGhlciB0aGFuIGRlYXRoPwogICAgQ29uZGVtbmVkIHZpbGxhaW4sIEkgZG8gYXBwcmVoZW5kIHRoZWU6CiAgICBPYmV5LCBhbmQgZ28gd2l0aCBtZTsgZm9yIHRob3UgbXVzdCBkaWUuCgpST01FTwoKICAgIEkgbXVzdCBpbmRlZWQ7IGFuZCB0aGVyZWZvcmUgY2FtZSBJIGhpdGhlci4KICAgIEdvb2QgZ2VudGxlIHlvdXRoLCB0ZW1wdCBub3QgYSBkZXNwZXJhdGUgbWFuOwogICAgRmx5IGhlbmNlLCBhbmQgbGVhdmUgbWU6IHRoaW5rIHVwb24gdGhlc2UgZ29uZTsKICAgIExldCB0aGVtIGFmZnJpZ2h0IHRoZWUuIEkgYmVzZWVjaCB0aGVlLCB5b3V0aCwKICAgIFB1dCBub3QgYW5vdGhlciBzaW4gdXBvbiBteSBoZWFkLAogICAgQnkgdXJnaW5nIG1lIHRvIGZ1cnk6IE8sIGJlIGdvbmUhCiAgICBCeSBoZWF2ZW4sIEkgbG92ZSB0aGVlIGJldHRlciB0aGFuIG15c2VsZjsKICAgIEZvciBJIGNvbWUgaGl0aGVyIGFybSdkIGFnYWluc3QgbXlzZWxmOgogICAgU3RheSBub3QsIGJlIGdvbmU7IGxpdmUsIGFuZCBoZXJlYWZ0ZXIgc2F5LAogICAgQSBtYWRtYW4ncyBtZXJjeSBiYWRlIHRoZWUgcnVuIGF3YXkuCgpQQVJJUwoKICAgIEkgZG8gZGVmeSB0aHkgY29uanVyYXRpb25zLAogICAgQW5kIGFwcHJlaGVuZCB0aGVlIGZvciBhIGZlbG9uIGhlcmUuCgpST01FTwoKICAgIFdpbHQgdGhvdSBwcm92b2tlIG1lPyB0aGVuIGhhdmUgYXQgdGhlZSwgYm95IQoKICAgIFRoZXkgZmlnaHQKClBBR0UKCiAgICBPIExvcmQsIHRoZXkgZmlnaHQhIEkgd2lsbCBnbyBjYWxsIHRoZSB3YXRjaC4KCiAgICBFeGl0CgpQQVJJUwoKICAgIE8sIEkgYW0gc2xhaW4hCgogICAgRmFsbHMKICAgIElmIHRob3UgYmUgbWVyY2lmdWwsCiAgICBPcGVuIHRoZSB0b21iLCBsYXkgbWUgd2l0aCBKdWxpZXQuCgogICAgRGllcwoKUk9NRU8KCiAgICBJbiBmYWl0aCwgSSB3aWxsLiBMZXQgbWUgcGVydXNlIHRoaXMgZmFjZS4KICAgIE1lcmN1dGlvJ3Mga2luc21hbiwgbm9ibGUgQ291bnR5IFBhcmlzIQogICAgV2hhdCBzYWlkIG15IG1hbiwgd2hlbiBteSBiZXRvc3NlZCBzb3VsCiAgICBEaWQgbm90IGF0dGVuZCBoaW0gYXMgd2Ugcm9kZT8gSSB0aGluawogICAgSGUgdG9sZCBtZSBQYXJpcyBzaG91bGQgaGF2ZSBtYXJyaWVkIEp1bGlldDoKICAgIFNhaWQgaGUgbm90IHNvPyBvciBkaWQgSSBkcmVhbSBpdCBzbz8KICAgIE9yIGFtIEkgbWFkLCBoZWFyaW5nIGhpbSB0YWxrIG9mIEp1bGlldCwKICAgIFRvIHRoaW5rIGl0IHdhcyBzbz8gTywgZ2l2ZSBtZSB0aHkgaGFuZCwKICAgIE9uZSB3cml0IHdpdGggbWUgaW4gc291ciBtaXNmb3J0dW5lJ3MgYm9vayEKICAgIEknbGwgYnVyeSB0aGVlIGluIGEgdHJpdW1waGFudCBncmF2ZTsKICAgIEEgZ3JhdmUIE8gbm8hIGEgbGFudGVybiwgc2xhdWdodGVyJ2QgeW91dGgsCiAgICBGb3IgaGVyZSBsaWVzIEp1bGlldCwgYW5kIGhlciBiZWF1dHkgbWFrZXMKICAgIFRoaXMgdmF1bHQgYSBmZWFzdGluZyBwcmVzZW5jZSBmdWxsIG9mIGxpZ2h0LgogICAgRGVhdGgsIGxpZSB0aG91IHRoZXJlLCBieSBhIGRlYWQgbWFuIGludGVycidkLgoKICAgIExheWluZyBQQVJJUyBpbiB0aGUgdG9tYgogICAgSG93IG9mdCB3aGVuIG1lbiBhcmUgYXQgdGhlIHBvaW50IG9mIGRlYXRoCiAgICBIYXZlIHRoZXkgYmVlbiBtZXJyeSEgd2hpY2ggdGhlaXIga2VlcGVycyBjYWxsCiAgICBBIGxpZ2h0bmluZyBiZWZvcmUgZGVhdGg6IE8sIGhvdyBtYXkgSQogICAgQ2FsbCB0aGlzIGEgbGlnaHRuaW5nPyBPIG15IGxvdmUhIG15IHdpZmUhCiAgICBEZWF0aCwgdGhhdCBoYXRoIHN1Y2snZCB0aGUgaG9uZXkgb2YgdGh5IGJyZWF0aCwKICAgIEhhdGggaGFkIG5vIHBvd2VyIHlldCB1cG9uIHRoeSBiZWF1dHk6CiAgICBUaG91IGFydCBub3QgY29ucXVlcidkOyBiZWF1dHkncyBlbnNpZ24geWV0CiAgICBJcyBjcmltc29uIGluIHRoeSBsaXBzIGFuZCBpbiB0aHkgY2hlZWtzLAogICAgQW5kIGRlYXRoJ3MgcGFsZSBmbGFnIGlzIG5vdCBhZHZhbmNlZCB0aGVyZS4KICAgIFR5YmFsdCwgbGllc3QgdGhvdSB0aGVyZSBpbiB0aHkgYmxvb2R5IHNoZWV0PwogICAgTywgd2hhdCBtb3JlIGZhdm91ciBjYW4gSSBkbyB0byB0aGVlLAogICAgVGhhbiB3aXRoIHRoYXQgaGFuZCB0aGF0IGN1dCB0aHkgeW91dGggaW4gdHdhaW4KICAgIFRvIHN1bmRlciBoaXMgdGhhdCB3YXMgdGhpbmUgZW5lbXkCiAgICBGb3JnaXZlIG1lLCBjb3VzaW4hIEFoLCBkZWFyIEp1bGlldCwKICAgIFdoeSBhcnQgdGhvdSB5ZXQgc28gZmFpcj8gc2hhbGwgSSBiZWxpZXZlCiAgICBUaGF0IHVuc3Vic3RhbnRpYWwgZGVhdGggaXMgYW1vcm91cywKICAgIEFuZCB0aGF0IHRoZSBsZWFuIGFiaG9ycmVkIG1vbnN0ZXIga2VlcHMKICAgIFRoZWUgaGVyZSBpbiBkYXJrIHRvIGJlIGhpcyBwYXJhbW91cj8KICAgIEZvciBmZWFyIG9mIHRoYXQsIEkgc3RpbGwgd2lsbCBzdGF5IHdpdGggdGhlZTsKICAgIEFuZCBuZXZlciBmcm9tIHRoaXMgcGFsYWNlIG9mIGRpbSBuaWdodAogICAgRGVwYXJ0IGFnYWluOiBoZXJlLCBoZXJlIHdpbGwgSSByZW1haW4KICAgIFdpdGggd29ybXMgdGhhdCBhcmUgdGh5IGNoYW1iZXItbWFpZHM7IE8sIGhlcmUKICAgIFdpbGwgSSBzZXQgdXAgbXkgZXZlcmxhc3RpbmcgcmVzdCwKICAgIEFuZCBzaGFrZSB0aGUgeW9rZSBvZiBpbmF1c3BpY2lvdXMgc3RhcnMKICAgIEZyb20gdGhpcyB3b3JsZC13ZWFyaWVkIGZsZXNoLiBFeWVzLCBsb29rIHlvdXIgbGFzdCEKICAgIEFybXMsIHRha2UgeW91ciBsYXN0IGVtYnJhY2UhIGFuZCwgbGlwcywgTyB5b3UKICAgIFRoZSBkb29ycyBvZiBicmVhdGgsIHNlYWwgd2l0aCBhIHJpZ2h0ZW91cyBraXNzCiAgICBBIGRhdGVsZXNzIGJhcmdhaW4gdG8gZW5ncm9zc2luZyBkZWF0aCEKICAgIENvbWUsIGJpdHRlciBjb25kdWN0LCBjb21lLCB1bnNhdm91cnkgZ3VpZGUhCiAgICBUaG91IGRlc3BlcmF0ZSBwaWxvdCwgbm93IGF0IG9uY2UgcnVuIG9uCiAgICBUaGUgZGFzaGluZyByb2NrcyB0aHkgc2VhLXNpY2sgd2VhcnkgYmFyayEKICAgIEhlcmUncyB0byBteSBsb3ZlIQoKICAgIERyaW5rcwogICAgTyB0cnVlIGFwb3RoZWNhcnkhCiAgICBUaHkgZHJ1Z3MgYXJlIHF1aWNrLiBUaHVzIHdpdGggYSBraXNzIEkgZGllLgoKICAgIERpZXMKCiAgICBFbnRlciwgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgY2h1cmNoeWFyZCwgRlJJQVIgTEFVUkVOQ0UsIHdpdGggYSBsYW50ZXJuLCBjcm93LCBhbmQgc3BhZGUKCkZSSUFSIExBVVJFTkNFCgogICAgU2FpbnQgRnJhbmNpcyBiZSBteSBzcGVlZCEgaG93IG9mdCB0by1uaWdodAogICAgSGF2ZSBteSBvbGQgZmVldCBzdHVtYmxlZCBhdCBncmF2ZXMhIFdobydzIHRoZXJlPwoKQkFMVEhBU0FSCgogICAgSGVyZSdzIG9uZSwgYSBmcmllbmQsIGFuZCBvbmUgdGhhdCBrbm93cyB5b3Ugd2VsbC4KCkZSSUFSIExBVVJFTkNFCgogICAgQmxpc3MgYmUgdXBvbiB5b3UhIFRlbGwgbWUsIGdvb2QgbXkgZnJpZW5kLAogICAgV2hhdCB0b3JjaCBpcyB5b25kLCB0aGF0IHZhaW5seSBsZW5kcyBoaXMgbGlnaHQKICAgIFRvIGdydWJzIGFuZCBleWVsZXNzIHNrdWxscz8gYXMgSSBkaXNjZXJuLAogICAgSXQgYnVybmV0aCBpbiB0aGUgQ2FwZWwncyBtb251bWVudC4KCkJBTFRIQVNBUgoKICAgIEl0IGRvdGggc28sIGhvbHkgc2lyOyBhbmQgdGhlcmUncyBteSBtYXN0ZXIsCiAgICBPbmUgdGhhdCB5b3UgbG92ZS4KCkZSSUFSIExBVVJFTkNFCgogICAgV2hvIGlzIGl0PwoKQkFMVEhBU0FSCgogICAgUm9tZW8uCgpGUklBUiBMQVVSRU5DRQoKICAgIEhvdyBsb25nIGhhdGggaGUgYmVlbiB0aGVyZT8KCkJBTFRIQVNBUgoKICAgIEZ1bGwgaGFsZiBhbiBob3VyLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBHbyB3aXRoIG1lIHRvIHRoZSB2YXVsdC4KCkJBTFRIQVNBUgoKICAgIEkgZGFyZSBub3QsIHNpcgogICAgTXkgbWFzdGVyIGtub3dzIG5vdCBidXQgSSBhbSB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CwgYm95OiB3aGljaCB3YXkCgpKVUxJRVQKCiAgICBZZWEsIG5vaXNlPyB0aGVuIEknbGwgYmUgYnJpZWYuIE8gaGFwcHkgZGFnZ2VyIQoKICAgIFNuYXRjaGluZyBST01FTydzIGRhZ2dlcgogICAgVGhpcyBpcyB0aHkgc2hlYXRoOwoKICAgIFN0YWJzIGhlcnNlbGYKICAgIHRoZXJlIHJ1c3QsIGFuZCBsZXQgbWUgZGllLgoKICAgIEZhbGxzIG9uIFJPTUVPJ3MgYm9keSwgYW5kIGRpZXMKCiAgICBFbnRlciBXYXRjaCwgd2l0aCB0aGUgUGFnZSBvZiBQQVJJUwoKUEFHRQoKICAgIFRoaXMgaXMgdGhlIHBsYWNlOyB0aGVyZSwgd2hlcmUgdGhlIHRvcmNoIGRvdGggYnVybi4KCkZpcnN0IFdhdGNobWFuCgogICAgVGhlIGdyb3VuZCBpcyBibG9vZHk7IHNlYXJjaCBhYm91dCB0aGUgY2h1cmNoeWFyZDoKICAgIEdvLCBzb21lIG9mIHlvdSwgd2hvZSdlciB5b3UgZmluZCBhdHRhY2guCiAgICBQaXRpZnVsIHNpZ2h0ISBoZXJlIGxpZXMgdGhlIGNvdW50eSBzbGFpbiwKICAgIEFuZCBKdWxpZXQgYmxlZWRpbmcsIHdhcm0sIGFuZCBuZXdseSBkZWFkLAogICAgV2hvIGhlcmUgaGF0aCBsYWluIHRoZXNlIHR3byBkYXlzIGJ1cmllZC4KICAgIEdvLCB0ZWxsIHRoZSBwcmluY2U6IHJ1biB0byB0aGUgQ2FwdWxldHM6CiAgICBSYWlzZSB1cCB0aGUgTW9udGFndWVzOiBzb21lIG90aGVycyBzZWFyY2g6CiAgICBXZSBzZWUgdGhlIGdyb3VuZCB3aGVyZW9uIHRoZXNlIHdvZXMgZG8gbGllOwogICAgQnV0IHRoZSB0cnVlIGdyb3VuZCBvZiBhbGwgdGhlc2UgcGl0ZW91cyB3b2VzCiAgICBXZSBjYW5ub3Qgd2l0aG91dCBjaXJjdW1zdGFuY2UgZGVzY3J5LgoKICAgIFJlLWVudGVyIHNvbWUgb2YgdGhlIFdhdGNoLCB3aXRoIEJBTFRIQVNBUgoKU2Vjb25kIFdhdGNobWFuCgogICAgSGVyZSdzIFJvbWVvJ3MgbWFuOyB3ZSBmb3VuZCBoaW0gaW4gdGhlIGNodXJjaHlhcmQuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhvbGQgaGltIGluIHNhZmV0eSwgdGlsbCB0aGUgcHJpbmNlIGNvbWUgaGl0aGVyLgoKICAgIFJlLWVudGVyIG90aGVycyBvZiB0aGUgV2F0Y2gsIHdpdGggRlJJQVIgTEFVUkVOQ0UKClRoaXJkIFdhdGNobWFuCgogICAgSGVyZSBpcyBhIGZyaWFyLCB0aGF0IHRyZW1ibGVzLCBzaWdocyBhbmQgd2VlcHM6CiAgICBXZSB0b29rIHRoaXMgbWF0dG9jayBhbmQgdGhpcyBzcGFkZSBmcm9tIGhpbSwKICAgIEFzIGhlIHdhcyBjb21pbmcgZnJvbSB0aGlzIGNodXJjaHlhcmQgc2lkZS4KCkZpcnN0IFdhdGNobWFuCgogICAgQSBncmVhdCBzdXNwaWNpb246IHN0YXkgdGhlIGZyaWFyIHRvby4KCiAgICBFbnRlciB0aGUgUFJJTkNFIGFuZCBBdHRlbmRhbnRzCgpQUklOQ0UKCiAgICBXaGF0IG1pc2FkdmVudHVyZSBpcyBzbyBlYXJseSB1cCwKICAgIFRoYXQgY2FsbHMgb3VyIHBlcnNvbiBmcm9tIG91ciBtb3JuaW5nJ3MgcmVzdD8KCiAgICBFbnRlciBDQVBVTEVULCBMQURZIENBUFVMRVQsIGFuZCBvdGhlcnMKCkNBUFVMRVQKCiAgICBXaGF0IHNob3VsZCBpdCBiZSwgdGhhdCB0aGV5IHNvIHNocmllayBhYnJvYWQCgpMQURZIENBUFVMRVQKCiAgICBUaGUgcGVvcGxlIGluIHRoZSBzdHJlZXQgY3J5IFJvbWVvLAogICAgU29tZSBKdWxpZXQsIGFuZCBzb21lIFBhcmlzOyBhbmQgYWxsIHJ1biwKICAgIFdpdGggb3BlbiBvdXRjcnkgdG93YXJkIG91ciBtb251bWVudC4KClBSSU5DRQoKICAgIFdoYXQgZmVhciBpcyB0aGlzIHdoaWNoIHN0YXJ0bGVzIGluIG91ciBlYXJzPwoKRmlyc3QgV2F0Y2htYW4KCiAgICBTb3ZlcmVpZ24sIGhlcmUgbGllcyB0aGUgQ291bnR5IFBhcmlzIHNsYWluOwogICAgQW5kIFJvbWVvIGRlYWQ7IGFuZCBKdWxpZXQsIGRlYWQgYmVmb3JlLAogICAgV2FybSBhbmQgbmV3IGtpbGwnZC4KClBSSU5DRQoKICAgIFNlYXJjaCwgc2VlaywgYW5kIGtub3cgaG93IHRoaXMgZm91bCBtdXJkZXIgY29tZXMuCgpGaXJzdCBXYXRjaG1hbgoKICAgIEhlcmUgaXMgYSBmcmlhciwgYW5kIHNsYXVnaHRlcidkIFJvbWVvJ3MgbWFuOwogICAgV2l0aCBpbnN0cnVtZW50cyB1cG9uIHRoZW0sIGZpdCB0byBvcGVuCiAgICBUaGVzZSBkZWFkIG1lbidzIHRvbWJzLgoKQ0FQVUxFVAoKICAgIE8gaGVhdmVucyEgTyB3aWZlLCBsb29rIGhvdyBvdXIgZGF1Z2h0ZXIgYmxlZWRzIQogICAgVGhpcyBkYWdnZXIgaGF0aCBtaXN0YSdlbi0tZm9yLCBsbywgaGlzIGhvdXNlCiAgICBJcyBlbXB0eSBvbiB0aGUgYmFjayBvZiBNb250YWd1ZSwtLQogICAgQW5kIGl0IG1pcy1zaGVhdGhlZCBpbiBteSBkYXVnaHRlcidzIGJvc29tIQoKTEFEWSBDQVBVTEVUCgogICAgTyBtZSEgdGhpcyBzaWdodCBvZiBkZWF0aCBpcyBhcyBhIGJlbGwsCiAgICBUaGF0IHdhcm5zIG15IG9sZCBhZ2UgdG8gYSBzZXB1bGNocmUuCgogICAgRW50ZXIgTU9OVEFHVUUgYW5kIG90aGVycwoKUFJJTkNFCgogICAgQ29tZSwgTW9udGFndWU7IGZvciB0aG91IGFydCBlYXJseSB1cCwKICAgIFRvIHNlZSB0aHkgc29uIGFuZCBoZWlyIG1vcmUgZWFybHkgZG93bi4KCk1PTlRBR1VFCgogICAgQWxhcywgbXkgbGllZ2UsIG15IHdpZmUgaXMgZGVhZCB0by1uaWdodDsKICAgIEdyaWVmIG9mIG15IHNvbidzIGV4aWxlIGhhdGggc3RvcHAnZCBoZXIgYnJlYXRoOgogICAgV2hhdCBmdXJ0aGVyIHdvZSBjb25zcGlyZXMgYWdhaW5zdCBtaW5lIGFnZT8KClBSSU5DRQoKICAgIExvb2ssIGFuZCB0aG91IHNoYWx0IHNlZS4KCk1PTlRBR1VFCgogICAgTyB0aG91IHVudGF1Z2h0ISB3aGF0IG1hbm5lcnMgaXMgaW4gdGhpcz8KICAgIFRvIHByZXNzIGJlZm9yZSB0aHkgZmF0aGVyIHRvIGEgZ3JhdmUCgpQUklOQ0UKCiAgICBTZWFsIHVwIHRoZSBtb3V0aCBvZiBvdXRyYWdlIGZvciBhIHdoaWxlLAogICAgVGlsbCB3ZSBjYW4gY2xlYXIgdGhlc2UgYW1iaWd1aXRpZXMsCiAgICBBbmQga25vdyB0aGVpciBzcHJpbmcsIHRoZWlyIGhlYWQsIHRoZWlyCiAgICB0cnVlIGRlc2NlbnQ7CiAgICBBbmQgdGhlbiB3aWxsIEkgYmUgZ2VuZXJhbCBvZiB5b3VyIHdvZXMsCiAgICBBbmQgbGVhZCB5b3UgZXZlbiB0byBkZWF0aDogbWVhbnRpbWUgZm9yYmVhciwKICAgIEFuZCBsZXQgbWlzY2hhbmNlIGJlIHNsYXZlIHRvIHBhdGllbmNlLgogICAgQnJpbmcgZm9ydGggdGhlIHBhcnRpZXMgb2Ygc3VzcGljaW9uLgoKRlJJQVIgTEFVUkVOQ0UKCiAgICBJIGFtIHRoZSBncmVhdGVzdCwgYWJsZSB0byBkbyBsZWFzdCwKICAgIFlldCBtb3N0IHN1c3BlY3RlZCwgYXMgdGhlIHRpbWUgYW5kIHBsYWNlCiAgICBEb3RoIG1ha2UgYWdhaW5zdCBtZSBvZiB0aGlzIGRpcmVmdWwgbXVyZGVyOwogICAgQW5kIGhlcmUgSSBzdGFuZCwgYm90aCB0byBpbXBlYWNoIGFuZCBwdXJnZQogICAgTXlzZWxmIGNvbmRlbW5lZCBhbmQgbXlzZWxmIGV4Y3VzZWQuCgpQUklOQ0UKCiAgICBUaGVuIHNheSBhdCBvbmNlIHdoYXQgdGhvdSBkb3N0IGtub3cgaW4gdGhpcy4KCkZSSUFSIExBVVJFTkNFCgogICAgSSB3aWxsIGJlIGJyaWVmLCBmb3IgbXkgc2hvcnQgZGF0ZSBvZiBicmVhdGgKICAgIElzIG5vdCBzbyBsb25nIGFzIGlzIGEgdGVkaW91cyB0YWxlLgogICAgUm9tZW8sIHRoZXJlIGRlYWQsIHdhcyBodXNiYW5kIHRvIHRoYXQgSnVsaWV0OwogICAgQW5kIHNoZSwgdGhlcmUgZGVhZCwgdGhhdCBSb21lbydzIGZhaXRoZnVsIHdpZmU6CiAgICBJIG1hcnJpZWQgdGhlbTsgYW5kIHRoZWlyIHN0b2wnbiBtYXJyaWFnZS1kYXkKICAgIFdhcyBUeWJhbHQncyBkb29tcy1kYXksIHdob3NlIHVudGltZWx5IGRlYXRoCiAgICBCYW5pc2gnZCB0aGUgbmV3LW1hZGUgYnJpZGVncm9vbSBmcm9tIHRoZSBjaXR5LAogICAgRm9yIHdob20sIGFuZCBub3QgZm9yIFR5YmFsdCwgSnVsaWV0IHBpbmVkLgogICAgWW91LCB0byByZW1vdmUgdGhhdCBzaWVnZSBvZiBncmllZiBmcm9tIGhlciwKICAgIEJldHJvdGgnZCBhbmQgd291bGQgaGF2ZSBtYXJyaWVkIGhlciBwZXJmb3JjZQogICAgVG8gQ291bnR5IFBhcmlzOiB0aGVuIGNvbWVzIHNoZSB0byBtZSwKICAgIEFuZCwgd2l0aCB3aWxkIGxvb2tzLCBiaWQgbWUgZGV2aXNlIHNvbWUgbWVhbgogICAgVG8gcmlkIGhlciBmcm9tIHRoaXMgc2Vjb25kIG1hcnJpYWdlLAogICAgT3IgaW4gbXkgY2VsbCB0aGVyZSB3b3VsZCBzaGUga2lsbCBoZXJzZWxmLgogICAgVGhlbiBnYXZlIEkgaGVyLCBzbyB0dXRvcidkIGJ5IG15IGFydCwKICAgIEEgc2xlZXBpbmcgcG90aW9uOyB3aGljaCBzbyB0b29rIGVmZmVjdAogICAgQXMgSSBpbnRlbmRlZCwgZm9yIGl0IHdyb3VnaHQgb24gaGVyCiAgICBUaGUgZm9ybSBvZiBkZWF0aDogbWVhbnRpbWUgSSB3cml0IHRvIFJvbWVvLAogICAgVGhhdCBoZSBzaG91bGQgaGl0aGVyIGNvbWUgYXMgdGhpcyBkaXJlIG5pZ2h0LAogICAgVG8gaGVscCB0byB0YWtlIGhlciBmcm9tIGhlciBib3Jyb3cnZCBncmF2ZSwKICAgIEJlaW5nIHRoZSB0aW1lIHRoZSBwb3Rpb24ncyBmb3JjZSBzaG91bGQgY2Vhc2UuCiAgICBCdXQgaGUgd2hpY2ggYm9yZSBteSBsZXR0ZXIsIEZyaWFyIEpvaG4sCiAgICBXYXMgc3RheSdkIGJ5IGFjY2lkZW50LCBhbmQgeWVzdGVybmlnaHQKICAgIFJldHVybidkIG15IGxldHRlciBiYWNrLiBUaGVuIGFsbCBhbG9uZQogICAgQXQgdGhlIHByZWZpeGVkIGhvdXIgb2YgaGVyIHdha2luZywKICAgIENhbWUgSSB0byB0YWtlIGhlciBmcm9tIGhlciBraW5kcmVkJ3MgdmF1bHQ7CiAgICBNZWFuaW5nIHRvIGtlZXAgaGVyIGNsb3NlbHkgYXQgbXkgY2VsbCwKICAgIFRpbGwgSSBjb252ZW5pZW50bHkgY291bGQgc2VuZCB0byBSb21lbzoKICAgIEJ1dCB3aGVuIEkgY2FtZSwgc29tZSBtaW51dGUgZXJlIHRoZSB0aW1lCiAgICBPZiBoZXIgYXdha2luZywgaGVyZSB1bnRpbWVseSBsYXkKICAgIFRoZSBub2JsZSBQYXJpcyBhbmQgdHJ1ZSBSb21lbyBkZWFkLgogICAgU2hlIHdha2VzOyBhbmQgSSBlbnRyZWF0ZWQgaGVyIGNvbWUgZm9ydGgsCiAgICBBbmQgYmVhciB0aGlzIHdvcmsgb2YgaGVhdmVuIHdpdGggcGF0aWVuY2U6CiAgICBCdXQgdGhlbiBhIG5vaXNlIGRpZCBzY2FyZSBtZSBmcm9tIHRoZSB0b21iOwogICAgQW5kIHNoZSwgdG9vIGRlc3BlcmF0ZSwgd291bGQgbm90IGdvIHdpdGggbWUsCiAgICBCdXQsIGFzIGl0IHNlZW1zLCBkaWQgdmlvbGVuY2Ugb24gaGVyc2VsZi4KICAgIEFsbCB0aGlzIEkga25vdzsgYW5kIHRvIHRoZSBtYXJyaWFnZQogICAgSGVyIG51cnNlIGlzIHByaXZ5OiBhbmQsIGlmIGF1Z2h0IGluIHRoaXMKICAgIE1pc2NhcnJpZWQgYnkgbXkgZmF1bHQsIGxldCBteSBvbGQgbGlmZQogICAgQmUgc2FjcmlmaWNlZCwgc29tZSBob3VyIGJlZm9yZSBoaXMgdGltZSwKICAgIFVudG8gdGhlIHJpZ291ciBvZiBzZXZlcmVzdCBsYXcuCgpQUklOQ0UKCiAgICBXZSBzdGlsbCBoYXZlIGtub3duIHRoZWUgZm9yIGEgaG9seSBtYW4uCiAgICBXaGVyZSdzIFJvbWVvJ3MgbWFuPyB3aGF0IGNhbiBoZSBzYXkgaW4gdGhpcz8KCkJBTFRIQVNBUgoKICAgIEkgYnJvdWdodCBteSBtYXN0ZXIgbmV3cyBvZiBKdWxpZXQncyBkZWF0aDsKICAgIEFuZCB0aGVuIGluIHBvc3QgaGUgY2FtZSBmcm9tIE1hbnR1YQogICAgVG8gdGhpcyBzYW1lIHBsYWNlLCB0byB0aGlzIHNhbWUgbW9udW1lbnQuCiAgICBUaGlzIGxldHRlciBoZSBlYXJseSBiaWQgbWUgZ2l2ZSBoaXMgZmF0aGVyLAogICAgQW5kIHRocmVhdGVuZWQgbWUgd2l0aCBkZWF0aCwgZ29pbmcgaW4gdGhlIHZhdWx0LAogICAgSSBkZXBhcnRlZCBub3QgYW5kIGxlZnQgaGltIHRoZXJlLgoKUFJJTkNFCgogICAgR2l2ZSBtZSB0aGUgbGV0dGVyOyBJIHdpbGwgbG9vayBvbiBpdC4KICAgIFdoZXJlIGlzIHRoZSBjb3VudHkncyBwYWdlLCB0aGF0IHJhaXNlZCB0aGUgd2F0Y2gCiAgICBTaXJyYWgsIHdoYXQgbWFkZSB5b3VyIG1hc3RlciBpbiB0aGlzIHBsYWNlPwoKUEFHRQoKICAgIEhlIGNhbWUgd2l0aCBmbG93ZXJzIHRvIHN0cmV3IGhpcyBsYWR5J3MgZ3JhdmU7CiAgICBBbmQgYmlkIG1lIHN0YW5kIGFsb29mLCBhbmQgc28gSSBkaWQ6CiAgICBBbm9uIGNvbWVzIG9uZSB3aXRoIGxpZ2h0IHRvIG9wZSB0aGUgdG9tYjsKICAgIEFuZCBieSBhbmQgYnkgbXkgbWFzdGVyIGRyZXcgb24gaGltOwogICAgQW5kIHRoZW4gSSByYW4gYXdheSB0byBjYWxsIHRoZSB3YXRjaC4KClBSSU5DRQoKICAgIFRoaXMgbGV0dGVyIGRvdGggbWFrZSBnb29kIHRoZSBmcmlhcidzIHdvcmRzLAogICAgVGhlaXIgY291cnNlIG9mIGxvdmUsIHRoZSB0aWRpbmdzIG9mIGhlciBkZWF0aDoKICAgIEFuZCBoZXJlIGhlIHdyaXRlcyB0aGF0IGhlIGRpZCBidXkgYSBwb2lzb24KICAgIE9mIGEgcG9vciAncG90aGVjYXJ5LCBhbmQgdGhlcmV3aXRoYWwKICAgIENhbWUgdG8gdGhpcyB2YXVsdCB0byBkaWUsIGFuZCBsaWUgd2l0aCBKdWxpZXQuCiAgICBXaGVyZSBiZSB0aGVzZSBlbmVtaWVzPyBDYXB1bGV0ISBNb250YWd1ZSEKICAgIFNlZSwgd2hhdCBhIHNjb3VyZ2UgaXMgbGFpZCB1cG9uIHlvdXIgaGF0ZSwKICAgIFRoYXQgaGVhdmVuIGZpbmRzIG1lYW5zIHRvIGtpbGwgeW91ciBqb3lzIHdpdGggbG92ZS4KICAgIEFuZCBJIGZvciB3aW5raW5nIGF0IHlvdXIgZGlzY29yZHMgdG9vCiAgICBIYXZlIGxvc3QgYSBicmFjZSBvZiBraW5zbWVuOiBhbGwgYXJlIHB1bmlzaCdkLgoKQ0FQVUxFVAoKICAgIE8gYnJvdGhlciBNb250YWd1ZSwgZ2l2ZSBtZSB0aHkgaGFuZDoKICAgIFRoaXMgaXMgbXkgZGF1Z2h0ZXIncyBqb2ludHVyZSwgZm9yIG5vIG1vcmUKICAgIENhbiBJIGRlbWFuZC4KCk1PTlRBR1VFCgogICAgQnV0IEkgY2FuIGdpdmUgdGhlZSBtb3JlOgogICAgRm9yIEkgd2lsbCByYWlzZSBoZXIgc3RhdHVlIGluIHB1cmUgZ29sZDsKICAgIFRoYXQgd2hpbGUgVmVyb25hIGJ5IHRoYXQgbmFtZSBpcyBrbm93biwKICAgIFRoZXJlIHNoYWxsIG5vIGZpZ3VyZSBhdCBzdWNoIHJhdGUgYmUgc2V0CiAgICBBcyB0aGF0IG9mIHRydWUgYW5kIGZhaXRoZnVsIEp1bGlldC4KCkNBUFVMRVQKCiAgICBBcyByaWNoIHNoYWxsIFJvbWVvJ3MgYnkgaGlzIGxhZHkncyBsaWU7CiAgICBQb29yIHNhY3JpZmljZXMgb2Ygb3VyIGVubWl0eSEKClBSSU5DRQoKICAgIEEgZ2xvb21pbmcgcGVhY2UgdGhpcyBtb3JuaW5nIHdpdGggaXQgYnJpbmdzOwogICAgVGhlIHN1biwgZm9yIHNvcnJvdywgd2lsbCBub3Qgc2hvdyBoaXMgaGVhZDoKICAgIEdvIGhlbmNlLCB0byBoYXZlIG1vcmUgdGFsayBvZiB0aGVzZSBzYWQgdGhpbmdzOwogICAgU29tZSBzaGFsbCBiZSBwYXJkb24nZCwgYW5kIHNvbWUgcHVuaXNoZWQ6CiAgICBGb3IgbmV2ZXIgd2FzIGEgc3Rvcnkgb2YgbW9yZSB3b2UKICAgIFRoYW4gdGhpcyBvZiBKdWxpZXQgYW5kIGhlciBSb21lby4KCiAgICBFeGV1bnQK

Chuck Cartledge
Chuck Cartledge
Chuck Cartledge

httpantonio-ferraroeupnword-clouds-in-r-packages-wordcloud2-and-tmrm(list=ls())library(wordcloud2)library(NLP)library(tm)library(RCurl) Necessary steps 1 Use imagesgooglecom to find an outline of the shape to fill (tmpusapng) 2 Use gimp to fill the outline with black 3 Use a command like wordcloud2(TDMasDF size = 20 figPath=tmpusapng backgroundColor = white fontFamily=Loma) to populate shape 4 Result is a web page with javascript embedded to create image and allow mouse overs Clean corpuscleanCorpus lt- function(corpus) corpustmp lt- tm_map(corpus removePunctuation) corpustmp lt- tm_map(corpustmpstripWhitespace) corpustmp lt- tm_map(corpustmptolower) corpustmp lt- tm_map(corpustmp PlainTextDocument) corpustmp lt- tm_map(corpustmpremoveWords stopwords(english)) return(corpustmp) Build TDMgenerateTDM lt- function(path) sdir lt-path scor lt-Corpus(DirSource(directory = sdir encoding= UTF-8)) scorcl lt- cleanCorpus(scor) stdm lt- TermDocumentMatrix(scorcl) stdminitData lt- function(path) if (direxists(path) == FALSE) If the directory does not exist create and populate with dummy data dummyDataFile lt- romeoAndJulietbase64 fileName lt- sprintf(sdummyDatatxt path) print(sprintf(Creating and populating the file s with dummy data fileName)) dircreate(path recursive = TRUE) write(base64( paste( readLines(dummyDataFile) collapse=) encode=FALSE) file=fileName) main lt- function() options(stringsAsFactors = FALSE) The working directory pathName lt- Text initData(pathName) Get the Term Document Matrix TDM lt- generateTDM(pathName) Do I need a matrix or a DF We will see TDMasMatrix lt- asmatrix(TDM) TDMasDFlt-dataframe(TDMasMatrix) TDMasDF$words lt-rownames(TDMasDF) Column headers colnames(TDMasDF) lt- c(freq word) TDMasDFlt-TDMasDF[ c(word freq)] TDMasDF lt- TDMasDF[order(TDMasDF$freqdecreasing=TRUE)] The results a lt- wordcloud2(TDMasDF size = 03 shape=star backgroundColor = black fontFamily=Loma) print(a) a lt- letterCloud(TDMasDF word=USA size = 03 fontFamily=Loma backgroundColor = black) print(a) a lt- wordcloud2(TDMasDF size = 13 figPath=heartpng backgroundColor = white fontFamily=Loma color=red) print(a) TDMasDF$freq lt- log(TDMasDF$freq) a lt- wordcloud2(TDMasDF size = 12 figPath=usapng backgroundColor = white shuffle=FALSE minRotation = 0 maxRotation = 2pi) print(a) print(The program has ended)main()

Chuck Cartledge