<html><head><style>
body {
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        padding:1em;
        margin:auto;
        background:#fefefe;
}
h1, h2, h3, h4, h5, h6 {
        font-weight: bold;
}
h1 {
        color: #000000;
        font-size: 28pt;
}
h2 {
        border-bottom: 1px solid #CCCCCC;
        color: #000000;
        font-size: 24px;
}
h3 {
        font-size: 18px;
}
h4 {
        font-size: 16px;
}
h5 {
        font-size: 14px;
}
h6 {
        color: #777777;
        background-color: inherit;
        font-size: 14px;
}
hr {
        height: 0.2em;
        border: 0;
        color: #CCCCCC;
        background-color: #CCCCCC;
display: inherit;
}
p, blockquote, ul, ol, dl, li, table, pre {
        margin: 15px 0;
}
a, a:visited {
        color: #4183C4;
        background-color: inherit;
        text-decoration: none;
}
#message {
        border-radius: 6px;
        border: 1px solid #ccc;
        display:block;
        width:100%;
        height:60px;
        margin:6px 0px;
}
button, #ws {
        font-size: 12 pt;
        padding: 4px 6px;
        border-radius: 5px;
        border: 1px solid #bbb;
        background-color: #eee;
}
code, pre, #ws, #message {
        font-family: Monaco;
        font-size: 10pt;
        border-radius: 3px;
        background-color: #F8F8F8;
        color: inherit;
}
code {
        border: 1px solid #EAEAEA;
        margin: 0 2px;
        padding: 0 5px;
}
pre {
        border: 1px solid #CCCCCC;
        overflow: auto;
        padding: 4px 8px;
}
pre > code {
        border: 0;
        margin: 0;
        padding: 0;
}
#ws { background-color: #f8f8f8; }
.bloop_markdown table {
border-collapse: collapse;
font-family: Helvetica, arial, freesans, clean, sans-serif;
color: rgb(51, 51, 51);
font-size: 15px; line-height: 25px;
padding: 0; }
.bloop_markdown table tr {
border-top: 1px solid #cccccc;
background-color: white;
margin: 0;
padding: 0; }
.bloop_markdown table tr:nth-child(2n) {
background-color: #f8f8f8; }
.bloop_markdown table tr th {
font-weight: bold;
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }
.bloop_markdown table tr td {
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }
.bloop_markdown table tr th :first-child, table tr td :first-child {
margin-top: 0; }
.bloop_markdown table tr th :last-child, table tr td :last-child {
margin-bottom: 0; }
.bloop_markdown blockquote{
border-left: 4px solid #dddddd;
padding: 0 15px;
color: #777777; }
blockquote > :first-child {
margin-top: 0; }
blockquote > :last-child {
margin-bottom: 0; }
code, pre, #ws, #message {
word-break: normal;
word-wrap: normal;
}
hr {
display: inherit;
}
.bloop_markdown :first-child {
-webkit-margin-before: 0;
}
code, pre, #ws, #message {
font-family: Menlo, Consolas, Liberation Mono, Courier, monospace;
}
.send { color:#77bb77; }
.server { color:#7799bb; }
.error { color:#AA0000; }</style></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class="bloop_markdown"><p>Hi Anton and welcome back to the discussion. :)</p>
<p>While trying to find the talk about overlapping protocol members from different protocols I spotted your proposal: <a href="https://github.com/Anton3/swift-evolution/blob/generic-protocols/proposals/NNNN-generic-protocols.md">https://github.com/Anton3/swift-evolution/blob/generic-protocols/proposals/NNNN-generic-protocols.md</a> </p>
<p>Just one hint, inside an extension or a type (non-protocol) we write <code>typealias</code> instead of <code>associatedtype</code>.</p>
<p>Here is the evolution-thread: <a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160919/027122.html">https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon–20160919/027122.html</a></p>
<p>The suggestion there was to prefix everything with the corresponding protocol when there is a collision.</p>
<pre><code class="swift">struct Test : Foo<Int>, Foo<String> {
init(_ value: Foo<Int>.Value) { … } // or better: init(_ value: Int)
init(_ value: Foo<String>.Value) { … } // init(_ value: String)
// assume both had the function `foo()`
func Foo<Int>.foo() { … }
func Foo<String>.foo() { … }
}
</code></pre>
<p>Is there really a need for true generic protocols? I’m still fascinated by the idea how a generic and constrained <code>typealias</code> could create this new ‘pseudo’ generic protocol.</p>
<pre><code class="swift">protocol Foo {
associatedtype Value
init(_ value: Value)
func foo()
}
typealias GenericFoo<T> = Foo where Value == T
struct OtherTest : GenericFoo<Int>, GenericFoo<String> {
init(_ value: Int) { … }
init(_ value: String) { … }
func GenericFoo<Int>.foo() { … }
func GenericFoo<String>.foo() { … }
}
</code></pre>
<p>But allowing this kind of <code>typealias</code> probably means that one would in general allow the where clause on any protocol anywhere in the language. :/ Or I might be totally wrong at this point.</p>
<p>Again, one cool thing is that this would also define some best practice of how we could use existentials.</p>
<p><code>typealias</code> + <code>non-/generic type name</code> + <code>=</code> <code>protocol/class</code> + optional N * (<code>&</code> + <code>protocol</code>) + optional <code>where clause</code></p>
<p>That pattern is more reusable then the strict <code>Any< … ></code> would be.</p>
<p></p></div><div class="bloop_original_html"><style>body{font-family:Helvetica,Arial;font-size:13px}</style><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div> <br> <div id="bloop_sign_1481358003916872960" class="bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">-- <br>Adrian Zubarev<br>Sent with Airmail</div></div> <br><p class="airmail_on">Am 9. Dezember 2016 um 20:16:14, Anton Zhilin (<a href="mailto:antonyzhilin@gmail.com">antonyzhilin@gmail.com</a>) schrieb:</p> <blockquote type="cite" class="clean_bq"><span><div><div></div><div>
<title></title>
<div dir="ltr">
<div class="markdown-here-wrapper" style="">
<p style="margin:0px 0px 1.2em!important">A fundamental problem is,
how do we get rid of <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">
associatedtype</code> duplicates?</p>
<p style="margin:0px 0px 1.2em!important">A pedantic approach is to
add trait operations for conformances:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-swift" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)"><span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">protocol</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Constructible</span> </span>{
associatedtype <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Value</span>
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>(<span class="hljs-number" style="color:rgb(0,128,128)">_</span> value: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Value</span>)
}
<span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">struct</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">MyStruct</span> </span>{
conformance <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Constructible</span> {
rename associatedtype <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">ValueInt</span> = <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Value</span>
}
conformance <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Constructible</span> {
rename associatedtype <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">ValueString</span> = <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Value</span>
}
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">typealias</span> <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">ValueInt</span> = <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Int</span> <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// or can be inferred</span>
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>(<span class="hljs-number" style="color:rgb(0,128,128)">_</span> value: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Int</span>)
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">typealias</span> <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">ValueString</span> = <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">String</span> <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// or can be inferred</span>
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>(<span class="hljs-number" style="color:rgb(0,128,128)">_</span> value: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">String</span>)
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">This way, if there is a
if there is a conflicting member, which does not use any of the
associated types, like <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">
func foo()</code>, then we can give it different meanings in
different conformances.<br>
Although this approach is the most clean one from theoreticall
point of view, choosing different names for associated types would
not look very good in practise.</p>
<p style="margin:0px 0px 1.2em!important">One possible solution is
to <em>always</em> automatically match <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">
associatedtype</code>s, without using <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">
typealias</code>es.</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-swift" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)"><span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">protocol</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">ConstructibleFromBoth</span> </span>{
associatedtype <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">First</span>
associatedtype <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Second</span>
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>(first: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">First</span>)
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>(second: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Second</span>)
}
<span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">struct</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">MyStruct</span> : <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">ConstructibleFromBoth</span> </span>{
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>(first: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Int</span>)
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>(second: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Double</span>)
}
<span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">extension</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">MyStruct</span> </span>{
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>(first: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">String</span>) <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// now there are 2 distinct conformances</span>
}
<span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">extension</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">MyStruct</span> </span>{
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>(second: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Float</span>) <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// now there are 4 distinct conformances</span>
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">It introduces another
potentially exponential algorithm for compiler. Although, does it?
During a conformance test in some generic function, compiler will
need to only find the first match or two.<br>
Anyway, I guess, people would prefer to state explicitly that a
type conforms to multiple versions of a protocol.</p>
<p style="margin:0px 0px 1.2em!important">Attempt #3. We can
resolve the conflict between associated types, if we delete (if
trait sense) confliting associated types from the type. But with
extensions, all associated types can be made conflicting. So there
needs to be some attribute, marking, which of the associated types
we don’t want. It can lie at the place of conformance:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-swift" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)"><span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">struct</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">MyStruct</span> </span>{ }
<span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">extension</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">MyStruct</span> : @<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">dontCreateTypealiases</span> (<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Constructible</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">where</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Value</span> == <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Int</span>) </span>{ ... }
<span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">extension</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">MyStruct</span> : @<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">dontCreateTypealiases</span> (<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Constructible</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">where</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Value</span> == <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">String</span>) </span>{ ... }
<span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// MyStruct.Value.self // error, no such type</span>
<span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">struct</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">NormalConformanceTest</span> : <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Constructible</span> </span>{ <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>(<span class="hljs-number" style="color:rgb(0,128,128)">_</span> value: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Float</span>) }
<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">NormalConformanceTest</span>.<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Value</span>.<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">self</span> <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">//=> Float</span>
</code></pre>
<p style="margin:0px 0px 1.2em!important">Or we can let constrained
protocols syntax carry this attribute by default:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-swift" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)"><span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">extension</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">MyStruct</span> : (<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Constructible</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">where</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Value</span> == <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Int</span>) </span>{ ... }
<span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// MyStruct.Value.self // error, no such type</span>
<span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">struct</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">NormalConformanceTest</span>: <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Constructible</span> </span>{ <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>(<span class="hljs-number" style="color:rgb(0,128,128)">_</span> value: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Float</span>) }
<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">NormalConformanceTest</span>.<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Value</span>.<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">self</span> <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">//=> Float</span>
</code></pre>
<p style="margin:0px 0px 1.2em!important">The only thing left to
solve is generic protocol declaration syntax and protocol
specialization syntax. I’d like to present two ways to do this.
First, taking ideas from Rust:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-swift" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)"><span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">protocol</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">ContainsCollection</span><<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Element</span>> </span>{
associatedtype <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">CollectionType</span> : <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Collection</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">where</span> <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">CollectionType</span>.<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Element</span> == <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Element</span>
<span class="hljs-func"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">collection</span><span class="hljs-params">()</span> -> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">CollectionType</span>
}
<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">extension</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">String</span> : <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">ContainsCollection</span><span class="hljs-generics"><Character></span>, <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">ContainsCollection</span><span class="hljs-generics"><UnicodeScalar></span>, <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">ContainsCollection</span><span class="hljs-generics"><CChar></span> </span>{
<span class="hljs-func"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">collection</span><span class="hljs-params">()</span> -> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">CharacterView</span>
<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">collection</span><span class="hljs-params">()</span> -> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">UnicodeScalarView</span>
<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">collection</span><span class="hljs-params">()</span> -> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">ContiguousArray</span><span class="hljs-generics"><CChar></span>
}</span>
</code></pre>
<p style="margin:0px 0px 1.2em!important">Generic parameters are
used to disambiguate between different conformances, and associated
types are just matched. Explicit <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">
typealias</code> specifiction is prohibited, because conflicts.</p>
<p style="margin:0px 0px 1.2em!important">Second, without modifying
current protocol declaration syntax:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-swift" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)"><span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">protocol</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">ContainsCollection</span> </span>{
associatedtype <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Element</span>
associatedtype <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">CollectionType</span> : <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Collection</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">where</span> <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">CollectionType</span>.<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Element</span> == <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Element</span>
<span class="hljs-func"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">collection</span><span class="hljs-params">()</span> -> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">CollectionType</span>
}
<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">extension</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">String</span> : <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">ContainsCollection</span><span class="hljs-generics"><Element: Character></span>, <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">ContainsCollection</span><span class="hljs-generics"><Element: UnicodeScalar></span>, <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">ContainsCollection</span><span class="hljs-generics"><Element: CChar></span> </span>{
<span class="hljs-func"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">collection</span><span class="hljs-params">()</span> -> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">CharacterView</span>
<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">collection</span><span class="hljs-params">()</span> -> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">UnicodeScalarView</span>
<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">collection</span><span class="hljs-params">()</span> -> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">ContiguousArray</span><span class="hljs-generics"><CChar></span>
}</span>
</code></pre>
<div title="MDH:PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj5BIGZ1bmRh bWVudGFsIHByb2JsZW0gaXMsIGhvdyBkbyB3ZSBnZXQgcmlkIG9mIGBhc3NvY2lhdGVkdHlwZWAg ZHVwbGljYXRlcz88L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGJyPjwvZGl2PjxkaXYg Y2xhc3M9ImdtYWlsX2V4dHJhIj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGRpdiBjbGFzcz0i Z21haWxfZXh0cmEiPkEgcGVkYW50aWMgYXBwcm9hY2ggaXMgdG8gYWRkIHRyYWl0IG9wZXJhdGlv bnMgZm9yIGNvbmZvcm1hbmNlczo8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGJyPjwv ZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj5gYGBzd2lmdDwvZGl2PjxkaXYgY2xhc3M9Imdt YWlsX2V4dHJhIj5wcm90b2NvbCBDb25zdHJ1Y3RpYmxlIHs8L2Rpdj48ZGl2IGNsYXNzPSJnbWFp bF9leHRyYSI+Jm5ic3A7ICZuYnNwOyBhc3NvY2lhdGVkdHlwZSBWYWx1ZTwvZGl2PjxkaXYgY2xh c3M9ImdtYWlsX2V4dHJhIj4mbmJzcDsgJm5ic3A7IGluaXQoXyB2YWx1ZTogVmFsdWUpPC9kaXY+ PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPn08L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9l eHRyYSI+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxicj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFp bF9leHRyYSI+c3RydWN0IE15U3RydWN0IHs8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+ Jm5ic3A7ICZuYnNwOyBjb25mb3JtYW5jZSBDb25zdHJ1Y3RpYmxlIHs8L2Rpdj48ZGl2IGNsYXNz PSJnbWFpbF9leHRyYSI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHJlbmFtZSBhc3NvY2lh dGVkdHlwZSBWYWx1ZUludCA9IFZhbHVlPC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPiZu YnNwOyAmbmJzcDsgfTwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj4mbmJzcDsgJm5ic3A7 IGNvbmZvcm1hbmNlIENvbnN0cnVjdGlibGUgezwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJh Ij4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgcmVuYW1lIGFzc29jaWF0ZWR0eXBlJm5ic3A7 VmFsdWVTdHJpbmcgPSBWYWx1ZTwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj4mbmJzcDsg Jm5ic3A7IH08L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGJyPjwvZGl2Pjxk aXYgY2xhc3M9ImdtYWlsX2V4dHJhIj4mbmJzcDsgJm5ic3A7IHR5cGVhbGlhcyBWYWx1ZUludCZu YnNwOz0gSW50ICZuYnNwOy8vIG9yIGNhbiBiZSBpbmZlcnJlZDxicj48ZGl2IGNsYXNzPSJnbWFp bF9leHRyYSI+Jm5ic3A7ICZuYnNwOyBpbml0KF8gdmFsdWU6IEludCk8L2Rpdj48ZGl2IGNsYXNz PSJnbWFpbF9leHRyYSI+PGJyPjwvZGl2PiZuYnNwOyAmbmJzcDsgdHlwZWFsaWFzIFZhbHVlU3Ry aW5nJm5ic3A7PSBTdHJpbmcgJm5ic3A7Ly8gb3IgY2FuIGJlIGluZmVycmVkPGRpdiBjbGFzcz0i Z21haWxfZXh0cmEiPiZuYnNwOyAmbmJzcDsgaW5pdChfIHZhbHVlOiBTdHJpbmcpPC9kaXY+PGRp diBjbGFzcz0iZ21haWxfZXh0cmEiPn08L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+YGBg PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxicj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFp bF9leHRyYSI+VGhpcyB3YXksIGlmIHRoZXJlIGlzIGEgaWYgdGhlcmUgaXMgYSBjb25mbGljdGlu ZyBtZW1iZXIsIHdoaWNoIGRvZXMgbm90IHVzZSBhbnkgb2YgdGhlIGFzc29jaWF0ZWQgdHlwZXMs IGxpa2UgYGZ1bmMgZm9vKClgLCB0aGVuIHdlIGNhbiBnaXZlIGl0IGRpZmZlcmVudCBtZWFuaW5n cyBpbiBkaWZmZXJlbnQgY29uZm9ybWFuY2VzLjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJh Ij5BbHRob3VnaCB0aGlzIGFwcHJvYWNoIGlzIHRoZSBtb3N0IGNsZWFuIG9uZSBmcm9tIHRoZW9y ZXRpY2FsbCBwb2ludCBvZiB2aWV3LCBjaG9vc2luZyBkaWZmZXJlbnQgbmFtZXMgZm9yIGFzc29j aWF0ZWQgdHlwZXMgd291bGQgbm90IGxvb2sgdmVyeSBnb29kIGluIHByYWN0aXNlLjwvZGl2Pjwv ZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj48YnI+PC9kaXY+PGRpdiBjbGFzcz0i Z21haWxfZXh0cmEiPk9uZSBwb3NzaWJsZSBzb2x1dGlvbiBpcyB0byAqYWx3YXlzKiBhdXRvbWF0 aWNhbGx5IG1hdGNoIGBhc3NvY2lhdGVkdHlwZWBzLCB3aXRob3V0IHVzaW5nIGB0eXBlYWxpYXNg ZXMuPC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJh Ij48YnI+PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPmBgYHN3aWZ0PC9kaXY+PGRpdiBj bGFzcz0iZ21haWxfZXh0cmEiPnByb3RvY29sIENvbnN0cnVjdGlibGVGcm9tQm90aCB7PC9kaXY+ PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPiZuYnNwOyAmbmJzcDsgYXNzb2NpYXRlZHR5cGUgRmly c3Q8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+Jm5ic3A7ICZuYnNwOyBhc3NvY2lhdGVk dHlwZSBTZWNvbmQ8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+Jm5ic3A7ICZuYnNwOyBp bml0KGZpcnN0OiBGaXJzdCk8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+Jm5ic3A7ICZu YnNwOyBpbml0KHNlY29uZDogU2Vjb25kKTwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj59 PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxicj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFp bF9leHRyYSI+c3RydWN0IE15U3RydWN0IDogQ29uc3RydWN0aWJsZUZyb21Cb3RoIHs8L2Rpdj48 ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+Jm5ic3A7ICZuYnNwOyBpbml0KGZpcnN0OiBJbnQpPC9k aXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPiZuYnNwOyAmbmJzcDsgaW5pdChzZWNvbmQ6IERv dWJsZSk8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+fTwvZGl2PjxkaXYgY2xhc3M9Imdt YWlsX2V4dHJhIj48YnI+PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPmV4dGVuc2lvbiBN eVN0cnVjdCB7PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPiZuYnNwOyAmbmJzcDsgaW5p dChmaXJzdDogU3RyaW5nKSAmbmJzcDsgLy8gbm93IHRoZXJlIGFyZSAyIGRpc3RpbmN0IGNvbmZv cm1hbmNlczwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj59PC9kaXY+PGRpdiBjbGFzcz0i Z21haWxfZXh0cmEiPjxicj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+ZXh0ZW5zaW9u IE15U3RydWN0IHs8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+Jm5ic3A7ICZuYnNwOyBp bml0KHNlY29uZDogRmxvYXQpICZuYnNwOyAvLyBub3cgdGhlcmUgYXJlIDQgZGlzdGluY3QgY29u Zm9ybWFuY2VzPC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPn08L2Rpdj48ZGl2IGNsYXNz PSJnbWFpbF9leHRyYSI+YGBgPC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxicj48L2Rp dj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+SXQgaW50cm9kdWNlcyBhbm90aGVyIHBvdGVudGlh bGx5IGV4cG9uZW50aWFsIGFsZ29yaXRobSBmb3IgY29tcGlsZXIuIEFsdGhvdWdoLCBkb2VzIGl0 PyBEdXJpbmcgYSBjb25mb3JtYW5jZSB0ZXN0IGluIHNvbWUgZ2VuZXJpYyBmdW5jdGlvbiwgY29t cGlsZXIgd2lsbCBuZWVkIHRvIG9ubHkgZmluZCB0aGUgZmlyc3QgbWF0Y2ggb3IgdHdvLjwvZGl2 PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj5Bbnl3YXksIEkgZ3Vlc3MsIHBlb3BsZSB3b3VsZCBw cmVmZXIgdG8gc3RhdGUgZXhwbGljaXRseSB0aGF0IGEgdHlwZSBjb25mb3JtcyB0byBtdWx0aXBs ZSB2ZXJzaW9ucyBvZiBhIHByb3RvY29sLjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9Imdt YWlsX2V4dHJhIj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGJyPjwvZGl2PjxkaXYgY2xhc3M9 ImdtYWlsX2V4dHJhIj5BdHRlbXB0ICMzLiBXZSBjYW4gcmVzb2x2ZSB0aGUgY29uZmxpY3QgYmV0 d2VlbiBhc3NvY2lhdGVkIHR5cGVzLCBpZiB3ZSBkZWxldGUgKGlmIHRyYWl0IHNlbnNlKSBjb25m bGl0aW5nIGFzc29jaWF0ZWQgdHlwZXMgZnJvbSB0aGUgdHlwZS4gQnV0IHdpdGggZXh0ZW5zaW9u cywgYWxsIGFzc29jaWF0ZWQgdHlwZXMgY2FuIGJlIG1hZGUgY29uZmxpY3RpbmcuIFNvIHRoZXJl IG5lZWRzIHRvIGJlIHNvbWUgYXR0cmlidXRlLCBtYXJraW5nLCB3aGljaCBvZiB0aGUgYXNzb2Np YXRlZCB0eXBlcyB3ZSBkb24ndCB3YW50LiBJdCBjYW4gbGllIGF0IHRoZSBwbGFjZSBvZiBjb25m b3JtYW5jZTo8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGJyPjwvZGl2PjxkaXYgY2xh c3M9ImdtYWlsX2V4dHJhIj5gYGBzd2lmdDwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj5z dHJ1Y3QgTXlTdHJ1Y3QgeyB9PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPmV4dGVuc2lv biBNeVN0cnVjdCA6IEBkb250Q3JlYXRlVHlwZWFsaWFzZXMmbmJzcDsoQ29uc3RydWN0aWJsZSB3 aGVyZSBWYWx1ZSA9PSBJbnQpIHsgLi4uIH08L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+ ZXh0ZW5zaW9uIE15U3RydWN0IDogQGRvbnRDcmVhdGVUeXBlYWxpYXNlcyAoQ29uc3RydWN0aWJs ZSB3aGVyZSBWYWx1ZSA9PSBTdHJpbmcpIHsgLi4uIH08L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9l eHRyYSI+Ly8gTXlTdHJ1Y3QuVmFsdWUuc2VsZiAmbmJzcDsvLyBlcnJvciwgbm8gc3VjaCB0eXBl PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxicj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFp bF9leHRyYSI+c3RydWN0IE5vcm1hbENvbmZvcm1hbmNlVGVzdCA6IENvbnN0cnVjdGlibGUgeyBp bml0KF8gdmFsdWU6IEZsb2F0KSB9PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPk5vcm1h bENvbmZvcm1hbmNlVGVzdC5WYWx1ZS5zZWxmICZuYnNwOy8vPSZndDsgRmxvYXQ8YnI+PC9kaXY+ PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPmBgYDwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJh Ij48YnI+PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPk9yIHdlIGNhbiBsZXQgY29uc3Ry YWluZWQgcHJvdG9jb2xzIHN5bnRheCBjYXJyeSB0aGlzIGF0dHJpYnV0ZSBieSBkZWZhdWx0Ojwv ZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj48YnI+PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxf ZXh0cmEiPmBgYHN3aWZ0PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPmV4dGVuc2lvbiBN eVN0cnVjdCA6IChDb25zdHJ1Y3RpYmxlIHdoZXJlIFZhbHVlID09IEludCkgeyAuLi4gfTwvZGl2 Pi8vIE15U3RydWN0LlZhbHVlLnNlbGYgJm5ic3A7Ly8gZXJyb3IsIG5vIHN1Y2ggdHlwZTwvZGl2 PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj48YnI+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPnN0 cnVjdCBOb3JtYWxDb25mb3JtYW5jZVRlc3Q6IENvbnN0cnVjdGlibGUgeyBpbml0KF8gdmFsdWU6 IEZsb2F0KSB9PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPk5vcm1hbENvbmZvcm1hbmNl VGVzdC5WYWx1ZS5zZWxmICZuYnNwOy8vPSZndDsgRmxvYXQ8L2Rpdj48ZGl2IGNsYXNzPSJnbWFp bF9leHRyYSI+YGBgPC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxicj48L2Rpdj48ZGl2 IGNsYXNzPSJnbWFpbF9leHRyYSI+VGhlIG9ubHkgdGhpbmcgbGVmdCB0byBzb2x2ZSBpcyBnZW5l cmljIHByb3RvY29sIGRlY2xhcmF0aW9uIHN5bnRheCBhbmQgcHJvdG9jb2wgc3BlY2lhbGl6YXRp b24gc3ludGF4LiBJJ2QgbGlrZSB0byBwcmVzZW50IHR3byB3YXlzIHRvIGRvIHRoaXMuIEZpcnN0 LCB0YWtpbmcgaWRlYXMgZnJvbSBSdXN0OjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj48 YnI+PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPmBgYHN3aWZ0PC9kaXY+PGRpdiBjbGFz cz0iZ21haWxfZXh0cmEiPnByb3RvY29sIENvbnRhaW5zQ29sbGVjdGlvbiZsdDtFbGVtZW50Jmd0 OyB7PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPiZuYnNwOyAmbmJzcDsgYXNzb2NpYXRl ZHR5cGUgQ29sbGVjdGlvblR5cGUgOiBDb2xsZWN0aW9uIHdoZXJlIENvbGxlY3Rpb25UeXBlLkVs ZW1lbnQgPT0gRWxlbWVudDwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj4mbmJzcDsgJm5i c3A7IGZ1bmMgY29sbGVjdGlvbigpIC0mZ3Q7IENvbGxlY3Rpb25UeXBlPC9kaXY+PGRpdiBjbGFz cz0iZ21haWxfZXh0cmEiPn08L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGJyPjwvZGl2 PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj5leHRlbnNpb24gU3RyaW5nIDogQ29udGFpbnNDb2xs ZWN0aW9uJmx0O0NoYXJhY3RlciZndDssIENvbnRhaW5zQ29sbGVjdGlvbiZsdDtVbmljb2RlU2Nh bGFyJmd0OywgQ29udGFpbnNDb2xsZWN0aW9uJmx0O0NDaGFyJmd0OyB7PC9kaXY+PGRpdiBjbGFz cz0iZ21haWxfZXh0cmEiPiZuYnNwOyAmbmJzcDsgZnVuYyBjb2xsZWN0aW9uKCkgLSZndDsgQ2hh cmFjdGVyVmlldzwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj4mbmJzcDsgJm5ic3A7IGZ1 bmMgY29sbGVjdGlvbigpIC0mZ3Q7IFVuaWNvZGVTY2FsYXJWaWV3PC9kaXY+PGRpdiBjbGFzcz0i Z21haWxfZXh0cmEiPiZuYnNwOyAmbmJzcDsgZnVuYyBjb2xsZWN0aW9uKCkgLSZndDsgQ29udGln dW91c0FycmF5Jmx0O0NDaGFyJmd0OzwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj59PC9k aXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPmBgYDwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4 dHJhIj48YnI+PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPkdlbmVyaWMgcGFyYW1ldGVy cyBhcmUgdXNlZCB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBkaWZmZXJlbnQgY29uZm9ybWFuY2Vz LCBhbmQgYXNzb2NpYXRlZCB0eXBlcyBhcmUganVzdCBtYXRjaGVkLiBFeHBsaWNpdCBgdHlwZWFs aWFzYCBzcGVjaWZpY3Rpb24gaXMgcHJvaGliaXRlZCwgYmVjYXVzZSBjb25mbGljdHMuPC9kaXY+ PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxicj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRy YSI+U2Vjb25kLCB3aXRob3V0IG1vZGlmeWluZyBjdXJyZW50IHByb3RvY29sIGRlY2xhcmF0aW9u IHN5bnRheDo8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGJyPjwvZGl2PjxkaXYgY2xh c3M9ImdtYWlsX2V4dHJhIj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+YGBgc3dpZnQ8L2Rpdj48 ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+cHJvdG9jb2wgQ29udGFpbnNDb2xsZWN0aW9uIHs8L2Rp dj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+Jm5ic3A7ICZuYnNwOyBhc3NvY2lhdGVkdHlwZSBF bGVtZW50PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPiZuYnNwOyAmbmJzcDsgYXNzb2Np YXRlZHR5cGUgQ29sbGVjdGlvblR5cGUgOiBDb2xsZWN0aW9uIHdoZXJlIENvbGxlY3Rpb25UeXBl LkVsZW1lbnQgPT0gRWxlbWVudDwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj4mbmJzcDsg Jm5ic3A7IGZ1bmMgY29sbGVjdGlvbigpIC0mZ3Q7IENvbGxlY3Rpb25UeXBlPC9kaXY+PGRpdiBj bGFzcz0iZ21haWxfZXh0cmEiPn08L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGJyPjwv ZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj5leHRlbnNpb24gU3RyaW5nIDogQ29udGFpbnND b2xsZWN0aW9uJmx0O0VsZW1lbnQ6IENoYXJhY3RlciZndDssIENvbnRhaW5zQ29sbGVjdGlvbiZs dDtFbGVtZW50OiBVbmljb2RlU2NhbGFyJmd0OywgQ29udGFpbnNDb2xsZWN0aW9uJmx0O0VsZW1l bnQ6IENDaGFyJmd0OyB7PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPiZuYnNwOyAmbmJz cDsgZnVuYyBjb2xsZWN0aW9uKCkgLSZndDsgQ2hhcmFjdGVyVmlldzwvZGl2PjxkaXYgY2xhc3M9 ImdtYWlsX2V4dHJhIj4mbmJzcDsgJm5ic3A7IGZ1bmMgY29sbGVjdGlvbigpIC0mZ3Q7IFVuaWNv ZGVTY2FsYXJWaWV3PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPiZuYnNwOyAmbmJzcDsg ZnVuYyBjb2xsZWN0aW9uKCkgLSZndDsgQ29udGlndW91c0FycmF5Jmx0O0NDaGFyJmd0OzwvZGl2 PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj59PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEi PmBgYDwvZGl2PjwvZGl2PjwvZGl2Pg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">
</div>
</div>
</div>
</div></div></span></blockquote></div><div class="bloop_markdown"><p></p></div></body></html>