changeset 10090:3d2d7f2a23b3

Merge
author kcr
date Fri, 30 Mar 2018 13:19:53 -0700
parents 1a2d4f3b38f6 136681b544ef
children d2eec003e785 b3deb485d502 3a451fc805af
files .hgtags apps/samples/Ensemble8/lib/lucene-core-3.2.0.jar apps/samples/Ensemble8/lib/lucene-grouping-3.2.0.jar apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.fdt apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.fdx apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.fnm apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.frq apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.nrm apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.prx apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.tii apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.tis apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/segments.gen
diffstat 59 files changed, 1775 insertions(+), 1724 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Thu Mar 29 15:46:04 2018 +0000
+++ b/.hgignore	Fri Mar 30 13:19:53 2018 -0700
@@ -28,7 +28,10 @@
 test.keystore
 ^webrev*
 nbproject/private/
+Ensemble8/src/generated/resources/ensemble/search/index/write.lock
+Ensemble8/lib/lucene.*.jar
 ^.*~$
+
 syntax: glob
 *.vcxproj.user
 */Release/*
--- a/.hgtags	Thu Mar 29 15:46:04 2018 +0000
+++ b/.hgtags	Fri Mar 30 13:19:53 2018 -0700
@@ -486,6 +486,7 @@
 93056ba104b6785e6b372a145d71bce7a9896a9b 8u141-b12
 7f8356d232541fbd58c5a98191fd0a8f0d219141 8u141-b13
 d6db71e77bb1163dd6290dfda7f06cd827a02351 8u141-b14
+2991e8b097f37f8d5847bedee9025003af6011d3 8u172-b00
 2991e8b097f37f8d5847bedee9025003af6011d3 8u162-b01
 345860863e85d1384fd53e0a04862946b46b2c79 8u151-b01
 ff23e24353931fc6c09c2262b5c99bbcae3c5913 8u151-b02
@@ -513,6 +514,8 @@
 aafcf6462c161a546d76d14289977014a23e07e0 8u171-b00
 8313f29a0abe0e4936318d5180702b0e83718cb0 8u162-b02
 7b5ff41a72257d85d389f1d002ef4cfdb9b7fdde 8u162-b03
+934b230d560c7420b533595d7e1b9c3c3f2d16a8 8u172-b01
+20653a1518b3d7720de332ada6851526e4a35f7d 8u172-b02
 aafcf6462c161a546d76d14289977014a23e07e0 8u161-b01
 f00169e0cd131295679a531f77ade48c8a283abe 8u161-b02
 a5359a6b7ebc433c92b7d86c6c3ad579ebedfb40 8u161-b03
@@ -534,14 +537,23 @@
 e6ffac5da91bbca66e6f776094506c24e0909c07 8u161-b11
 a988f967c0978fdf6890d92f659567cb8839a1c5 8u162-b12
 6624db4f0355c093296061d8a5d3e38c78b38394 8u161-b12
+168082ed03e2cfb688c24810b77be9a568d7f498 8u172-b03
 ac9454ffccecccab79af808ddcff8d30dfd45189 8u171-b01
 1128349c07ec36d8f75b5979a8bed4ae84c7293c 8u171-b02
 c7c43150cd8dfc6510beec782c75b44a86d52198 8u171-b03
+7015b3483ca35fc5b49b5b5e03bb4ade1f254ff0 8u172-b04
 cd83202021acf76ae30593eded62c90833d509af 8u171-b04
+01594f0c837df54afca695eb61714ebea4518512 8u172-b05
 e88d5b3806e6f0c6a99ff52bf696a34ce7edc235 8u171-b05
+9221362c71d311d3f28465e6cd6a341c83ba878c 8u172-b06
 2ed1e397665ee5e80143492d33384830df95e315 8u171-b06
+c50126da73185329faf8f0cfa9fe8ca2539ab86d 8u172-b07
 b369e37a7c6f0685c4b789853eb4fe1f1fad34ff 8u171-b07
+afff74ab372b6a27e71defb504983e23343f042e 8u172-b08
 210d1c902211de7d5bd565853daa02a02f392414 8u171-b08
+d03bb47544491c4f5d41a9a74d234bbb448d5477 8u172-b09
 9eeea1f3cfe58ca3b7c0b8fdbbb39fed62e0f985 8u171-b09
+3e73d22285217a3e86a14d3771a1d85b7429fe31 8u172-b10
 9eeea1f3cfe58ca3b7c0b8fdbbb39fed62e0f985 8u171-b10
+ec63c85958b13d85f35c181f1eb94294e9094446 8u172-b11
 9eeea1f3cfe58ca3b7c0b8fdbbb39fed62e0f985 8u171-b11
--- a/apps/samples/.classpath	Thu Mar 29 15:46:04 2018 +0000
+++ b/apps/samples/.classpath	Fri Mar 30 13:19:53 2018 -0700
@@ -12,8 +12,9 @@
     <classpathentry kind="src" path="Ensemble8/src/compiletime/java"/>
     <classpathentry kind="src" path="Ensemble8/src/generated/java"/>
     <classpathentry kind="src" path="Ensemble8/src/generated/resources"/>
-    <classpathentry kind="lib" path="Ensemble8/lib/lucene-core-3.2.0.jar"/>
-    <classpathentry kind="lib" path="Ensemble8/lib/lucene-grouping-3.2.0.jar"/>
+    <classpathentry kind="lib" path="Ensemble8/lib/lucene-core-7.1.0.jar"/>
+    <classpathentry kind="lib" path="Ensemble8/lib/lucene-grouping-7.1.0.jar"/>
+    <classpathentry kind="lib" path="Ensemble8/lib/lucene-queryparser-7.1.0.jar"/>
     <classpathentry kind="src" path="MandelbrotSet/src"/>
     <classpathentry kind="src" path="Modena/src/main/java"/>
     <classpathentry kind="src" path="Modena/src/main/resources"/>
--- a/apps/samples/Ensemble8/build.gradle	Thu Mar 29 15:46:04 2018 +0000
+++ b/apps/samples/Ensemble8/build.gradle	Fri Mar 30 13:19:53 2018 -0700
@@ -4,8 +4,9 @@
 def mainClassName = "ensemble.EnsembleApp"
 
 def FileCollection apachecp = files(
-   "./lib/lucene-grouping-3.2.0.jar",
-   "./lib/lucene-core-3.2.0.jar")
+   "./lib/lucene-core-7.1.0.jar",
+   "./lib/lucene-grouping-7.1.0.jar",
+   "./lib/lucene-queryparser-7.1.0.jar")
 
 sourceSets {
     main {
--- a/apps/samples/Ensemble8/build.xml	Thu Mar 29 15:46:04 2018 +0000
+++ b/apps/samples/Ensemble8/build.xml	Fri Mar 30 13:19:53 2018 -0700
@@ -119,8 +119,34 @@
     <!-- COPY LIBS INTO JAR FILE: so that we have a simple single jar application -->
     <target name="-post-jar" depends="jfx-deployment">
         <zip destfile="${dist.jar}" update="true">
-            <zipfileset src="${file.reference.lucene-core-3.2.0.jar}"/>
-            <zipfileset src="${file.reference.lucene-grouping-3.2.0.jar}"/>
+            <!-- Rename license and notice file -->
+            <mappedresources>
+                <zipfileset src="${file.reference.lucene-core-7.1.0.jar}">
+                    <include name="META-INF/LICENSE.txt"/>
+                </zipfileset>
+                <globmapper from="*/LICENSE.txt" to="*/LUCENE_LICENSE.TXT" />
+            </mappedresources>
+            <mappedresources>
+                <zipfileset src="${file.reference.lucene-core-7.1.0.jar}">
+                    <include name="META-INF/NOTICE.txt"/>
+                </zipfileset>
+                <globmapper from="*/NOTICE.txt" to="*/LUCENE_NOTICE.TXT" />
+            </mappedresources>
+
+            <!-- Include the core SPI services -->
+            <zipfileset src="${file.reference.lucene-core-7.1.0.jar}">
+                <include name="META-INF/services/**"/>
+            </zipfileset>
+
+            <zipfileset src="${file.reference.lucene-core-7.1.0.jar}">
+                <exclude name="META-INF/**"/>
+            </zipfileset>
+            <zipfileset src="${file.reference.lucene-grouping-7.1.0.jar}">
+                <exclude name="META-INF/**"/>
+            </zipfileset>
+            <zipfileset src="${file.reference.lucene-queryparser-7.1.0.jar}">
+                <exclude name="META-INF/**"/>
+            </zipfileset>
         </zip>
     </target>
     
Binary file apps/samples/Ensemble8/lib/lucene-core-3.2.0.jar has changed
Binary file apps/samples/Ensemble8/lib/lucene-grouping-3.2.0.jar has changed
--- a/apps/samples/Ensemble8/nbproject/project.properties	Thu Mar 29 15:46:04 2018 +0000
+++ b/apps/samples/Ensemble8/nbproject/project.properties	Fri Mar 30 13:19:53 2018 -0700
@@ -30,16 +30,18 @@
 endorsed.classpath=
 excludes=
 jfxbuild.jfxrt.jar=../../../build/sdk/rt/lib/ext/jfxrt.jar
-file.reference.lucene-core-3.2.0.jar=lib/lucene-core-3.2.0.jar
-file.reference.lucene-grouping-3.2.0.jar=lib/lucene-grouping-3.2.0.jar
+file.reference.lucene-core-7.1.0.jar=lib/lucene-core-7.1.0.jar
+file.reference.lucene-grouping-7.1.0.jar=lib/lucene-grouping-7.1.0.jar
+file.reference.lucene-queryparser-7.1.0.jar=lib/lucene-queryparser-7.1.0.jar
 includes=**
 jar.archive.disabled=${jnlp.enabled}
 jar.compress=true
 jar.index=${jnlp.enabled}
 javac.classpath=\
     ${jfxbuild.jfxrt.jar}:\
-    ${file.reference.lucene-core-3.2.0.jar}:\
-    ${file.reference.lucene-grouping-3.2.0.jar}
+    ${file.reference.lucene-core-7.1.0.jar}:\
+    ${file.reference.lucene-grouping-7.1.0.jar}:\
+    ${file.reference.lucene-queryparser-7.1.0.jar}
 # Space-separated list of extra javac options
 javac.compilerargs=
 javac.deprecation=false
--- a/apps/samples/Ensemble8/src/app/java/ensemble/SearchPopover.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/apps/samples/Ensemble8/src/app/java/ensemble/SearchPopover.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2014, Oracle and/or its affiliates.
+ * Copyright (c) 2008, 2017, Oracle and/or its affiliates.
  * All rights reserved. Use is subject to license terms.
  *
  * This file is available and licensed under the following license:
@@ -42,16 +42,14 @@
 import java.util.Map;
 import javafx.animation.KeyFrame;
 import javafx.animation.Timeline;
-import javafx.beans.value.ChangeListener;
 import javafx.beans.value.ObservableValue;
 import javafx.event.ActionEvent;
-import javafx.event.EventHandler;
 import javafx.geometry.Point2D;
 import javafx.scene.control.Tooltip;
 import javafx.scene.input.KeyCode;
 import javafx.scene.input.KeyEvent;
 import javafx.util.Duration;
-import org.apache.lucene.queryParser.ParseException;
+import org.apache.lucene.queryparser.classic.ParseException;
 
 
 /**
--- a/apps/samples/Ensemble8/src/app/java/ensemble/search/ClasspathDirectory.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/apps/samples/Ensemble8/src/app/java/ensemble/search/ClasspathDirectory.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2014, Oracle and/or its affiliates.
+ * Copyright (c) 2008, 2017, Oracle and/or its affiliates.
  * All rights reserved. Use is subject to license terms.
  *
  * This file is available and licensed under the following license:
@@ -36,12 +36,15 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.IOContext;
 import org.apache.lucene.store.IndexInput;
 import org.apache.lucene.store.IndexOutput;
+import org.apache.lucene.store.Lock;
 
 /**
  * A very simple implementation of lucene Directory, it reads a index from the classpath in a directory called index
@@ -75,8 +78,9 @@
         return allFiles;
     }
 
-    @Override public IndexInput openInput(String s) throws IOException {
+    @Override public IndexInput openInput(String s, IOContext ioc) throws IOException {
         return new ClassPathIndexInput(
+            s,
             getClass().getResourceAsStream("index/"+s),
             fileLengthMap.get(s).intValue()
         );
@@ -87,7 +91,8 @@
         private int pointer = 0;
         private int length;
 
-        private ClassPathIndexInput(InputStream in, int length) throws IOException {
+        private ClassPathIndexInput(String resourceDescription, InputStream in, int length) throws IOException {
+            super(resourceDescription);
             this.length = length;
             // read whole file into memory, so we can provide random access
             data = new byte[length];
@@ -108,6 +113,13 @@
             in.close();
         }
 
+        private ClassPathIndexInput(String resourceDescription, byte[] data) {
+            super(resourceDescription);
+            this.data = data;
+            this.pointer = 0;
+            this.length = data.length;
+        }
+
         @Override public byte readByte() throws IOException {
             return data[pointer ++];
         }
@@ -124,13 +136,48 @@
         @Override public void seek(long l) throws IOException { pointer = (int)l; }
 
         @Override public long length() { return length; }
+
+        @Override
+        public IndexInput slice(String sliceDescription, long offset, long length) throws IOException {
+            int o = (int) offset;
+            int l = (int) length;
+            byte[] sliceData = new byte[l];
+            System.arraycopy(data, o, sliceData, 0, l);
+            return new ClassPathIndexInput(sliceDescription, sliceData);
+        }
     }
 
     @Override public void close() throws IOException {}
-    @Override public boolean fileExists(String s) throws IOException { throw new UnsupportedOperationException("Not implemented"); }
-    @Override public long fileModified(String s) throws IOException { throw new UnsupportedOperationException("Not implemented"); }
-    @Override @Deprecated public void touchFile(String s) throws IOException { throw new UnsupportedOperationException("Not implemented"); }
     @Override public void deleteFile(String s) throws IOException { throw new UnsupportedOperationException("Not implemented"); }
     @Override public long fileLength(String s) throws IOException { throw new UnsupportedOperationException("Not implemented"); }
-    @Override public IndexOutput createOutput(String s) throws IOException { throw new UnsupportedOperationException("Not implemented"); }
+    @Override
+    public IndexOutput createOutput(String string, IOContext ioc) throws IOException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public IndexOutput createTempOutput(String string, String string1, IOContext ioc) throws IOException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void sync(Collection<String> clctn) throws IOException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void rename(String string, String string1) throws IOException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void syncMetaData() throws IOException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public Lock obtainLock(String string) throws IOException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
 }
--- a/apps/samples/Ensemble8/src/app/java/ensemble/search/IndexSearcher.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/apps/samples/Ensemble8/src/app/java/ensemble/search/IndexSearcher.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2014, Oracle and/or its affiliates.
+ * Copyright (c) 2008, 2017, Oracle and/or its affiliates.
  * All rights reserved. Use is subject to license terms.
  *
  * This file is available and licensed under the following license:
@@ -35,32 +35,37 @@
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
 import javafx.application.ConditionalFeature;
 import javafx.application.Platform;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 import org.apache.lucene.document.Document;
-import org.apache.lucene.queryParser.MultiFieldQueryParser;
-import org.apache.lucene.queryParser.ParseException;
+import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
+import org.apache.lucene.queryparser.classic.ParseException;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.Sort;
 import org.apache.lucene.search.grouping.GroupDocs;
 import org.apache.lucene.search.grouping.SearchGroup;
-import org.apache.lucene.search.grouping.SecondPassGroupingCollector;
+import org.apache.lucene.search.grouping.TermGroupSelector;
 import org.apache.lucene.search.grouping.TopGroups;
-import org.apache.lucene.util.Version;
+import org.apache.lucene.search.grouping.TopGroupsCollector;
+import org.apache.lucene.util.BytesRef;
 
 /**
  * Class for searching the index
  */
 public class IndexSearcher {
-    private final static List<SearchGroup> searchGroups = new ArrayList<>();
+    private final static List<SearchGroup<BytesRef>> searchGroups = new ArrayList<>();
     static {
         for (DocumentType dt: DocumentType.values()){
-            SearchGroup searchGroup = new SearchGroup();
-            searchGroup.groupValue = dt.toString();
+            SearchGroup<BytesRef> searchGroup = new SearchGroup();
+            searchGroup.groupValue = new BytesRef(dt.toString());
             searchGroup.sortValues = new Comparable[]{5f};
             searchGroups.add(searchGroup);
         }
@@ -71,24 +76,25 @@
 
     public IndexSearcher() {
         try {
-            searcher = new org.apache.lucene.search.IndexSearcher(new ClasspathDirectory());
+            searcher = new org.apache.lucene.search.IndexSearcher(DirectoryReader.open(new ClasspathDirectory()));
         } catch (IOException e) {
             e.printStackTrace();
         }
-        analyzer = new StandardAnalyzer(Version.LUCENE_31);
-        parser = new MultiFieldQueryParser(Version.LUCENE_31, new String[]{"name","bookTitle","chapter","description"}, analyzer);
+        analyzer = new StandardAnalyzer();
+        parser = new MultiFieldQueryParser(new String[]{"name","bookTitle","chapter","description"}, analyzer);
     }
 
     public Map<DocumentType, List<SearchResult>> search(String searchString) throws ParseException {
         Map<DocumentType, List<SearchResult>> resultMap = new EnumMap<>(DocumentType.class);
         try {
             Query query = parser.parse(searchString);
-            final SecondPassGroupingCollector collector = new SecondPassGroupingCollector("documentType", searchGroups,
+            final TopGroupsCollector<BytesRef> collector = new TopGroupsCollector(
+                    new TermGroupSelector("documentType"), searchGroups,
                     Sort.RELEVANCE, Sort.RELEVANCE, 10, true, false, true);
             searcher.search(query, collector);
-            final TopGroups groups = collector.getTopGroups(0);
-            for (GroupDocs groupDocs : groups.groups) {
-                DocumentType docType = DocumentType.valueOf(groupDocs.groupValue);
+            final TopGroups<BytesRef> groups = collector.getTopGroups(0);
+            for (GroupDocs<BytesRef> groupDocs : groups.groups) {
+                DocumentType docType = DocumentType.valueOf(groupDocs.groupValue.utf8ToString());
                 List<SearchResult> results = new ArrayList<>();
                 for (ScoreDoc scoreDoc : groupDocs.scoreDocs) {
                     if ((Platform.isSupported(ConditionalFeature.WEB)) || (docType != DocumentType.DOC)) {
--- a/apps/samples/Ensemble8/src/compiletime/java/ensemble/compiletime/search/BuildEnsembleSearchIndex.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/apps/samples/Ensemble8/src/compiletime/java/ensemble/compiletime/search/BuildEnsembleSearchIndex.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2015, Oracle and/or its affiliates.
+ * Copyright (c) 2008, 2017, Oracle and/or its affiliates.
  * All rights reserved. Use is subject to license terms.
  *
  * This file is available and licensed under the following license:
@@ -32,7 +32,11 @@
 package ensemble.compiletime.search;
 
 import ensemble.compiletime.Sample;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
@@ -51,12 +55,15 @@
 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
+import org.apache.lucene.document.SortedDocValuesField;
+import org.apache.lucene.document.StringField;
+import org.apache.lucene.document.TextField;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexWriterConfig;
 import org.apache.lucene.index.IndexWriterConfig.OpenMode;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
-import org.apache.lucene.util.Version;
+import org.apache.lucene.util.BytesRef;
 
 /**
  * Generate the lucene index that Ensemble uses for its search
@@ -71,6 +78,8 @@
             System.out.println("Creating Documents for Samples...");
             docs.addAll(indexSamples(allSamples));
             System.out.println("Creating tasks for getting all documentation...");
+            System.out.println("javaDocBaseUrl = " + javaDocBaseUrl);
+            System.out.println("javafxDocumentationHome = " + javafxDocumentationHome);
             tasks.addAll(indexJavaDocAllClasses(javaDocBaseUrl));
             tasks.addAll(indexAllDocumentation(javafxDocumentationHome));
             // execute all the tasks in 32 threads, collecting all the documents to write
@@ -94,24 +103,22 @@
             }
             // create index
             System.out.println("Indexing to directory '" + indexDir + "'...");
-            Directory dir = FSDirectory.open(indexDir);
-            Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31);
-            IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31, analyzer);
+            Directory dir = FSDirectory.open(indexDir.toPath());
+            Analyzer analyzer = new StandardAnalyzer();
+            IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
             iwc.setOpenMode(OpenMode.CREATE);
             try (IndexWriter writer = new IndexWriter(dir, iwc)) {
                 // write all docs
                 System.out.println("Writing ["+docs.size()+"] documents to index....");
                 writer.addDocuments(docs);
-                // optimize the writen index
-                System.out.println("Optimizing search index....");
-                writer.optimize();
                 System.out.println("NUMBER OF INDEXED DOCUMENTS = ["+writer.numDocs()+"]");
             }
             // write file listing all the search index files, so we know what
             // is in the jar file at runtime
             try (FileWriter listAllOut = new FileWriter(new File(indexDir,"listAll.txt"))) {
                 for (String fileName: dir.listAll()) {
-                    if (!"listAll.txt".equals(fileName)) { // don't include the "listAll.txt" file
+                    // don't include the "listAll.txt" file or "write.lock"
+                    if (!"listAll.txt".equals(fileName) && !"write.lock".equals(fileName)) {
                         Long length = dir.fileLength(fileName);
                         listAllOut.write(fileName);
                         listAllOut.write(':');
@@ -167,11 +174,11 @@
                 }
                 // write documentation section entry to index
                 docs.add(createDocument(DocumentType.DOC,
-                    new Field("bookTitle", docPage.bookTitle, Field.Store.YES, Field.Index.ANALYZED),
-                    new Field("chapter", docPage.chapter==null? "" : docPage.chapter, Field.Store.YES, Field.Index.ANALYZED),
-                    new Field("name", section.name, Field.Store.YES, Field.Index.ANALYZED),
-                    new Field("description", section.content, Field.Store.NO, Field.Index.ANALYZED),
-                    new Field("ensemblePath", section.url, Field.Store.YES, Field.Index.NOT_ANALYZED)
+                    new TextField("bookTitle", docPage.bookTitle, Field.Store.YES),
+                    new TextField("chapter", docPage.chapter==null? "" : docPage.chapter, Field.Store.YES),
+                    new TextField("name", section.name, Field.Store.YES),
+                    new TextField("description", section.content, Field.Store.NO),
+                    new StringField("ensemblePath", section.url, Field.Store.YES)
                 ));
             }
             // handle next page if there is one
@@ -206,11 +213,11 @@
         for (Sample sample: allSamples) {
             // write class entry to index
             docs.add(createDocument(DocumentType.SAMPLE,
-                new Field("name", sample.name, Field.Store.YES, Field.Index.ANALYZED),
-                new Field("description", sample.description, Field.Store.NO, Field.Index.ANALYZED),
-                new Field("shortDescription", sample.description.substring(0, Math.min(160, sample.description.length())),
-                        Field.Store.YES, Field.Index.NOT_ANALYZED),
-                new Field("ensemblePath", "sample://"+sample.ensemblePath, Field.Store.YES, Field.Index.NOT_ANALYZED)
+                new TextField("name", sample.name, Field.Store.YES),
+                new TextField("description", sample.description, Field.Store.NO),
+                new StringField("shortDescription", sample.description.substring(0, Math.min(160, sample.description.length())),
+                        Field.Store.YES),
+                new StringField("ensemblePath", "sample://"+sample.ensemblePath, Field.Store.YES)
             ));
         }
         return docs;
@@ -257,13 +264,13 @@
         ///System.out.println("classDescription = " + classDescription);
         // write class entry to index
         docs.add(createDocument(documentType,
-                new Field("name", className, Field.Store.YES, Field.Index.ANALYZED),
-                new Field("description", classDescription, Field.Store.NO, Field.Index.ANALYZED),
-                new Field("shortDescription", classDescription.substring(0,Math.min(160,classDescription.length())),
-                        Field.Store.YES, Field.Index.NOT_ANALYZED),
-                new Field("package", packageName, Field.Store.YES, Field.Index.ANALYZED),
-                new Field("url", url, Field.Store.YES, Field.Index.NOT_ANALYZED),
-                new Field("ensemblePath", url, Field.Store.YES, Field.Index.NOT_ANALYZED) // TODO what do we need here
+                new TextField("name", className, Field.Store.YES),
+                new TextField("description", classDescription, Field.Store.NO),
+                new StringField("shortDescription", classDescription.substring(0,Math.min(160,classDescription.length())),
+                        Field.Store.YES),
+                new TextField("package", packageName, Field.Store.YES),
+                new StringField("url", url, Field.Store.YES),
+                new StringField("ensemblePath", url, Field.Store.YES) // TODO what do we need here
         ));
 
         // extract properties
@@ -282,14 +289,14 @@
                 //System.out.println("                    oracle url = " + url);
                 // write class entry to index
                 docs.add(createDocument(DocumentType.PROPERTY,
-                        new Field("name", propertyName, Field.Store.YES, Field.Index.ANALYZED),
-                        new Field("description", description, Field.Store.NO, Field.Index.ANALYZED),
-                        new Field("shortDescription", description.substring(0,Math.min(160,description.length())),
-                                Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("url", propUrl, Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("className", className, Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("package", packageName, Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("ensemblePath", url + "#" + propertyName, Field.Store.YES, Field.Index.NOT_ANALYZED) // TODO what do we need here
+                        new TextField("name", propertyName, Field.Store.YES),
+                        new TextField("description", description, Field.Store.NO),
+                        new StringField("shortDescription", description.substring(0,Math.min(160,description.length())),
+                                Field.Store.YES),
+                        new StringField("url", propUrl, Field.Store.YES),
+                        new StringField("className", className, Field.Store.YES),
+                        new StringField("package", packageName, Field.Store.YES),
+                        new StringField("ensemblePath", url + "#" + propertyName, Field.Store.YES) // TODO what do we need here
                 ));
             }
         }
@@ -309,14 +316,14 @@
                 //System.out.println("                    oracle url = " + url);
                 // write class entry to index
                 docs.add(createDocument(DocumentType.METHOD,
-                        new Field("name", methodName, Field.Store.YES, Field.Index.ANALYZED),
-                        new Field("description", description, Field.Store.NO, Field.Index.ANALYZED),
-                        new Field("shortDescription", description.substring(0,Math.min(160,description.length())),
-                                Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("url", methodUrl, Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("className", className, Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("package", packageName, Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("ensemblePath", url + "#" + methodName + "()", Field.Store.YES, Field.Index.NOT_ANALYZED) // TODO what do we need here
+                        new TextField("name", methodName, Field.Store.YES),
+                        new TextField("description", description, Field.Store.NO),
+                        new StringField("shortDescription", description.substring(0,Math.min(160,description.length())),
+                                Field.Store.YES),
+                        new StringField("url", methodUrl, Field.Store.YES),
+                        new StringField("className", className, Field.Store.YES),
+                        new StringField("package", packageName, Field.Store.YES),
+                        new StringField("ensemblePath", url + "#" + methodName + "()", Field.Store.YES) // TODO what do we need here
                 ));
             }
         }
@@ -336,14 +343,14 @@
                 //System.out.println("                    oracle url = " + url);
                 // write class entry to index
                 docs.add(createDocument(DocumentType.FIELD,
-                        new Field("name", fieldName, Field.Store.YES, Field.Index.ANALYZED),
-                        new Field("description", description, Field.Store.NO, Field.Index.ANALYZED),
-                        new Field("shortDescription", description.substring(0,Math.min(160,description.length())),
-                                Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("url", fieldUrl, Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("className", className, Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("package", packageName, Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("ensemblePath", url + "#" + fieldName, Field.Store.YES, Field.Index.NOT_ANALYZED) // TODO what do we need here
+                        new TextField("name", fieldName, Field.Store.YES),
+                        new TextField("description", description, Field.Store.NO),
+                        new StringField("shortDescription", description.substring(0,Math.min(160,description.length())),
+                                Field.Store.YES),
+                        new StringField("url", fieldUrl, Field.Store.YES),
+                        new StringField("className", className, Field.Store.YES),
+                        new StringField("package", packageName, Field.Store.YES),
+                        new StringField("ensemblePath", url + "#" + fieldName, Field.Store.YES) // TODO what do we need here
                 ));
             }
         }
@@ -363,14 +370,14 @@
                 ///System.out.println("                    oracle url = " + url);
                 // write class entry to index
                 docs.add(createDocument(DocumentType.ENUM,
-                        new Field("name", enumName, Field.Store.YES, Field.Index.ANALYZED),
-                        new Field("description", description, Field.Store.NO, Field.Index.ANALYZED),
-                        new Field("shortDescription", description.substring(0,Math.min(160,description.length())),
-                                Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("url", enumUrl, Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("className", className, Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("package", packageName, Field.Store.YES, Field.Index.NOT_ANALYZED),
-                        new Field("ensemblePath", url+ "#" + enumName, Field.Store.YES, Field.Index.NOT_ANALYZED) // TODO what do we need here
+                        new TextField("name", enumName, Field.Store.YES),
+                        new TextField("description", description, Field.Store.NO),
+                        new StringField("shortDescription", description.substring(0,Math.min(160,description.length())),
+                                Field.Store.YES),
+                        new StringField("url", enumUrl, Field.Store.YES),
+                        new StringField("className", className, Field.Store.YES),
+                        new StringField("package", packageName, Field.Store.YES),
+                        new StringField("ensemblePath", url+ "#" + enumName, Field.Store.YES) // TODO what do we need here
                 ));
             }
         }
@@ -387,8 +394,9 @@
     private static Document createDocument(DocumentType documentType, Field... fields) throws IOException {
         // make a new, empty document
         Document doc = new Document();
-        // add doc type field
-        doc.add(new Field("documentType", documentType.toString(), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
+        // add doc type field + sorting field
+        doc.add(new StringField("documentType", documentType.toString(), Field.Store.YES));
+        doc.add(new SortedDocValuesField("documentType", new BytesRef(documentType.toString())));
         // add other fields
         if (fields != null) {
             for (Field field : fields) {
@@ -409,8 +417,9 @@
     private static void addDocument(IndexWriter writer, DocumentType documentType, Field... fields) throws IOException {
         // make a new, empty document
         Document doc = new Document();
-        // add doc type field
-        doc.add(new Field("documentType", documentType.toString(), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
+        // add doc type field + sorting field
+        doc.add(new StringField("documentType", documentType.toString(), Field.Store.YES));
+        doc.add(new SortedDocValuesField("documentType", new BytesRef(documentType.toString())));
         // add other fields
         if (fields != null) {
             for (Field field : fields) {
Binary file apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.cfe has changed
Binary file apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.cfs has changed
Binary file apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.fdt has changed
Binary file apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.fdx has changed
--- a/apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.fnm	Thu Mar 29 15:46:04 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-documentTypenamedescriptionshortDescriptionensemblePathpackageurl	className
\ No newline at end of file
--- a/apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.frq	Thu Mar 29 15:46:04 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1170 +0,0 @@
-									
			
-


    !!!!!!"""""""####$$$$$%%&&&&&&&**+&''''''(((()))*****,,,-.///00//00001111122222223333444478844455555566666778888999999:;;;;;;<<=<====>>>?@@@ @@AA AAA BB!BBB!BCCCC!EE"E"FFF#GGGG#GHHH$III&1$OO'OO(P(QQQRRRRRRRR)RR)SSS)SSSTTTTTTTTTT*UUUU*UUU+VVVVV+VWWWW+W,XX,XYYYYYY,Z-ZZZZ-[[-\\\\\\\\]]]\\\.].]]]]]]^^^^^/^/__________``````````aaaaaaaaaabbbbbbbbccccccccccdd2d2d2e2ff3gg4h4}~h4i4jj5mm6nn7o7ooo7pppp8pqqq8r9rss9ss9s:t:tu:uuuuuuvvvvvvvvvvvvvvvw;ww;xxxxxxxyy<yyz=z{{{{={{|||>|}}||||||}}}}>~~~~?BÅ?@π׀@AABɅBцCLJCDψDDEEًFFFǍӍߍFGяGHϐHHH˒ђےIIÔϔՔJJKחK˗їLəLŚݚMN˜ӜۜNOO͞l5}
6
-		5
-P
-o"#@':-g1!E	D
8w
]&uU$xx"$.xLxU%V.K
Y%	
-e
-[%b)!

-!!E UU
(	qD#, <


;U	bbk	.l*")#&'.&$1DOOƅƅU0IVIU1$U1>5$N;UU	
;G0
-YCFUIUUV
-{	
-E 1	6*1{G
-!U/NQϏEUU
2<YCV
B
-j>45UWU	G	>'U
-J
-$U5$
9;&c.	
-WQ	C1WUV#E%[Wc		1c5$U		c	$m+
8W$fV1Uݍ;1Um+-"$=b{	
Tl*
x4s+$,f3E!8!_EVEU*[$;O1=
-
)	S~UIU$**e!& yU,W/DžUI1WDžq
	UUUUUUU'[A#7
- C#'

H	333335)n	#3	
-o)ylC;k=
Wb3		.*m9CS͐SSSVF

1	!k$e		
F$:$$$
	#D		!'

-]`%-=E>.\$.G5.2z%.I1*
-[1=08<1

-!!	E9						ME
+#E'/!%\0)C#Hz0
'%K2_ 
-C
-cC]A#1





%
a?E	Y 	!
-
-;4)04333333)#W8
-6i%/OL<-	e

UGGI-Mg3	
	M<g+		V=q
-1	e	/		S%H	7C
/B==&Q	#/5	 )Ag{CM_E111113_#{?{
9	#wg			WY"4		/W!
IT	\E_[A,:^
)/

-6
)213	MQ;	+





%
wMXA/?A
0/	%$/^e[)!1~$U5/9.
m)K#
-
-"SK
	!"
1	
$

-/-
Qa]!	
/
f%aK!7)Ki5SA!3U4	%WA%	Y7mmik\222222>
eQaG+kmUQ+IW=/'
;/3
m)W1




;
3
9
a!UO1+!a M

U'y'
	S?%[.U
Ga7
U"qM
%
GGF@)Y.gCy###+
O6P+3;	k/(+"		!Fi		%_J3
-I

G%Sg0	U0+S7


-u#	E
2+	CK;"	#=IiQK333335[|CSk	E'/

 #,#DV#1
!
!
!
!
!
!
)






;
ϝQѝI^UA)1
		K	!SooYeo%;+"WUBI$,%	'1?	=#	'3	/		ua/-)
-/	"g),
-P*"%F)[	[[a
+B	%o/1&*<*%!
=B	4
	+	
-7A	C1r͐!	

	5	
-	aG5+	y
	5	M	O			'AWφ?.mt?
y//}=)e]-	'5r2C=###.}U333335Su[6S4	]	`%SZ&Bg;a3$!R+%?yG[w3m!??'		' 	*3333350EE5?-.۞		3=O
7?{Yy%S

5#!&?@](;8'FF#%!6(p#U
-}Mc'y|-	 '(P
--&y	|)*,%1U,H}E
-
-=,!!'
-?39|
#			9w!;-9#I
-0
$c3Wm3(&7*#*$$
&c6-c-g65'c----g6
J	
?Gl%!!ׇeeTeee13	
>Co1&$ݒO	
-
-
-+
-C	|kYs?H	73kA-
K
+)eKkCC	
'S+}=A
R=G$jHDž#Hy8??9?C	'M	%	Dž	_%
-]E!P		P	CS%###')GW
;#;
g?			y1w
-H׌&uI*'/	CB6<$IG		




#C
3
9
*F@CII			A[3!
-1=Coh
=>85A
	
-#	
w	3'**/%1!!;[C$H}U	
 :[['1T
}|Y[-
-$C+9/
\		_	oRuMa?%Q	!"	
-	





%
[/4333335#U.1I9g
		7
	
1
	SE75
		
!			9kkk;	 G='UUU						k}"*
	k"	
$!Zqq	3\%		
Y[%	K	*B33kmOm#S\<
=_(
!=]G@Eq/37n7	K5o9	!9	q8u]!!	GW{	O1kq
g	!U3CkK
-
-
0
;o>/+I$Y4
-
-
-
-
-
-
-)*T0&:)4333333)#	
-	Q'}u6"#*f
/UiM9!!!!!#	M	e-u1
					
		

		

		aU	W
;
%!)R	#C
;??7
a
	
-

}YO]
3iEN'{!		"'sSGh+m	V]%u>,?'Sm?E/I-$C$*0o

-[=	%!A,/sGI-%###5+(u1!1%





%
L&Y"+90#C		)<
 ?O
-?	FC;	=
-YS}"$L%,{

H.U59J1s3	K+		(&;71	%'9!]	'|MO			K7'
S9/-)I5"/EF	/#$-_
-
-					
-	KM]
-
		~
-	
-! z

-
	'
B		!				G				[				?		5		?		Y		%		K	M	U		G	M"
-{##	
-
=])	CI$*
3


K
+
S	&'Rn	ƅS&%
		
/		+	>	/% 					
+'$
A\D2RS3	Mm
3#	E%
	I99-y-11Cu7};M
-
5
m[}-	UC/MkuU/+/
	s	A_
A=yM	QEm9UgAPi!}	
-+E/%A!	1!!C	.HO͐		
0<%Z)
)3V%	F;U%Ec	
-
-#]#+/5#

			+	!gCk=H*

wd
	
+
-8	 	 	 	 	 	"	
!	
%!
-	*$A1S?w0M	
-		1Q"|	
-_!ojeQ
W	z);j"II$9		J	
-		%Q
-1#GIG@m
-F<	z0`8E͐$!HYC-=!~qCCg!333333
#0̐'	222222)"0+͐9K

-C
FT+';<WqFUmob4

		@3g&
k		


-uj@

-	) 4
////yx
a		4C6/gGY,&i'%'i)%)i+%+
X
]
-
[#,====	===LB18e;I%
-!K	|131K)3	?	K	K'

##P%'/ee
-*n
Gg			!	C-3		
%
	
	
	
b

-?p*5G		A?t
2?[e
-/\;a	
u!#EM
-'?p+Ck
-(((((*+	?--{}7

	gC+./!5WY
!-)7
--
K					COC
?		[eK-+/;#sIE=H+5=[,&P	mq	Ci2}saG@
y)a!}	A1!










!

%
	yi#
-#	Cq
-<W5A\#S!	 (/+|CGJK
F$	
7%HZ9W5	AV+H1>5		
		
		
		
		
		
		7!$1E0>w{=RNsle/99L;W
iC;qj+;)
-$sC;;n+!'aC
E;]]!! 
-

B@M	'P##
!Y'H"U.Cu]`1u9;;Q3A>*$]V'.[
$"ƅ]##%

Dž'	3-I
337J9	

-A	'UU*U2F>03!~WR	&!M_Dž2V		E׉D^;lq	
-}
-	-^	Ic%&	
8 OH	ƅK	f		
0?	o

-
-
!,
+A)(I BfS3Bu	
-';				
	
	
	
		

	)!
		'/5r=1	'
-c
	'/
-'
-II	0
J8	QQ23 !,J-(?C?C?C^!2c##+%


	'!)
I#'#n)
g"
3'@ӂ%
#
- (o%?&2Ie;	
	
]$
͐&y 
-F&z4333333)#A

/Ua!>)]			yU
u	6?+q%a+GI	S[ok[Rs
-i	o+I/

-EWM- =( .Th
-L8     "Ld,				
	
	
	`T'

-
-





#C
3
9
0Ue	C
;);O6	Oc?G6 
G[k#qq'
-				"	
		

		

	WOB}[M

-B
-	5S8u#9Ln59C+
C	+#E+C!#
(


#+!		#	""G)-!$
-K333335				
&)C
-	
-$Dž'O
-
-!#=	
-
-
-
-	GW

-
	

-;
-&3$
-"'
+%5!%$	' -.̐	+p		
-7	;2


|3u
S		!yG%}Y
'#)J͐%$@
l				###I2$r!!!!+111111		
	.U$$$$$$-!CE'CEm:l	'>BMg'bI'U!)aN@#b=7g=M+	
`I











%;${v	"
-#K!)eC]	1,
-:)!+&+0x$/$Dž	/;Uj	K?%!?6J#0k%u	$
-e;%)A	6#&I	.~7[#O-EGYm')		5M*I

-'cDž#)SylY)m[c;)c]	.	%=o	QC++%i-	w[LQK	=		P
-c3		*1,͐Yы
#K
	7$$!
-
-1





%
/*	1/&
V	BCS
-`	g	
 3'	
#	W-(
w


=z&/m+
(.






oqm		{
-.W]#*%!);%
!
-,	*[);$*
-B0
	(),8p&"...;
)#!.GTCQ
/;)/I5/tS?%	Ct!QE	:%	.W~~~~)$#A4333333)#.O&% K)g/"WC+C@33-2@//[S1C/5S
E *


J !+(%%;+t'A%1{7#%
-#=.	
m
-g
-kC*
'mA{	!777777777
-Y.2j*2RJ9	
	W
+-%[[[[[[I
-y
%
		
-	
	




-
u
 
({*\y?C1
-	cc=;%  Dž]\šš
ٌ
-#$Y%2#W*C5EBA@###^	=OHC0;4333333)#0,HFS'!G$*#W5)
	3=
K[
3IK!CC5;;'S?1+}9=(7'-
-E

K
'I	CC'S+}=4333335
%=!+U',=
`8&]y	
-#
-;
"S"#D]"	@%
 	[#&		1	Q$	i;=	$v%m
SK
	K	CC%'S+}=Q
-	"4
	)'37I
71333335qsj
-#						-=M]W]	U	
L
#I	 8zQ]CE	3>	
>	
@	

''5/f
;/=O'
-	37	c		o&mN		$lL
::*Q9:_X<A		!;IߘXww
-}7
-='$#	&G8:"&~ @>1.=	
{	
-gQiW.M/YGg
/5	;=QU/'7
-g#		:!	7?!	9;}7O
CW	;Q
-?
-
-'A+$++IA5M

AkT)	==+		yu}%P
-
!^
!	-
!-
^
!	#-
%-
%-5O5
6_c33_/$
-%-
4333333)#
-v868EQA	'wA+!y!!!	
$?
-/	'!	
\\Džn[W
7+
-	
#	c	3	
c1
S
%qf$G1)		
	G
)3	3<
-"T"}S   g
-9
		SgAY!
-E?57K
!/5
{
}?
-	#)M	e	-
-U%_$i)!)*)
>1Dž5	UO						͐+	<W)0OǍƅ^	
	`tzI#{?b[!U###5E!
1!!!!!!iME#;	c_J%@;7!y
-		$~	
-		
-'A
 !̐#c	=O9C![?y+ow+###5#YQI1	2i"Gk6N	*6<m]&%=N"5B'tDžY1 Dž-!				c_;

;		)9	y	J									A!'O]# !~%#C /6 >      4#t!gm

m#+	#
-A	7	3k		3	/3333339!AC	/KE##Y
7A
	A	)'K
K+






q]75-59a	kCQ_e	!
	y
I8	W-
7#'k
7Q7q

+	C;				w+J>	Cm	A
e%)!Am		I	yI	G	/{E			
#'E	
M=KS]	%>>	q			MYOc'p5=2 0-#G*	A	B

-N
"5
;ƅDž#
,O#I? C	$O*!_S
(iU/")''<"
."<">=G_!	q`c?+
-]#Qo
	
-

-
EseS
	!	}.O[~	Pt#e#	-
-%"F?
-!ݝ!/%0	A""i !!!!!
!$$$O.=]C=]$$$$$qqW
K
K	CC'S+}=Yyc?[%n7n	MmK])		|e73l-%'& D+^"""9[%Gwl'}_
bW)	we4-e{
-	:	bi+J	%sg'1-b[#0!_i7	-`
-oj #+*)5?
-s
-		3?	!%)+l5#Ao5	)3o;K
1;	[W%	/K	Sw				#U	+CC?	
-
m1
7
!3)OYOU
	UM7-s	}	v%		
%!
#_5	E&8qRYX!'MX6	-w*
	s
-R	/W&	&'h	
	
-!'

-], GGGGG+1G
wDžDžbWY%ݝ+2	=
-%HH$Bރ2>ooq	)	
	+M81??=:9	=
-	d $*	
L#GE\ۚ	q!%xK\z??*|C=*	\C_&&I0U-u_
IH.7	:
-)*( 
-RAyl
-#??DH$
/////5$$#	
!3		Z
-
'K=K$-3"'		#!
	!y{	yH,
-'1-E&''6dDž?/ 	

[X/3
-({1





%
	ZR,
I%';
W<W88			w
"-8
-')	

+
-##
-E?+75!_o'
-|######V
-"		`e))-
-CA1F5	
#3?f d!
-{

3K]K3'7&	y 
-@Iq/%&&&!"""A
I=Q
=)'O#U
-c
#m,U6?			***Q
%o'S/7###	=r=
QU1++KI#sك3).
-!	1Q?;5-;T &<"5&%CT4xxyx

-
k!W5
-C3SqNRyy!G6*	L+/
- 	c2H !7e\SM>im&s'
-
- 	1FG0h!<%0	-#	%ua	'AGG1(11=1
-ke1]!	;	'		7					C	;
-ZK`	I)+i!

#5[QA	i)#;$	
-K
#l!Ggg	9C7!IMiC	I
}!"
-
-
Z	%W0
-

-K9=<P
-Q	]BE%50
	
&$	C/ 	E#{
;B
'1
Q
;s7+W(
g|W
G=7	&EmA	y
9s8+3/!snr6!zj1*)!3vM5b#A.(2`/.?x& $VT%%		/
				o	_
-!3#

#o#A#/
+'
-\0JI]!#
-7



#$$#$$-$$$$$$	$$$$%#6$	$$$H	=#y#'3X
ts8	k?(-3NoA$5##$+###$1%$$$$$$--YY\7%$

C	
-8q#%)o	
	A
-	
-Y
-%mm&c.m*
-Qmm%{5+
-A-7K3)
-E%
Gy';?C-͐-
-'	)3	+#		C>BG
-	!#
		J*	Re		#UC  CC/!OG65!11H>e	%(o
Nu	I	/%	%=]gO?5"/$!GTE]4m	ƅ5A 		'F!UP++%+
@MM43R%)@
-&?VW,
-?!1-)G!362###!$C"C'	0$A@S
-		)?
!9%!
!D
-)		1'" "s"U	

-	
	=%	/(2u%	H	!	%		I	q*K (&E7U	A?E|1





%
qs)-Z;=u
)U'+7;M!!)=	
-		
-S55		O
T
1CK			
-;I+::)
-c
	>V:Y	+ReCS<###
MC
u'
+

-%)
/
-S3333333CG#!0
-(Cq?&}e[\DžR0!7$U5.B?A];Y,
-1	3%
-Y	
_#S*	!'>	=;SDž$TGC$$+/5'	"
 	"
8 0MgU	bY[ i		$	9c#Cw
!5###8
O	#A%DžI}I	AA		%Q	){;			
-	}UUm
-CM"
-/AGk
G
/
9	/

&/2
-+Hp&7)
W/!
	9--)-*I;!
\D)'+/%+~v	.)n	V
-}.-T8Rv!
-;N!
	N)*	'1G'!I7wI
9/c	
o{	
#%E
-%+I	++%
1
-
%	;
-%53S/'I.1	&E%8)sq'z28GC!){(2R$&$oo$oo$&	y 
-&$.4JI?Y;
+A*c ;>
8
GJJ=W
*TE(k9u 
-

-
		
		y	( "*	#
-$+%^>8FJ<jV?
3%8)"##&H		G&I18
=
A#=g)=SVRBYc=CEE(Km:E,77;}9/5k
=_;#,?Um+%%(';F[y5mUG5g&{
+MoR
-}A#Q~c2jC:W0 /		]:Y	5';$


--+#		
. +͐1!!
qm1	1
/%VBU+\'	C&nUm-	ADž'"Ŕ5E
U&E39	15$ z$#Mu6.b
	

	#
Hɓmg;!I=}\YGm 	
-"@;)+mnqDž	a! 9
- 	[dD
-!	
-	m
- '9=I%1G333335]/9)F8%+	
-FI
C[O_s
-'-'$_503-EG]d.g5*+-!#cd	rD-O͐͐͐8i8X=XX==R"+
4E7 5!;-S#@I		.O
			3y!

c5
5
-Q(&.0
,+m	
+
#	'B	0
m+mItC	b	-k{	YW_ ?C*gt		0)U5+#$'!o2?WK
Z'0D
/
-
=-*10c'''''ƅƅ
	%d͐sEK###		37E4	_q
-3/'	6
-3('*-('1*7(
N'J%	&7#I?oY;CH'	+0)K59]&WBKg%
-<-A	$'$I
-,
-93L	)H&#g6$*.{C*	8,'G8/
-/^5/@
-&4333335)#xY
-=75m
1	%Z)&o	OC^m%b3
-q?CB@
^$2^!2^$3	m;		3g)19Z-0%pp19.'
/+#=
3I'/ID+		
2ӎDž	;	5		7					Q	


#		
(
-W'(
(I;K/"""()
Y)))))10s1' 	
-&))	
'
-'Y
%Wf	3	0
''3
9"_E3A))7)'
.C?=3I
'.Ik{͐*
-333333%4HS'#<)ylY;E;i=k	=c
-K[
-?
 J#	_a
-2(	g-@	%
)	=
$*Y)98*-
)	=
$#DžOEz.T);%	

 
-
-%q}
"C(];0
' ;E&W?C!O=&)ag;&].w
-0
#		!774#CY.&e
a%)#<M]

g[+ A	^
73			 	cKBe=)G+Q|'5e!k;_k75I111113'uW'O
;
Z	I-[g5y)[_A5Eg)
	`
	]OEe_O1	;3I{+i#				
	
	
	3
G{kIW3
	 Q=	w_??o5g]*
	
	
	
Og	Y'!-S7[A	A_#5r	bWC:+)?Qto414gG&?Tc/%/c1%1i3%3!F&c.&c&c.&c.&/&/$
2&zzh

-
-
3				]%	7		
-;
%!	I{
	
	
	
_
c[	
3)LCwC6
>ƅDžt?p,,++,,,,,,,*.͐?C#+)177
! 
IW
Is	
Y.;7
-
-1





%
0	,'J9	q"	[!------#
-=-	ITϋ	DžDž/4I!	=y



k	
$		1'!"i g6,,' $$$c{5K[ogSI333335oA'[S5[]}K1[ses
-c		

7p

-=O>DDE39++
-!x$^!3)=!/?>=>4?ϓDž1E=9	W;5-K#c5;!	q1g9-777}/)-1=
-M799'ea15Q
;%![#a
;?/9#'#/AQ-/
7E
K'		Y5
=?Os3u0S=#%KM/#'7O'%C{
Ua15!K3/3#7	;!9Me1	q	e#Y	[a=


	
'K-	sK		gY-%	#QM!G1		ss=!	A#m
e)	C9#;pEe}n8E%W98O|C7YH*15i6MO*HD7rs:=ـӄ4
-3
-$P&',&=!~$qT:bn')/	
-OQEO	
;M=I			1!7$@I'1c	a&I%)7o		'5
-QYI111113).-?AY-wtC9
	
E7





%
	s	sa?{m+A-)

Q#/11'
5	
1#
U	9kO;@=s$-1
	/	1{#
+E10.;%M1Eq l%:	"/Ac
aY8?		
	#7'3!

#oO7+:)QO
%klDž!Y
#";Q!?		!!.	CW
#
k],G9
-)5.	<9	7./..h.....{	
-
-}R	 (%!/*]
%]

 1'-.3IR,9Y,I
	1++Y
*--7
-8CR

/"\		
-<###O-
A"G'!Q99
	
#%Y/UK	1%
+e/^I!	;	;8/%!#	1U/
#D?C=
-5TK#
lc
U)fgI#!;|
)mC7!~Ui#	g*#9R	/c-5C?>
-o_
-;/4L	s
w	%bie{#
-
--+5-/*%kk%UQf
9?

CR
+3=%!##9
GW

0X?,_!%N'
U
=?"|$	m)_-	[	**a	Ej222222>[II]"+;'uZY	I5],m-eO'aU

 !+'wp=o1////CQ
mzj}%	`s[>
-	]a;y'	e^	a		I	

a1H#79#	-3'-		))!B=H(.!).K;+J$ 411zD
-+ 
&	)9[/+1+8!*w	%$%mCE"[98!
['C!];&N771$2!m#*%t?y/	o1o1IW
-/G		
-

1###2l8_i=?C79se5K57E	 "=-+7E
)	7t
	%;
Q!=
	
i	)
-ӝ!!
S/8		՝!,Uۚ*00%

+=I!^	UQ/i'[A=-
-uU#3ghC~	}
-I	c;#&"&	6
-;)T
S	NOL0)M
͐mo)$T$$G


	#
(((((*(!!a'])S9=?)z	/!%#	#!'!3$3
-e>]y4H l!*!IADž!	S% !
)!YC*$}n	Ɂ['WaE 

{*			
81#&	&	#00/900000~17	6=0r
-	'DD9D-P9yx:1333335
-# ?!O|1-gu	m+m	MRMO{S
G
- 0}C]*w
-		
-+
-
-= m,	%-&	
T#=
-EbtQ=.4	
*glz; #$)}
-	%C#!+/Eqqm**eU
-	#>+ g	&;K
O	&$=!:	7DžRIY#n7&@
&Gn	.!͐C		7#	9		?)
'*+7;M!w;
!!i	%/
-9|o

-	A
-4AS=OL;
-l8	D=D[1W?MA

-		
C
-
U
I`$#07{;3-g
17w3#U)m
I#7a)Y
!3O	-M7''9A		5
-=		%*%$yST	.'					A,: g #
.r%,:/%W)FK
C#
-UC,
G
--RŇ=CAIqƅW77AI[	;"'W,XJ7:5:?E@33M$1?C
2222
		
x,	8_

	
E-	(Y		5)yCMy'[M''3ۉ2I2
+qEOE'iB'mA239	G]*3"9%%[/+	1K		
-?	0?ICYwO*
#9w#YI/CG/_@5DE]!3

;




98()D07+	
	1!	{
	
	
	
	
	

$gu	eK
O;y/+ %yA+;7!''{{hO+-73:0dZ\;
-		/G	333333#NO
"i?C
	
-5H		
-,?Vk*+	'	!			
%		
			A			{_
	
/	2Y?-eD!xA	#=a


-K
9Q

{	#_!		=#A}o+
--
5T5
'Z
-_0
AA
M
?{'7<;gX Mi"&
-<k"%\YY*!'I!+
!+8 
-%+33341$,	*	EE!^B77i]{q)?C	3}=
-9OH
-	3(	+DžO$,!&].w
-Q2	2UG998o	ƅƅDžXE/
'),	2
=]FC	Qm
OQW
/
U
i
-
M9!!!!!#	!
M	e
-	u0
					
		

		

		a
U
-	!<ۃOum7mMu +Qe
-I1     "I])
-t1					

	
		
		YQ	:7
-
-





#C
3
9
0=!	Z)+g3CG	5s	mS	G+	-%yMW%CBmH&ƅ
-^3̐̐g/̐^Dž!3!e?$--H$p0$
-
-eu&v)#V@*""":
j
-'
-
-
-4|m;-u	
{%=-1		 	"
-!/%"+*!#						
^



t%$-
-$'2;	q
K1)w]	3.o	",sƅƅm[(]sKs9
-*G
-l	13!KO
)1	]-
-|
tuRO|	-	
]	
[AS!u	;q	!&+'iz	S
$!%[!/l&}m"$
!2L#- 
-}111U\\/
-
-
-
-
-
-
-	






#"L"877777777~
-q*
-

3*	e3m333333)#+'9 
-'
-
-
M
'.
-6'/
-9=IEY
-=k!!!
-=								
=
M
;!(['-%	%CW3k!
	oi+4000000)
?#

1=33_3 QS]1?g19-	/5	4"""""")BuAUA%+E=mMcoO	
5E	A
A!KWw
	%e
mH
 
 
 
 
 

o5##
C
)Cm+-qU)Cg!q'SCw






			+PC	}W%==
],''=>dfO		+Y+	Y
-n!!)*	'	1	9+(%	
-r"'+!(CDs
-%C++
- 44	45	55	55	56	66	6#6		
i333335,{-9s&c/+,H	}
v						F?<?C.Jj1.9?C]]nowՈ	,H00c11.g:11+B=EcQ

+m3+1ozz+H0 	_
'L/&ט!~~~77777*!"U~W0	
D
-:^.]]7%]2F?'8_);)%?A"'
-
-,>B	B
-"+5			4/gU
/%'$					
+$,>BN"	%5

-
-6%
&-
99	>C'98988)	337(/9Q9N8	8RCF*9GDž	&"+\Wa'5
-
]U###/9g	_';	9&!1	:C9w'X:k /S=C,OFX+m,#5
rU$	Js

	A	E$%m	[A7m+$#0	2T$TI9y[	
-	+
-eM
-"0
'y9)eXd-S+'
;!
!		!
+%|x
-%
	I$K;/IIIK6	HR*\WI:?#M
-
-1





%
0	3JK|	oH8!
eC
-G
=
-g
-=RdSu)Qk?p
-H_i'	% wJ=(-$<i
5!%d!-	+cw "Pc$jU98
%	
	-

m<<rRY32&>!
-		+;h;;i;;;;;;;;;;W;<	;=;=;yI
#O#m3F?Z#
{Ca
'9H
-'A	/5%/A&
.
"n;yum=? 9?5)5+:'L=0$C}
V͐[i!y;+6UM


	B	#^###mJau#OYI111113!	
	#
Y-[	9
]		#{W7E



		

%
UY+3(aK_-Om5A?GF%!<=A]G
-	'P
-
-='3!C?=
			1!][	' <
*Pd
-H7!HZk=\
(\	
-
-
-
-VP
98vdc" ;au
-YI111113Y-w9
}1





%
sa
W
-!=!>?*	/	5m
				25$?o???	7k8WW\0s#Cc+#(?+		++;1UL%m
)!g%	.Qe
BL#

!<s;LJKKLJ#

1J#

1L0%
G	]s|
-%eg1*mnoL0\x)	;	1		7					M	
	
		>
-	#	





~
-c
O#ƅ
-3$@@@A08I#~	͐	(1%.ϖ	#WWY,q
-% $F2xx!A%

]	#N2s^^^^V	,	%#w4 ''9C=_:'55w'U	C)	$$9/I
-9q
+-q8Dž	vEm"U&M5

	
-
-
-9
-
-A'Ae
		4Ac 4"AW(+-?CO#
@BB':	%	-3**#$1+-T	'
	#


mg	K	%	
-!
-C%Y'-BUuQ-#5'	u	#8)Fi't#5%+>		'Q)k+A0A?%!fgI<юY
-Y5z7S
-1g	A+)7)O-5uG;tf19Y#'a
#	
-nm/TOFg-
-Y7=OH_
-K,A 
{]{-=H|j,D$$[fOA	,};
 )	, %"1! 
!#l])2	9^	MCc)"-J	*$a 
- 		-		G!>XBB-)?DBH)

-EDSDSDSCSDSDSC			c?
*{_
-1





%
/m	)#9###4$
-%#=%tj/EFE<EFFE<E='$
(%
#(5FFq<#GNG^71,,	-DB1	E
	
%1="7(1)CJW&q3M!k/
-'#-kk?]GT	/O
{'%$	
-7O!WC1oKo5/u
;=_=y;,kWYS)qAQ9-C15U]/	!

Q1	k1AEc9I		
V%3?!
Y5CMAE<+!A
;
CS		
;4>!Wd(8	Y	l;222222?u#"u7c!.9
3I		%%%		H!	!&-'df5#B!.Y
-[7z]!z

-s	
k






E)+7)M
-5G;pI	-;Y
#
-O';
%w'#ۖ#J%OF?	M[7=O7iφ-3.!_	$O-Uk%9%C'1G#'Rzzz/
-zzz#

l####		3	d'	2K!k.
M#
-
A	 		O[	

#e	Q3
-?Cy	
-W?JGS31
!&^ ,D$)Dž
-/	X
$U7XC##1@UCC_###m]9#	-?Q#
5"
??
?/"
-?,C 
-2CA
O|
-x$$-7GGG	
-3
-

=%_	
9
#C
A
L$HHHH$$HH3_'DL7 	
*AF$&~$
G	
AD

8>>$T'%Y\=i	:_Q?8
-o%_II
-YwO&)I?zB{zp"6]50o7	q/!
-###333335=
-s)#		n%c!+ƅ\CCD/_.37)*_55+*_75-0^0|/.T91/*_;/1*_=/3?-5
A+7C)9	%21qWJ~9
				F






3)9#()BBE3	 
-"R
-;











K								*|<+j0	,
&yM
8
-"(3_,*
-333333Wk+7
%!22_!x87	f"@U###Y$,
#?(Y
-y+k
Uxq	5
7G$=
-E1?
-
-}kWYuGOag#IW
'		V
/./5N4&YI%5DžKVp#<gQ!	(9
X=	JVbBX	T<
-	E!4DlGY:!BDM
-,#WL:}
-8	
-.4j{111111'i9^:GG+4G+e#=L<#{"-y		3/W,4TA,*$.L :@!Zx4lUk24#%'b&z9:7CJ%U@;js
-0
PiMC+-m1ZO1DB:3l#H01!FT)_&()+P*:Dž>!*	7	7+#
-	!?
3s
-!+Qk=)	qTSDžu)	C		(V=-c
L
#

-		5		*CMaZE'Oa1J=2&	c

	
'l?	09"#+o57	Cn
-%;wA43.
-@
		}5i_
O!J&
-$#$?4$	I%
	

	/
-'d)
-
J;3
%: t&	')9]X!!E	a%
--}'e	9!%
-[?V		!'

-]2ooo}}ooIcb
		+
|
-pE}%Q3	''"0]Y			=
	
	
	
" J&	sE	EY5U'
-}0! 4]	l<-r!mU#m	)|1zS	q





%
i	u7Eo
		

! ?$W
:&#,
	#]h
(
-
-o





#C
3
9
	!-
S
g

-K
5
K
c+
u3


#/			_S

]L",-4333335
\t=&&%-e)M.k]S/AEB_=)`k	}Pq%E5AI
YZ	#sUk=,	1'gN5		

-
-b
=
1
sSN-]5[Q#E	
xa;Uz	.-RM?	AO53#	'J	5	 			5g
-	K	K	
--PW 0#'
-A+B9-
['(_;*kdA)
c

3Y[	?

9%5	k]Q;7q[1m'mK
~#1U_q!	]

!qWVw_	[
+C7
'
'
'
'

)Kv)
A	3-)`%!C)S);1uI'>#
A;5_9!	####%#/%+
+M?7Qg	O)
						=O-
Q19)	7Ob	-/W]'1
	iU):@8$
-0

-)RYo
-'
-	1 V'%MaE2!!!!!#		E	K	?%		
	7											
E	MS1:30*-A
-Z"UbC
9#6/#='	(*(Q(	
-/;?Q%%
35"*<@> Wu!!!&		
-	!F	?/-&=			
A(}@v
	=	 	
+b>@
@5
-
-,>BB
-"+*	 		
4 bA	
-

=(
-	
-
-
-
-
-
-
-
-
-
-F #!$! " !/"=  O
-rD
#8=!]
-C
-1





%
/
-+8		
(	$1cs
-(jn
-"7!$	1+AEQq%Gp		
*	

" 5
-!3!cK!5	
-					
		

		

	3/.U!_2!Z'ze	=
??
T<
-
-q (=O C(,
-
-I)%	(-
+73%+Hf
"9G-)'A	u3
I9	G!
-


y$yEC/kA9#
-#;
m?
8"i
"i

*O
#'
-
+
-%(;@[%q7#1		H==7KKKKKKKKK	())49	C-
4YJCeY_	5s	[/m	)G5W	%M*+W	#u+ie
-9!'_XZW[q\	?}]	oOIRG		JOL3
-
'|c:CCU7$sq7#1'4H%(U7%(U7K
-!999#A/P	m=Uu#Y5_Oi
-#?=5xQ
-jYY
-%M"'%kk:K"CF;KKKKKKKKKKKC.7#CKKKq7#1q7#1KKK?/C=G-=G%(U7%(U7=Gq7#1KKKK%Wa'A+KKKK7%KKK
-'373;Q
*k	1
)
1#	1
)
1#		
-5)&
	

-ke]$ #Q	2Cg'h*	Eƅ	YA!
-}'!
=Dž]pBm%&
-=
-?2A)
-E/
-7my###-(u%
Kw
IKCOCkU
]'S'y+O/>#y~-=4>#3?Q
-IE}~\	
3			p#cci%	%)Ex]V		3`%		G
0'M
-9
LUDz#
	J	gCA/	Uy		#	#o1	G5	y|		3%i!Y[W[\M'}1	YSAzqO19)k
-[
	







G)
{z
-o;k)=V	?%$tC=+{###+
-k?-1O#9#Z+.J}m	;auY	Y1w9 saw Z{
-	y +*$77G	W
*-:Q$	:?C!
-
$	
-A+q
-1
-['"4)=	0A1^!2111Y381(38	&C\+H C*93+;.
-
7!


	q;*!TTTT7)H\7)7	)ST_;	U
-

 1!UU	
-hCw	E	(E~UU4p 7d'.U7TDWU9K3kA>(1
-	
9[	.O+R	g7KJ)|-W1_
cc+	%T
-5ba'MYG	S''#"
)}MF;MF;HMMM1;6&6&V8 {%CG
-0&	7cy1
?=y5	?.H(ƅDžDžDžDž!
$3Dž=	
-1=&	 
yMU,333335B1	D
)$a
V?;g	'	=

?	


8
8}VVVVVVVVV5 ?	>??W,t?Yi
-#7=Mh
-;Q'oC!u+"")s%
-
-uUBG0E
-				M5rG
7$S?CW==
-IV?EUM^!2
-#V.UWWWWWWWWW~&	!!'WHB
-H "'L9H@W
XXX	Im%!SQE7
)8	S	E!	3	S	E!	3
]
c!"C
-
-
-9,!Y	C0)
		#]]w#


-k
	8	-oq
%U;r
-gU%]"'	
-=
-

"%/C=G,..*(
		5
#>)	
-$#7F7N 
-'
/:
F<9!	#'"/
	3;		#A;!AH	)5
	<"B'3<
a
3%$!qs+-!#ك53	Oۚ%f'g
+
-#	
	w?U'	?
3/%
		
A'
?	k/5KR"e"3[W
9

o-		
-)(/D']
;

o-
-	
S%(/D-HUH 4j1
-e)
-	a3
-		*;;;9/3K+m%
e5Bm+e),,q$-	?#Dž	#};	=Z	[F
	[%>\[8%)s
-&
-*q	Eyj[
!S	1+7;M!		;gMgaw=aa	y-5'&
M
9
	'g
?-Q	0K
-%l/=
7/5J	tSu222222)3=	"?YsT%S

5}
- %uU&*$#}'W+I')&A&.I*'+'
-Ifه
!5+I	
-
-
-`	
m!	Q##C
Y#Z		)
#"
00Y
-]"+	
ۇ
7+9+;+o3o3?
-];)/
V\W\\\YC&"Dž*-!CO3'0'U%'E"1
&r&
&		'
w
Q
%

$9C
-
-1





%
	0	yJ
#	
	

-
2F3
-H%
nnnnn
-
E7!

(.T
77%%(0-n
-	;.\0;]077-%oD$77)0-;7)8
-!&*<-CKA.].
-Z 0.
-'2.g]+<H]$%#

-1YPQ'95
)	S;k	=;
Qq,Q

c)IŇ=Džy/+
+/

%#	1

9'k\ #?JC
.j=T)#%l?7/G	222222>u#"'cSZ	}s9o,|x!!$"	)
-K
CO		-#	;;
0>		1[]	-	
		G	
		
!	)	
3%	7%@	 5
^		w
Um%
_
		U1


	13?
		.	3	
	
=
1+	d		
-	:?%+

		
?y'	;=		?U	
!	;	I?O
1	1
5!	1!=


+-'	5s	Y#)	g	"		9%		#[/3!
		x		/	'	7!			%	)3
/+1		?		-%3!	F	5
			'		
/6		
	=		4	

	
-!	
G$#		F
3d			`@p0IqH@Q"2.)$2ZAW4r)S3]I3-$*A#0J_~N58tG!$*!1)T1(=z7"#,? ,+[?,/G-#i=""6^RFY52?7;qe+BU6K$)OB/;y->-BC
-

-

-
-4333335)#C1"zW$!-+5+390g	\UC_				O!'A81
#G

/U5'9qw	#=Omg3F=?
	
-	9CA	l{Oc3)c=	;%Y%S
5|K

-:
^^UUK=`	
-c2'9$$'\U!]9O*%q--	)),W^^+0/W^^^^^X)K59CYDž?C](m}0@ddjdddd<<Dž]_^#u_
-,_,_____'O
_K	E
			
#

8Ma~%7Y	@7G<0?,
OF]"{f
-<!!+)!	$N#"B	&'L	%	
-
[O9C*C	q	E
-!DžӎrA/?Ye-v
'0Y7DžB,_E#%5!;!__Q'__	G+	?		C__`````	``	`a	aa	aa	aa	aa	bbbbbc_###Y]	G	BB2_"""
-

-
ccc
?79)		dYC+
-7)*T1I(o͐m
-		!A??g
!&AhDžOW]	
-(1





%
#Rƅ
)bl*$
-7"ݍ&c.m+
-&c.m+
-;
)m+%
-
)I$$$
)III

(
-b1/	-Tl*$olR'7
U19	
-o2:<K
 5	!	"ϓg!QM7I"	/
.~]C!- YI
-e3333331



#!	
	
%	

	bY[(	*333335)0$7UP%C]>						A?C=!	_	BC!']+dd?=$'
-		


-	$

+m		
-eG	3&3y/
-!Ci}
-aCa!}A1M





%
+yi
CEy 
-H&iC43333350"I}}QFH.	I		
	'O+oQ`
	-	k%{mE#w
-
)V
-$&3		?k



 !$9H#+
m8\qMI$5{I&==m>/A1

K333333))r
-)	]3333359Qy	
;EGu

7
-
-
-1





%
0	S
-;Gau!9YI111113Y-w
-9
7





%
sag#Y?,			w
:!A9###sc
-
+1K5#/
-_	Yq	?*[
-CS	3C	s;KD5E
'8R!/?C	9$$9F	;	%?o-5$
-6
-9%QC1akkK1U__gCK33333	!
!!1-)!C1S)K	}csI'C#
	Y5;!!###3'/-/M'uQgO)IC7y!-)
	' 	
	
+%
-y'{w	
'	
-5



3

?+}
#
	
m];q}5M+
-G	C]A	E)!=I!+_
!+??]3[	#'	ygQB"E4O-K
kMEGA	 
-%		s
-	TK/*	]'
-
->	*!03*@
	-!,0m 9ipe
-|		7	m	J;1
#&	}t$	G3'_?)!-aY	JW f1$$	gJ++$M]+#	&0qŇ='%O,&9a#'j ?1!0C+-/!Y]&C(-qmm3r%$-e'e1!	
-O7	]3yq	CU)ECU5%C|51i





%
#A[]
_M%"U6$,1>1&q&!+
-&	
-
_y
		'
-!KpAZ	p}C333333#b%w{#7as+C[M2+>m	
9	;
333335
-
#k]0]!	q
-Mqe9MM9

Mu7##/
S#M+I
'	1		?]]
!#Y	/#)c+
7/=

?W	m1%	++]	
%''''')#		!
37/)73
-)
/+M	A	'%q!Ie


	)#!)#
	#c!'+3S
	7E]+		);!!
%
%	%7!d
Au9wK
U+)c')+; 	)k
w

-
){E		O	5y/
a
)=GI''#WG)E#	K)y+'S	QQ
M-y
+E#?K/!)<t}=:Fj\B|Hig1An;yTW{C}a}3OTLOl,Zq;4333333)#MA&7&#	V<Y/
		
/?	s=P[UkAp
-H%eKi'
-'j
wJ\+CE0K;F			

-'iai]		@n2
( (j9&͐GU	%e1;)N	)E

U	4,)a
	G+Ac'C7

#
ggLY>-g5Q43 %
X
	=s
-
-
&	A@
'^".Aq	S*#".9hhh..97=E.E*1C
9/#C%S
5"2.
KY)1DžU	gU	U	U	
	3'-)5Wa+/q*'%A.Y7"$YpT		)	
	9O)
]	,7}yEc'}	mW1
+!3	
-.((Ez((=G
-1





%

	/zUa5l/{6Y###iuC"222222?y=I?5
-1q



"


s[K/%}			

-0)*'0"-j'dƅ-###BD	Y1/a+
33
-

-/1"'uE4i+eQU4"&"&L		a		&'S#			%		3"$IY!C7]!
-2|0sx4
cej-iKl__
-f/
-
-)#
&	(#IL ).
qi&}|01kN)1NHHN]m71)Nm	m
-!;!0%		
/A57q
-	H#
-2	=

	_
-nNNn))&_,c>E&7				'-	
MmM7
-oonn7ˇNI
7݇P	'#8op,C?DCNoMOoOo?C߇*UE[.0333333)#*UUY=
1	
-
-1H';=I
%
-9{#Y
-5Vm/O}K@go/m9#SQu5S/Q,?%%?QkC

-ADDH

@#cm+	
-
CC,+gI	3#YuwO*A
-V	
#JV@

-I		%F	'			YK	dM	wc
-O
-''pp;&])l	*5J#_E
-M		')				,eQ*$?
-9?C?
-9
I0"3'Yw}OAI9FP	
I-		'	A'WW\
-
-





#C
3
9
0=9;=/{%w	*q'O*'+p
o	qqqqWW"
==9N1!9,'W+#5
-'
-"
-
-
-#/	,+-!$ߝmFm	)=mmmmm.///

oq	4
-6'J3U	
-j	+	LC#%5!	K						
!?y''	'!#?
9WB1'k5iI	
]5		L	O	n
5+R=t'C2CTo+w
-5X#H[W	]1; $J22W+/*
-
-?C
r'111T		a
$c_$Xxx$$+s!L1.111[/,[[H$$(?Vn9[o[1]ss1Oc--/1#9'K!#
#
=7E-###'Q;G+OE;1{a{/esi9ak/'
Q	Ae9Y!-=I3=+})C-'{/#
51?MYE7yIkM-GO[!3=YG{5+5O	'UU?ywggC+%e;=C1OcQ9=5-C=	!%:owKhUmE4uME3mxEGl6<<%Di?~7_?C1E.-$L&
-V.@_
=>f!>-|i5u		
 ! 
 3333338=	#

9	_,11]qG2
-
1a
222222}"#0-	"A7
-	|

-		+=$

-$t't'j
-	4/*-)\<BIB;gq)IE7***,O9
-I+7I:?C0%'
-
-/8Džu	cQ
e
	
o_('	K]	CE#e
-
33Q))111111{]+E)o1WQ!c	{SL?vY6qQ3!-rEC	,OK!!
7!3u	3'u!
q)?3
3P!R3dF!)#/
9
3		
+!K@!&\!5=E%	USMU
;?zO
o%zws			15)


##/)/3	=53>]		
+9!!,'
		MS=i~O	S
'dW'CE
-''
'%+
-0'w#w#!	RxR+\ggOA)8kQA'!	373%@Dž	*333335)0\~͐IN5&	$	/
-	Q
#	+@	
-\			p"(9I
qq+B#)=mJEng
73%Ck
-;Y9T$k5k#wO&%=Z

-	1
-





%
Y/ky
-g E=
l
|
!1A/!]|}q;7k!
f=zI/
#"	
-$K	
-}J}%.}I]3
-
	:
	
GO	o;7!'C
-
XvIiSMxX
I!V
-'<wwwwg[A-?5	
F]1
/׆OO)O~;eSw#EX-O(Y		'+'?e|e.!	k{-@a
	"L/9,͐t
I%;gkU1k	:'%|
-aW[}X3%;

-!$oW	2<\C=T
x?<x~	A-
?Q	Y5	Hyˁ#7B?O?S%
-%uts!G;ǃɃ;E+%	
-		%?/	;
	
	{9
-	
q
--$$8!xxxxxx		#
0KQ5
	&1		)%
- f$
-
f	u
-)Kl/-%/
- 
- 	&T  /%5 !.'.T.
MH!
-#*_/-?CO#{5C9		c];R	#%	
!%{*#''%(ek+75M!-%	/		
U	%		K
{A=S		UW	-l?WW
S*	222222#
##
`='G1Cq
3


k[
	'	7
"P1/
%	loWa)_7		+=+}7%5#k15;y[drI#	#!-		y1
![i'caaQR,=Y1)G				K;E	/!e
9c	

g%	u3k	/%K
S%
eW		53mmM/5;y%	Eo>b333333#Ag
%/;9W"';')'W<;?W!W#
	3
'x)4w	]x
-]0
-$S#7?*')R)--YY/U
-iU
-UUU
-e%-VKy3x.S#fyyyyyyM
-!

)	= 5z1=)+4+41=)nn+)1HDžzzzzzCC=U4	,
P	+/W	1	[		G+GSx	##	*w	')
'c*$$$-H+(%	!c
-	QC=\4+	"
-	"
V	6A
-
-
-Vu.
-	iSm	d		
-
-
-3		/*	?m)(	
%

	>	?6
-%1-	
-
-!=

	%,) %+;''8! !'
0#_D()!1"WHI}o?
	+
-T}}]
75=7a]	A1	i9YQ
-	#
;{	
-
;
-
!]c"
C)IIY~Ae@
-
-1





%
;,tT
-6*###j1S9=q#[5	Cq[1a=	kK1U_	!%e_+baeCC333335)	
W1-MO)!C)7)G	csI'+oU
{={579!!###3'/-/M'uQg1)
?C

++)5	45E!\Q-E?$2
-2E)??'	&>
-/o{!(	(q,1			7o		
			?
-S!*
-mp=
--)9
-|?>R1
#	)*$:t-Fc?c?c?-Fc?tF|ttt9+c
-
-1





%
0	iI4{IS%7	+;;3
-@)5	39
T		
&66)V
'#\	9)	?^eV-73

-/?3
-O	!-+53(!/=W/E'I!}

+	C&$%Y3tI!&HmM7#1$9(I$-E+11MH&))4333333?)#+q%1	
s3?	:/U	i	1M9!!!!!#Ma9-							
							
G
%]U=	W
9	B	#DžDž̐Dž#%51	IQ809A!<
-E
 	}YtA
-9	:.-222224
#!=-^2r;+,<g6%oom-P-P-q+!"~
-~~7FJ
6N~#k=/'/HH333333#"0Y*a)a)6<#56<#~+4###%5!;!HB	3J%Q	g"!"*e	3'q		

	)
-KU"
H{8a	M8$###Q[	fF<;Y?[<


5rV1	)%=1/?	^ 8I<	bP 1	2W
-2b0E?	I5E 
%? 	G/O)
-a9},^!AD#A#		
@!
+!YEN	'				s1B"ŀp39C	B5Ӄ37ـIՒ
NQ),-!
'	D%
	)

	rUMw

@Z94?#MU}}-	B}}	BE+				&	y 
-&"+ 
-6%+a%%J..4
-K 		ye/E+
-kW#
-1Y/S!	
$$$	m	h	8'	y(Dž](\DžDžh	=&TtCEY,H]4L
׌
-	HIE	!	!	QG))
	A
(=5
.GD2r.P	<-
)!	FE
-EU-359
z	
Z!	
	+! 
-/W)+#f$@	=
)	=

)	=
:
)	=
*;=
)	=

)	=
-1(L
-ć'/ooooo]
-BC	
-	
-	
-	
-D!)͈:)XY]2V	-
:)QOwX=DžDžDž)-	_

-#%#wN#"#1 H]==p	#*PŚ0E/KkMIq	2
"ICl/?C*BIHDžDž}}
-'nq'
-p-"8"5ƅq'/)qq
3)"4=]-#	3$YQ
-%S
5$G8d		
8<m
*D7q	#		
-

9	'+#	$299ߖ%99';oKӎ)
d:ODž=	/=+1/	
-1[%C-	4uWA		!')	!'v	?REy!8Q

-1=(	
m[		45A=5
-/3
-)=8	Eˋ	\g!:3}sJ	!	q		
	E_,#I_,
-F"_J,lyG
-CM"6$A	@-[m		_-2FŇ=		1	?g
-}XQ-ikCyH';	s

wd
e
CK);Y[@gooƅ	1r7˞H5		
5#og/NE&;T"i7%7i9%9i;%;}/	5
-=1F)IF$
	
#E$$+$$$$+$;%8&)m3%	!
!0Oa>
/AGG
-ˎ3I159Kg&g%%##9%
;			[	e		
-
	
	
	
)	:C(-53GCm	C
-)8#	-E]5.UGI@I@L@)i-E)qK?%!G* -$&&IU]m.?	%+?a3	'J+GJ+5G		{	SU	T7RH/n͐͐͐͐{͐͐͐̐̐rW	̐5
A?I		
s,+";			#:qGђܑ|"qWn
'#				I,/:	?	
,2	
	;-Ոq;1_
	
	=y
g1EGu1H	"*9R^EyisGYm1
k	%mC###O)S;+Wc_gb3/
;
-

#

9AQ=%9m+A+Ees9+	!
KSa	9;
(*~%-WO5Y
}#)e)3K(8a2!+	
-Dž:S2UϏUϏUUU//o{!q!?9Ic
Q	/Aq
Y[;rR#
#!%#zF'####%!k+;ARC7o]U6?###%		;1aG5I1OO[YAq%0{I	Q	:	q!)S9S53g+Q;CAdG59+%;{)ME?-
-o;!
aQ$* 	
-y7%%#%	q$q&M{f%Q?DžWW
-!
-

-
%$&0z4?	
!}:#L:a
E	;O=)X	%_V%=9C
-G333335_)'''
-'K333333'tIC%
-*;n

%
'47%_K).:_'
%$	/
1
-.z
-
-1





%
0	E
-HYDž!#I 	]\O	&$_a	;	=I/g8	/
-soM		#c	#e	X	!,ƅ	WY[)
-5ƅƅCS###;{0ƅH(]5EW
-ks[@		!1)1E+ϖ%V.J/B
	,!1Lqqq0%*WW	[))
85#3;0F'

	=7(XJ30-1}):5;Q(e?5WoeueCD!{ZI%yo$oqson$/G[S_!X/Kt
g-1G	
3s!`
;$d>	"+.5eK?])5?}+eli1	#
-?"J				
YGmM]AWgsaA)))))+#r+_)9hA|)"?W?
;-
%j
)vC
)?1C
a	u+#)S>"
_++5az)
CQ@? P  5}=
-D
-
=2]'	#3	B	5			Y	}%
=			?		#C9Q%?=k

#/;~	E!U<)?'	#'	]	+
Z-a	5
-
|*Tgј5Ә5J&
՘5#+/-7
"1
-	
-}3F}7A'>Em	[sIEC-Y7
-C
9'MIURzs=maBM-_
-!H		]
-GN9;	/+;
--5		
-
-k
11]?I	i	*Tg.;78A$]I	%O,!
6		7"	0	
-			*	QA-
	%#
\/	!
-!!5

-
-#I				]U
						E[/I@
	

	13!A																		'9	!		'+

 
		/-
	'

					


% ;
+
Ay
				=
;![
-	!/'!!-Y'	/Ic	#"											)
		
	
	/	7.#
-'	`
-%c"
	$
	

#$			
#	
	/	
-=		;#$#	
)w
)1
-		
	?		,!
-)!	;	
-	
-1
3
#6'


-
47
 
-+	+
-$		
^1aB19e<6-        8#$\K8'77@J[#*(o:;5,U>8!")'B?"$;!>78[#0I"822K 9v    * 8Ws>($+,|0*'(4=-/) #H/!ZA    *,B$*DE- 6X7+**,m8;Q*(h6:8A`719KT$&*W+Xj'2 51ššw%K4i=	oo;#CG.u.G33!	-;#uap4?or%?|/5J!'	!*>3		A%Ia+'A9.$$<E	E	)~o3SBK8
		
		%#w,p!-Y3<gK'%e	!	=%E
)u	)
	Y	@
	;9
7%o
		-i%;W-o/-		ם#Z;		+
_4333335)7[C'.?9.#K%=#.!E
9	EY59iQM"%WU5U/
		
-#7o31IDž;q!?9	'zy)!15iAw1A)!Q')h%7
-
	&+%h5%
k7y!n+0
5A]?@
+C՗	Džo3o3K
-
	"!&1
-=YO
"y)63;=o'3
	1++!5uK+
^\!G=R=	'	v
-$=	.j	)
yE	A"o
-
-1





%
0	$_
	

	0	K
-M!k'	;!#*..z!I
-Y
-#wO;J*	H 		*:O=
-C%#m77
#'q


/+
	/5	

	W-	%f		;8$-+	%(;3
-GSQ4'
5#}=; -
O
*)"e	5U?/'9![M	h	6a~gY7#kIS3
%%13	%%	
#/5%	?/eM%ei=
-
-
-
-'UA	-	7'
!##/GW5^1W[JI/	!EG
-:
e/Q$<t;SCK?[V#%x!n-
%	/S
g
K
7!K
c	G
-+
u3


			-s_S
%		[>:	
-d",-c!l?'S70ey
-k_?	Q)W	7w7#7{!/-'3		]/#)%7WW/##-++o{=?U
G#	!	95_Q
/+Ui)!cI[!
1qEy		Kg;-CUq_?{)GQ]		-77Q?+E;!g)%G$Q'	'
9A
?1

m	7	MyK'C#7)WS)';?S7G+		S
	'#	q!#s=/	-%#VC/EK.u=%K_U#	{f
G5C/Q5)
	_MQ##c 
	C#5Am3y;6OA	t//#{OAC+9=38
-?3
+,EM1				#		!	gA9
-O		/;%	-o3?R-'%7m/Y!EYgO)K;7 1
-!
5j+_*	
f%55_%)a;
	)#+
<2k}wG"	%=xePv%*.9fT-Qp;	
U
-%/ +2	*[	eY_v	w$B
-;M0)
/!t.K7'%				[	M0
-	3!
'Ib	7a	
e\
]		6				!cq1?H'93
5+vh
	U'z
-
/A-5'7@>n
-$I&a.J$~+

-
-1%-	..ٛ}A?"HF*y/g#		+M	;		1			/-	O2C_j=
Hi+M%IC )-hm-|	SS77M=
U7;j$	5M###VsS=e	!'+M=)#]Y		
G͉)	?
-	juaM &r2q_=1	
	N!;r0#!
-=*Pv	%A("0a4'A
-?
'
'
'
'
'
)
)3
I
		M	O	
U
			*?()_
-)?
-
-A
### :##L#(O	93@Y9?2?CDžY,DžE0}n7c-		D


-(	%	
S%$c
	5%<	g
	S)i	
											[


					7		
#		
+
					77!		
-!4>:(3,+--C/%2-y#----/m-e+-!#qc9+-#	#U5
*-#
%^qc&
5
[+B


-
		
0	%

US%$#
	5%:	g

	U+i
	S											


				7	
	
#	
-					77!	
-4=;t"+
-I--C/%2-y---gI	5-	of]
-222222|
-"N"
,$/#2f!%<F
  
-
-
-H1Dž-e+-!#qcqc&5U		
			
	

				7'	/;					7

-Z1	-###%."3'/5:oG0P%;ʞ˞O1	˞J1	Oqc&qc&i		=C!A!
%)G'+#
C/K/')++=C_###)
9-E;//

;=EK?%	-+
%5S)		Q)}9/IK	5'U!)
1%
#;%!+#Y)}
5+7)+

M=#!Q%{[	
##-	-
73
+
K=135si)1
5%	
	
	
	







	


9#+c5=W]	UG5)+
5)3WC								;m		
!'{
5'+	/!'Q	

CASw=%)s)
U%+A]#G
'Q	#
/
[=}A					s'##@{}Yzlt
K	a	KC+S+}='1{ea79-;CC;U+a+o='	E5eQw+?
k	G35S-!			

	


			
							1			

		a
			#	
	
								C			
	-	
				
	)	m
#	%				
#%#!			
		+
#
!#		
* |1a			
-
-
-".#!?!#2 a3#E&''# !( +  #17%7}#7%=1A#'##
15M!!!337c1Q{S%1eIG9w5/'';#
e/9!)9a';?;A=5k?
E%;A)mE[1+AQ#q+1MY[o{'y9=')Gu!')Ys#c
C]Eo_5!'i#
=Ig#mKO?;g!8of_rh}@znXnnYKG;`rL=PeX@FWUSwJP&&&&&&&&&&&&&&''''''&'''''''''''''''''''444444444444999999999999999UUUUUUUUVVVVVVVVVVVVVVVVVVVVVWWWWWWgggggggggggghhhhghhhhhhhghiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijijijqqqqqqqq||||||||||||||||||ϏяӏՏ׏ُۏݏߏ///000YYYYYYY\\\\\\\\\\\\\\\\\\\44RRR							
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
















##########################''((((((((((((((((((((((((33333333333333333333333333==================>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOOOPPPPPPPPPPPPPPPPQQQQQQQQQQQQQQQQQQQQQQQQQQRRRrrrrrrrrrrrrrrrrrsssssssssssssssssssssssss{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ÚŚ#################$((((((((((()))))))333333333333333444>>>>>>>>>>>>>>>?>???@@@@@@@@@@@@@AAAAABBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRR^^^^^^_____________________________```````````````````````bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccdddddssssssssssssssssssssuuuuuuuuuuuuuvvvvvvvvvvvvvvvvv{{{{{{{{{{{|||||444444444444444444444444444444444555555555555555555555555555555555555555555555555555556666666666666666666666666666666666666666666666666666666777777```````````````````````````````aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbRRRRRRSSSSSSSSSSSSTTTTTTTTTTTɜ˜͜ϜќӜ՜לٜۜݜߜ**************+++++++++++++++==================AAAAAAAAAGGGGGGGGGGGGGGGRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTTTrsssssrr'''''''''xxxxxxxxxmnnnmmmmmmmmmmmmmmmnnnnnmnmnmnmnnmnnnnnnnnqqqqqqqqqqqqqqqqqqqqqrrrrrrrrrqrqrqrqrqrqrqrqrrrrrrqrrrrrrrrrrrrqrrqrqrqrqrDžɅ˅ͅυхӅՅׅمۅ݅߅ÆdžɆˆ͆ÜŜǜ*VVVVVV^^^vvvvvvvvvvvvvvvvvvvvvvvvvvvv}}}}}}}}}}}}}}}|||||||||||||||||||||||||||||||}}}}}}}}}}}}}}}}7777777777777777777~~~~~~~~~~~~~~~~~~~~~****~~~&&&&&&&&&&&&&&&&&&&&&&&&&&&&++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++++++++++++++++++++++1177@""""""000///232233333OOOTTTYZYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZ\\\\\ddddddddddddduuuuuɗ˗͗777777777777777777777777777777777778888888TTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\\\]]]]]]]]]]]]\\\\\\\\\\\\\\\\\\\]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]             !!!!!!!!  """////////////0000000000000;;;;;;;;;;;;IOJJJJIJIJIJJIIJJIJJJIJIJIJIJIJIJIJJIKIKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLILILILLLLLLLLLLLLLLILILILLILLILLLLILLLLLILIMIMIMIMIMIMIMIMIMIMIMIMIMJMJMJMJMJMJMJMJMJMJMJMJMJMJJMMJMJMJMJMJMJMJMJMJMJJMMJMJMJMMJMMMJMMMMMMMMJMJMJMJMJMJMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOJOOOOJOJOJOOJOUUVUVVVVVVVVVVVVVVUVVVVVVVWWWWWWWWWWZjkkkkjkjkjkjkjkjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklljllljljljljljljljljljljljljljljljljljljljljljljljljljljljjlljljljljljljljljljljjlljlllljllllllllllllllllmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmjmjmjmjmmmmmxxxxxxxxxxxxxxx}}}}}}}}}}}}}}}}}}}}}}}---------------------------------------------------------...........																		<<<<<<<<<<<<====OOOOOOOOOOOOOOOOOOOOOXXXXXXXXXXXYYYXXXXXXXXXXXXXXXXXXXXXXXXjjjjjjjjyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyɖ͖ϖіӖՖזٖۖݖߖÖŖǖÞŞǞɞÝŝǝɝ˝͝ϝѝӝ՝םٝ۝ݝߝ		!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"""!"))))))))))))*00000001111111111111119999999:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::=========@@@@@@???????????????????????????????????????????????????????????@@EFFFFEEEEEEEEEEEEEEEEEEEFFFFEFFFFFFFFFFFFFFFFFFFFFFFFGFFFFFFFFFFFFFFFFFFFFFFGFGFGGGGGFGFGFGFGFGGGGGGGGGGGGGGGFGFGFGIIIIIIIIIIIITTTTUUTTTTTTTTTTTTTTTTTTTVVVZ[[[ZZZZZZZZZZZZZZZZZZZZ[Z[[Z[[Z[[Z[[Z[[[[[[[[[[[[[[[Z[Z[]]]^]^]^^]^^____________fffnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnononopppooooooooooooooooooooooooopopoppppopopoppppppppppppppppopopopopoppppppppppppppppppppppppppppqqqqqpqpqqqqpqqvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwxwxwxwxwxxxxxxxxxxxxxwxwxwxwwxxxxxxxxxyyyyyxxxyyyyyyxyyyyy~~~~~~~~~~~~~~~~~~~~~~~~~~~~ÅŅ̀πрӀՀ׀ـۀ݀߀ˀÀŀǀɀÁŁǁɁˁ́ρсӁՁׁفہ݁߁ǂɂ˂͂ςтӂՂׂۂńDŽɄ˄̈́τфӄՄׄل߄ÃŃǃɃ˃̓σуӃՃ׃كۃ݃߃ŇчӇՇׇهۇ݇߇LJɇˇ͇χÉljɉˉ͉ωщӉՉ׉ىۉ݉߉ËŋNjɋˋ͋ϋыӋՋ׋݋ߋًۋÌŌnjɌˌ͌όьӌՌ׌ٌی݌ߌÐŐǐɐːِ͐ېݐߐϐѐӐՐאÑőǑɑˑ͑ϑёӑՑבّۑݑߑǒÒŒɒ˒͒ϒђӒՒגْےݒߒ˔ÔŔǔɔ͔ϔєӔהݔߔՔÓœǓɓ˓͓ϓѓӓՓדٓۓݓߓÕŕɕǕ˕͕ϕѕӕՕוٕەݕߕBB]]]]]]^^^ňLjɈˈ͈шψӈՈوۈ݈߈








"""""""""""""""""""""""""""""$$$$$$$$$$%%%%$%$%$%$%$%%%%%%%%%%$%$%%(((((((((((,,,,,,,,,,,,,,,---00000000101012222222222222222222222222222222222222;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;<;<;<<<<<<<<;<<<<<<<<;<;<;<GGHHHHHHHHHHHWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWdddddddddedeeeeeededeqqqqqqqqqsssstttttttstststttttttst00000000000000000000000111111111111111111111111111111111111YYYYYYYYYYYYYYYYYYYYYYYYY!!!!!!!!!!!!$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$,,,,,,,,,,,,,,,,,,,,22222222222222222222222288888888888888888888888888999999989999999999988888899999999999999999999999GGGGGGHHHHHHHHHHHHHHHHHHHHHHHHIIIHHHHHHHHHHHHHHHHHHHHHHHHHHHXXXXXXXXggggggggggooooooooooooooooooooooooo~~~~~~~~~~Íэ׍ٍۍӍՍ˞ٞ۞ݞߞ͞ўӞ՞מ																																)))))))))))))))))))))))))))))))))))))))))./...........................................//////////./////////////////////////////UU]]]]]effeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffeffeffeffefeffeffefffefffffffffffffffffffffeffffefffffefhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyyyyyyyyyyyyyyyzˊ͊ϊъӊՊ׊ۊ݊ߊÊŊNJɊ×ŗǗ&&&&&&&&&&&&&&&BBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCEEECECCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDCDCDCDCDCDCDCDCDCDCDCDDDCDDDDDDDDDDDDDDDDDDDDDDDDCDCDDCDCDCEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE}ōǍɍˍ͍ύϗїӗ!!!11111111<<<<<<<<<<<<<BUUUWWWWXWXXXXXXXXWXXXXXXXXWXWXWXX______________z{{{{{                                               !!!!!!!!!!$$$%%%%%%%%%%%%&&&&&&'''//////<<<<<<<<<<<<<<<<<<==========GGGGGGIIIIIIIIIIRVVVVVVVVVVVVZZZZZZ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^_dddddddddddddddddddddddddddd}}}}}}}}}~ttttttttttttttttttttttttttttttttttttttttttttututuuuutuuuuxxxxxx|||||||||՗ٗۗݗחߗ**************************φцӆՆ׆نۆ݆߆ÇBBBBBBBOfgggffffffgggggggggggggggggggggfgfgfggggggggghhhhhhhhhhhhhhhiiiihihihiiiiiiiiihihihiuuuuuuuuuuuuuuuuuuuuuuuuuuuuuݍߍÎǎˎ͎юӎ׎Ïŏɏˏ͏00000[[[[[^^^ØŘǘɘ˘͘ϘјӘ՘ט٘ۘݘÙřǙə˙͙ϙљәՙיٙۙݙߙ""""""""""''''''''''''''''''''''''GGGZZ\\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\[\\\\\\\\\\\nnnnnnnnnnzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzۚݚߚÛśǛɛ˛͛ϛћӛ՛כٛۛݛߛ%%%%%%%%%%%%%%%%%%%%%%%%%%%%%UUUUUU{{{						  """"""""""""$$$)))****444AAAQQQQWWuuu8888888888888888888888881/-3IKGMOE9?;=AC75qusmoUwky}SQa_c[ei]gY{W#+')%
	!#UUUUUUUVVFF${	
-s1
>	
-!!).J 
Ey 
-Ag{
-_E111113_#y?c/	#ug
-Ak7.n	!ACË)
-?)
-?99[[[[[[G/Hww	IGQ8$-J-|	'dd'dd-
-
-
-+3I
---###/o{!/]CC;CCCCC	[[[[UCC<FJ//_wfy;;\	e		mm<m<&&G			Oц4333333)#4333333)#S--++_		Ci}
-aG333335a'}Ayi_#
-
-
-=
-WY[
-WY[	++	
;Jn	n	
A$
A	
-VeF

ddIJIJӆ#9=ېݐ[ECC"333333)#&y 
-;<WWs!qgg&&i&i&i&i&i&i&UI7JJeeOFϖ<%
-'Wk0=###BD]2q9?	o	o#@#@	&&ee+
9-EE$XE***m220!!& pJ-p+JXX#@~~z 7
Y8qo$
[8))B######*Bxx%JwFF
-
-&
-
-&
-
-&
-
-&*
-!
- P&[[&w->5AA!N]R:R;<!Nw5_ə_799+++^5EAEA^1^5EAEA^1
-6&A'/###41A-)###f77*+3ٍ++	$HR%4333333)#
-YYd]E
		o;7!'C!
-
-
-d
-
-\]
-6<6<q Y1+  Tumm CCmmTT>?>? ( J -2!V3<<>?!!XD!+-!#+-!#+-!#XD!" ""!!n		ˀ+-\\"+iiÉdG"'JljUWX;<WX""F5I$J3F3 
-4&"	333335
 Y1
-
kGGGY1####$#

-H$$$$$$$$$-$PuA$%a+&_% 444?C	"A		"A	?@?@?@??ǕU?@%#I J JB;;#::
-cc=A"
;?9***)iY9A0;;ˉS]͉TT""""RAU
-&
['-3k)
c_3Y[	0_0+8&+,&&# 0J /&&&0A888888880AmUqqYn,ωX&miWW''8!)=
-	-/8/8--k		--'/'V'-'{{S'**5kR&$&
-I333335




1
!
'
!11-oooo11?C?C'(((()#
')X?%IQ))))KP)C?C)jk)IK*L**:L˙*\*OOk*]@*?*jӉddgg~A		
$:&aT&_Ti&i&i&i&i&i&zzzzzz,,,,,,,**+&&,,Ag{
-_I333335i]_+;C	?5K#yg		

Fk$$=S=
-?\8Չ[[[HOk\ddYCCCCCgs;em=&	04333335)#						1	0Kn	$
A}eq"
TdnKKC%+<XHgYYY&i&i&i&Kk
-2W	o\#@&998u+XE/%W	V2!s
-		S/#%]?sWiU)[	+HK8O/7$
[}f
.).}.2x2[
-9g
-
-.:R<_8	
-?SE++^-= =^- = =C'/###4276<]	
-								A!'O],umCmT??K =?<"X@}"i!*+\\\\\\]\]]]^ifoo	
-!%K'\X<XՃyy!W/n$$$$u&]%?ו-}K ssV;:1T9 ! !}BK /	!F0Aqɓ''**]W!$=	-)'11?C__)X)?Ck-L}**d=h&]Ti&i&i&zz&$#$--:8:RBo	%{Q+	*)\2oo		00\!0ozF!!	!)+G1"'	;
7]U}YY9UXXXXX)L/###%!I2
-<7]]98Gm9wX:XnKKKm"T,W,D<:L-==WWǍKK+1<2זWWwVA"JCBun	]Z
-0nnT?
-SSDBE8FG^8BJn	Z
-wۖ?
-SSkz
)Lood%dd&dd%d&d&d&d%&
-333335]3#							*+@@& u-ϓK 0{"
"
ـ
-(AØ[q~KKKKKKK?@?@?@DBSq5D)U)UKKKKDFKKKKKKKKKKKDDD-DǘKKKqrKKK?C)U)UDɘDrKKKKKKKK˘KKK

-3Oe)z[[eTT7T7}T7ׇLDFFUVhn=DXgggY0Y-o#CÝZ;;;;F=p'ه?7Z
-1ۇoo?
-)nTT7]\7770,͘mF3
->3^^F!
-33<=_###%5!;!==S		00+nk"T+@LL.Ã..)ۀ!ݖ")")L*ODD;nnDD݇p߇̈́'pI9pI9C2VI#CXs'>89}	!1};v8xǃɃ*5'P/gX<;MXX%1STD ! !r?<"D!}-Fttttttt*F!F!|	V&]]]]]]]]<kyӄ߀I!&S4111111)!028-:L-oooo:2:Rߖ<O9J=h_,`k"Tdegoo?rӞo&]Ti&i&i&͍B$$-JLLLL{ea7Òˑ͑I!dd
-2F!d%WWn}WWјG2
-Ә՘.9
-	s+AكA9{oŝ		)\.9/13on˃̓σnoo=\o0*	K3	2ekr88+	?3	$ǝ+	?3	,ɝ
$ك՞,u98:8-:R:R*c*(%*c*..,/ UU !q\\\\e%-m)_S5Y[	S[L2[[oo.!		>!	>)\)\w'C?!![[/opopG/˝͝/0000%IL0U 0op/zzF$ߍG$M5E0010S1~~/~)~GE~,,,,,n	m?^kH11>11y""''11,zzz2	;
22222L2	;
c22e׌~333344]!w
-82Zt);#
	
-!
-9
-!ك4dGdBV$ٌ,Dϝѝɋ
-8[[D/0
-K333335)LeӂeXˋ###&	,D	l8,G2L2H$	"A
--*.=/]]!({0͋.w8hppW*"5LOz8Y.	![u	ӝ՝LzY%kH,ט88;Lz8,DH:8LD8Vo/]Q!({2!2!
-pL-HY0uLH1"-
-yreHyk5I	E,D,)CTww!0u/ewˁHYHӃ:L%F	
-!wكu	WםG508	":MYC#C#C>5U444555555666666,7٘7UUU777]]8899988889999A9a199wx9XX::OXX,U>mnVILDD
-
-?5&!	yMEe+-!$ILILӐUo
+c*(%+c*,D-D:{;;;;;;;<;:2n<<8:L:L-=====1>>><@=7WWWW+mݘ@*+"LILLILL,n@@@@A#
L	L!WWWWY5UwxILUAAA""A%BBB8)B2uBQ	&L
3
-c;[zzmnmnTTn	Ù1
5
-e=?<ABBCCCCEEEDGFFFGGG89r99UY3%Q	&/	7
-g?[wxn	%	9
-iA?G::G
GUGHHHHHHHHHHHHIIIHHHIL -I
c5CD UUU4333333!#<1XE UV
=`SSSSSS9&"o+IM'.w+lO1(5
,&OOOOPQ QQRRRRR*RRR*'R**'S*(SSS+(SSS+(TTTT"
"
"
"
))))
-(A
-(A[[qr71$~~I MI MI MI MI MI MI M%?@?@?@?@?@?@CDBaSBSqrCD)U)U)U)UI M
-!I MI MI MCDFGI MJ MJ MJ MJ MJ MJ MJ MJ MJ MJ MCDCDC.D-CDJ MJ MJ MqrqrJ J MMJ M?C׃?C~)U)U)U)UۃCDCDqrJ MJ MJ MJ MJ MJ MJ MJ MJ J MMJ M
<P?Mef!))T[\[\efTTTT77TT77S:7UUopU77UUJ1:ӁFGFGMCMVV;T!VVVV"?WWhhmnWWWJMXAXXXXsfgfgfgYYYY#C#C!Y=YZZ;;;;;;XXZZ[FF[\\pfp''LJA9/;
-oC[1ɇopop=
-qE?))\\\\\\#11JM0h7%7\I\\]]]]7%77&77&7V777777777k/-]]]]0-^lm^^^M
AA^^-___
-+
-,9999<=_______``````````aaaaaaaaaabbbbbbbbccccccccccdr-bd,,be,M/>/>	/ݝME
-~;au
-YI111113Y-u9
e/






%
qa
-?8l7Gߝ+MMs&#V=0zzM߃fM0,,rmn->	1+&D,,l)s&gMgggJMÎhB))!Yq]Or!-,:%efi"'"+"'"+JM5jJ0mMMNrmnN,,,ooomoooˇop?Cpp͇p![%D
cI9

m?I''ppppwk5IACI'
I9
I'#1#DII'
ppI9
WXpqqq+-!$6<$+-$q
-K333335?
-C# U		

 VGs
-?>	
-!/\\\HwddYCDDDD\\D/gS;fn=&	rNn	%
Afe+<Xh'i&i&i&NNfl	o#@&frr+2!+NXы7%
c)..###x	.\	N
/:R<`++^) 9 9^) 9 9C1####f76<uTN=XES"+ixNX<XG1NyyH$$$u$'Y/	"A	- ;: " "N.NrՋs+W-?.e8-('h1pp1?DN?DN-LOeh'YTi&i&i&zzz&--:8:R.Bp!	1
	)\]!\ppN0pzG$1Yk"'	;
N#D7GA9xXXNN-D<;--:L-WW+WWxN"]Jun	[znnT[3i?E8Gn	[x[3?-:NDYEV' }
-N"
"

-(@\rNNNNNNN?@?@?@DBgSrD)U)UNNNNDGNNNNNNNNNNNDDD-DNNNrrNNN?C)U)UDDrNNNNNNNOˎOOO@L7f){fTT78p8GGVhnOYgggY#C;;;Fp'7[1[3pp?)1O8]888^mss
-,55<=zy+n+AOO//)((f",",O*$ k1I,'ppCI#CX'>xx"}<81/fxŀ0/gX<;OXX%RD " "D-FttttttG$<4111111:8-:L-::QOSh_,`ee'YTi&i&i&-JOOOWW:LnWWG0	F/9
-
-		
=xpW)\/9.12pG2n0pp=p%
-	1
	":MU	CU	G;-&	q'=t'>u9999u'5 z"0)IT)5U'']]'wxwx!"+N}юe%uuuuuvvvvvvvvvvvvv+
cG=)
- ;))=9G50E3ٛ;Evw<w1/11/fffffOxxffefwx+XSxxǀ0'P1/g/gWX;<;A;SWXWX'x4xwxy$%3yyxyzmSRO###BDOTTCD" "" "qr??9==6CDۆ{{{3{{
,F.tt.tttttt...t...|ttttF$U		||||||}}}}}G$>	}}

[3n];<}!~~~~~~~~+++)~S%̀ՀQ/MWU}}4&	] 8:Lc:LŇ͈::Y߆:R:Q:8ŖӎOOÊŊNJ׉JKgh>% O+O+~={݊_,_,%8%%
-`
`F
dede
-%9%	ESCg!E1aM
kK	1U_	%_gC	C33333}!!3-)!C	)S)K	I'?#S/wO{5/S!####3'/-/M'uQogO)	A7-)
-??qr&aT'[Ti&j&i&j&i&j&ōэ*9{gG
g',`)ϏJOJOJOŐɒϒْW/q͔ӔבWIǐRWWWW?ey
-]K333333]1{=we

-
-
TY[
TY[:L:Ltno%++++<$V1CS###<*.+-$=ÆldžɐۑݑߑːɆǖ!WWWW[[O7FF!ghh
9
-1
0wxA
K
m)#CCC'S+}=
Q
-
K
KGCC'S+}=opɗWW)\)\hhϗ1op1F6noG200՗opop<=op!!=1=S=1==
׌	!		@%
-!	Aj/mqrÜŜǜ"":M:Lɜќٜ5	
-:gW	:%5	
-CgW	C;-&g%45ߙݞߞ˞;-&!9_
-C>8+Y	0)*4E		C
-	;1
 	1e0
-,n'
-
-{17
-~Lu4)02>'%G		C	)$$
-
	$	"'P<m6	
-
-,+7F#*S$q+
!E1
-
g
-&5g		a	]eq;(,5=AG,	WQ?!5
-/73	{	63h	N:7Zh*.LN);$)*
-#,"
A+}8M0G'C2
E$8
-s	%6(ii8
-"3=5
-QM=
-	'-85-
*\9w.+J>F41S0+9L" 	;/&	
	
	8!W!
}U'+?k{C-w-Ay
Q%'g}c3Y	YU?q
E79
C%G##E;Mi/A535wcu
/###YY=WA3e								;!;q5	
#}	

W+
y'6"W'T8T7T7,+,,,,,,	nnn%%%99ߒ=ccA=Ar;? !!]Vw,+,CIא###BՐ?]\!JFZ+EI7%IId=ccA=Ar;?F:X׍ٍ&44444[EEEEGFFFF~{?&$@T&,229HIgopx~{ٞm,,/!tIJJjJjjJJjJIjJjJjJjJ jjJJJ J J JJ J J jjJjJjIjIjI IjJjjjjIjJjJjI IIIIjjJJ J et݆Jۆtt}h^^ > ^f u^d/
h^^ > ^f u^d=ZhfJJfefJj}tEEtttJJJhhhV'Ն%d}!d%I;ttzzzzIjuu߆!x}jIIzd%ن%d}IJIJtIzzzWee"+ӆߍEEmݒۍ3m+BCCCCCCCCCCE&.pp	zqqqqqqqqqϙIχ:ˀEoo!1FwU0II~EIwmI0119љ&әՙ&י:9999999999CX1ZZٙۙ,+++,,,ZZZZZZeeeeeeII 7777777A]pp!!!!!_Ӑyߙ[[ff/~F00?;IE׆IJ:˙GUUUUUUUUUUUUUUUUUgggg::;UIQjUWяiӏiՏig&oo[:RI:ُiۏiݏig'|&ig'|&:Uj}V[[[əw[[eoJIz?F?CooUUUUUUUUUŖ+++I1:JAU###jDۋ
VjEцV~?=?~0<<0<<FFoŊ]NJ$
A.nnw/):RC)ɊGX0;eCe
dW!+X2~;x&~;~ Cmo)CmTCCnwo11~		yÊ :-W;W B&'gi|V+׏ !jI;t~F~0qϐd&	o	~ B1(.jeh) j$
AIZF~000)m"''	;
eCmX,q;1"oomhTmnwoomhnw ,,,,,,Xѐ!o[    CCwTˇ͇C""qqqqqq2B
;x?npw)/):TJ'hLJAɇ)+,$
ACIII1&""Öj_,WC$
A$
$
V0!!!W;;;WW$iiU		;,++,,,,,,Vgi&ߏ'|!~F:CC"'~
ddeC?wOǖXh)!hhj$
AC!!B1.(jeWWW;;WWWW;;U?[?@?@H$999ggooݞߞ$$$HIIHHHIHHHH$ÜŜǜgo۞~~~~OFF'?V&FU^,n[eXXO6<w:/JIߚC!C&Eݙ		""$)4A WQu"*.--RRDf-N%
Af-׎LLLLMNNp+N"?nOm*+T]]xl=#=#A} Ay cycu6A	
6;C%+
=%+#i}
-ay333
-a



0#cw
-[}333
-[06-
i6-c7;%
c8X'TX'TY:RbGuNNu%%%%%%%%%D44DDi'Y/nn>5>>/>1>1---<<N	;
&J&&Jk&y+&&N.
-(@\))G))???ED?CÀÛśǛɛrrrrrrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOˎOOO&EyِEׁJPkqMMlrJPkqNMMlr'-V'"?-V:L)U$$~---~XX1X0X0ÉNffCi}
-aG333335a%}A{[





%
yi=cw
-[K333335[/y;
C!'ucAAGzG98)<==1='PS>#b6<$=A}AyAVB buӎՎÎŎEGGklzH@)./y͊j.....y...../)/z/y///ŗ/efe...........//]yيG׌y\ӋN!N::9'.}
-#CN4c
-!
-!


-

-Ϛ#*RRRR(*SSSS>3+++bb?>X?Þ
-
-
-**+>>++*
-



*+++
-
-
-


>@bbBBAA
-
-++*
-



-
-

A?
-

-
-
-

-
-
-

-
-
-
-

-
-
-
-


-
-
-
PkPkPkPkPkPk#-[#,k#-c#,sPkPkњQ
-
-
QQӚRsccsss
++*
-s?
-
{{{{{{{{՚B>BsR6'4H4333F#
-
{6F
-
{#(@3?)Ey:Q7]8x--l	t:\\8m}VJLLLdYMYYYYYݎNNYYLLLZMZZZZZߎNgSOZZ\)s
-?\\\\8888]]0]]h>>BBssRR{{

-#(3@#
-
#
-
{{
-
-[M__`b_nddE1x*7\͛zppITyTur%cctttV'>Fw<Oz]S###jÈ׈x"-t-tt}}||}Y4&CS###jD*BRvp{?R+ю*6fpσ߃^Bŀm-:L_,$Omdxюۓɐϓۑ۔ݑߑːɆ-)h]]\z"'''\m+-!#+-!#+-$ߝݝ+-!#+-!$	#e/
-/		?
)o		ms
=/Ui/SS]A[S{-#%-W
_a	C]=qWiQ'	1	[}[Q
-
-98T7T7U7FV99ǐ=iYA9Ar;;}}!
-!
-!$^VxAUL0CJ###BǕ?qmrrrn]\̈́<"L-ZG[J88887?Tŕ??Õ?ɕېݐLL==9AG5rE3AsG:ӌ))ـz &Sz}OF&2
-!x###BD###BD[vӎEEEE<+-!$׃ك?ۃ
-K333335)]rqm0Y&	
-!plj--z7Y5mV/ӄۀI9!*4555667``aaaab]E
		o;7!'C!___`bS>APssQ>>AAssRR{{{{{#
****;#(3@#(3@***&$wndMMMlMllMMlMMlMlMlMlMllMMMMMMMMMllMlMlMlMlMMlMllllMlMlMlMMMMMllMMMetMttL}i_^^ > <<^g u ^d/
i^^ > <<^g u ^d=ZigO_MffdfMk}uEEdtɏˏ͏_uMMMiiiV'&d}!d%J;duzÙzzzJkuu!x}lIIzd%%d}LOLOtLzzzWef"<_DEEO7HVŐRSBDDDDDDDDDDEV]-GF.qqC8U4555667``aaaaaǝɝ7z]ك-UsAsAUz͍U
-I333335! 		

)1x{*Vk8oV$-vrrrrqrrrrvg%ggg&g%ggg&g%g%g&g&,,n/{ZZogo---xx-x------xx2*'/	!F''-102,,ooozx1$88U2kV/VUqCk;99o&*v]ngx&222!UYVFٌ)
-?ϝѝՉ[[[Hdd
-[[/gs;em	Kn	$
Ae
dKK<Xg&i&i&i&LKek׉	odӂeXE2!KX$
[8)x[!N:R<b^-= =^- = =ummK XD}!iKX<XGLu&]/%"A
-KK ;:>1 " "0K /0Aq͋ɓWk		/8V'{1pp1kLLN)):LOdh&]Ti&i&i&zz:::R.Uo2	)\![ooӝ՝00LozF:0SI"'	;
Kegטm9wX:nKKK,D<;:L=WWKKזWWwL"un	eJznnGqn	eJwۖ:
LXEV&.u-K"
"

-(A[KKKKKKKŘ)U)UKKKKFKKKKKKKKKKKKKKKKK?C)U)UKKKKKKKKKKK
>Oe)-[[ep7LFFVhnLXggg#C;;;Fp'ه?eۇooJ)1L770-m
-,33znkLLÃ)rݖe")")LLO݇߇I,'IgX'>ww!)CT;1CewɃˁ0/gX<;MXX%S " "rtttttttF:<ӃI:::L::RߖOJh&]Ti&i&i&_,derLLL͑IWW:LnWWFјӘ՘h
RwoWם)\h1oG5n0ooo	2	kr":MC		CC		G;-&,,ooon101$1$՞Ӟ$%%
-=/[EF$HL7:JEF]JA1A1=͝oo		!=:0wn====$,		F=xV0-J,,,,,J~X<6<F5xn_0H&KɉH,uu0L10101ŝq
-s&#	yE88+	
-!&:ÝӉˉ!͉AOO8Y577TC]DX-ZZZ!Z#Z%Z'ffffffLM7777777C]]Ոppv						
-K333333)]_y˕V)s&#M=nBC&&\BBB&B\BBBBDBRDDDDDDDDCDE\\CDCCCCDDD\}l\!xDEDEїCCDCzˍCzD\EDDDzDCEӗEE"i* 0%B\\\\]]k}X\F!F!*HHH
Heߋ-YYYYYI9I9-d!%*99<Z_1bcdn{"3Y889G2 3:9  >YE!"###%@&\&((),//22334445566888999<=<=>?@@AABBCHHIQRRVYZZZ^_1__``bbbcccddggh~inoɞrssu{{{|~Ïݗמ9$$?y
K
K	CC'S+}=y9FL݋̓yׇ]]]]]]]]^/$HD..^HC?V?V?VGGCU###jDπрՒɔ~4333335)#						1	99\0*7Ø͘0ɘǘ˘@݀ՄוǔєfɋJT+ѕ+w+ˋϔf++??TٓR
RRS
S
T
#
-?T?Tp+]	19Y&*?CT\@?1pXXXXd###T1Z+0TU4333335)#							1	+׀ÔBB'P%)X%%TB%Ŕ.T߀7^3__``bbcccd]+
-!T+wH1U9ۉ9T\@#
#
#
#
Ӏ\TϘ###YSYYC{$H[99999[[EE[-vvvvz
-






#]
I
O
0>#B cٛ~F11?FzR	4333335)==<8JEJM:BGg::;JPkWiiig&op[:R_I:iiig'|&jh'|':k}V[[٘[x		[[fp		OKz?G?Cpp-OmDrD.|	LÁJ1:MAU###jD]ǍmEKAF5?ϕ=Z?ɀבג90<<0<<FGp^$
A.onw/):RCǗ)HX0;eCe
dW!X2~%;
ђx~<	~Cmp)CmTCDoxp11y\:щ\X<XB&'gi|V%!kJ;d=)G~)0q*d*&	o	~B	1"(/dleh)mݛ%
AKZ|GŁ~!0	00)m"''	;
22333eCFE9nX-q<1"ppnh%Tn]nx%ρF
-
-!
-!ppnhnx%сX!o\CCxTC$n""qqqqrr<y?nqx)/)ˊ:TTM*	'h9Ձ)n,%
A7DJJL1""k_,XC$
A%
%
V		>As	ǃ1=$X<;<XX%88889jj<Vhi'$'|=G:DD"'=eefDF!?ՃxO		Xh)hhmߛ%
AEB	1".(dmۛf\;;dWWWWdY3;;dWWWWdY3;;ZU?݃[}?@?@pp~F+<$+-$GG4333335+pg'bYc0YY		!'

-]2KI'ppI''?VӁ=_˝Fفǀffff$HofXXO6<x$:/MHDHDHDHDLכC"DEH++*߂ٚ>4xHY$7lR4Ś|###w4hDՋDV\\/NffX\6<GN"A	/8{ppNNOz.!\NzX;Nz:NVpO1OznfI,xx"1Cfx:LFxWG20":MEEϋы~~)--w-كY5)a)a&].w
-%VV[4[4[4e66/~~~L/	Mwwwϖ<~JLLLLL-%[fO˖[f-%..%%w#$$

-	
-PkPkPkPk#
#
#
#
PkPkMMn[f0%NNN*44ǚXωw|
-ff[[[[[[&&&4gDDE?DDD\\Hdd;	n	eh'i&i&i&	o2^) 9 9^) 9 9<; " "W11eh'i&i&i&:R!
1
	)\pppXNN-D:WWWWxn	fJn	fJ"
"
@LhYggg;;;pfppJ)^
-,55O",",O/g<;OX%R " "ttt<Oh'i&i&i&eeOOOWWnWWn	)\nppp%
-
1
	U	GU	K;-&EEEUVZ4[4[4e66/~~~L/	MML~fwwwÆYYYǎ͎YYY--Mddddcm.Ɏώ----.-dd-.-.MnZZZZZZLLdddcm---Y4.-Z--y.-.)

-	
-PkPkPkPk#
#
#
#
PkPkɚ|5gRR*RRRR˃.RSRSyY>S>/SSG>=1>=>SSSG:8p)Zv*p>R'vv'PG'P)X?vpvpGGGRSI8G?742
-

-
-
-PkPkPkPkPkPk#
#
#
#
PkPkSωńۂۄ݄Äقł݂ٔ.RRSRRSSʼnI4˚|15gDTDTDT(řnx7p(**2YYY((((Y(YYYYYYRS*YSSS7777777777~"*+Ϝ4333333`#%}++]$)4AO#
-
QOל	
O4333333)#+AH	$go~ϞHH
['(oU+

 Y[	k	=Z888

bbcbbc1
-QQ{{
<+
$9$4G0	
-YBDDDDDDDDDu0+ݘߘ******PsQ4333333)#0 8!78898**
K
K	CC'S+}=4333333)#8|
{{{{{{{{+^8LL	l4333333O{-u-..-ך%dž0ۘ*{O[91"		
<U_6[}:G3'AYEmG:::Sz4333333)#4333333		++1+++++!!GG1>5>*G>'4Sہx"++
-PsA+
-++
-
-
-
-
-
-
-
-rS'~A
-

-
-
-PkPkPkPkPkPk#
#
#
#
PkPk4͚}6fņ~#'3=@AC1"Qr{SǙ!q/9FTV[_qMbbcu;5K1.C%#(3=@AQs{xU49Dž)?7WAE\*	%+)'
wgoUyk[3O#c!?WeSQ=Úۚ8)80E-/qmR4333335`#7FI1ϒ͈UvWG)e,i]_Y$-I_&dG/zݍ
$,2;;;;Gq,0'4|hfnu>/
N	H/*~GU^3x0R&B]g&'|iϏ99FY4333333)#^!d
-
-1





%
0	m%2ќ	ɜP'tZY}\T]]_pyna}Iz~Ň==!*1<8mowVj&v	XW9g6E|͐H~AUBp&Ew]#(@3Ty7OW1UU'29}\0s8{ْ~!<	φ+o	z\&&&&&&&&&&&&&&''''''&'''''''''''''''''''444444444444999999999999999UUUUUUUUVVVVVVVVVVVVVVVVVVVVVWWWWWWgggggggggggghhhhghhhhhhhghiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijijijqqqqqqqq||||||||||||||||||ϏяӏՏ׏ُۏݏߏ///000YYYYYYY\\\\\\\\\\\\\\\\\\\44RRR							
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
















##########################''((((((((((((((((((((((((33333333333333333333333333==================>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOOOPPPPPPPPPPPPPPPPQQQQQQQQQQQQQQQQQQQQQQQQQQRRRrrrrrrrrrrrrrrrrrsssssssssssssssssssssssss{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ÚŚ#################$((((((((((()))))))333333333333333444>>>>>>>>>>>>>>>?>???@@@@@@@@@@@@@AAAAABBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRR^^^^^^_____________________________```````````````````````bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccdddddssssssssssssssssssssuuuuuuuuuuuuuvvvvvvvvvvvvvvvvv{{{{{{{{{{{|||||444444444444444444444444444444444555555555555555555555555555555555555555555555555555556666666666666666666666666666666666666666666666666666666777777```````````````````````````````aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbRRRRRRSSSSSSSSSSSSTTTTTTTTTTTɜ˜͜ϜќӜ՜לٜۜݜߜ**************+++++++++++++++==================AAAAAAAAAGGGGGGGGGGGGGGGRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTTTrsssssrr'''''''''xxxxxxxxxmnnnmmmmmmmmmmmmmmmnnnnnmnmnmnmnnmnnnnnnnnqqqqqqqqqqqqqqqqqqqqqrrrrrrrrrqrqrqrqrqrqrqrqrrrrrrqrrrrrrrrrrrrqrrqrqrqrqrDžɅ˅ͅυхӅՅׅمۅ݅߅ÆdžɆˆ͆ÜŜǜ*VVVVVV^^^vvvvvvvvvvvvvvvvvvvvvvvvvvvv}}}}}}}}}}}}}}}|||||||||||||||||||||||||||||||}}}}}}}}}}}}}}}}7777777777777777777~~~~~~~~~~~~~~~~~~~~~****~~~&&&&&&&&&&&&&&&&&&&&&&&&&&&&++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++++++++++++++++++++++1177@""""""000///232233333OOOTTTYZYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZ\\\\\ddddddddddddduuuuuɗ˗͗777777777777777777777777777777777778888888TTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\\\]]]]]]]]]]]]\\\\\\\\\\\\\\\\\\\]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]             !!!!!!!!  """////////////0000000000000;;;;;;;;;;;;IOJJJJIJIJIJJIIJJIJJJIJIJIJIJIJIJIJJIKIKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLILILILLLLLLLLLLLLLLILILILLILLILLLLILLLLLILIMIMIMIMIMIMIMIMIMIMIMIMIMJMJMJMJMJMJMJMJMJMJMJMJMJMJJMMJMJMJMJMJMJMJMJMJMJJMMJMJMJMMJMMMJMMMMMMMMJMJMJMJMJMJMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOJOOOOJOJOJOOJOUUVUVVVVVVVVVVVVVVUVVVVVVVWWWWWWWWWWZjkkkkjkjkjkjkjkjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklljllljljljljljljljljljljljljljljljljljljljljljljljljljljljjlljljljljljljljljljljjlljlllljllllllllllllllllmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmjmjmjmjmmmmmxxxxxxxxxxxxxxx}}}}}}}}}}}}}}}}}}}}}}}---------------------------------------------------------...........																		<<<<<<<<<<<<====OOOOOOOOOOOOOOOOOOOOOXXXXXXXXXXXYYYXXXXXXXXXXXXXXXXXXXXXXXXjjjjjjjjyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyɖ͖ϖіӖՖזٖۖݖߖÖŖǖÞŞǞɞÝŝǝɝ˝͝ϝѝӝ՝םٝ۝ݝߝ		!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"""!"))))))))))))*00000001111111111111119999999:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::=========@@@@@@???????????????????????????????????????????????????????????@@EFFFFEEEEEEEEEEEEEEEEEEEFFFFEFFFFFFFFFFFFFFFFFFFFFFFFGFFFFFFFFFFFFFFFFFFFFFFGFGFGGGGGFGFGFGFGFGGGGGGGGGGGGGGGFGFGFGIIIIIIIIIIIITTTTUUTTTTTTTTTTTTTTTTTTTVVVZ[[[ZZZZZZZZZZZZZZZZZZZZ[Z[[Z[[Z[[Z[[Z[[[[[[[[[[[[[[[Z[Z[]]]^]^]^^]^^____________fffnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnononopppooooooooooooooooooooooooopopoppppopopoppppppppppppppppopopopopoppppppppppppppppppppppppppppqqqqqpqpqqqqpqqvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwxwxwxwxwxxxxxxxxxxxxxwxwxwxwwxxxxxxxxxyyyyyxxxyyyyyyxyyyyy~~~~~~~~~~~~~~~~~~~~~~~~~~~~ÅŅ̀πрӀՀ׀ـۀ݀߀ˀÀŀǀɀÁŁǁɁˁ́ρсӁՁׁفہ݁߁ǂɂ˂͂ςтӂՂׂۂńDŽɄ˄̈́τфӄՄׄل߄ÃŃǃɃ˃̓σуӃՃ׃كۃ݃߃ŇчӇՇׇهۇ݇߇LJɇˇ͇χÉljɉˉ͉ωщӉՉ׉ىۉ݉߉ËŋNjɋˋ͋ϋыӋՋ׋݋ߋًۋÌŌnjɌˌ͌όьӌՌ׌ٌی݌ߌÐŐǐɐːِ͐ېݐߐϐѐӐՐאÑőǑɑˑ͑ϑёӑՑבّۑݑߑǒÒŒɒ˒͒ϒђӒՒגْےݒߒ˔ÔŔǔɔ͔ϔєӔהݔߔՔÓœǓɓ˓͓ϓѓӓՓדٓۓݓߓÕŕɕǕ˕͕ϕѕӕՕוٕەݕߕBB]]]]]]^^^ňLjɈˈ͈шψӈՈوۈ݈߈








"""""""""""""""""""""""""""""$$$$$$$$$$%%%%$%$%$%$%$%%%%%%%%%%$%$%%(((((((((((,,,,,,,,,,,,,,,---00000000101012222222222222222222222222222222222222;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;<;<;<<<<<<<<;<<<<<<<<;<;<;<GGHHHHHHHHHHHWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWdddddddddedeeeeeededeqqqqqqqqqsssstttttttstststttttttst00000000000000000000000111111111111111111111111111111111111YYYYYYYYYYYYYYYYYYYYYYYYY!!!!!!!!!!!!$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$,,,,,,,,,,,,,,,,,,,,22222222222222222222222288888888888888888888888888999999989999999999988888899999999999999999999999GGGGGGHHHHHHHHHHHHHHHHHHHHHHHHIIIHHHHHHHHHHHHHHHHHHHHHHHHHHHXXXXXXXXggggggggggooooooooooooooooooooooooo~~~~~~~~~~Íэ׍ٍۍӍՍ˞ٞ۞ݞߞ͞ўӞ՞מ																																)))))))))))))))))))))))))))))))))))))))))./...........................................//////////./////////////////////////////UU]]]]]effeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffeffeffeffefeffeffefffefffffffffffffffffffffeffffefffffefhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyyyyyyyyyyyyyyyzˊ͊ϊъӊՊ׊ۊ݊ߊÊŊNJɊ×ŗǗ&&&&&&&&&&&&&&&BBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCEEECECCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDCDCDCDCDCDCDCDCDCDCDCDDDCDDDDDDDDDDDDDDDDDDDDDDDDCDCDDCDCDCEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE}ōǍɍˍ͍ύϗїӗ!!!11111111<<<<<<<<<<<<<BUUUWWWWXWXXXXXXXXWXXXXXXXXWXWXWXX______________z{{{{{                                               !!!!!!!!!!$$$%%%%%%%%%%%%&&&&&&'''//////<<<<<<<<<<<<<<<<<<==========GGGGGGIIIIIIIIIIRVVVVVVVVVVVVZZZZZZ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^_dddddddddddddddddddddddddddd}}}}}}}}}~ttttttttttttttttttttttttttttttttttttttttttttututuuuutuuuuxxxxxx|||||||||՗ٗۗݗחߗ**************************φцӆՆ׆نۆ݆߆ÇBBBBBBBOfgggffffffgggggggggggggggggggggfgfgfggggggggghhhhhhhhhhhhhhhiiiihihihiiiiiiiiihihihiuuuuuuuuuuuuuuuuuuuuuuuuuuuuuݍߍÎǎˎ͎юӎ׎Ïŏɏˏ͏00000[[[[[^^^ØŘǘɘ˘͘ϘјӘ՘ט٘ۘݘÙřǙə˙͙ϙљәՙיٙۙݙߙ""""""""""''''''''''''''''''''''''GGGZZ\\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\[\\\\\\\\\\\nnnnnnnnnnzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzۚݚߚÛśǛɛ˛͛ϛћӛ՛כٛۛݛߛ%%%%%%%%%%%%%%%%%%%%%%%%%%%%%UUUUUU{{{						  """"""""""""$$$)))****444AAAQQQQWWuuu888888888888888888888888
\ No newline at end of file
--- a/apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.nrm	Thu Mar 29 15:46:04 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-NRMxy||||||y||yx|yyyy|yxyxxyxyxxyxxxyyxxyxx||y||yy|yyyyyy||yyyyyy||xy||y||||||y|yxxxyy|||||||||yyyyyyyyyyy|yyy|yyyy|y|yyyyy||yy||||||y|yyy||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||wsrtvsrussrttwpuqstrvvuutvtxstxwruvuustvxttvrvvxuvvsvxtxwvxvvxvvtxqrqvttvutxxwsusuxtxxxxxpxqrtuuvuutvvuwvuututtxwtxsuuutuvuuxuuuwuuuuvuoxvxxxvtxxvmvvvvvvvvvvvvtsqvvtstuuuuttttvtuuuxvxutxxxxxxxxxxxxxututxvvvvvvvvvtsqvvtstuuuuttttvtuuutvvvvvvvvvxtsquvvvwuuvvvkuvvsuuuuuvttttnvtvxsxxvyuvtvxsxuxxxxxxxxuxxvvxyuuuvvvvvvvvvyuuuuuvyylxsvxuwvuutvvtvvvpvvwttwvvvxxxxxxxwttvvvvvvvwwvmxxxyxxxxxxwxxxxxxvvvvvvvywxxxuuttssrvtwtttvuuttvvxvwvvvwxxxxvxxxvutvwvvvvvvwvupxxxxwvptxruuyvxxvuvxwututuuvtuxwxxxxxxuuuvttxtxxvyutttvtvvvtvvvvvvvvvvxxvuvxtwuuxuwxxxvxuvvyvwwyuuyxtvywxvyyxttxytvtvuuxxuunyuurruuruvvvvssrxxtwttvvuxuuxuuouwxxmttttttttttrrtttttsttttttuvuuuuuuutttttttttttttssstststtsststststttttttttttttttsstttttttttttttttttttttsstttttttttstttutttuuuuttttttttttttttttttttssttttttstttttttttttttttttttttttttttuusstststtsststststttttttttuuuuuuuuuuuuuuuuuuttttttttttttttttvutttttunxvuxxxxxxvuvvvvxtuupyuxxyvvuuuptuvxxxvxxuttwvtuwvvvxuuvupwuvwwuqtuuvxvwttwwxvuuuyutuuxvyyuttxxtjvwvvvvwuvvsuvxxvxvxxvvvtvvvtvvvuuywwwwwwwwwwwtuwwwyvutvvuwwxwyuuuuttttuvuvutttsuuuwutstxutttsuuyyvvxvvxyutstwwwwxxxwvvvwuqxyuxxxxxxyuvvvvxssrwttuuxuotttvtuxxvvvtvytyuxxvvvuupuussmtttxxttvvpxxxxxxvvxvvuvutvvuwxtuxwxuuvtxvtxvvtvvuuguuuxvtruuuwvvvwxvvttuvstvuuvxvuywtvttttwvtxxxxxtuxvutvvvvvvvywotwxtvxwxxxxvvvpyvyttxvvvtupyvyttttxvvvtumyvyrttxvvutumvvvuvvxxxvvvvwtuvpyvyttttxvvvtumxxxvnuxxuuuvxxxxxxxxvvvvxuupytyuttuxvvtuqytyuttuxvvtupytyuttuxvvtuqytyuttuxvvtuvvxvvxxxxvvvwjwttututtuuuuuuuuuuuuuutuuuuuuuvuvwvvvuwuukvsrvsvuvxvxwvxvvvuvwtstwwtsvxuutvvwwwwwwvwvwvvwwwvwwwvvvvvvvvvvvvvvvvvvvvvvvvwvvwwvwwwwvwwvvwwwwvvvvvvvvvvvvvvvvvvwvwwwvvvvvvvvvvvvwvwvwvwvwvvvvvvwwwvwwvvvwvvvwwvvvvwvvwwwwvwwwwvwvqxxxyxxxxxxxxxyxvvvvvuxuttxxxxxuxvvvvvuttluuvuuuoxxxxxxxxxxxxxxxxxxxxxvvvvvvvwjuutyvuxuuutvyxxxxxxxxvuxvuvvvvvuntvuuuuvutsytyvxxxxxxxvxxxuuuuvuvvvvvvvvvtsuvtupuytuyuttuxvxtvtuquytuyuttuxvxtvtupuytuyuttuxvxtvtuquytuyuttuxvxtvtupuuvuwuultvxxttvtqrtxxuuwwvvvvwvvpxxyuuuusuxvvxsxxvvvvvvxyxyvvvvvvvvvvvvvvvvtvsluuvvuuspuuuuuuuuuuuuuuxxxxxxxxvvvvvvvvuuwpuuuuvvuuuuxxxxxxvvvvvvwvvuuvvvxuxvxxxtxxwxwxxwwxxxxnxtxxtxvvuuwwvxxwwvvruwwtwxxtxxxpvunuutyuuuvtyxxxxxvvuvuxvvuvuxuuuuuyyvxxxxxxvvvxnyxttuuuxxxxxxyxxttuuvvvvvvvumtuvxxxvxxuttwvtuuuuuwuuuuuvvxxxxxuuuuuvuuuuupwuuwwuqtuuvxvwttwwxvuuwvvuttuuhuttsvxxxwwxuuwwxvvvwvtvttvvvvuuuoxywywwxywxyxxxxxxxxxwywwxvvvvvvvvvywrtuutuuuwtwwuuututtttuuuuwuyxwxvvvxxvvxxxxxxvvvvwxxxxxxxxxvvvxxxxtvxxuwuyvurvvvmutpvpxwwxpuywxwuywxxxxxuxvvvvvwmwwsxvxxxxwwsvvvvvtvxvxwuupywxwywxxxxuvvvvxwuxvxuxuxuptuvxxxvxxuttwvtuuuuwuuuuxvvxxxxuuuuvuuuuxxxxxvttssrvxpwuuwwuqtuuvxvwttwwxvuujuutytutuuuvvsuxxvtxvxxxxtvytuuvvvuvvvvttvvuvvuuxxvvunutttttsstxtsxxuwuuwvuuruuvtuuuvuvuovwvtstutwwwuvttuvutvvututuuuttvvuuvtttttutqywwxwwxuxuxvuuuttsvuvvuvuvuuvxwwxxwxxwxxuxuxvxxxxxxwxwxxxxxxwwxxxxxxxxxxxryxxxyxvvstxxuuwwuuvvvuvvvuwxryvxxyvvvnuvrtystxystrwstttsstvuxvxxxwwxxuxxxxvttttttvwutvuwvvvvvvwuvwtwstttttsstvtuhvtwwtsttvuvvsuxxuuvtvxvvxuuvxvtwuuxvuvtttrrrqttvtvtutttvtwwtnttxvxtuurrvjvtvvuvvsutxvvtvvxxvuvvtuvvrxxvwxuutwwutuuutvxuvpvvwxvvlvvvvvxvvxxuxttxvvxssvvrwwwttxxxuwwwyttxxxvvvyttkxxxwwwuluuxtrxwwuutxxxxxxxxxtvvvvvvvvrxwwvquuuvuwxxwswsxqtqxyywywwxwxyyxxxxxxxxxwywwxvvvvvvvvvwxvptvvxxwvxuuttutvwxwuxxxxwxyptuvxxxvxxuttwvtuuuuwuuuuxxxvvxxuuuuvuuuupwuuwwuqtuuvxvwttwwxvuutvvsssssrttvvvvvsvptuuutxxxwttwwxoutwxvvwvvptuuutxxxwttwwxoutwxvvwvvptuuutxxxwttwwxoutwxvvwvvptuuutxxxwttwwxoutwxvvwvvptuuutxxxwttwwxoutwxvvwvvptuuutxxxwttwwxoutwxvvwvvptuuutxxxwttwxoutwxvvwvvunvtwstttsyyttttvsvmxvxxuxxxxxxvuwxxxxtxxuxxxxxwyywvvwwwurwwwwwwwwwwwwwwwovwvvvuutuvxwtvxuvvxxuxtxuutuvxwtpuwwwxwwwuuxuuvuvuvxuvuvxxxuulttuuxtvvvvuwvtvvupuxwxwwwpuxuxwwuvvxvvptwvwxwvwvrxuxwttwvwxvxxxxxxxxxxxxwxxxvwvvvvvvvvvvvvvvvrxuxxwtxxxvpyyyyxxvvpxxxxxxvvvxxxpwwwvxxxxwwwvvvvvxxxxvtxxvvuuqxxyxyyxxxyxxxxxxxxvvvvvvvyyxvvvvvvxxxxvvvvvvwluuvvvvtwwvwuttssrvtwtttvuurxxxxvvwxxpwwtuuvxxwxvxxuttuwwvmxtrvxxtvtlxtuxvuwxxxxvxvvurwwyxxuvvyywyyxyxttuuyvyytyyuyuxtuwxyuutvwtqwwtuuuwvtxvwttuvwwxitttutxututvustvttvttttutxtwxuvvvxuxwxxututvuuustvuvutttutvvvvvwvptuvxxxvxxuttwvtuuuuwuuuuxxxxvvxuuuuvuuuupwuuwwuqtuuvxvwttwwxvuupwwtuuvxxwxvxxusttwwvtxxxxxxrwwvyywyyxxttuuuxvywuutvwtqwwtuuuwvtxvwsttvwwxqswwxwuuqxvxvxxvxwxwwvxwxxvuxtxxxwwwuuxxkwxxvvvtxwxxvvxuvvuvvvuvvwtxuuwwxxvvvtxwxxvwvxvxwwxxxxxxxvwwxxxxxxxxxxxxxuxxxxuvvuvvvuvvyxwvuvvvvwwwvuvvvvvvvvvwwvtxxuuwvnuuottwvtswvvttvvvxwwwuuvwvtuuuvuuvvvswvvmvvtwwuvxxxxxvxvvtwtvvvvuwwwwwovvxxvvnuwvywxyxuvwwmuwxyvvvxxvxuuuvwxxyxxxxxxuwxwyxwtxyxxxvvvxxtvvvvvvvvvvvtvvxuwwxwvtyyyxxuuoxxvuvuyyyyxyxtxqxyxxxxxyxvvvuunutxwwvvvvvvujutsvvxxuuwwvvvwwvwuuuuwutsvwvvtvvvvvuvvrxxxxvvwxxrvvvxvvtvvtvgvuvwuvwuxwtxxvuwyxvuuvvvuxuustuuutttttttuttvvtuuuvvvuvttttvuvuvuvvytxuxtttxvuuuuttvtvuvvwuvustwuxwtxxwvusxxxxxvtxxxxxyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuwxxxxxxvwtvxxxwtxwyxtsxxxxxxxxxxuxvuuttsttvttsttvttsttttvuuuuuxuustuuutttttttuttvvtuuuvvvuvttttvuvuvuvvyttttttuuxtsttttsuxtttxttttttttvvvvvvvvvvtvvvvvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvvvvvvuvvvtvstuuvuuxuuuuuwuuvusutvtwuxxtvtvuuunuuuuuvtuuuuuuttttttttttttttttutttttttutttttttttttuuuuuvuuuuutuvtuuttttttttttttttttutttttttutttttttttttuvuxuvuptuvxxxvxxuttwvtvtuxtutuvvvuwwuqtuuvxvwttwwxputrvxtuvxvqvuuutxxvtutttvuttutututxvtutttvuttutututxuuutuuutuvunuuuxxuvuutttuvtutuutuxutxxxxwuumtxtqtuvttuuuunyvvyttvvuuvvvvmvvxtvvxwxwvxtvvwuwuwuvvxxxxlxqyvxvuuuuuuuuuvuuuuuuuutvxxxxxxxxxxpnuxxwuuvpuvvvvvxvvuxuvtuuuuuuuvxsvvvwxxvvvxvwvvxvpyxvvyxxxxuxvvvvvvuupyyxuvvvluuuxxvvumyttttttttxxxxxxxxxyttttvvvvvvvvvttttouxxxxxxuxxxxxxxxxxvvvvvvvxxxutxvvysuyvvwuytxxvxxvvtvvvvvwxxxxxxxxxvvwqrrrrssrruttuuttrrrrrttrrrrnxvxutvtuttttututtuyywuttuvttxvtuttttututtvyyywuttuvttxvxwxwwtyvvvvvvxvvtyvvvvvvwxvwuwyuvuvuvuvuvuvxwutuutuutuvuxvtrsvvvvnuvvsvutxxxuvvsvuxxxxxxxwtxxxxxxvvvvvvvvttxtuuxxuulvvxvvxwwxwxuuuupustuxwxuvtuurxxwvvvxvwxvvvtvvvvxlvxvxuutxwvxwtwvwouuuuyxxuuuuuuqvptuptuqvxvxvxxvwvwuuwxunswouuuuuuuuuuuxxxxxxvvvvvvuuwpvvvvvvxxxxvvvvwvvsuuuuttvtwwvwunvtlxxxxxvvxwvwqtuvttqtuvwttwvwqtuvttqtuvvttwvwqtuvttqtuvwttwvwqtuvttqtuvwttquvxxxouuwxvvwquvxxxouuwxvvwquvxxxouuwxvvwquvxxxouuwxvvwquvxxxouuwxvvwquvwxxouuwxvvwutquvwxxouuwxvvwtttywttqtuuvtttuqtuuvtwttuwvwqtuvttqtuvwtttttywwttqtuuvtsttqtuuvtwsttwqtuvttqtuvwttxxtttywwttqtuuvtttuqtuuvtwttuwqtuvttqtuvwttrvvxxvvvvxxtxxxxxvvvvvvwxvvttuuuyvvvvywtuxvpuxyuuuxxxxxxyvvvvvuuqtttuxsvvvvuuvvuttxtttuvvvvsuxxtxxxxxxxxxxxxxsxxvxxqppquvuvuvuvuuqquvuvtuvvvvvvtvvtvvvvtvvvvvtuuuuttttxrstuqwwvvvwwxvxutxxvvvvvvvvvxxxvvvututvvvvvvvvwuuuwwwnttxxwwvtvvpxuywxwxuywxxxxxxuxvvvvvvwoxxxxxxxxxxxxxxxxxxxvvvvvvvwxxuuuuuuxvxutvvvxxxvvvxxxututuuuvvvvvvwuuuuuouuuyvvvxvwwuuuyvvvxxxxxxxxxxxuxvvvvvvvvvvvvwwssrwttumvxtxxwyxtustuuutttttttuttvvtuuuvvvuvuuuuvuuuvuvwyyxxttwvvxtxxwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuxxxxywtxtustuuutttttttuttvvtuuuvvvuvuuuuvuuuvuvttwwvvvtvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvsuuuyyxxtvxivvvuxxttuvtvvuutxxxxxxxxxxxttyuuvvvvvttttruxvywtuxwwrvxxvuxuvvvxxxxxxxxxxxvvvvvvvvuxukttxxxuuvvvvvvvwvtvvuuuunxttvxxwuwwvxxxwxvttxxxxxxxxxxxxvxxwxxxuwwvvvvvvvvvvvvvvvvxxxwuuvuvuuotttvuuuuututtvvuuvvqtvtvxxxtvvvvtqqyvxxyvvvnuxxwuuvkvxxuuuuuuxvwxuxwttvvtvvuxtwxxxuuuuuuxxxxxxxxuuuuuuxtttyutvttvttttttywtxuxwpwwtuuvxxwxvxxuttuwwvtxxxxxrwwyxvyywyxxttuuyyyvwytvwtqwwtuuuwvtxvwttuvwwxxywyxwxyxxxxxxwyxvvvvvvwmuvutvvtuwutxxvxxxxxxtxvvvvvvvvvvutvvtuwttxxxxxxxxxvvvrvvttxvxutvvxxvvxxututvvvvvvwuuttxuuuuuuxxxxxxxxxxxxxxxxxxxxxwxxwxxwxxwxxwxxwxxwxvtvuvuutwtxxxxtvwwttssssttuvxtwwtqpqqqxuuuutttuxxvxnvwvxuxvvuuvxvvvwxxxxxxxxwxxxxwvxuxvvvvvvvvvvvvvvuuvxxxxxxvvvvvwvvxxvxuuxuvxvxxvovwkyvvvuytyuwqtptxtvttssrvtwtttvuuvvssrxtwttvuukvvuvvsuxvvtvvuuvukvuxxxxxxwxyvuxuuxxxxxvxxxwtwxxxxxxxxxwvruvvvvvvvvvvuxxxuuuquxtwwptuvxxxvxxuttwvuuruxxttttvutttvutttvvvttttvtutwwuuqtuuvxvwttwwxuuuupywxwywxxxxuvvvvxwtuutyywvwtwtuxwtuxwtuxwtuxwtuxwtuxwptwxtuxwtxtuxuuqvxxvxvxxxxxxxxwvvvvvvxtvtvxxvvwrssowxuttuuuuuuutvnttxvwvuuuurtsqxxxxxyyvvwxwxxxxxxxxxxyxyvxwuwwwtwxxwtyxyxxutvvwxvutvtwuvtututwxxxwvvqxvxtrvxxxvtxvxvvvvnwtuuutxwtvttsxttxtyxxxxwxwuuuttuuuvtxvxxxvutvvvvuusvuvuyvvtxvvtvxuytvvuvtutttxxxxxxxxuwxxtxtxuwyxxxxvvtxtvvvvvvvvvvvvvvtvvtvxuyvuuuuutrwxxwruwxxwpxvxxvruuttvutyvvvvxuusttuvvvvtvvuusvvgutsuuwxttvuxsusutvrsuuwxxxxwxxxxxxxxuxtutxxxttvusxuutusuvuvvuuuvuvuvuusturtvvuttuuvuuxvvtrtttvuttyvvuvvwvuusstttuvvtvuusnxwxxxxxxvwxxxxxxxvxwtuvtvvvvxxxxxxupuuevxuuuuuxvwxuxwttvuxytvtwxxuuuuuxxxxxxxxuuuuuxtttvtttttttwtxuwuuwwxwpuvxvvuvvxuuwwuvxvxxtxxxxxxxxxxxvvvvvvvvvvvvvuvvxwuuuwwuuqxxvvtvuxxxxxxxvvvvvvvtxxpuuquuxuvxvxxuxvvvxsytytsxvtusytytsxvtusytytsxvtusytytsxvtukvxvsuvvtxxvvuvvvxuxwvwxuwyxxvxwyuuttvuyvvwuwxxxwxxxxxxuvuxxwvvwuvutwvwvwvvywuwuvvvvxwtvuwjuvywwxxvxxvuuvvsuxvvtxvxxxxxxxxxvvywwxxuuvvuvvvvvvvvxxvnxuvvpxxyxxxyvxyxxxuvtvxxuwtxxvvtxnwxvuxxwvvxsyxxyxnvvxxvvnuwwxwvuxtuwvwxtxxxwxxxxwuxxvvvvvvvvvuxutntttxuxtwwwwwvvuvuosuxxttvvxuuuvvvwvuuuxvuuwvxtxuxttrqvxutvxutttxtvvvvvvvvvxvvvxutttvutvvtsxxutttututtuttuuvuuvvttuuxvutuutvxmvvxwuvvuuuxvxutttvvvxxxutttutvvvwuuuuuouuuyvvvxvvvuuuyvvvxxxxxxxxxxxuxvvvvvvvvvvvvvvotuutrvtvwxttuuvvixvuxuuttvutxyvyvuvxxuxuxxutvuuwuuuutvttvwtuuttvnswuuqxtrvxxvtxvuvvlwtuuutxwtvttsxttxtyxxxxwxwuuuttuuuvtxvxxxvutvvvvuurwxwxptuutrvtvwxttuuvvhuttuuuttuvuwxsvtustutvrtvtuutuutxxxxxwxtxxxxutxwxuxxututxuxvtuvuswxutusuvuvuuuvvuvuvuvvvutustturvuvvvtvvuttuuvuuxvvtrtvuyvvuvvvuutuvvtvuusitttuututuuwsvtvttvtuttuutsuxwxtvvvxutwuxuvutuuwussvuutttuvuuvvuvvvlwuxwxwxvuwvvvvtsuutuxxxxxxuvtxvuvuwvvvvvvvvvvtuuvvjvtvvuvvsutxvtvxvxvuvvuvtvuuxxrxxvwxuurtvuurvvrtvvrtvrtvixxwwxxvwxwxxwuwxxwvxxvxuwxxwxwxwxxxxwvvuxxvwxwuxtuuvuvuuuuvvvxwuwnxwwtttwwuvuuuuwwwxvxtwvuwwvyxxxxxxyxwwvxtxxxxxxxxxxxuyxuuxuxuxuxuxuxtvvvwuwwuwwuwuyxquuuuuttttuurxvyvvvvwvxvyxxttvuxwvxxxxxxxxxxxxyvxxvvvvwvttwxvtvvvvvvvvvvvvvuyxxttxwvuvvvvkvxxvwxuxwxvuvvxwwxvwxxvwxuxwmuuwvuuuuuutxwwtxwwtxwwutxwwtxwwuxwstrxwrvvyvtvtvvuttssrytuttxrrvvvvvtxxxxxtwrstttvvtttuvvvvuuvtuxvvuxxvvxvvuuwvvwxvxxxvxxxxxxuvvwnttxxxwvtvv||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
\ No newline at end of file
Binary file apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.prx has changed
Binary file apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.si has changed
Binary file apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.tii has changed
Binary file apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/_0.tis has changed
--- a/apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/listAll.txt	Thu Mar 29 15:46:04 2018 +0000
+++ b/apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/listAll.txt	Fri Mar 30 13:19:53 2018 -0700
@@ -1,10 +1,4 @@
-_0.fdx:81284
-segments_1:240
-_0.tii:12956
-segments.gen:20
-_0.frq:259491
-_0.fnm:96
-_0.tis:829654
-_0.prx:187643
-_0.fdt:3255379
-_0.nrm:71124
+_0.cfe:363
+_0.cfs:2287509
+_0.si:381
+segments_1:136
Binary file apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/segments.gen has changed
Binary file apps/samples/Ensemble8/src/generated/resources/ensemble/search/index/segments_1 has changed
--- a/build.gradle	Thu Mar 29 15:46:04 2018 +0000
+++ b/build.gradle	Fri Mar 30 13:19:53 2018 -0700
@@ -1132,20 +1132,6 @@
 }
 
 allprojects {
-    // We want to configure all projects as java projects and use the same compile settings
-    // etc, except for the root project which we just want to ignore (and for now media)
-    if (project == rootProject) {
-       return
-    }
-    if (project.path.startsWith(":apps")) {
-        // Lets handle the apps tree differently, as it is a collection of ant builds,
-        // and the ant importer collides with the 'apply plugin:java'
-        return
-    }
-    // All of our projects are java projects
-    apply plugin: "java"
-    sourceCompatibility = 1.8
-
     // Setup the repositories that we'll download libraries from. Maven Central is
     // just easy for most things. The custom "ivy" repo is for downloading SWT. The way it
     // works is to setup the download URL such that it will resolve to the actual jar file
@@ -1165,6 +1151,21 @@
         }
     }
 
+    // We want to configure all projects as java projects and use the same compile settings
+    // etc, except for the root project which we just want to ignore (and for now media)
+    if (project == rootProject) {
+       return
+    }
+    if (project.path.startsWith(":apps")) {
+        // Lets handle the apps tree differently, as it is a collection of ant builds,
+        // and the ant importer collides with the 'apply plugin:java'
+        return
+    }
+
+    // All of our projects are java projects
+    apply plugin: "java"
+    sourceCompatibility = 1.8
+
     // By default all of our projects require junit for testing so we can just
     // setup this dependency here.
     dependencies {
@@ -3224,6 +3225,36 @@
 
     ant.importBuild 'build.xml'
 
+    // Download the Lucene libraries needed for the Ensemble8 app
+    getConfigurations().create("lucene");
+    dependencies {
+        lucene group: "org.apache.lucene", name: "lucene-core", version: "7.1.0"
+        lucene group: "org.apache.lucene", name: "lucene-grouping", version: "7.1.0"
+        lucene group: "org.apache.lucene", name: "lucene-queryparser", version: "7.1.0"
+    }
+
+    // Copy Lucene libraries into the Ensemble8/lib directory
+    File ensembleLibDir = rootProject.file("apps/samples/Ensemble8/lib");
+    def libNames = [ "lucene-core-7.1.0.jar",
+                     "lucene-grouping-7.1.0.jar",
+                     "lucene-queryparser-7.1.0.jar" ]
+
+
+    task getLucene(type: Copy) {
+        doFirst {
+            ensembleLibDir.mkdirs();
+        }
+        into ensembleLibDir
+        includeEmptyDirs = false
+        configurations.lucene.files.each { f ->
+            libNames.each { name ->
+                if (name == f.getName()) {
+                    from f.getPath()
+                }
+            }
+        }
+    }
+
     compileTargets { t ->
         // The apps build is Ant based, and gradle lets us "import" ant apps/build.xml
         // into our configuration.
@@ -3233,6 +3264,7 @@
         def jfxrtJar = "${rootProject.buildDir}/${sdkDirName}/rt/lib/ext/jfxrt.jar"
 
         def appsJar = project.task("appsJar${t.capital}") {
+            dependsOn(sdk, getLucene)
             doLast() {
               ant.properties['targetBld'] = "$t.name"
               if (!rootProject.ext[t.upper].compileSwing) {
@@ -3258,6 +3290,7 @@
               if (!t.name.startsWith("arm")) {
                 ant.project.executeTarget("scenebuilderAppClean")
               }
+              delete(ensembleLibDir);
             }
         }
         rootProject.clean.dependsOn(appsClean)
--- a/build.properties	Thu Mar 29 15:46:04 2018 +0000
+++ b/build.properties	Fri Mar 30 13:19:53 2018 -0700
@@ -40,10 +40,10 @@
 jfx.release.suffix=-ea
 
 # UPDATE THE FOLLOWING VALUES FOR A NEW RELEASE
-jfx.release.name=8u171
+jfx.release.name=8u172
 jfx.release.major.version=8
 jfx.release.minor.version=0
-jfx.release.micro.version=171
+jfx.release.micro.version=172
 
 ##############################################################################
 #
--- a/buildSrc/genVSproperties.bat	Thu Mar 29 15:46:04 2018 +0000
+++ b/buildSrc/genVSproperties.bat	Fri Mar 30 13:19:53 2018 -0700
@@ -38,7 +38,7 @@
 set VSVER=150
 set "VSVARS32FILE=C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvars32.bat"
 if not "%VS150COMNTOOLS%"=="" (
-    set VS150COMNTOOLS=%VS150COMNTOOLS%
+    set "VS150COMNTOOLS=%VS150COMNTOOLS%"
 ) else (
   if exist "%VSVARS32FILE%" set "VS150COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build"
 )
--- a/buildSrc/win.gradle	Thu Mar 29 15:46:04 2018 +0000
+++ b/buildSrc/win.gradle	Fri Mar 30 13:19:53 2018 -0700
@@ -131,11 +131,12 @@
         "LIBPATH"              : WINDOWS_VS_LIBPATH,
         "DXSDK_DIR"            : WINDOWS_DXSDK_DIR
 ];
+def msvcVer = System.getenv("MSVC_VER") ?: "14.10.25017"
 def msvcBinDir = ""
 if (winVsVer == 150) {
     msvcBinDir = (IS_64
-                      ? "$WINDOWS_VS_VSINSTALLDIR/VC/Tools/MSVC/14.10.25017/bin/HostX64/x64"
-                      : "$WINDOWS_VS_VSINSTALLDIR/VC/Tools/MSVC/14.10.25017/bin/HostX86/x86")
+                      ? "$WINDOWS_VS_VSINSTALLDIR/VC/Tools/MSVC/$msvcVer/bin/HostX64/x64"
+                      : "$WINDOWS_VS_VSINSTALLDIR/VC/Tools/MSVC/$msvcVer/bin/HostX86/x86")
 } else if (winVsVer <= 120) {
     msvcBinDir = (IS_64
                       ? "$WINDOWS_VS_VSINSTALLDIR/VC/BIN/amd64"
@@ -172,9 +173,10 @@
 if (!file(RC).exists()) throw new GradleException("FAIL: cannot find RC: " + RC)
 if (!file(FXC).exists()) throw new GradleException("FAIL: cannot find FXC: " + FXC)
 
+def msvcRedistVer = System.getenv("MSVC_REDIST_VER") ?: "14.10.25008"
 String msvcRedstDir = (IS_64
-                  ? "$WINDOWS_VS_VSINSTALLDIR/VC/Redist/MSVC/14.10.25008/x64"
-                  : "$WINDOWS_VS_VSINSTALLDIR/VC/Redist/MSVC/14.10.25008/x86")
+                  ? "$WINDOWS_VS_VSINSTALLDIR/VC/Redist/MSVC/$msvcRedistVer/x64"
+                  : "$WINDOWS_VS_VSINSTALLDIR/VC/Redist/MSVC/$msvcRedistVer/x86")
 
 String winSdkDllDir = (IS_64
                   ? "$WINDOWS_VS_WINSDKDLLINSTALLDIR/x64"
@@ -184,13 +186,14 @@
 ext.MSVCR = null
 ext.MSVCP = null
 
+def windowsCRTVer = System.getenv("WINDOWS_CRT_VER") ?: "150"
 if (WINDOWS_VS_VER == "150") {
     WINDOWS_DLL_VER = "140"
-    ext.MSVCR = cygpath("${msvcRedstDir}/Microsoft.VC${WINDOWS_VS_VER}.CRT/vcruntime${WINDOWS_DLL_VER}.dll")
-    ext.MSVCP = cygpath("${msvcRedstDir}/Microsoft.VC${WINDOWS_VS_VER}.CRT/msvcp${WINDOWS_DLL_VER}.dll")
+    ext.MSVCR = cygpath("${msvcRedstDir}/Microsoft.VC${windowsCRTVer}.CRT/vcruntime${WINDOWS_DLL_VER}.dll")
+    ext.MSVCP = cygpath("${msvcRedstDir}/Microsoft.VC${windowsCRTVer}.CRT/msvcp${WINDOWS_DLL_VER}.dll")
 }
 
-def vs2017DllPath = cygpath("${msvcRedstDir}/Microsoft.VC${WINDOWS_VS_VER}.CRT")
+def vs2017DllPath = cygpath("${msvcRedstDir}/Microsoft.VC${windowsCRTVer}.CRT")
 if (file(vs2017DllPath).exists()) {
     def VS2017DLLs = [
         "concrt140.dll",
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/BehaviorSkinBase.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/BehaviorSkinBase.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -202,6 +202,16 @@
     }
 
     /**
+     * Subclasses can invoke this method to unregister listening to
+     * property change events for the given property.
+     *
+     * @param property
+     */
+    protected final void unregisterChangeListener(ObservableValue<?> property) {
+        changeListenerHandler.unregisterChangeListener(property);
+    }
+
+    /**
      * Skin subclasses will override this method to handle changes in corresponding
      * control's properties.
      */
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ProgressIndicatorSkin.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ProgressIndicatorSkin.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -38,6 +38,8 @@
 import javafx.beans.property.BooleanProperty;
 import javafx.beans.property.IntegerProperty;
 import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.ReadOnlyBooleanProperty;
+import javafx.beans.property.ReadOnlyObjectProperty;
 import javafx.beans.value.WritableValue;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
@@ -56,6 +58,7 @@
 import javafx.scene.shape.Circle;
 import javafx.scene.text.Text;
 import javafx.scene.transform.Scale;
+import javafx.stage.Window;
 import javafx.util.Duration;
 import javafx.css.CssMetaData;
 import javafx.css.StyleableObjectProperty;
@@ -173,7 +176,8 @@
     private ProgressIndicator control;
 
     protected Animation indeterminateTransition;
-
+    private ReadOnlyObjectProperty<Window> windowProperty = null;
+    private ReadOnlyBooleanProperty windowShowingProperty = null;
 
 
     /***************************************************************************
@@ -193,6 +197,7 @@
         registerChangeListener(control.visibleProperty(), "VISIBLE");
         registerChangeListener(control.parentProperty(), "PARENT");
         registerChangeListener(control.sceneProperty(), "SCENE");
+        updateWindowListeners();
 
         initialize();
     }
@@ -216,6 +221,14 @@
         } else if ("PARENT".equals(p)) {
             updateAnimation();
         } else if ("SCENE".equals(p)) {
+            updateWindowListeners();
+            updateAnimation();
+        }
+        else if ("WINDOW".equals(p)) {
+            updateWindowListeners();
+            updateAnimation();
+        }
+        else if ("WINDOWSHOWING".equals(p)) {
             updateAnimation();
         }
     }
@@ -293,7 +306,9 @@
         ProgressIndicator control = getSkinnable();
         final boolean isTreeVisible = control.isVisible() &&
                                       control.getParent() != null &&
-                                      control.getScene() != null;
+                                      control.getScene() != null &&
+                                      control.getScene().getWindow() != null &&
+                                      control.getScene().getWindow().isShowing();
         if (indeterminateTransition != null) {
             pauseTimeline(! isTreeVisible);
         } else if (isTreeVisible) {
@@ -308,7 +323,25 @@
      * Listeners                                                               *
      *                                                                         *
      **************************************************************************/
+     private void updateWindowListeners() {
+        // Re-register change listeners for windowProperty & windowShowingProperty
+        if (windowProperty != null) {
+            unregisterChangeListener(windowProperty);
+            windowProperty = null;
 
+            unregisterChangeListener(windowShowingProperty);
+            windowShowingProperty = null;
+        }
+
+        if ((control.getScene() != null) &&
+            (control.getScene().getWindow() != null)) {
+            windowProperty = control.getScene().windowProperty();
+            windowShowingProperty = control.getScene().getWindow().showingProperty();
+
+            registerChangeListener(windowProperty, "WINDOW");
+            registerChangeListener(windowShowingProperty, "WINDOWSHOWING");
+        }
+     }
 
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/controls/src/test/java/javafx/scene/control/ProgressIndicatorTest.java	Fri Mar 30 13:19:53 2018 -0700
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javafx.scene.control;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.ref.Reference;
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import javafx.scene.control.Alert;
+import javafx.scene.control.ProgressIndicator;
+import javafx.scene.Scene;
+import javafx.stage.Stage;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.StackPane;
+import com.sun.javafx.tk.Toolkit;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class ProgressIndicatorTest {
+    Toolkit tk;
+
+    @Before public void setup() {
+        tk = Toolkit.getToolkit();
+    }
+
+    final static int TOTAL_PROGRESS_INDICATORS = 10;
+    private ArrayList<WeakReference<ProgressIndicator>> weakRefArr =
+                                      new ArrayList(TOTAL_PROGRESS_INDICATORS);
+
+    @Test public void memoryLeakTest_JDK_8189265_stage() {
+        testProgressIndicatorObjectsInStage();
+
+        attemptGC(10);
+
+        assertEquals(TOTAL_PROGRESS_INDICATORS, getCleanedUpObjectCount());
+    }
+
+    @Test public void memoryLeakTest_JDK_8189265_alert() {
+        testProgressIndicatorObjectsInAlert();
+
+        attemptGC(10);
+
+        assertEquals(TOTAL_PROGRESS_INDICATORS, getCleanedUpObjectCount());
+    }
+
+    @Test public void memoryLeakTest_JDK_8189265_changingStage() {
+        testProgressIndicatorObjectsInChangingStage();
+
+        attemptGC(10);
+
+        assertEquals(TOTAL_PROGRESS_INDICATORS, getCleanedUpObjectCount());
+    }
+
+    private void testProgressIndicatorObjectsInStage() {
+        ProgressIndicator pi[] = new ProgressIndicator[TOTAL_PROGRESS_INDICATORS];
+        HBox hb = new HBox();
+
+        for (int i = 0; i < TOTAL_PROGRESS_INDICATORS; i++) {
+            pi[i] = new ProgressIndicator();
+            weakRefArr.add(i, new WeakReference<ProgressIndicator>(pi[i]));
+            hb.getChildren().add(pi[i]);
+        }
+
+        assertEquals(TOTAL_PROGRESS_INDICATORS, weakRefArr.size());
+        assertEquals(0, getCleanedUpObjectCount());
+
+        Stage stage = new Stage();
+        Scene scene = new Scene(hb);
+        stage.setScene(scene);
+        stage.show();
+
+        tk.firePulse();
+
+        stage.close();
+        tk.firePulse();
+    }
+
+    private void testProgressIndicatorObjectsInAlert() {
+        ProgressIndicator pi[] = new ProgressIndicator[TOTAL_PROGRESS_INDICATORS];
+        StackPane root = new StackPane();
+
+        for (int i = 0; i < TOTAL_PROGRESS_INDICATORS; i++) {
+            pi[i] = new ProgressIndicator();
+            weakRefArr.add(i, new WeakReference<ProgressIndicator>(pi[i]));
+            root.getChildren().add(pi[i]);
+        }
+
+        assertEquals(TOTAL_PROGRESS_INDICATORS, weakRefArr.size());
+        assertEquals(0, getCleanedUpObjectCount());
+
+        Alert dialog = new Alert(Alert.AlertType.INFORMATION);
+        dialog.getDialogPane().setContent(root);
+        dialog.show();
+        tk.firePulse();
+
+        dialog.close();
+        tk.firePulse();
+    }
+
+    private void testProgressIndicatorObjectsInChangingStage() {
+        ProgressIndicator pi[] = new ProgressIndicator[TOTAL_PROGRESS_INDICATORS];
+        HBox hb = new HBox();
+
+        for (int i = 0; i < TOTAL_PROGRESS_INDICATORS; i++) {
+            pi[i] = new ProgressIndicator();
+            weakRefArr.add(i, new WeakReference<ProgressIndicator>(pi[i]));
+            hb.getChildren().add(pi[i]);
+        }
+
+        assertEquals(TOTAL_PROGRESS_INDICATORS, weakRefArr.size());
+        assertEquals(0, getCleanedUpObjectCount());
+
+        Stage stage1 = new Stage();
+        Scene scene = new Scene(hb);
+        stage1.setScene(scene);
+        stage1.show();
+
+        tk.firePulse();
+
+        Stage stage2 = new Stage();
+        stage2.setScene(scene);
+
+        tk.firePulse();
+
+        stage1.close();
+        stage2.close();
+        tk.firePulse();
+    }
+
+    private void attemptGC(int n) {
+        // Attempt gc n times
+        for (int i = 0; i < n; i++) {
+            System.gc();
+            System.runFinalization();
+
+            if (getCleanedUpObjectCount() == TOTAL_PROGRESS_INDICATORS) {
+                break;
+            }
+            try {
+                Thread.sleep(500);
+            } catch (InterruptedException e) {
+               System.err.println("InterruptedException occurred during Thread.sleep()");
+            }
+        }
+    }
+
+    private int getCleanedUpObjectCount() {
+        int count = 0;
+        for (WeakReference<ProgressIndicator> ref : weakRefArr) {
+            if (ref.get() == null) {
+                count++;
+            }
+        }
+        return count;
+    }
+}
--- a/modules/graphics/src/main/java/com/sun/glass/ui/gtk/GtkWindow.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/graphics/src/main/java/com/sun/glass/ui/gtk/GtkWindow.java	Fri Mar 30 13:19:53 2018 -0700
@@ -228,4 +228,10 @@
     protected void _releaseInput(long ptr) {
         throw new UnsupportedOperationException("Not supported yet.");
     }
+
+    @Override
+    public long getRawHandle() {
+        long ptr = super.getRawHandle();
+        return ptr == 0L ? 0L : _getNativeWindowImpl(ptr);
+    }
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/tk/TKStage.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/graphics/src/main/java/com/sun/javafx/tk/TKStage.java	Fri Mar 30 13:19:53 2018 -0700
@@ -126,6 +126,9 @@
     public void toFront();
     public void close();
 
+    public default void postponeClose() {}
+    public default void closePostponed() {}
+
     public void requestFocus(FocusCause cause);
 
     /**
--- a/modules/graphics/src/main/java/com/sun/javafx/tk/Toolkit.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/graphics/src/main/java/com/sun/javafx/tk/Toolkit.java	Fri Mar 30 13:19:53 2018 -0700
@@ -151,9 +151,9 @@
         "ucrtbase",
 
         // Finally load VS 2017 DLLs in the following order
-        "concrt140",
         "vcruntime140",
-        "msvcp140"
+        "msvcp140",
+        "concrt140"
 };
 
     private static String lookupToolkitClass(String name) {
--- a/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/WindowStage.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/WindowStage.java	Fri Mar 30 13:19:53 2018 -0700
@@ -772,13 +772,33 @@
         }
     }
 
+    private boolean isClosePostponed = false;
+    private Window deadWindow = null;
+
+    @Override
+    public void postponeClose() {
+        isClosePostponed = true;
+    }
+
+    @Override
+    public void closePostponed() {
+        if (deadWindow != null) {
+            deadWindow.close();
+            deadWindow = null;
+        }
+    }
+
     @Override public void close() {
         super.close();
         QuantumToolkit.runWithRenderLock(() -> {
             // prevents closing a closed platform window
             if (platformWindow != null) {
                 platformWindows.remove(platformWindow);
-                platformWindow.close();
+                if (isClosePostponed) {
+                    deadWindow = platformWindow;
+                } else {
+                    platformWindow.close();
+                }
                 platformWindow = null;
             }
             GlassScene oldScene = getViewScene();
--- a/modules/graphics/src/main/java/javafx/scene/Node.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/graphics/src/main/java/javafx/scene/Node.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -832,15 +832,13 @@
         }
     }
 
-    // reapplyCSS should be true for root elements when they are added, and is false for children
-    // of the root element. This prevents CSS being reapplied recursively, as noted in JDK-8151756.
-    private void invalidatedScenes(Scene oldScene, SubScene oldSubScene, boolean reapplyCSS) {
+    private void invalidatedScenes(Scene oldScene, SubScene oldSubScene) {
         Scene newScene = sceneProperty().get();
         boolean sceneChanged = oldScene != newScene;
         SubScene newSubScene = subScene;
 
         if (getClip() != null) {
-            getClip().setScenes(newScene, newSubScene, reapplyCSS);
+            getClip().setScenes(newScene, newSubScene);
         }
         if (sceneChanged) {
             updateCanReceiveFocus();
@@ -853,7 +851,7 @@
             focusSetDirty(newScene);
         }
         scenesChanged(newScene, newSubScene, oldScene, oldSubScene);
-        if (sceneChanged && reapplyCSS) impl_reapplyCSS();
+        if (sceneChanged) impl_reapplyCSS();
 
         if (sceneChanged && !impl_isDirtyEmpty()) {
             //Note: no need to remove from scene's dirty list
@@ -912,16 +910,16 @@
         }
     }
 
-    final void setScenes(Scene newScene, SubScene newSubScene, boolean reapplyCSS) {
+    final void setScenes(Scene newScene, SubScene newSubScene) {
         Scene oldScene = sceneProperty().get();
         if (newScene != oldScene || newSubScene != subScene) {
             scene.set(newScene);
             SubScene oldSubScene = subScene;
             subScene = newSubScene;
-            invalidatedScenes(oldScene, oldSubScene, reapplyCSS);
+            invalidatedScenes(oldScene, oldSubScene);
             if (this instanceof SubScene) { // TODO: find better solution
                 SubScene thisSubScene = (SubScene)this;
-                thisSubScene.getRoot().setScenes(newScene, thisSubScene, reapplyCSS);
+                thisSubScene.getRoot().setScenes(newScene, thisSubScene);
             }
         }
     }
@@ -6607,13 +6605,13 @@
                         } else {
                             if (oldClip != null) {
                                 oldClip.clipParent = null;
-                                oldClip.setScenes(null, null, /* reapplyCSS */ false);
+                                oldClip.setScenes(null, null);
                                 oldClip.updateTreeVisible(false);
                             }
 
                             if (newClip != null) {
                                 newClip.clipParent = Node.this;
-                                newClip.setScenes(getScene(), getSubScene(), /* reapplyCSS */ false);
+                                newClip.setScenes(getScene(), getSubScene());
                                 newClip.updateTreeVisible(true);
                             }
 
--- a/modules/graphics/src/main/java/javafx/scene/Parent.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/graphics/src/main/java/javafx/scene/Parent.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -266,7 +266,7 @@
                             relayout = true;
                         }
                         node.setParent(Parent.this);
-                        node.setScenes(getScene(), getSubScene(), /* reapplyCSS*/ true);
+                        node.setScenes(getScene(), getSubScene());
                         // assert !node.boundsChanged;
                         if (node.isVisible()) {
                             geomChanged = true;
@@ -495,7 +495,7 @@
                     }
                     if (old.getParent() == Parent.this) {
                         old.setParent(null);
-                        old.setScenes(null, null, /* reapplyCSS*/ false);
+                        old.setScenes(null, null);
                     }
                     // Do not add node with null scene to the removed list.
                     // It will not be processed in the list and its memory
@@ -664,7 +664,7 @@
         }
 
         for (int i=0; i<children.size(); i++) {
-            children.get(i).setScenes(newScene, newSubScene, /* reapplyCSS*/ false);
+            children.get(i).setScenes(newScene, newSubScene);
         }
 
         final boolean awaitingLayout = layoutFlag != LayoutFlags.CLEAN;
--- a/modules/graphics/src/main/java/javafx/scene/Scene.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/graphics/src/main/java/javafx/scene/Scene.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1112,11 +1112,11 @@
                     }
 
                     if (oldRoot != null) {
-                        oldRoot.setScenes(null, null, /* reapplyCSS*/ false);
+                        oldRoot.setScenes(null, null);
                     }
                     oldRoot = _value;
                     _value.getStyleClass().add(0, "root");
-                    _value.setScenes(Scene.this, null, /* reapplyCSS*/ true);
+                    _value.setScenes(Scene.this, null);
                     markDirty(DirtyBits.ROOT_DIRTY);
                     _value.resize(getWidth(), getHeight()); // maybe no-op if root is not resizable
                     _value.requestLayout();
--- a/modules/graphics/src/main/java/javafx/scene/SubScene.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/graphics/src/main/java/javafx/scene/SubScene.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -262,11 +262,11 @@
 
                     if (oldRoot != null) {
                         StyleManager.getInstance().forget(SubScene.this);
-                        oldRoot.setScenes(null, null, /* reapplyCSS*/ false);
+                        oldRoot.setScenes(null, null);
                     }
                     oldRoot = _value;
                     _value.getStyleClass().add(0, "root");
-                    _value.setScenes(getScene(), SubScene.this, /* reapplyCSS*/ true);
+                    _value.setScenes(getScene(), SubScene.this);
                     markDirty(SubSceneDirtyBits.ROOT_SG_DIRTY);
                     _value.resize(getWidth(), getHeight()); // maybe no-op if root is not resizable
                     _value.requestLayout();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/swing/src/main/java/com/sun/javafx/embed/swing/Disposer.java	Fri Mar 30 13:19:53 2018 -0700
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.javafx.embed.swing;
+
+import java.lang.ref.Reference;
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
+import java.util.Hashtable;
+
+/**
+ * This class is used for registering and disposing the native
+ * data associated with java objects.
+ *
+ * The object can register itself by calling the addRecord method and
+ * providing a descendant of the DisposerRecord class with overridden
+ * dispose() method.
+ *
+ * When the object becomes unreachable, the dispose() method
+ * of the associated DisposerRecord object will be called.
+ *
+ * @see DisposerRecord
+ */
+public class Disposer implements Runnable {
+    private static final ReferenceQueue queue = new ReferenceQueue();
+    private static final Hashtable records = new Hashtable();
+    private static Disposer disposerInstance;
+
+    static {
+        disposerInstance = new Disposer();
+
+        ThreadGroup tg = Thread.currentThread().getThreadGroup();
+        java.security.AccessController.doPrivileged(
+            new java.security.PrivilegedAction() {
+                public Object run() {
+                    /* The thread must be a member of a thread group
+                     * which will not get GCed before VM exit.
+                     * Make its parent the top-level thread group.
+                     */
+                    ThreadGroup tg = Thread.currentThread().getThreadGroup();
+                    for (ThreadGroup tgn = tg;
+                         tgn != null;
+                         tg = tgn, tgn = tg.getParent());
+                    Thread t =
+                        new Thread(tg, disposerInstance, "SwingNode Disposer");
+                    t.setContextClassLoader(null);
+                    t.setDaemon(true);
+                    t.setPriority(Thread.MAX_PRIORITY);
+                    t.start();
+                    return null;
+                }
+            }
+        );
+    }
+
+    /**
+     * Registers the object and the native data for later disposal.
+     * @param target Object to be registered
+     * @param rec the associated DisposerRecord object
+     * @see DisposerRecord
+     */
+    public static WeakReference addRecord(Object target, DisposerRecord rec) {
+        WeakReference ref = new WeakReference(target, queue);
+        disposerInstance.records.put(ref, rec);
+        return ref;
+    }
+
+    public void run() {
+        while (true) {
+            try {
+                Object obj = queue.remove();
+                ((Reference)obj).clear();
+                DisposerRecord rec = (DisposerRecord)records.remove(obj);
+                rec.dispose();
+                obj = null;
+                rec = null;
+            } catch (Exception e) {
+                System.out.println("Exception while removing reference: " + e);
+                e.printStackTrace();
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/swing/src/main/java/com/sun/javafx/embed/swing/DisposerRecord.java	Fri Mar 30 13:19:53 2018 -0700
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.javafx.embed.swing;
+
+/**
+ * This class is used to hold the resource to be disposed.
+ */
+public interface DisposerRecord {
+    public void dispose();
+}
--- a/modules/swing/src/main/java/javafx/embed/swing/SwingNode.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/swing/src/main/java/javafx/embed/swing/SwingNode.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,6 +29,7 @@
 import javafx.beans.Observable;
 import javafx.beans.value.ChangeListener;
 import javafx.beans.value.ObservableValue;
+import javafx.event.Event;
 import javafx.event.EventHandler;
 import javafx.event.EventType;
 import javafx.geometry.Point2D;
@@ -47,6 +48,7 @@
 import java.awt.Cursor;
 import java.awt.EventQueue;
 import java.awt.Toolkit;
+import java.lang.ref.WeakReference;
 import java.awt.dnd.DragGestureEvent;
 import java.awt.dnd.DragGestureListener;
 import java.awt.dnd.DragGestureRecognizer;
@@ -68,6 +70,8 @@
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.locks.ReentrantLock;
+import com.sun.javafx.embed.swing.Disposer;
+import com.sun.javafx.embed.swing.DisposerRecord;
 import com.sun.javafx.geom.BaseBounds;
 import com.sun.javafx.geom.transform.BaseTransform;
 import com.sun.javafx.jmx.MXNodeAlgorithm;
@@ -78,12 +82,15 @@
 import com.sun.javafx.stage.FocusUngrabEvent;
 import com.sun.javafx.stage.ScreenHelper;
 import com.sun.javafx.stage.WindowHelper;
+import com.sun.javafx.tk.TKStage;
 import com.sun.javafx.PlatformUtil;
 import sun.awt.UngrabEvent;
 import sun.awt.LightweightFrame;
 import sun.swing.JLightweightFrame;
 import sun.swing.LightweightContent;
 
+import static javafx.stage.WindowEvent.WINDOW_HIDDEN;
+
 /**
  * This class is used to embed a Swing content into a JavaFX application.
  * The content to be displayed is specified with the {@link #setContent} method
@@ -126,6 +133,17 @@
  * @since JavaFX 8.0
  */
 public class SwingNode extends Node {
+    private static boolean isThreadMerged;
+
+    static {
+        AccessController.doPrivileged(new PrivilegedAction<Object>() {
+            public Object run() {
+                isThreadMerged = Boolean.valueOf(
+                        System.getProperty("javafx.embed.singleThread"));
+                return null;
+            }
+        });
+    }
 
     private double fxWidth;
     private double fxHeight;
@@ -167,6 +185,52 @@
         javafx.scene.text.Font.getFamilies();
     }
 
+    private EventHandler windowHiddenHandler = (Event event) -> {
+        if (lwFrame != null &&  event.getTarget() instanceof Window) {
+            final Window w = (Window) event.getTarget();
+            TKStage tk = w.impl_getPeer();
+            if (tk != null) {
+                if (isThreadMerged) {
+                    jlfOverrideNativeWindowHandle.invoke(lwFrame, 0L, null);
+                } else {
+                    // Postpone actual window closing to ensure that
+                    // a native window handler is valid on a Swing side
+                    tk.postponeClose();
+                    SwingFXUtils.runOnEDT(() -> {
+                        jlfOverrideNativeWindowHandle.invoke(lwFrame, 0L,
+                                (Runnable) () -> SwingFXUtils.runOnFxThread(
+                                        () -> tk.closePostponed()));
+                    });
+                }
+            }
+        }
+
+    };
+
+    private Window hWindow = null;
+    private void notifyNativeHandle(Window window) {
+        if (hWindow != window) {
+            if (hWindow != null) {
+                hWindow.removeEventHandler(WINDOW_HIDDEN, windowHiddenHandler);
+            }
+            if (window != null) {
+                window.addEventHandler(WINDOW_HIDDEN, windowHiddenHandler);
+            }
+            hWindow = window;
+        }
+
+        if (lwFrame != null) {
+            long rawHandle = 0L;
+            if (window != null) {
+                TKStage tkStage = window.impl_getPeer();
+                if (tkStage != null) {
+                    rawHandle = tkStage.getRawHandle();
+                }
+            }
+            jlfOverrideNativeWindowHandle.invoke(lwFrame, rawHandle, null);
+        }
+    }
+
     /**
      * Attaches a {@code JComponent} instance to display in this {@code SwingNode}.
      * <p>
@@ -242,6 +306,12 @@
      */
     private static final OptionalMethod<JLightweightFrame> jlfNotifyDisplayChanged =
         new OptionalMethod<>(JLightweightFrame.class, "notifyDisplayChanged", Integer.TYPE);
+    private static OptionalMethod<JLightweightFrame> jlfOverrideNativeWindowHandle;
+
+    static {
+        jlfOverrideNativeWindowHandle = new OptionalMethod<>(JLightweightFrame.class,
+                        "overrideNativeWindowHandle", Long.TYPE, Runnable.class);
+    }
 
     /*
      * Called on EDT
@@ -254,25 +324,21 @@
         if (content != null) {
             lwFrame = new JLightweightFrame();
 
-            lwFrame.addWindowFocusListener(new WindowFocusListener() {
-                @Override
-                public void windowGainedFocus(WindowEvent e) {
-                    SwingFXUtils.runOnFxThread(() -> {
-                        SwingNode.this.requestFocus();
-                    });
-                }
-                @Override
-                public void windowLostFocus(WindowEvent e) {
-                    SwingFXUtils.runOnFxThread(() -> {
-                        ungrabFocus(true);
-                    });
-                }
-            });
+            SwingNodeWindowFocusListener snfListener =
+                                 new SwingNodeWindowFocusListener(this);
+            lwFrame.addWindowFocusListener(snfListener);
 
             jlfNotifyDisplayChanged.invoke(lwFrame, scale);
-            lwFrame.setContent(new SwingNodeContent(content));
+            lwFrame.setContent(new SwingNodeContent(content, this));
             lwFrame.setVisible(true);
 
+            if (getScene() != null) {
+                notifyNativeHandle(getScene().getWindow());
+            }
+
+            SwingNodeDisposer disposeRec = new SwingNodeDisposer(lwFrame);
+            Disposer.addRecord(this, disposeRec);
+
             SwingFXUtils.runOnFxThread(() -> {
                 locateLwFrame(); // initialize location
 
@@ -477,6 +543,9 @@
         if (oldValue != null) {
             removeWindowListeners(oldValue);
         }
+
+        notifyNativeHandle(newValue);
+
         if (newValue != null) {
             addWindowListeners(newValue);
         }
@@ -494,6 +563,7 @@
         Window window = scene.getWindow();
         if (window != null) {
             addWindowListeners(window);
+            notifyNativeHandle(window);
         }
         scene.windowProperty().addListener(sceneWindowListener);
     }
@@ -688,12 +758,56 @@
         return alg.processLeafNode(this, ctx);
     }
 
-    private class SwingNodeContent implements LightweightContent {
+    private static class SwingNodeDisposer implements DisposerRecord {
+         JLightweightFrame lwFrame;
+
+         SwingNodeDisposer(JLightweightFrame ref) {
+             this.lwFrame = ref;
+         }
+         public void dispose() {
+             if (lwFrame != null) {
+                 lwFrame.dispose();
+                 lwFrame = null;
+             }
+         }
+    }
+
+    private static class SwingNodeWindowFocusListener implements WindowFocusListener {
+        private WeakReference<SwingNode> swingNodeRef;
+
+        SwingNodeWindowFocusListener(SwingNode swingNode) {
+            this.swingNodeRef = new WeakReference<SwingNode>(swingNode);
+        }
+
+        @Override
+        public void windowGainedFocus(WindowEvent e) {
+            SwingFXUtils.runOnFxThread(() -> {
+                SwingNode swingNode = swingNodeRef.get();
+                if (swingNode != null) {
+                    swingNode.requestFocus();
+                }
+            });
+        }
+
+        @Override
+        public void windowLostFocus(WindowEvent e) {
+            SwingFXUtils.runOnFxThread(() -> {
+                SwingNode swingNode = swingNodeRef.get();
+                if (swingNode != null) {
+                    swingNode.ungrabFocus(true);
+                }
+            });
+        }
+    }
+
+    private static class SwingNodeContent implements LightweightContent {
         private JComponent comp;
         private volatile FXDnD dnd;
+        private WeakReference<SwingNode> swingNodeRef;
 
-        public SwingNodeContent(JComponent comp) {
+        public SwingNodeContent(JComponent comp, SwingNode swingNode) {
             this.comp = comp;
+            this.swingNodeRef = new WeakReference<SwingNode>(swingNode);
         }
         @Override
         public JComponent getComponent() {
@@ -701,11 +815,17 @@
         }
         @Override
         public void paintLock() {
-            paintLock.lock();
+            SwingNode swingNode = swingNodeRef.get();
+            if (swingNode != null) {
+                swingNode.paintLock.lock();
+            }
         }
         @Override
         public void paintUnlock() {
-            paintLock.unlock();
+            SwingNode swingNode = swingNodeRef.get();
+            if (swingNode != null) {
+                swingNode.paintLock.unlock();
+            }
         }
 
         // Note: we skip @Override annotation and implement both pre-hiDPI and post-hiDPI versions
@@ -716,15 +836,24 @@
         }
         //@Override
         public void imageBufferReset(int[] data, int x, int y, int width, int height, int linestride, int scale) {
-            SwingNode.this.setImageBuffer(data, x, y, width, height, linestride, scale);
+            SwingNode swingNode = swingNodeRef.get();
+            if (swingNode != null) {
+                swingNode.setImageBuffer(data, x, y, width, height, linestride, scale);
+            }
         }
         @Override
         public void imageReshaped(int x, int y, int width, int height) {
-            SwingNode.this.setImageBounds(x, y, width, height);
+            SwingNode swingNode = swingNodeRef.get();
+            if (swingNode != null) {
+                swingNode.setImageBounds(x, y, width, height);
+            }
         }
         @Override
         public void imageUpdated(int dirtyX, int dirtyY, int dirtyWidth, int dirtyHeight) {
-            SwingNode.this.repaintDirtyRegion(dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+            SwingNode swingNode = swingNodeRef.get();
+            if (swingNode != null) {
+                swingNode.repaintDirtyRegion(dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+            }
         }
         @Override
         public void focusGrabbed() {
@@ -733,49 +862,68 @@
                 // so we can't delegate it to another GUI toolkit.
                 if (PlatformUtil.isLinux()) return;
 
-                if (getScene() != null &&
-                        getScene().getWindow() != null &&
-                        getScene().getWindow().impl_getPeer() != null) {
-                    getScene().getWindow().impl_getPeer().grabFocus();
-                    grabbed = true;
+                SwingNode swingNode = swingNodeRef.get();
+                if (swingNode != null) {
+                    Scene scene = swingNode.getScene();
+                    if (scene != null &&
+                        scene.getWindow() != null &&
+                        scene.getWindow().impl_getPeer() != null) {
+                        scene.getWindow().impl_getPeer().grabFocus();
+                        swingNode.grabbed = true;
+                    }
                 }
             });
         }
         @Override
         public void focusUngrabbed() {
             SwingFXUtils.runOnFxThread(() -> {
-                ungrabFocus(false);
+                SwingNode swingNode = swingNodeRef.get();
+                if (swingNode != null) {
+                    swingNode.ungrabFocus(false);
+                }
             });
         }
         @Override
         public void preferredSizeChanged(final int width, final int height) {
             SwingFXUtils.runOnFxThread(() -> {
-                SwingNode.this.swingPrefWidth = width;
-                SwingNode.this.swingPrefHeight = height;
-                SwingNode.this.impl_notifyLayoutBoundsChanged();
+                SwingNode swingNode = swingNodeRef.get();
+                if (swingNode != null) {
+                    swingNode.swingPrefWidth = width;
+                    swingNode.swingPrefHeight = height;
+                    swingNode.impl_notifyLayoutBoundsChanged();
+                }
             });
         }
         @Override
         public void maximumSizeChanged(final int width, final int height) {
             SwingFXUtils.runOnFxThread(() -> {
-                SwingNode.this.swingMaxWidth = width;
-                SwingNode.this.swingMaxHeight = height;
-                SwingNode.this.impl_notifyLayoutBoundsChanged();
+                SwingNode swingNode = swingNodeRef.get();
+                if (swingNode != null) {
+                    swingNode.swingMaxWidth = width;
+                    swingNode.swingMaxHeight = height;
+                    swingNode.impl_notifyLayoutBoundsChanged();
+                }
             });
         }
         @Override
         public void minimumSizeChanged(final int width, final int height) {
             SwingFXUtils.runOnFxThread(() -> {
-                SwingNode.this.swingMinWidth = width;
-                SwingNode.this.swingMinHeight = height;
-                SwingNode.this.impl_notifyLayoutBoundsChanged();
+                SwingNode swingNode = swingNodeRef.get();
+                if (swingNode != null) {
+                    swingNode.swingMinWidth = width;
+                    swingNode.swingMinHeight = height;
+                    swingNode.impl_notifyLayoutBoundsChanged();
+                }
             });
         }
 
         //@Override
         public void setCursor(Cursor cursor) {
             SwingFXUtils.runOnFxThread(() -> {
-                SwingNode.this.setCursor(SwingCursors.embedCursorToCursor(cursor));
+                SwingNode swingNode = swingNodeRef.get();
+                if (swingNode != null) {
+                    swingNode.setCursor(SwingCursors.embedCursorToCursor(cursor));
+                }
             });
         }
 
@@ -783,7 +931,10 @@
             // This is a part of AWT API, so the method may be invoked on any thread
             synchronized (SwingNodeContent.this) {
                 if (this.dnd == null) {
-                    this.dnd = new FXDnD(SwingNode.this);
+                    SwingNode swingNode = swingNodeRef.get();
+                    if (swingNode != null) {
+                        this.dnd = new FXDnD(swingNode);
+                    }
                 }
             }
         }
--- a/modules/web/src/main/java/com/sun/javafx/scene/web/skin/HTMLEditorSkin.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/web/src/main/java/com/sun/javafx/scene/web/skin/HTMLEditorSkin.java	Fri Mar 30 13:19:53 2018 -0700
@@ -75,6 +75,7 @@
 import com.sun.javafx.scene.control.skin.ColorPickerSkin;
 import com.sun.javafx.scene.control.skin.FXVK;
 import com.sun.javafx.scene.web.behavior.HTMLEditorBehavior;
+import com.sun.webkit.dom.HTMLDocumentImpl;
 import com.sun.webkit.WebPage;
 import com.sun.javafx.webkit.Accessor;
 
@@ -442,6 +443,7 @@
             if (newValue.doubleValue() == totalWork) {
                 cachedHTMLText = null;
                 Platform.runLater(() -> {
+                    setDesignMode("on");
                     setContentEditable(true);
                     updateToolbarState(true);
                     updateNodeOrientation();
@@ -979,15 +981,13 @@
         fgColorButton.setDisable(!isCommandEnabled(FOREGROUND_COLOR_COMMAND));
         String foregroundColorValue = getCommandValue(FOREGROUND_COLOR_COMMAND);
         if (foregroundColorValue != null) {
-            Color c = Color.web(rgbToHex((String)foregroundColorValue));
-            fgColorButton.setValue(c);
+            fgColorButton.setValue(getColor(foregroundColorValue));
         }
 
         bgColorButton.setDisable(!isCommandEnabled(BACKGROUND_COLOR_COMMAND));
         String backgroundColorValue = getCommandValue(BACKGROUND_COLOR_COMMAND);
         if (backgroundColorValue != null) {
-            Color c = Color.web(rgbToHex((String)backgroundColorValue));
-            bgColorButton.setValue(c);
+            bgColorButton.setValue(getColor(backgroundColorValue));
         }
 
         atomicityCount = atomicityCount == 0 ? 0 : --atomicityCount;
@@ -1057,6 +1057,11 @@
         htmlBodyElement.setAttribute("contenteditable", Boolean.toString(b));
     }
 
+    private void setDesignMode(String mode) {
+        HTMLDocumentImpl htmlDocumentImpl = (HTMLDocumentImpl)webPage.getDocument(webPage.getMainFrame());
+        htmlDocumentImpl.setDesignMode(mode);
+    }
+
     private boolean getCommandState(String command) {
         return webPage.queryCommandState(command);
     }
@@ -1065,29 +1070,16 @@
         return webPage.queryCommandValue(command);
     }
 
-    private static String rgbToHex(String value) {
-        if (value.startsWith("rgba")) {
-            String[] components = value.substring(value.indexOf('(') + 1, value.lastIndexOf(')')).split(",");
-            value = String.format("#%02X%02X%02X%02X",
-                Integer.parseInt(components[0].trim()),
-                Integer.parseInt(components[1].trim()),
-                Integer.parseInt(components[2].trim()),
-                Integer.parseInt(components[3].trim()));
-            // The default background color for WebView, according to the HTML
-            // standard is rgba=#00000000 (black). The canvas background is expected
-            // to be white.
-            if ("#00000000".equals(value)) {
-                return "#FFFFFFFF";
-            }
-        } else if (value.startsWith("rgb")) {
-            String[] components = value.substring(value.indexOf('(') + 1, value.lastIndexOf(')')).split(",");
-            value = String.format("#%02X%02X%02X",
-                Integer.parseInt(components[0].trim()),
-                Integer.parseInt(components[1].trim()),
-                Integer.parseInt(components[2].trim()));
+    private Color getColor(String value) {
+        Color color = Color.web(value);
+        /* The default background color for WebView, according to the HTML
+         * standard is rgba=#00000000 (transparent). The canvas background is expected
+         * to be white.
+         */
+        if (color.equals(Color.TRANSPARENT)) {
+            color = Color.WHITE;
         }
-
-        return value;
+        return color;
     }
 
     private void applyTextFormatting() {
--- a/modules/web/src/main/java/com/sun/javafx/webkit/PasteboardImpl.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/web/src/main/java/com/sun/javafx/webkit/PasteboardImpl.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,12 +25,17 @@
 
 package com.sun.javafx.webkit;
 
+import com.sun.javafx.webkit.UIClientImpl;
 import com.sun.webkit.Pasteboard;
 import com.sun.webkit.graphics.WCGraphicsManager;
 import com.sun.webkit.graphics.WCImageFrame;
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
 import javafx.scene.image.Image;
 import javafx.scene.input.Clipboard;
 import javafx.scene.input.ClipboardContent;
+import javax.imageio.ImageIO;
 
 
 final class PasteboardImpl implements Pasteboard {
@@ -65,9 +70,22 @@
         Object platformImage = WCGraphicsManager.getGraphicsManager().
                 toPlatformImage(wcImage.getFrame());
         Image fxImage = Image.impl_fromPlatformImage(platformImage);
-        ClipboardContent content = new ClipboardContent();
-        content.putImage(fxImage);
-        clipboard.setContent(content);
+        if (fxImage != null) {
+            ClipboardContent content = new ClipboardContent();
+            content.putImage(fxImage);
+            String fileExtension = wcImage.getFrame().getFileExtension();
+            try {
+                File imageDump = File.createTempFile("jfx", "." + fileExtension);
+                imageDump.deleteOnExit();
+                ImageIO.write(UIClientImpl.toBufferedImage(fxImage),
+                    fileExtension,
+                    imageDump);
+                content.putFiles(Arrays.asList(imageDump));
+            } catch (IOException | SecurityException e) {
+                // Nothing specific to be done as of now
+            }
+            clipboard.setContent(content);
+        }
     }
 
     @Override public void writeUrl(String url, String markup) {
--- a/modules/web/src/main/java/com/sun/javafx/webkit/UIClientImpl.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/web/src/main/java/com/sun/javafx/webkit/UIClientImpl.java	Fri Mar 30 13:19:53 2018 -0700
@@ -357,9 +357,10 @@
             if (isImageSource) {
                 Object platformImage = image.getWidth() > 0 && image.getHeight() > 0 ?
                         image.getPlatformImage() : null;
+                String fileExtension = image.getFileExtension();
                 if (platformImage != null) {
                     try {
-                        File temp = File.createTempFile("jfx", ".png");
+                        File temp = File.createTempFile("jfx", "." + fileExtension);
                         temp.deleteOnExit();
                         ImageIO.write(
                             toBufferedImage(Image.impl_fromPlatformImage(
@@ -367,7 +368,7 @@
                                     platformImage
                                 )
                             )),
-                            "png",
+                            fileExtension,
                             temp);
                         content.put(DataFormat.FILES, Arrays.asList(temp));
                     } catch (IOException | SecurityException e) {
--- a/modules/web/src/main/java/com/sun/javafx/webkit/prism/WCImageDecoderImpl.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/web/src/main/java/com/sun/javafx/webkit/prism/WCImageDecoderImpl.java	Fri Mar 30 13:19:53 2018 -0700
@@ -59,6 +59,7 @@
     private PrismImage[] images;
     private volatile byte[] data;
     private volatile int dataSize = 0;
+    private String fileNameExtension;
 
     static {
         log = Logger.getLogger(WCImageDecoderImpl.class.getName());
@@ -82,8 +83,7 @@
     }
 
     @Override protected String getFilenameExtension() {
-        /// retrieve image format from reader
-        return ".img";
+        return "." + fileNameExtension;
     }
 
     private boolean imageSizeAvilable() {
@@ -210,6 +210,7 @@
             if (imageHeight < metadata.imageHeight) {
                 imageHeight = metadata.imageHeight;
             }
+            fileNameExtension = l.getFormatDescription().getExtensions().get(0);
         }
     };
 
@@ -226,8 +227,9 @@
     private static final class Frame extends WCImageFrame {
         private WCImage image;
 
-        private Frame(WCImage image) {
+        private Frame(WCImage image, String extension) {
             this.image = image;
+            this.image.setFileExtension(extension);
         }
 
         @Override public WCImage getFrame() {
@@ -275,7 +277,7 @@
                         hashCode(), idx, type));
             }
             PrismImage img = getPrismImage(idx, frame);
-            return new Frame(img);
+            return new Frame(img, fileNameExtension);
         }
         if (log.isLoggable(Level.FINE)) {
             log.fine(String.format("%X FAILED getFrame(%d)", hashCode(), idx));
--- a/modules/web/src/main/java/com/sun/javafx/webkit/prism/WCPathImpl.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/web/src/main/java/com/sun/javafx/webkit/prism/WCPathImpl.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -104,165 +104,60 @@
         path.append(arc, true);
     }
 
-    public void addArc(double x, double y, double r, double startAngle,
-                       double endAngle, boolean aclockwise)
+    public void addArc(double x, double y, double r, double sa,
+                       double ea, boolean aclockwise)
     {
+        // Use single precision float as native
+        final float TWO_PI = 2.0f * (float) Math.PI;
+        float startAngle = (float) sa;
+        float endAngle = (float) ea;
+
         if (log.isLoggable(Level.FINE)) {
-            log.log(Level.FINE, "WCPathImpl({0}).addArc({1},{2},{3},{4},{5},{6})",
+            log.log(Level.FINE, "WCPathImpl({0}).addArc(x={1},y={2},r={3},sa=|{4}|,ea=|{5}|,aclock={6})",
                     new Object[] {getID(), x, y, r, startAngle, endAngle, aclockwise});
         }
+
         hasCP = true;
 
+        float newEndAngle = endAngle;
+        // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-arc
+        // If the anticlockwise argument is false and endAngle-startAngle is equal
+        // to or greater than 2pi, or,
+        // if the anticlockwise argument is true and startAngle-endAngle is equal to
+        // or greater than 2pi,
+        // then the arc is the whole circumference of this ellipse, and the point at
+        // startAngle along this circle's circumference, measured in radians clockwise
+        // from the ellipse's semi-major axis, acts as both the start point and the
+        // end point.
 
-        double eps = 0.001;
+        // below condition is already handled in normalizeAngles(), CanvasPath.cpp.
+        // if (!anticlockwise && end_angle - start_angle >= twoPiFloat) {
+        //   new_end_angle = start_angle + twoPiFloat;
+        // } else if (anticlockwise && start_angle - end_angle >= twoPiFloat) {
+        //   new_end_angle = start_angle - twoPiFloat;
+        // } else
 
-        if (!aclockwise) {
-            if (endAngle < 0.0) {
-                if (endAngle < -2.0*Math.PI - eps) {
-                    int eMult = (int) (-endAngle / (2*Math.PI)) ;
-                    endAngle += eMult*2.0*Math.PI;
-                }
+        // Otherwise, the arc is the path along the circumference of this ellipse
+        // from the start point to the end point, going anti-clockwise if the
+        // anticlockwise argument is true, and clockwise otherwise.
+        // Since the points are on the ellipse, as opposed to being simply angles
+        // from zero, the arc can never cover an angle greater than 2pi radians.
+        //
+        // NOTE: When startAngle = 0, endAngle = 2Pi and anticlockwise = true, the
+        // spec does not indicate clearly.
+        // We draw the entire circle, because some web sites use arc(x, y, r, 0,
+        // 2*Math.PI, true) to draw circle.
+        // We preserve backward-compatibility.
+        if (!aclockwise && startAngle > endAngle) {
+            newEndAngle = startAngle + (TWO_PI - ((startAngle - endAngle) % TWO_PI));
+        } else if (aclockwise && startAngle < endAngle) {
+            newEndAngle = startAngle - (TWO_PI - ((endAngle - startAngle) % TWO_PI));
+        }
 
-                endAngle += 2.0*Math.PI;
-            } else {
-                if (endAngle > 2.0*Math.PI + eps) {
-                    int eMult = (int) (endAngle / (2*Math.PI));
-                    endAngle -= eMult*2.0*Math.PI;
-                }
-            }
-
-            if (startAngle < 0.0) {
-                if (startAngle < -2.0*Math.PI - eps) {
-                    int sMult = (int) (-startAngle / (2*Math.PI));
-                    startAngle += sMult*2.0*Math.PI;
-                }
-
-                startAngle += 2.0*Math.PI;
-            } else {
-                if (startAngle > 2.0*Math.PI + eps) {
-                    int sMult = (int) (startAngle / (2*Math.PI));
-                    startAngle -= sMult*2.0*Math.PI;
-                }
-            }
-
-            double d = startAngle - endAngle;
-
-            if (startAngle < endAngle) {
-                d = Math.abs(d);
-            }
-
-            endAngle = (float) (2.0 * Math.PI - endAngle);
-
-            Shape arc = new Arc2D((float)(x - r), (float)(y - r),
-                                  (float)(2*r), (float)(2*r),
-                (float) ((endAngle * 180.0) / Math.PI),
-                (float) ((d * 180.0) / Math.PI),Arc2D.OPEN);
-
-            PathIterator pi = arc.getPathIterator(null);
-            List<Integer> segStack = new ArrayList<Integer>();
-            List<Float> valStack = new ArrayList<Float>();
-            float [] coords = new float[6];
-            while(!pi.isDone()) {
-                switch(pi.currentSegment(coords)) {
-                    case PathIterator.SEG_MOVETO:
-                        valStack.add(coords[1]);
-                        valStack.add(coords[0]);
-                        break;
-                    case PathIterator.SEG_QUADTO:
-                        throw new RuntimeException("Unexpected segment: " +
-                                                   "SEG_QUADTO");
-                    case PathIterator.SEG_CUBICTO:
-                        valStack.add(coords[1]);
-                        valStack.add(coords[0]);
-                        valStack.add(coords[3]);
-                        valStack.add(coords[2]);
-                        valStack.add(coords[5]);
-                        valStack.add(coords[4]);
-                        segStack.add(PathIterator.SEG_CUBICTO);
-                        break;
-                    case PathIterator.SEG_CLOSE:
-                        throw new RuntimeException("Unexpected segment: " +
-                                                   "SEG_CLOSE");
-                }
-
-                pi.next();
-            }
-
-            segStack.add(PathIterator.SEG_MOVETO);
-
-            Path2D invArc = new Path2D();
-            int segIndex = segStack.size();
-            int valIndex = valStack.size();
-            while (segIndex > 0) {
-                switch(segStack.get(--segIndex)) {
-                    case PathIterator.SEG_MOVETO:
-                        invArc.moveTo(valStack.get(--valIndex), valStack.get(--valIndex));
-                        break;
-                    case PathIterator.SEG_LINETO:
-                        invArc.lineTo(valStack.get(--valIndex), valStack.get(--valIndex));
-                        break;
-                    case PathIterator.SEG_QUADTO:
-                        invArc.quadTo(valStack.get(--valIndex), valStack.get(--valIndex),
-                                      valStack.get(--valIndex), valStack.get(--valIndex));
-                        break;
-                    case PathIterator.SEG_CUBICTO:
-                        invArc.curveTo(valStack.get(--valIndex), valStack.get(--valIndex),
-                                       valStack.get(--valIndex), valStack.get(--valIndex),
-                                       valStack.get(--valIndex), valStack.get(--valIndex));
-                        break;
-                }
-            }
-            path.append(invArc, true);
-        } else {
-
-            if (endAngle < 0.0) {
-                if (endAngle < -2.0*Math.PI - eps) {
-                    int eMult = (int) (-endAngle / (2*Math.PI));
-                    endAngle += eMult*2.0*Math.PI;
-                }
-
-                endAngle += 2.0*Math.PI;
-            } else {
-                if (endAngle > 2.0*Math.PI + eps) {
-                    int eMult = (int) (endAngle / (2*Math.PI));
-                    endAngle -= eMult*2.0*Math.PI;
-                }
-            }
-
-            if (startAngle < 0.0) {
-                if (startAngle < -2.0*Math.PI - eps) {
-                    int sMult = (int) (-startAngle / (2*Math.PI));
-                    startAngle += sMult*2.0*Math.PI;
-                }
-
-                startAngle += 2.0*Math.PI;
-            } else {
-                if (startAngle > 2.0*Math.PI + eps) {
-                    int sMult = (int) (startAngle / (2*Math.PI));
-                    startAngle -= sMult*2.0*Math.PI;
-                }
-            }
-
-            double d = startAngle - endAngle;
-
-            if (startAngle < endAngle) {
-                d += 2*Math.PI;
-                if (d < eps) {
-                    d += 2*Math.PI;
-                }
-            }
-
-            if (Math.abs(startAngle) > eps) {
-                startAngle = (float) (2.0 * Math.PI - startAngle);
-            }
-
-
-            path.append(new Arc2D((float)(x - r), (float)(y - r),
-                                  (float)(2*r), (float)(2*r),
-                                  (float)((startAngle*180.0f)/Math.PI),
-                                  (float)((d*180.0f)/Math.PI),
-                                  Arc2D.OPEN), true);
-        }
+        path.append(new Arc2D((float) (x - r), (float) (y - r),
+                              (float) (2 * r), (float) (2 * r),
+                              (float) Math.toDegrees(-startAngle),
+                              (float) Math.toDegrees(startAngle - newEndAngle), Arc2D.OPEN), true);
     }
 
     public boolean contains(int rule, double x, double y) {
--- a/modules/web/src/main/java/com/sun/webkit/graphics/WCImage.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/web/src/main/java/com/sun/webkit/graphics/WCImage.java	Fri Mar 30 13:19:53 2018 -0700
@@ -29,11 +29,20 @@
 
 public abstract class WCImage extends Ref {
     private WCRenderQueue rq;
+    private String fileExtension;
 
     public abstract int getWidth();
 
     public abstract int getHeight();
 
+    public String getFileExtension() {
+        return fileExtension;
+    }
+
+    public void setFileExtension(String fileExtension) {
+        this.fileExtension = fileExtension;
+    }
+
     public Object getPlatformImage() {return null;}
 
     protected abstract byte[] toData(String mimeType);
--- a/modules/web/src/test/java/com/sun/webkit/SharedBufferTest.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/web/src/test/java/com/sun/webkit/SharedBufferTest.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -122,14 +122,6 @@
     }
 
     @Test @Ignore
-    public void testGetSomeDataFirstSegmentLastTenBytesWithTruncation() {
-        append(SEGMENT_SIZE * 2.5);
-        assertArrayEquals(
-                g(SEGMENT_SIZE - 5, 5),
-                getSomeData(SEGMENT_SIZE - 5, 10));
-    }
-
-    @Test
     public void testGetSomeDataInteriorSegmentFirstTenBytes() {
         append(SEGMENT_SIZE * 2.5);
         assertArrayEquals(g(SEGMENT_SIZE, 10), getSomeData(SEGMENT_SIZE, 10));
@@ -152,14 +144,6 @@
     }
 
     @Test @Ignore
-    public void testGetSomeDataInteriorSegmentLastTenBytesWithTruncation() {
-        append(SEGMENT_SIZE * 2.5);
-        assertArrayEquals(
-                g(SEGMENT_SIZE * 2 - 5, 5),
-                getSomeData(SEGMENT_SIZE * 2 - 5, 10));
-    }
-
-    @Test
     public void testGetSomeDataLastSegmentFirstTenBytes() {
         append(SEGMENT_SIZE * 2.5);
         assertArrayEquals(
@@ -209,14 +193,6 @@
     }
 
     @Test @Ignore
-    public void testGetSomeDataFirstSegmentWithTruncation() {
-        append(SEGMENT_SIZE * 2.5);
-        assertArrayEquals(
-                g(SEGMENT_SIZE * 0.5, SEGMENT_SIZE - SEGMENT_SIZE * 0.5),
-                getSomeData(SEGMENT_SIZE * 0.5, SEGMENT_SIZE));
-    }
-
-    @Test
     public void testGetSomeDataInteriorSegment() {
         append(SEGMENT_SIZE * 2.5);
         assertArrayEquals(
@@ -225,14 +201,6 @@
     }
 
     @Test @Ignore
-    public void testGetSomeDataInteriorSegmentWithTruncation() {
-        append(SEGMENT_SIZE * 2.5);
-        assertArrayEquals(
-                g(SEGMENT_SIZE * 1.5, SEGMENT_SIZE - SEGMENT_SIZE * 0.5),
-                getSomeData(SEGMENT_SIZE * 1.5, SEGMENT_SIZE));
-    }
-
-    @Test
     public void testGetSomeDataLastSegment() {
         append(SEGMENT_SIZE * 2.5);
         assertArrayEquals(
@@ -386,41 +354,6 @@
         assertSharedBufferContains(g(0, SEGMENT_SIZE));
     }
 
-    @Test @Ignore
-    public void testAppendThreeSegments() {
-        append(g(0, SEGMENT_SIZE * 3));
-        assertSharedBufferContains(
-                g(0, SEGMENT_SIZE),
-                g(SEGMENT_SIZE, SEGMENT_SIZE),
-                g(SEGMENT_SIZE * 2, SEGMENT_SIZE));
-    }
-
-    @Test @Ignore
-    public void testAppendThreeSegmentsPlusSegmentPlusTenBytes() {
-        append(g(0, SEGMENT_SIZE * 3));
-        append(g(0, SEGMENT_SIZE));
-        append(g(0, 10));
-        assertSharedBufferContains(
-                g(0, SEGMENT_SIZE),
-                g(SEGMENT_SIZE, SEGMENT_SIZE),
-                g(SEGMENT_SIZE * 2, SEGMENT_SIZE),
-                g(0, SEGMENT_SIZE),
-                g(0, 10));
-    }
-
-    @Test @Ignore
-    public void testAppendTenBytesPlusSegmentPlusThreeSegments() {
-        append(g(0, 10));
-        append(g(0, SEGMENT_SIZE));
-        append(g(0, SEGMENT_SIZE * 3));
-        assertSharedBufferContains(
-                g(0, 10),
-                g(0, SEGMENT_SIZE),
-                g(0, SEGMENT_SIZE),
-                g(SEGMENT_SIZE, SEGMENT_SIZE),
-                g(SEGMENT_SIZE * 2, SEGMENT_SIZE));
-    }
-
     @Test
     public void testAppendZeroBytes() {
         append(new byte[0]);
--- a/modules/web/src/test/java/com/sun/webkit/SimpleSharedBufferInputStreamTest.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/web/src/test/java/com/sun/webkit/SimpleSharedBufferInputStreamTest.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -164,13 +164,6 @@
     }
 
     @Test @Ignore
-    public void testRead3FirstSegmentLastTenBytesWithTruncation() {
-        append(SEGMENT_SIZE * 2.5);
-        readOut(SEGMENT_SIZE - 5);
-        assertArrayEquals(g(SEGMENT_SIZE - 5, 5), read(10));
-    }
-
-    @Test
     public void testRead3InteriorSegmentFirstTenBytes() {
         append(SEGMENT_SIZE * 2.5);
         readOut(SEGMENT_SIZE);
@@ -192,13 +185,6 @@
     }
 
     @Test @Ignore
-    public void testRead3InteriorSegmentLastTenBytesWithTruncation() {
-        append(SEGMENT_SIZE * 2.5);
-        readOut(SEGMENT_SIZE * 2 - 5);
-        assertArrayEquals(g(SEGMENT_SIZE * 2 - 5, 5), read(10));
-    }
-
-    @Test
     public void testRead3LastSegmentFirstTenBytes() {
         append(SEGMENT_SIZE * 2.5);
         readOut(SEGMENT_SIZE * 2);
@@ -245,15 +231,6 @@
     }
 
     @Test @Ignore
-    public void testRead3FirstSegmentWithTruncation() {
-        append(SEGMENT_SIZE * 2.5);
-        readOut(SEGMENT_SIZE * 0.5);
-        assertArrayEquals(
-                g(SEGMENT_SIZE * 0.5, SEGMENT_SIZE - SEGMENT_SIZE * 0.5),
-                read(SEGMENT_SIZE));
-    }
-
-    @Test
     public void testRead3InteriorSegment() {
         append(SEGMENT_SIZE * 2.5);
         readOut(SEGMENT_SIZE);
@@ -261,15 +238,6 @@
     }
 
     @Test @Ignore
-    public void testRead3InteriorSegmentWithTruncation() {
-        append(SEGMENT_SIZE * 2.5);
-        readOut(SEGMENT_SIZE * 1.5);
-        assertArrayEquals(
-                g(SEGMENT_SIZE * 1.5, SEGMENT_SIZE - SEGMENT_SIZE * 0.5),
-                read(SEGMENT_SIZE));
-    }
-
-    @Test
     public void testRead3LastSegment() {
         append(SEGMENT_SIZE * 2.5);
         readOut(SEGMENT_SIZE * 2);
@@ -378,30 +346,6 @@
         } catch (IndexOutOfBoundsException expected) {}
     }
 
-    @Test @Ignore
-    public void testRead3StandardUse() {
-        int streamSize = 24700;
-        append(streamSize);
-        int numberOfReads = streamSize / SEGMENT_SIZE + 1;
-        for (int i = 0; i < numberOfReads; i++) {
-            byte[] buffer = new byte[8192];
-            int len = is.read(buffer, 0, buffer.length);
-            int expectedLen = i == numberOfReads - 1
-                    ? streamSize % SEGMENT_SIZE : SEGMENT_SIZE;
-            assertEquals(expectedLen, len);
-            byte[] expectedBuffer = new byte[8192];
-            System.arraycopy(g(SEGMENT_SIZE * i, SEGMENT_SIZE), 0,
-                             expectedBuffer, 0,
-                             len);
-            assertArrayEquals(expectedBuffer, buffer);
-        }
-
-        byte[] buffer = new byte[8192];
-        int len = is.read(buffer, 0, buffer.length);
-        assertEquals(-1, len);
-        assertArrayEquals(new byte[8192], buffer);
-    }
-
     private void testSkipSmallNumberOfBytes(long skip) {
         int streamSize = (int) (SEGMENT_SIZE * 2.5);
         int skipCount = streamSize / SEGMENT_SIZE + 1;
@@ -418,16 +362,6 @@
     }
 
     @Test @Ignore
-    public void testSkipOneByte() {
-        testSkipSmallNumberOfBytes(1);
-    }
-
-    @Test @Ignore
-    public void testSkipTenBytes() {
-        testSkipSmallNumberOfBytes(10);
-    }
-
-    @Test
     public void testSkipZeroBytes() {
         testSkipSmallNumberOfBytes(0);
     }
@@ -570,23 +504,6 @@
         assertArrayEquals(g(0, SEGMENT_SIZE), read(SEGMENT_SIZE));
     }
 
-    @Test @Ignore
-    public void testCloseBeforeSubsequentRead() throws IOException {
-        append(SEGMENT_SIZE * 2.5);
-        assertArrayEquals(g(0, 10), read(10));
-        is.close();
-        assertArrayEquals(g(10, SEGMENT_SIZE - 10), read(SEGMENT_SIZE));
-    }
-
-    @Test @Ignore
-    public void testDoubleClose() throws IOException {
-        append(SEGMENT_SIZE * 2.5);
-        assertArrayEquals(g(0, 10), read(10));
-        is.close();
-        is.close();
-        assertArrayEquals(g(10, SEGMENT_SIZE - 10), read(SEGMENT_SIZE));
-    }
-
     @Test
     public void testCloseEmptyBuffer() throws IOException {
         is.close();
--- a/modules/web/src/test/java/com/sun/webkit/network/CookieTest.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/web/src/test/java/com/sun/webkit/network/CookieTest.java	Fri Mar 30 13:19:53 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -193,10 +193,11 @@
         actual = Cookie.parse(testString, expected.creationTime);
         assertAsExpected(testString, expected, actual);
 
-        long maxAge = (Long.MAX_VALUE - currentTimeMillis()) / 1000;
+        expected = new CookieModel("foo", "bar");
+        long currentTimeInMillis = expected.creationTime.baseTime();
+        long maxAge = (Long.MAX_VALUE - currentTimeInMillis) / 1000;
         testString = "foo=bar; Max-Age=" + maxAge;
-        expected = new CookieModel("foo", "bar");
-        expected.expiryTime = expected.creationTime.baseTime() + maxAge * 1000;
+        expected.expiryTime = currentTimeInMillis + maxAge * 1000;
         expected.persistent = true;
         actual = Cookie.parse(testString, expected.creationTime);
         assertAsExpected(testString, expected, actual);
--- a/modules/web/src/test/java/javafx/scene/web/CanvasTest.java	Thu Mar 29 15:46:04 2018 +0000
+++ b/modules/web/src/test/java/javafx/scene/web/CanvasTest.java	Fri Mar 30 13:19:53 2018 -0700
@@ -146,4 +146,24 @@
             }
         });
     }
+
+    // JDK-8191035
+    @Test public void testCanvasArc() {
+        final String htmlCanvasArc =
+                "<canvas id='canvas' width='600' height='300'></canvas> <script>" +
+                        "var context = document.getElementById('canvas').getContext('2d');" +
+                        "context.beginPath();" +
+                        "context.arc(300, 150, 75, -1.5707, 2.1362, false);" +
+                        "context.strokeStyle = 'red';" +
+                        "context.stroke();  </script>";
+
+        loadContent(htmlCanvasArc);
+        submit(() -> {
+            int redColor = 255;
+            assertEquals("Arc startAngle", redColor,
+                    (int) getEngine().executeScript("document.getElementById('canvas').getContext('2d').getImageData(260,213,1,1).data[0]"));
+            assertEquals("Arc endAngle", redColor,
+                    (int) getEngine().executeScript("document.getElementById('canvas').getContext('2d').getImageData(300,75,1,1).data[0]"));
+        });
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/system/src/test/java/javafx/embed/swing/SwingNodeBase.java	Fri Mar 30 13:19:53 2018 -0700
@@ -0,0 +1,227 @@
+/*
+ * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javafx.embed.swing;
+
+import javafx.application.Application;
+import javafx.application.Platform;
+import javafx.embed.swing.SwingNode;
+import javafx.scene.Scene;
+import javafx.scene.layout.VBox;
+import javafx.stage.Stage;
+import junit.framework.AssertionFailedError;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import util.Util;
+
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import java.awt.AWTException;
+import java.awt.Frame;
+import java.awt.Robot;
+import java.awt.event.InputEvent;
+import java.lang.reflect.InvocationTargetException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import static util.Util.TIMEOUT;
+
+public class SwingNodeBase {
+    public static final int BASE_LOCATION = 200;
+    public static final int BASE_SIZE = 200;
+    public static final int WAIT_TIME = 300;
+    public static final int LONG_WAIT_TIME = 2500;
+
+
+    protected static Robot robot;
+
+    // Used to launch the application before running any test
+    private static final CountDownLatch launchLatch = new CountDownLatch(1);
+
+    // Singleton Application instance
+    static MyApp myApp;
+
+
+    @BeforeClass
+    public static void setupOnce() throws AWTException, InvocationTargetException, InterruptedException {
+        robot = new Robot();
+        robot.setAutoDelay(100);
+
+        // Start the Application
+        new Thread(() -> Application.launch(MyApp.class, (String[])null)).start();
+
+        try {
+            if (!launchLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)) {
+                throw new AssertionFailedError("Timeout waiting for Application to launch");
+            }
+        } catch (InterruptedException ex) {
+            AssertionFailedError err = new AssertionFailedError("Unexpected exception");
+            err.initCause(ex);
+            throw err;
+        }
+
+        CountDownLatch paintLatch = new CountDownLatch(1);
+        SwingUtilities.invokeAndWait(()->{
+            myApp.swingNode.setContent(new MyApp.ColorPanel(java.awt.Color.RED));
+            myApp.swingNode.setVisible(true);
+        });
+        paintLatch.countDown();
+    }
+
+    @AfterClass
+    public static void teardownOnce() {
+        Platform.runLater(() -> {
+            Platform.exit();
+        });
+    }
+
+    public static void runWaitSleep(Runnable run) {
+        Util.runAndWait(run);
+        Util.sleep(WAIT_TIME);
+    }
+
+    public static void invokeWaitSleep(Runnable run) throws InvocationTargetException, InterruptedException {
+        SwingUtilities.invokeAndWait(run);
+        Util.sleep(WAIT_TIME);
+    }
+
+    // Application class. An instance is created and initialized before running
+    // the first test, and it lives through the execution of all tests.
+    public static class MyApp extends Application {
+
+        private Stage stage;
+
+        private SwingNode swingNode;
+        private VBox vbox;
+        private Scene scene;
+
+        @Override public void init() {
+            SwingNodeBase.myApp = this;
+            Platform.setImplicitExit(false);
+        }
+
+        @Override public void start(Stage primaryStage) throws Exception {
+            swingNode = new SwingNode();
+            vbox = new VBox(swingNode);
+            scene = new Scene(vbox, BASE_SIZE, BASE_SIZE,
+                    javafx.scene.paint.Color.GREEN);
+
+            launchLatch.countDown();
+        }
+
+        public void closeStage() {
+            runWaitSleep(() -> {
+                stage.close();
+                stage = null;
+            });
+        }
+
+        public void createAndShowStage() {
+            runWaitSleep(() -> {
+                stage = new Stage();
+                stage.setScene(scene);
+                stage.setTitle("JFX toplevel");
+                stage.setX(BASE_LOCATION);
+                stage.setY(BASE_LOCATION);
+                stage.show();
+                stage.requestFocus();
+            });
+        }
+
+        public void createStageAndDialog() throws InvocationTargetException, InterruptedException {
+            createAndShowStage();
+            createDialog();
+        }
+
+        public void attachSwingNode() {
+            runWaitSleep(() -> vbox.getChildren().add(swingNode));
+        }
+
+        public void detachSwingNode() {
+            runWaitSleep(() -> vbox.getChildren().remove(swingNode));
+        }
+
+        static JDialog dialog;
+
+        public Runnable createDialogRunnable = () -> {
+            Frame frame = JOptionPane.getFrameForComponent(myApp.swingNode.getContent());
+            dialog = new JDialog(frame);
+            dialog.setTitle("JDialog");
+            dialog.getContentPane().add(new ColorPanel(java.awt.Color.BLUE));
+            dialog.setLocationRelativeTo(dialog.getParent());
+            dialog.setBounds(BASE_LOCATION + BASE_SIZE / 2,
+                    BASE_LOCATION, BASE_SIZE,
+                    BASE_SIZE * 2);
+        };
+
+        public void createDialog() throws InvocationTargetException, InterruptedException {
+            dialog = null;
+            invokeWaitSleep(createDialogRunnable);
+        }
+
+        public void disposeDialog() throws InvocationTargetException, InterruptedException {
+            invokeWaitSleep(() -> dialog.dispose());
+        }
+
+        public void showDialog() throws InvocationTargetException, InterruptedException {
+            invokeWaitSleep(() -> dialog.setVisible(true));
+        }
+
+        public void closeStageAndDialog() throws InvocationTargetException, InterruptedException {
+            disposeDialog();
+            closeStage();
+        }
+
+        public static class ColorPanel extends JPanel {
+            private CountDownLatch latch;
+            public ColorPanel(java.awt.Color color) {
+                super();
+                setBackground(color);
+            }
+        }
+    }
+
+    public void testAbove(boolean above) throws InterruptedException, InvocationTargetException {
+        int checkLoc = BASE_LOCATION + 3 * BASE_SIZE /4;
+        int clickLoc = BASE_LOCATION + BASE_SIZE / 4;
+
+        if (myApp.stage != null && myApp.stage.isShowing()) {
+            robot.mouseMove(clickLoc, clickLoc);
+            robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
+            robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
+        }
+
+        if (above) {
+            Assert.assertEquals("JDialog is not above JavaFX stage",
+                    java.awt.Color.BLUE, robot.getPixelColor(checkLoc, checkLoc));
+        } else {
+            Assert.assertFalse("JDialog is above JavaFX stage",
+                    java.awt.Color.BLUE.equals(robot.getPixelColor(checkLoc, checkLoc)));
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/system/src/test/java/javafx/embed/swing/SwingNodeJDialogTest.java	Fri Mar 30 13:19:53 2018 -0700
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javafx.embed.swing;
+
+import org.junit.Test;
+import util.Util;
+
+import javax.swing.SwingUtilities;
+import java.lang.reflect.InvocationTargetException;
+import java.util.concurrent.CountDownLatch;
+
+public class SwingNodeJDialogTest extends SwingNodeBase {
+
+    @Test
+    public void testJDialogAbove() throws InterruptedException, InvocationTargetException {
+        myApp.createStageAndDialog();
+        myApp.showDialog();
+
+        testAbove(true);
+
+        myApp.closeStageAndDialog();
+    }
+
+    @Test
+    public void testNodeRemovalAfterShow() throws InterruptedException, InvocationTargetException {
+        myApp.createStageAndDialog();
+        myApp.showDialog();
+
+        testAbove(true);
+
+        myApp.detachSwingNode();
+        testAbove(false);
+
+        myApp.closeStageAndDialog();
+        myApp.attachSwingNode();
+    }
+
+    @Test
+    public void testNodeRemovalBeforeShow() throws InterruptedException, InvocationTargetException {
+        myApp.createStageAndDialog();
+        myApp.detachSwingNode();
+        myApp.showDialog();
+
+        testAbove(false);
+
+        myApp.closeStageAndDialog();
+        myApp.attachSwingNode();
+    }
+
+    @Test
+    public void testStageCloseAfterShow() throws InvocationTargetException, InterruptedException {
+        myApp.createStageAndDialog();
+        myApp.showDialog();
+        testAbove(true);
+        myApp.closeStage();
+        myApp.disposeDialog();
+    }
+
+    @Test
+    public void testStageCloseBeforeShow() throws InvocationTargetException, InterruptedException {
+        myApp.createStageAndDialog();
+        myApp.closeStage();
+        myApp.showDialog();
+        testAbove(true);
+        myApp.disposeDialog();
+    }
+
+
+    @Test
+    public void testNodeRemovalBeforeShowHoldEDT() throws InterruptedException, InvocationTargetException {
+        myApp.createAndShowStage();
+        CountDownLatch latch = new CountDownLatch(1);
+        SwingUtilities.invokeLater(()-> {
+            myApp.createDialogRunnable.run();
+            latch.countDown();
+            Util.sleep(LONG_WAIT_TIME);
+            myApp.dialog.setVisible(true);
+        });
+        latch.await();
+        myApp.detachSwingNode();
+        testAbove(false);
+        myApp.closeStageAndDialog();
+        myApp.attachSwingNode();
+    }
+
+    @Test
+    public void testStageCloseBeforeShowHoldEDT() throws InvocationTargetException, InterruptedException {
+        myApp.createAndShowStage();
+        CountDownLatch latch = new CountDownLatch(1);
+        SwingUtilities.invokeLater(()-> {
+            myApp.createDialogRunnable.run();
+            latch.countDown();
+            Util.sleep(LONG_WAIT_TIME);
+            myApp.dialog.setVisible(true);
+        });
+        latch.await();
+        myApp.closeStage();
+        testAbove(false);
+        myApp.disposeDialog();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/system/src/test/java/javafx/embed/swing/SwingNodePlatformExitCrashTest.java	Fri Mar 30 13:19:53 2018 -0700
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javafx.embed.swing;
+
+import javafx.application.Platform;
+import org.junit.Ignore;
+import org.junit.Test;
+import util.Util;
+import javax.swing.SwingUtilities;
+import java.lang.reflect.InvocationTargetException;
+import java.util.concurrent.CountDownLatch;
+
+public class SwingNodePlatformExitCrashTest extends SwingNodeBase {
+
+    @Test
+    @Ignore("JDK-8190329")
+    public void testPlatformExitBeforeShowHoldEDT() throws InvocationTargetException, InterruptedException {
+        myApp.createAndShowStage();
+        CountDownLatch latch = new CountDownLatch(1);
+        SwingUtilities.invokeLater(()-> {
+            myApp.createDialogRunnable.run();
+            latch.countDown();
+            Util.sleep(LONG_WAIT_TIME);
+            myApp.dialog.setVisible(true);
+        });
+        latch.await();
+        testAbove(false);
+        runWaitSleep(()-> Platform.exit());
+        myApp.disposeDialog();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/system/src/test/java/javafx/scene/web/HTMLEditorTest.java	Fri Mar 30 13:19:53 2018 -0700
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javafx.scene.web;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import javafx.application.Application;
+import javafx.application.Platform;
+import javafx.event.Event;
+import javafx.scene.input.KeyCode;
+import javafx.scene.input.KeyEvent;
+import javafx.scene.Scene;
+import javafx.scene.web.HTMLEditor;
+import javafx.scene.web.WebView;
+import javafx.stage.Stage;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static javafx.concurrent.Worker.State.SUCCEEDED;
+import static junit.framework.TestCase.fail;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static util.Util.TIMEOUT;
+
+public class HTMLEditorTest {
+    private static final CountDownLatch launchLatch = new CountDownLatch(1);
+
+    // Maintain one application instance
+    static HTMLEditorTestApp htmlEditorTestApp;
+
+    public static class HTMLEditorTestApp extends Application {
+        Stage primaryStage = null;
+
+        public HTMLEditorTestApp() {
+            super();
+        }
+
+        @Override
+        public void init() {
+            HTMLEditorTest.htmlEditorTestApp = this;
+        }
+
+        @Override
+        public void start(Stage primaryStage) throws Exception {
+            this.primaryStage = primaryStage;
+            launchLatch.countDown();
+        }
+    }
+
+    @BeforeClass
+    public static void setupOnce() {
+        // Start the Test Application
+        new Thread(() -> Application.launch(HTMLEditorTestApp.class,
+            (String[]) null)).start();
+
+        try {
+            if (!launchLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)) {
+                fail("Timeout waiting for FX runtime to start");
+            }
+        } catch (InterruptedException exception) {
+            fail("Unexpected exception: " + exception);
+        }
+
+    }
+
+    @AfterClass
+    public static void tearDownOnce() {
+        Platform.exit();
+    }
+
+    /**
+     * @test
+     * @bug 8090011
+     * Summary Check document focus change behavior on tab key press
+     */
+    @Test
+    public void checkFocusChange() throws Exception {
+        final CountDownLatch editorStateLatch = new CountDownLatch(2);
+        final AtomicBoolean result = new AtomicBoolean(false);
+        Platform.runLater(() -> {
+            HTMLEditor htmlEditor = new HTMLEditor();
+            Scene scene = new Scene(htmlEditor);
+            htmlEditorTestApp.primaryStage.setScene(scene);
+            WebView webView = (WebView)htmlEditor.lookup(".web-view");
+            assertNotNull(webView);
+
+            KeyEvent tabKeyEvent = new KeyEvent(null, webView,
+                                KeyEvent.KEY_PRESSED, "", "",
+                                KeyCode.TAB, false, false, false, false);
+
+            webView.focusedProperty().
+                addListener((observable, oldValue, newValue) -> {
+                if (newValue) {
+                    webView.getEngine().
+                        executeScript("document.body.focus();");
+                    // Check focus change on repeated tab key press
+                    for (int i = 0; i < 10; ++i) {
+                        Event.fireEvent(webView, tabKeyEvent);
+                    }
+                    result.set("red".equals(webView.getEngine().
+                        executeScript("document.body.style.backgroundColor").
+                        toString()));
+                    htmlEditorTestApp.primaryStage.hide();
+                    editorStateLatch.countDown();
+                }
+            });
+
+            webView.getEngine().getLoadWorker().stateProperty().
+                addListener((observable, oldValue, newValue) -> {
+                if (newValue == SUCCEEDED) {
+                    webView.getEngine().executeScript(
+                        "document.body.style.backgroundColor='red';" +
+                        "document.body.onfocusout = function() {" +
+                        "document.body.style.backgroundColor = 'yellow';" +
+                        "}");
+                    htmlEditor.requestFocus();
+                    editorStateLatch.countDown();
+                }
+            });
+            htmlEditorTestApp.primaryStage.show();
+        });
+
+        try {
+            editorStateLatch.await(10, TimeUnit.SECONDS);
+        } catch (InterruptedException ex) {
+            throw new AssertionError(ex);
+        } finally {
+            assertTrue("Focus Change with design mode enabled ", result.get());
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/system/src/test/java/test/javafx/embed/swing/SwingNodeMemoryLeakTest.java	Fri Mar 30 13:19:53 2018 -0700
@@ -0,0 +1,190 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package test.javafx.embed.swing;
+
+import javafx.application.Application;
+import javafx.application.Platform;
+import javafx.embed.swing.SwingNode;
+import javafx.scene.Scene;
+import javafx.scene.layout.BorderPane;
+import javafx.scene.layout.HBox;
+import javafx.stage.Stage;
+
+import javax.swing.JLabel;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import util.Util;
+import static util.Util.TIMEOUT;
+import junit.framework.AssertionFailedError;
+import org.junit.Test;
+import org.junit.BeforeClass;
+import org.junit.AfterClass;
+import static org.junit.Assert.assertEquals;
+
+public class SwingNodeMemoryLeakTest {
+
+    final static int TOTAL_SWINGNODE = 10;
+    static CountDownLatch launchLatch;
+    final static int GC_ATTEMPTS = 10;
+    ArrayList<WeakReference<SwingNode>> weakRefArrSN =
+                                      new ArrayList(TOTAL_SWINGNODE);
+    ArrayList<WeakReference<JLabel>> weakRefArrJL =
+                                      new ArrayList(TOTAL_SWINGNODE);
+
+    @BeforeClass
+    public static void setupOnce() {
+        launchLatch = new CountDownLatch(1);
+        // Start the Application
+        new Thread(() -> Application.launch(SwingNodeMemoryLeakTest.MyApp.class, (String[])null)).start();
+
+        try {
+            if (!launchLatch.await(5 * TIMEOUT, TimeUnit.MILLISECONDS)) {
+                throw new AssertionFailedError("Timeout waiting for Application to launch ("+
+                    (5 * TIMEOUT) + " seconds)");
+            }
+        } catch (InterruptedException ex) {
+            AssertionFailedError err = new AssertionFailedError("Unexpected exception");
+            err.initCause(ex);
+            throw err;
+        }
+    }
+
+    @AfterClass
+    public static void teardownOnce() {
+        Platform.exit();
+    }
+
+    @Test
+    public void testSwingNodeMemoryLeak() {
+        Util.runAndWait(() -> {
+            testSwingNodeObjectsInStage();
+        });
+        attemptGCSwingNode();
+        assertEquals(TOTAL_SWINGNODE, getCleanedUpSwingNodeCount());
+
+        attemptGCJLabel();
+        assertEquals(TOTAL_SWINGNODE, getCleanedUpJLabelCount());
+    }
+
+    private void testSwingNodeObjectsInStage() {
+
+        Stage tempStage[] = new Stage[TOTAL_SWINGNODE];
+
+        for (int i = 0; i < TOTAL_SWINGNODE; i++) {
+            BorderPane root = new BorderPane();
+            SwingNode sw = new SwingNode();
+            JLabel label = new JLabel("SWING");
+            sw.setContent(label);
+
+            weakRefArrSN.add(i, new WeakReference<SwingNode>(sw));
+            weakRefArrJL.add(i, new WeakReference<JLabel>(label));
+
+            root.centerProperty().set(sw);
+
+            Stage stage = new Stage();
+            Scene scene = new Scene(root, 150, 100);
+            stage.setScene(scene);
+
+            tempStage[i] = stage;
+        }
+        if (TOTAL_SWINGNODE != weakRefArrSN.size()) {
+            System.out.println("TOTAL_SWINGNODE != weakRefArr.size()");
+        }
+        assertEquals(0, getCleanedUpSwingNodeCount());
+        assertEquals(0, getCleanedUpJLabelCount());
+        assertEquals(TOTAL_SWINGNODE, weakRefArrSN.size());
+        assertEquals(TOTAL_SWINGNODE, weakRefArrJL.size());
+
+        for (int i = 0; i < TOTAL_SWINGNODE; i++) {
+            if (tempStage[i] != null) {
+                tempStage[i].close();
+                tempStage[i] = null;
+            }
+        }
+    }
+
+    private void attemptGCSwingNode() {
+        // Attempt gc GC_ATTEMPTS times
+        for (int i = 0; i < GC_ATTEMPTS; i++) {
+            System.gc();
+            System.runFinalization();
+            if (getCleanedUpSwingNodeCount() == TOTAL_SWINGNODE) {
+                break;
+            }
+            try {
+                Thread.sleep(250);
+            } catch (InterruptedException e) {
+                System.err.println("InterruptedException occurred during Thread.sleep()");
+            }
+        }
+    }
+
+    private void attemptGCJLabel() {
+        // Attempt gc GC_ATTEMPTS times
+        for (int i = 0; i < GC_ATTEMPTS; i++) {
+            System.gc();
+            System.runFinalization();
+            if (getCleanedUpJLabelCount() == TOTAL_SWINGNODE) {
+                break;
+            }
+            try {
+                Thread.sleep(250);
+            } catch (InterruptedException e) {
+                System.err.println("InterruptedException occurred during Thread.sleep()");
+            }
+        }
+    }
+    private int getCleanedUpSwingNodeCount() {
+        int count = 0;
+        for (WeakReference<SwingNode> ref : weakRefArrSN) {
+            if (ref.get() == null) {
+                count++;
+            }
+        }
+        return count;
+    }
+
+    private int getCleanedUpJLabelCount() {
+        int count = 0;
+        for (WeakReference<JLabel> ref : weakRefArrJL) {
+            if (ref.get() == null) {
+                count++;
+            }
+        }
+        return count;
+    }
+
+    public static class MyApp extends Application {
+        @Override
+        public void start(Stage stage) throws Exception {
+            launchLatch.countDown();
+        }
+    }
+
+}