<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://jogamp.org/bugzilla/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.2"
          urlbase="https://jogamp.org/bugzilla/"
          
          maintainer="sgothel@jausoft.com"
>

    <bug>
          <bug_id>316</bug_id>
          
          <creation_ts>2007-09-07 10:30:30 +0200</creation_ts>
          <short_desc>Multi-Head issues, identical to issue 241</short_desc>
          <delta_ts>2010-03-24 07:53:39 +0100</delta_ts>
          <reporter_accessible>0</reporter_accessible>
          <cclist_accessible>0</cclist_accessible>
          <classification_id>3</classification_id>
          <classification>JogAmp</classification>
          <product>Jogl</product>
          <component>core</component>
          <version>1</version>
          <rep_platform>All</rep_platform>
          <op_sys>linux</op_sys>
          <bug_status>VERIFIED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P1</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Sven Gothel">sgothel</reporter>
          <assigned_to name="Sven Gothel">sgothel</assigned_to>
          
          
          <cf_type>DEFECT</cf_type>
          <cf_scm_refs></cf_scm_refs>
          <cf_workaround>---</cf_workaround>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>332</commentid>
    <comment_count>0</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2010-03-24 07:50:49 +0100</bug_when>
    <thetext>


---- Reported by moorej 2007-09-07 10:30:30 ----

Basically, I am creating a JFrame and adding a GLCanvas to it.  This sometimes
fails due to java.awt.Component.checkGD() throwing an IllegalArgumentException.
 This appears to be due to the fact that the GLCanvas and the JFrame have
different GraphicsDevice instances associated with them.  Component.checkGD()
simply checks the id string associated with the device for equality:
 
   void checkGD(String stringID) {
        if (graphicsConfig != null) {
            if (!graphicsConfig.getDevice().getIDstring().equals(stringID)) {
                throw new IllegalArgumentException(
                                                   &quot;adding a container to a
container on a different GraphicsDevice&quot;);
            }
        }
    }
 
On my system (back when I had two heads...) I was using NVidia&apos;s driver
(currently 100.14.11) in TwinView mode with Xorg (7.0, 7.1) on Linux 2.6.22-x64,
I see two GraphicsDevices, one corresponding to each head.  These have ID
strings something like &apos;:0.0&apos; and &apos;:0.1&apos; respectively.
 
It may be possible to work around the problem by detecting the graphics device
used by the container I am adding the GLCanvas to, and setting the GC on the
GLCanvas (during construction?), however, since the GLCanvas seems to work fine
when moving the canvas (and parent container) across heads, I suspect that it
may be possible to solve this within JOGL...
 
The attached code can be compiled (with jogl/gluegen-rt in the classpath) and
run with no arguments.  It will attempt to identify a pair of GraphicsDevices
that have identical id strings, except for the last part.  If successful, it
will open a JFrame on one of them, and attempt to add a GLCanvas.  If no
exception is thrown, it will move the JFrame to the other head and try to add
another GLCanvas.  This reliably demonstrates the issue on my system.


FILE : JOGLWithNVidiaTwinView.java

import java.awt.EventQueue;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ContainerAdapter;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.media.opengl.GLCanvas;
import javax.swing.JFrame;

/**
 * Class to exhibit issue with JOGL on Linux/Xorg/NVidia/TwinView.
 * 
 * This will cause an IllegalArgumentException to be thrown when adding a
GLCanvas to
 * a JFrame (the JFrame&apos;s content pane):
 * 
 * java.lang.IllegalArgumentException: adding a container to a container on a
different GraphicsDevice
    at java.awt.Component.checkGD(Component.java:965)
    at java.awt.Container.addImpl(Container.java:1027)
    at java.awt.Container.add(Container.java:352)
    at JOGLWithNVidiaTwinView$2.run(JOGLWithNVidiaTwinView.java:88)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
    at
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    at
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
 */
public class JOGLWithNVidiaTwinView {

    /**
     * @param args Not used
     */
    public static void main(String[] args) {
        final XScreenDevice[] twinViewPair = XScreenDevice.findTwinViewScreens();
        if (twinViewPair == null) {
            System.out.println(&quot;No TwinView screen pair was found, exiting.&quot;);
            System.exit(1);
        }

        /*
         * Create a new Window on one head.
         */
        final JFrame frame = new
JFrame(twinViewPair[0].device.getDefaultConfiguration());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        /*
         * Set the frame visible. We will wait until the window is opened before
         * moving it.
         */
        try {
            openAndWait(frame);

            System.out.println(&quot;Frame is on device with ID: &quot;
                            +
frame.getGraphicsConfiguration().getDevice().getIDstring());
            System.out.flush();
            addCanvas(frame);

            System.out.println(&quot;Moving window to second device...&quot;);
            System.out.flush();
            /*
             * Get the bounds of the second device and move the frame there.
             */
            final Rectangle secondDeviceBounds =
twinViewPair[1].device.getDefaultConfiguration().getBounds();

            moveTo(frame, secondDeviceBounds);

            System.out.println(&quot;Frame is on device with ID: &quot;
                            +
frame.getGraphicsConfiguration().getDevice().getIDstring());
            System.out.println(&quot;Adding GLCanvas...&quot;);
            System.out.flush();
            addCanvas(frame);
        } catch (InterruptedException ie) {
            System.out.println(&quot;Interrupted...&quot;);
        }
    }

    /**
     * Creates and adds a new GLCanvas to the specified JFrame, blocking
     * until the operation is complete (do not call this from the Event Thread)
     * 
     * @param frame
     * @throws InterruptedException
     */
    static void addCanvas(final JFrame frame) throws InterruptedException {
        final boolean[] added = new boolean[] { false };
        final GLCanvas canvas = new GLCanvas();
        final ContainerListener listener = new ContainerAdapter() {

            @Override
            public void componentAdded(ContainerEvent e) {
                if (e.getComponent() == canvas) {
                    synchronized (added) {
                        added[0] = true;
                        added.notifyAll();
                    }
                }
            }

        };
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                final GLCanvas canvas = new GLCanvas();
                try {
                    frame.getContentPane().add(canvas);
                } catch (IllegalArgumentException iae) {
                    System.out.println(&quot;Caught exception while adding canvas: &quot;);
                    System.out.flush();
                    iae.printStackTrace();
                }
            }
        });
        try {
            synchronized (added) {
                while (!added[0])
                    added.wait();
            }
        } finally {
            frame.removeContainerListener(listener);
        }
    }

    /**
     * Moves the specified frame somewhere (top-left corner) of the specified
rectangle, blocking until
     * the operation is complete (do not call this from the Event Thread).
     * 
     * @param frame
     * @param target
     * @throws InterruptedException
     */
    static void moveTo(final JFrame frame, final Rectangle target) throws
InterruptedException {
        final boolean[] moved = new boolean[] { target.contains(frame.getX(),
frame.getY(), frame.getWidth(), frame
                        .getHeight()) };
        final ComponentListener listener = new ComponentAdapter() {

            public void componentMoved(ComponentEvent e) {
                synchronized (moved) {
                    if (moved[0] = target.contains(frame.getX(), frame.getY(),
frame.getWidth(), frame.getHeight())) {
                        moved.notifyAll();
                        System.out.println(&quot;Moved to: &quot; + frame.getX() + &quot;, &quot; +
frame.getY());
                    } else {
                        System.out.println(&quot;Moved somewhere unexpected: &quot; +
frame.getX() + &quot;, &quot; + frame.getY());
                    }
                }
            }
        };
        frame.addComponentListener(listener);
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                frame.setLocation(target.x, target.y);
            }
        });
        try {
            synchronized (moved) {
                while (!moved[0])
                    moved.wait();
            }
        } finally {
            frame.removeComponentListener(listener);
        }
    }

    /**
     * Sets the specified frame visible and waits for a corresponding WindowEvent.  
     * Do not call from Event Thread.
     * 
     * @param frame
     * @throws InterruptedException
     */
    static void openAndWait(JFrame frame) throws InterruptedException {
        final boolean[] open = new boolean[] { frame.isVisible() };
        final WindowListener listener = new WindowAdapter() {

            public void windowOpened(WindowEvent e) {
                synchronized (open) {
                    open[0] = true;
                    open.notifyAll();
                }
            }
        };
        frame.addWindowListener(listener);
        frame.setVisible(true);
        try {
            synchronized (open) {
                while (!open[0])
                    open.wait();
            }
        } finally {
            frame.removeWindowListener(listener);
        }
    }

    /**
     * Class to extract some (Unix, or possible Linux-specific)
     * info from a GraphicsDevice instance&apos;s idString.
     */
    static class XScreenDevice {

        public final GraphicsDevice device;
        public final String hostName;
        public final String serverID;
        public final String displayID;

        public XScreenDevice(GraphicsDevice device) {
            this.device = device;
            String idStr = device.getIDstring();

            final int colonIdx = idStr.indexOf(&apos;:&apos;);
            if (colonIdx &lt; 0) {
                throw new IllegalArgumentException(&quot;The specified device (id: &quot;
+ idStr
                                + &quot;) does not appear to be an X screen device.&quot;);
            }
            hostName = idStr.substring(0, colonIdx);

            idStr = idStr.substring(colonIdx + 1);
            final int dotIdx = idStr.indexOf(&apos;.&apos;);
            if (dotIdx &lt; 0) {
                displayID = &quot;&quot;;
                serverID = idStr;
            } else {
                serverID = idStr.substring(0, dotIdx);
                displayID = idStr.substring(dotIdx + 1);
            }
        }

        /**
         * Checks whether the specified device might be involved in a TwinView
         * configuration with this device. This means that the hostNames and
         * serverIDs must be identical, and the displayID and device must be
         * different.
         * 
         * @param device A non-null XScreenDevice.
         * @return &lt;code&gt;true&lt;/code&gt; if the specified device is (probably) in
         *         a TwinView configuration with this device, false otherwise.
         */
        public boolean isTwinViewComplement(XScreenDevice device) {
            return device.device != this.device &amp;&amp;
device.hostName.equals(this.hostName)
                            &amp;&amp; device.hostName.equals(this.hostName) &amp;&amp;
!device.displayID.equals(this.displayID);
        }

        public String toString() {
            return &quot;X Screen Device -- id: &quot; + device.getIDstring() + &quot; (host=&quot;
+ hostName + &quot;, serverID=&quot; + serverID
                            + &quot;, displayID=&quot; + displayID + &quot;)&quot;;
        }

        /**
         * Identifies a pair of TwinView screens in the local graphics
         * environment. A TwinView pair (for the purposes of this method) has X
         * display IDs comprised of identical hostnames, followed by a colon,
         * identical server ids, followed by a &apos;.&apos;, and unique display ids. For
         * example, &apos;:0.0&apos; and &apos;:0.1&apos; would be a pair.
         * 
         * 
         * @return A pair of XScreenDevice instances representing two distinct
         *         GraphicsDevices in the local environment that are believed to
         *         be a TwinView pair, or null if none are found.
         */
        public static XScreenDevice[] findTwinViewScreens() {
            final GraphicsEnvironment graphicsEnv =
GraphicsEnvironment.getLocalGraphicsEnvironment();
            final GraphicsDevice[] screenDevices = graphicsEnv.getScreenDevices();
            if (screenDevices == null || screenDevices.length &lt; 2) {
                /*
                 * Not enough devices for a TwinView pair.
                 */
                return null;
            }
            for (int firstScreenIdx = 1; firstScreenIdx &lt; screenDevices.length;
firstScreenIdx++) {
                final XScreenDevice firstDevice;
                try {
                    firstDevice = new XScreenDevice(screenDevices[firstScreenIdx]);
                    System.out.println(&quot;Searching for TwinView complement to: &quot;
+ firstDevice);
                } catch (IllegalArgumentException iae) {
                    System.out.println(&quot;Device: &quot; +
screenDevices[firstScreenIdx].getIDstring()
                                    + &quot; does not appear to be an X screen&quot;);
                    continue;
                }

                for (int secondScreenIdx = firstScreenIdx - 1; secondScreenIdx
&gt;= 0; secondScreenIdx--) {
                    try {
                        final XScreenDevice secondDevice = new
XScreenDevice(screenDevices[secondScreenIdx]);
                        System.out.println(&quot;\tTesting: &quot; + secondDevice);
                        if (firstDevice.isTwinViewComplement(secondDevice)) {
                            System.out.println(&quot;TwinView Pair Identified!&quot;);
                            return new XScreenDevice[] { firstDevice,
secondDevice };
                        }
                    } catch (IllegalArgumentException iae) {
                        /*
                         * Already warned above...
                         */
                    }
                }
            }
            /*
             * None found.
             */
            return null;
        }
    }
}



---- Additional Comments From moorej 2007-09-07 10:31:37 ----

Created an attachment
Demo that illustrates TwinView error




---- Additional Comments From krisher 2007-09-28 09:28:18 ----

Created an attachment
Proposed patch to GLCanvas to choose a visual as late as possible, seems to fix checkGD issues on Linux/Xorg/Xinerama.




---- Additional Comments From kbr 2007-10-18 23:13:10 ----

Thanks for the patch and sorry for not looking into it until now. This fix is
excellent, basically the best that can be done under the circumstances. Fix has
been checked in and will be present in tomorrow&apos;s 1.1.1-rc6 build.




---- Additional Comments From kbr 2007-10-18 23:14:24 ----

*** Issue 241 has been marked as a duplicate of this issue. ***



--- Bug imported by sgothel@jausoft.com 2010-03-24 07:50 EDT  ---

This bug was previously known as _bug_ 316 at https://jogl.dev.java.net/bugs/show_bug.cgi?id=316
Imported an attachment (id=106)
Imported an attachment (id=107)

Unknown bug field &quot;has_duplicates&quot; encountered while moving bug
   &lt;has_duplicates&gt;
     &lt;bug_id&gt;241&lt;/bug_id&gt;
     &lt;who&gt;kbr&lt;/who&gt;
     &lt;when&gt;2007-10-18 23:14:37&lt;/when&gt;
&lt;/has_duplicates&gt;
The original submitter of attachment 106 is unknown.
   Reassigning to the person who moved it here: sgothel@jausoft.com.
The original submitter of attachment 107 is unknown.
   Reassigning to the person who moved it here: sgothel@jausoft.com.

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397</commentid>
    <comment_count>1</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2010-03-24 07:53:39 +0100</bug_when>
    <thetext>*** Bug 241 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>106</attachid>
            <date>2007-09-07 10:31:00 +0200</date>
            <delta_ts>2007-09-07 10:31:00 +0200</delta_ts>
            <desc>Demo that illustrates TwinView error</desc>
            <filename>JOGLWithNVidiaTwinView.java</filename>
            <type>text/plain</type>
            <size>12249</size>
            <attacher name="Sven Gothel">sgothel</attacher>
            
              <data encoding="base64">aW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7CmltcG9ydCBqYXZhLmF3dC5HcmFwaGljc0Rldmlj
ZTsKaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzRW52aXJvbm1lbnQ7CmltcG9ydCBqYXZhLmF3dC5S
ZWN0YW5nbGU7CmltcG9ydCBqYXZhLmF3dC5ldmVudC5Db21wb25lbnRBZGFwdGVyOwppbXBvcnQg
amF2YS5hd3QuZXZlbnQuQ29tcG9uZW50RXZlbnQ7CmltcG9ydCBqYXZhLmF3dC5ldmVudC5Db21w
b25lbnRMaXN0ZW5lcjsKaW1wb3J0IGphdmEuYXd0LmV2ZW50LkNvbnRhaW5lckFkYXB0ZXI7Cmlt
cG9ydCBqYXZhLmF3dC5ldmVudC5Db250YWluZXJFdmVudDsKaW1wb3J0IGphdmEuYXd0LmV2ZW50
LkNvbnRhaW5lckxpc3RlbmVyOwppbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsK
aW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwppbXBvcnQgamF2YS5hd3QuZXZlbnQu
V2luZG93TGlzdGVuZXI7CgppbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMQ2FudmFzOwppbXBv
cnQgamF2YXguc3dpbmcuSkZyYW1lOwoKLyoqCiAqIENsYXNzIHRvIGV4aGliaXQgaXNzdWUgd2l0
aCBKT0dMIG9uIExpbnV4L1hvcmcvTlZpZGlhL1R3aW5WaWV3LgogKiAKICogVGhpcyB3aWxsIGNh
dXNlIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB0byBiZSB0aHJvd24gd2hlbiBhZGRpbmcg
YSBHTENhbnZhcyB0bwogKiBhIEpGcmFtZSAodGhlIEpGcmFtZSdzIGNvbnRlbnQgcGFuZSk6CiAq
IAogKiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOiBhZGRpbmcgYSBjb250YWlu
ZXIgdG8gYSBjb250YWluZXIgb24gYSBkaWZmZXJlbnQgR3JhcGhpY3NEZXZpY2UKICAgIGF0IGph
dmEuYXd0LkNvbXBvbmVudC5jaGVja0dEKENvbXBvbmVudC5qYXZhOjk2NSkKICAgIGF0IGphdmEu
YXd0LkNvbnRhaW5lci5hZGRJbXBsKENvbnRhaW5lci5qYXZhOjEwMjcpCiAgICBhdCBqYXZhLmF3
dC5Db250YWluZXIuYWRkKENvbnRhaW5lci5qYXZhOjM1MikKICAgIGF0IEpPR0xXaXRoTlZpZGlh
VHdpblZpZXckMi5ydW4oSk9HTFdpdGhOVmlkaWFUd2luVmlldy5qYXZhOjg4KQogICAgYXQgamF2
YS5hd3QuZXZlbnQuSW52b2NhdGlvbkV2ZW50LmRpc3BhdGNoKEludm9jYXRpb25FdmVudC5qYXZh
OjIwOSkKICAgIGF0IGphdmEuYXd0LkV2ZW50UXVldWUuZGlzcGF0Y2hFdmVudChFdmVudFF1ZXVl
LmphdmE6NTk3KQogICAgYXQgamF2YS5hd3QuRXZlbnREaXNwYXRjaFRocmVhZC5wdW1wT25lRXZl
bnRGb3JGaWx0ZXJzKEV2ZW50RGlzcGF0Y2hUaHJlYWQuamF2YToyNzMpCiAgICBhdCBqYXZhLmF3
dC5FdmVudERpc3BhdGNoVGhyZWFkLnB1bXBFdmVudHNGb3JGaWx0ZXIoRXZlbnREaXNwYXRjaFRo
cmVhZC5qYXZhOjE4MykKICAgIGF0IGphdmEuYXd0LkV2ZW50RGlzcGF0Y2hUaHJlYWQucHVtcEV2
ZW50c0ZvckhpZXJhcmNoeShFdmVudERpc3BhdGNoVGhyZWFkLmphdmE6MTczKQogICAgYXQgamF2
YS5hd3QuRXZlbnREaXNwYXRjaFRocmVhZC5wdW1wRXZlbnRzKEV2ZW50RGlzcGF0Y2hUaHJlYWQu
amF2YToxNjgpCiAgICBhdCBqYXZhLmF3dC5FdmVudERpc3BhdGNoVGhyZWFkLnB1bXBFdmVudHMo
RXZlbnREaXNwYXRjaFRocmVhZC5qYXZhOjE2MCkKICAgIGF0IGphdmEuYXd0LkV2ZW50RGlzcGF0
Y2hUaHJlYWQucnVuKEV2ZW50RGlzcGF0Y2hUaHJlYWQuamF2YToxMjEpCiAqLwpwdWJsaWMgY2xh
c3MgSk9HTFdpdGhOVmlkaWFUd2luVmlldyB7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gYXJncyBO
b3QgdXNlZAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdz
KSB7CiAgICAgICAgZmluYWwgWFNjcmVlbkRldmljZVtdIHR3aW5WaWV3UGFpciA9IFhTY3JlZW5E
ZXZpY2UuZmluZFR3aW5WaWV3U2NyZWVucygpOwogICAgICAgIGlmICh0d2luVmlld1BhaXIgPT0g
bnVsbCkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vIFR3aW5WaWV3IHNjcmVl
biBwYWlyIHdhcyBmb3VuZCwgZXhpdGluZy4iKTsKICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7
CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIENyZWF0ZSBhIG5ldyBXaW5kb3cgb24g
b25lIGhlYWQuCiAgICAgICAgICovCiAgICAgICAgZmluYWwgSkZyYW1lIGZyYW1lID0gbmV3IEpG
cmFtZSh0d2luVmlld1BhaXJbMF0uZGV2aWNlLmdldERlZmF1bHRDb25maWd1cmF0aW9uKCkpOwog
ICAgICAgIGZyYW1lLnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihKRnJhbWUuRVhJVF9PTl9DTE9T
RSk7CiAgICAgICAgZnJhbWUuc2V0U2l6ZSgyMDAsIDIwMCk7CiAgICAgICAgLyoKICAgICAgICAg
KiBTZXQgdGhlIGZyYW1lIHZpc2libGUuIFdlIHdpbGwgd2FpdCB1bnRpbCB0aGUgd2luZG93IGlz
IG9wZW5lZCBiZWZvcmUKICAgICAgICAgKiBtb3ZpbmcgaXQuCiAgICAgICAgICovCiAgICAgICAg
dHJ5IHsKICAgICAgICAgICAgb3BlbkFuZFdhaXQoZnJhbWUpOwoKICAgICAgICAgICAgU3lzdGVt
Lm91dC5wcmludGxuKCJGcmFtZSBpcyBvbiBkZXZpY2Ugd2l0aCBJRDogIgogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKyBmcmFtZS5nZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKS5nZXREZXZp
Y2UoKS5nZXRJRHN0cmluZygpKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwogICAg
ICAgICAgICBhZGRDYW52YXMoZnJhbWUpOwoKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxu
KCJNb3Zpbmcgd2luZG93IHRvIHNlY29uZCBkZXZpY2UuLi4iKTsKICAgICAgICAgICAgU3lzdGVt
Lm91dC5mbHVzaCgpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBHZXQgdGhlIGJvdW5k
cyBvZiB0aGUgc2Vjb25kIGRldmljZSBhbmQgbW92ZSB0aGUgZnJhbWUgdGhlcmUuCiAgICAgICAg
ICAgICAqLwogICAgICAgICAgICBmaW5hbCBSZWN0YW5nbGUgc2Vjb25kRGV2aWNlQm91bmRzID0g
dHdpblZpZXdQYWlyWzFdLmRldmljZS5nZXREZWZhdWx0Q29uZmlndXJhdGlvbigpLmdldEJvdW5k
cygpOwoKICAgICAgICAgICAgbW92ZVRvKGZyYW1lLCBzZWNvbmREZXZpY2VCb3VuZHMpOwoKICAg
ICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGcmFtZSBpcyBvbiBkZXZpY2Ugd2l0aCBJRDog
IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmcmFtZS5nZXRHcmFwaGljc0NvbmZpZ3Vy
YXRpb24oKS5nZXREZXZpY2UoKS5nZXRJRHN0cmluZygpKTsKICAgICAgICAgICAgU3lzdGVtLm91
dC5wcmludGxuKCJBZGRpbmcgR0xDYW52YXMuLi4iKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5m
bHVzaCgpOwogICAgICAgICAgICBhZGRDYW52YXMoZnJhbWUpOwogICAgICAgIH0gY2F0Y2ggKElu
dGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigi
SW50ZXJydXB0ZWQuLi4iKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVz
IGFuZCBhZGRzIGEgbmV3IEdMQ2FudmFzIHRvIHRoZSBzcGVjaWZpZWQgSkZyYW1lLCBibG9ja2lu
ZwogICAgICogdW50aWwgdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSAoZG8gbm90IGNhbGwgdGhp
cyBmcm9tIHRoZSBFdmVudCBUaHJlYWQpCiAgICAgKiAKICAgICAqIEBwYXJhbSBmcmFtZQogICAg
ICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgogICAgICovCiAgICBzdGF0aWMgdm9pZCBh
ZGRDYW52YXMoZmluYWwgSkZyYW1lIGZyYW1lKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24g
ewogICAgICAgIGZpbmFsIGJvb2xlYW5bXSBhZGRlZCA9IG5ldyBib29sZWFuW10geyBmYWxzZSB9
OwogICAgICAgIGZpbmFsIEdMQ2FudmFzIGNhbnZhcyA9IG5ldyBHTENhbnZhcygpOwogICAgICAg
IGZpbmFsIENvbnRhaW5lckxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENvbnRhaW5lckFkYXB0ZXIo
KSB7CgogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcG9u
ZW50QWRkZWQoQ29udGFpbmVyRXZlbnQgZSkgewogICAgICAgICAgICAgICAgaWYgKGUuZ2V0Q29t
cG9uZW50KCkgPT0gY2FudmFzKSB7CiAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChh
ZGRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGRlZFswXSA9IHRydWU7CiAgICAgICAg
ICAgICAgICAgICAgICAgIGFkZGVkLm5vdGlmeUFsbCgpOwogICAgICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9OwogICAgICAgIEV2ZW50
UXVldWUuaW52b2tlTGF0ZXIobmV3IFJ1bm5hYmxlKCkgewoKICAgICAgICAgICAgcHVibGljIHZv
aWQgcnVuKCkgewogICAgICAgICAgICAgICAgZmluYWwgR0xDYW52YXMgY2FudmFzID0gbmV3IEdM
Q2FudmFzKCk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGZyYW1l
LmdldENvbnRlbnRQYW5lKCkuYWRkKGNhbnZhcyk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChJ
bGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CiAgICAgICAgICAgICAgICAgICAgU3lzdGVt
Lm91dC5wcmludGxuKCJDYXVnaHQgZXhjZXB0aW9uIHdoaWxlIGFkZGluZyBjYW52YXM6ICIpOwog
ICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKICAgICAgICAgICAgICAgICAg
ICBpYWUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0K
ICAgICAgICB9KTsKICAgICAgICB0cnkgewogICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGFkZGVk
KSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoIWFkZGVkWzBdKQogICAgICAgICAgICAgICAgICAg
IGFkZGVkLndhaXQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAg
ICAgIGZyYW1lLnJlbW92ZUNvbnRhaW5lckxpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICB9CiAg
ICB9CgogICAgLyoqCiAgICAgKiBNb3ZlcyB0aGUgc3BlY2lmaWVkIGZyYW1lIHNvbWV3aGVyZSAo
dG9wLWxlZnQgY29ybmVyKSBvZiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSwgYmxvY2tpbmcgdW50
aWwKICAgICAqIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUgKGRvIG5vdCBjYWxsIHRoaXMgZnJv
bSB0aGUgRXZlbnQgVGhyZWFkKS4KICAgICAqIAogICAgICogQHBhcmFtIGZyYW1lCiAgICAgKiBA
cGFyYW0gdGFyZ2V0CiAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgKi8K
ICAgIHN0YXRpYyB2b2lkIG1vdmVUbyhmaW5hbCBKRnJhbWUgZnJhbWUsIGZpbmFsIFJlY3Rhbmds
ZSB0YXJnZXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgZmluYWwgYm9v
bGVhbltdIG1vdmVkID0gbmV3IGJvb2xlYW5bXSB7IHRhcmdldC5jb250YWlucyhmcmFtZS5nZXRY
KCksIGZyYW1lLmdldFkoKSwgZnJhbWUuZ2V0V2lkdGgoKSwgZnJhbWUKICAgICAgICAgICAgICAg
ICAgICAgICAgLmdldEhlaWdodCgpKSB9OwogICAgICAgIGZpbmFsIENvbXBvbmVudExpc3RlbmVy
IGxpc3RlbmVyID0gbmV3IENvbXBvbmVudEFkYXB0ZXIoKSB7CgogICAgICAgICAgICBwdWJsaWMg
dm9pZCBjb21wb25lbnRNb3ZlZChDb21wb25lbnRFdmVudCBlKSB7CiAgICAgICAgICAgICAgICBz
eW5jaHJvbml6ZWQgKG1vdmVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVkWzBdID0g
dGFyZ2V0LmNvbnRhaW5zKGZyYW1lLmdldFgoKSwgZnJhbWUuZ2V0WSgpLCBmcmFtZS5nZXRXaWR0
aCgpLCBmcmFtZS5nZXRIZWlnaHQoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW92ZWQu
bm90aWZ5QWxsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigi
TW92ZWQgdG86ICIgKyBmcmFtZS5nZXRYKCkgKyAiLCAiICsgZnJhbWUuZ2V0WSgpKTsKICAgICAg
ICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0
LnByaW50bG4oIk1vdmVkIHNvbWV3aGVyZSB1bmV4cGVjdGVkOiAiICsgZnJhbWUuZ2V0WCgpICsg
IiwgIiArIGZyYW1lLmdldFkoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBmcmFtZS5hZGRDb21wb25lbnRM
aXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgICAgRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihuZXcgUnVu
bmFibGUoKSB7CgogICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAg
ICBmcmFtZS5zZXRMb2NhdGlvbih0YXJnZXQueCwgdGFyZ2V0LnkpOwogICAgICAgICAgICB9CiAg
ICAgICAgfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3luY2hyb25pemVkIChtb3ZlZCkg
ewogICAgICAgICAgICAgICAgd2hpbGUgKCFtb3ZlZFswXSkKICAgICAgICAgICAgICAgICAgICBt
b3ZlZC53YWl0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAg
ICBmcmFtZS5yZW1vdmVDb21wb25lbnRMaXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgICAgfQogICAg
fQoKICAgIC8qKgogICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIGZyYW1lIHZpc2libGUgYW5kIHdh
aXRzIGZvciBhIGNvcnJlc3BvbmRpbmcgV2luZG93RXZlbnQuICAKICAgICAqIERvIG5vdCBjYWxs
IGZyb20gRXZlbnQgVGhyZWFkLgogICAgICogCiAgICAgKiBAcGFyYW0gZnJhbWUKICAgICAqIEB0
aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KICAgICAqLwogICAgc3RhdGljIHZvaWQgb3BlbkFu
ZFdhaXQoSkZyYW1lIGZyYW1lKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAg
IGZpbmFsIGJvb2xlYW5bXSBvcGVuID0gbmV3IGJvb2xlYW5bXSB7IGZyYW1lLmlzVmlzaWJsZSgp
IH07CiAgICAgICAgZmluYWwgV2luZG93TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgV2luZG93QWRh
cHRlcigpIHsKCiAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChXaW5kb3dFdmVu
dCBlKSB7CiAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG9wZW4pIHsKICAgICAgICAgICAg
ICAgICAgICBvcGVuWzBdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBvcGVuLm5vdGlmeUFs
bCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBm
cmFtZS5hZGRXaW5kb3dMaXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgICAgZnJhbWUuc2V0VmlzaWJs
ZSh0cnVlKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG9wZW4pIHsK
ICAgICAgICAgICAgICAgIHdoaWxlICghb3BlblswXSkKICAgICAgICAgICAgICAgICAgICBvcGVu
LndhaXQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIGZy
YW1lLnJlbW92ZVdpbmRvd0xpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICB9CiAgICB9CgogICAg
LyoqCiAgICAgKiBDbGFzcyB0byBleHRyYWN0IHNvbWUgKFVuaXgsIG9yIHBvc3NpYmxlIExpbnV4
LXNwZWNpZmljKQogICAgICogaW5mbyBmcm9tIGEgR3JhcGhpY3NEZXZpY2UgaW5zdGFuY2UncyBp
ZFN0cmluZy4KICAgICAqLwogICAgc3RhdGljIGNsYXNzIFhTY3JlZW5EZXZpY2UgewoKICAgICAg
ICBwdWJsaWMgZmluYWwgR3JhcGhpY3NEZXZpY2UgZGV2aWNlOwogICAgICAgIHB1YmxpYyBmaW5h
bCBTdHJpbmcgaG9zdE5hbWU7CiAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBzZXJ2ZXJJRDsK
ICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGRpc3BsYXlJRDsKCiAgICAgICAgcHVibGljIFhT
Y3JlZW5EZXZpY2UoR3JhcGhpY3NEZXZpY2UgZGV2aWNlKSB7CiAgICAgICAgICAgIHRoaXMuZGV2
aWNlID0gZGV2aWNlOwogICAgICAgICAgICBTdHJpbmcgaWRTdHIgPSBkZXZpY2UuZ2V0SURzdHJp
bmcoKTsKCiAgICAgICAgICAgIGZpbmFsIGludCBjb2xvbklkeCA9IGlkU3RyLmluZGV4T2YoJzon
KTsKICAgICAgICAgICAgaWYgKGNvbG9uSWR4IDwgMCkgewogICAgICAgICAgICAgICAgdGhyb3cg
bmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHNwZWNpZmllZCBkZXZpY2UgKGlkOiAi
ICsgaWRTdHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpIGRvZXMgbm90IGFw
cGVhciB0byBiZSBhbiBYIHNjcmVlbiBkZXZpY2UuIik7CiAgICAgICAgICAgIH0KICAgICAgICAg
ICAgaG9zdE5hbWUgPSBpZFN0ci5zdWJzdHJpbmcoMCwgY29sb25JZHgpOwoKICAgICAgICAgICAg
aWRTdHIgPSBpZFN0ci5zdWJzdHJpbmcoY29sb25JZHggKyAxKTsKICAgICAgICAgICAgZmluYWwg
aW50IGRvdElkeCA9IGlkU3RyLmluZGV4T2YoJy4nKTsKICAgICAgICAgICAgaWYgKGRvdElkeCA8
IDApIHsKICAgICAgICAgICAgICAgIGRpc3BsYXlJRCA9ICIiOwogICAgICAgICAgICAgICAgc2Vy
dmVySUQgPSBpZFN0cjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNlcnZl
cklEID0gaWRTdHIuc3Vic3RyaW5nKDAsIGRvdElkeCk7CiAgICAgICAgICAgICAgICBkaXNwbGF5
SUQgPSBpZFN0ci5zdWJzdHJpbmcoZG90SWR4ICsgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9
CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZGV2
aWNlIG1pZ2h0IGJlIGludm9sdmVkIGluIGEgVHdpblZpZXcKICAgICAgICAgKiBjb25maWd1cmF0
aW9uIHdpdGggdGhpcyBkZXZpY2UuIFRoaXMgbWVhbnMgdGhhdCB0aGUgaG9zdE5hbWVzIGFuZAog
ICAgICAgICAqIHNlcnZlcklEcyBtdXN0IGJlIGlkZW50aWNhbCwgYW5kIHRoZSBkaXNwbGF5SUQg
YW5kIGRldmljZSBtdXN0IGJlCiAgICAgICAgICogZGlmZmVyZW50LgogICAgICAgICAqIAogICAg
ICAgICAqIEBwYXJhbSBkZXZpY2UgQSBub24tbnVsbCBYU2NyZWVuRGV2aWNlLgogICAgICAgICAq
IEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgKHBy
b2JhYmx5KSBpbgogICAgICAgICAqICAgICAgICAgYSBUd2luVmlldyBjb25maWd1cmF0aW9uIHdp
dGggdGhpcyBkZXZpY2UsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBwdWJs
aWMgYm9vbGVhbiBpc1R3aW5WaWV3Q29tcGxlbWVudChYU2NyZWVuRGV2aWNlIGRldmljZSkgewog
ICAgICAgICAgICByZXR1cm4gZGV2aWNlLmRldmljZSAhPSB0aGlzLmRldmljZSAmJiBkZXZpY2Uu
aG9zdE5hbWUuZXF1YWxzKHRoaXMuaG9zdE5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAmJiBkZXZpY2UuaG9zdE5hbWUuZXF1YWxzKHRoaXMuaG9zdE5hbWUpICYmICFkZXZpY2UuZGlz
cGxheUlELmVxdWFscyh0aGlzLmRpc3BsYXlJRCk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMg
U3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICByZXR1cm4gIlggU2NyZWVuIERldmljZSAt
LSBpZDogIiArIGRldmljZS5nZXRJRHN0cmluZygpICsgIiAoaG9zdD0iICsgaG9zdE5hbWUgKyAi
LCBzZXJ2ZXJJRD0iICsgc2VydmVySUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwg
ZGlzcGxheUlEPSIgKyBkaXNwbGF5SUQgKyAiKSI7CiAgICAgICAgfQoKICAgICAgICAvKioKICAg
ICAgICAgKiBJZGVudGlmaWVzIGEgcGFpciBvZiBUd2luVmlldyBzY3JlZW5zIGluIHRoZSBsb2Nh
bCBncmFwaGljcwogICAgICAgICAqIGVudmlyb25tZW50LiBBIFR3aW5WaWV3IHBhaXIgKGZvciB0
aGUgcHVycG9zZXMgb2YgdGhpcyBtZXRob2QpIGhhcyBYCiAgICAgICAgICogZGlzcGxheSBJRHMg
Y29tcHJpc2VkIG9mIGlkZW50aWNhbCBob3N0bmFtZXMsIGZvbGxvd2VkIGJ5IGEgY29sb24sCiAg
ICAgICAgICogaWRlbnRpY2FsIHNlcnZlciBpZHMsIGZvbGxvd2VkIGJ5IGEgJy4nLCBhbmQgdW5p
cXVlIGRpc3BsYXkgaWRzLiBGb3IKICAgICAgICAgKiBleGFtcGxlLCAnOjAuMCcgYW5kICc6MC4x
JyB3b3VsZCBiZSBhIHBhaXIuCiAgICAgICAgICogCiAgICAgICAgICogCiAgICAgICAgICogQHJl
dHVybiBBIHBhaXIgb2YgWFNjcmVlbkRldmljZSBpbnN0YW5jZXMgcmVwcmVzZW50aW5nIHR3byBk
aXN0aW5jdAogICAgICAgICAqICAgICAgICAgR3JhcGhpY3NEZXZpY2VzIGluIHRoZSBsb2NhbCBl
bnZpcm9ubWVudCB0aGF0IGFyZSBiZWxpZXZlZCB0bwogICAgICAgICAqICAgICAgICAgYmUgYSBU
d2luVmlldyBwYWlyLCBvciBudWxsIGlmIG5vbmUgYXJlIGZvdW5kLgogICAgICAgICAqLwogICAg
ICAgIHB1YmxpYyBzdGF0aWMgWFNjcmVlbkRldmljZVtdIGZpbmRUd2luVmlld1NjcmVlbnMoKSB7
CiAgICAgICAgICAgIGZpbmFsIEdyYXBoaWNzRW52aXJvbm1lbnQgZ3JhcGhpY3NFbnYgPSBHcmFw
aGljc0Vudmlyb25tZW50LmdldExvY2FsR3JhcGhpY3NFbnZpcm9ubWVudCgpOwogICAgICAgICAg
ICBmaW5hbCBHcmFwaGljc0RldmljZVtdIHNjcmVlbkRldmljZXMgPSBncmFwaGljc0Vudi5nZXRT
Y3JlZW5EZXZpY2VzKCk7CiAgICAgICAgICAgIGlmIChzY3JlZW5EZXZpY2VzID09IG51bGwgfHwg
c2NyZWVuRGV2aWNlcy5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAg
ICAgICAgICogTm90IGVub3VnaCBkZXZpY2VzIGZvciBhIFR3aW5WaWV3IHBhaXIuCiAgICAgICAg
ICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAg
ICAgICAgICAgIGZvciAoaW50IGZpcnN0U2NyZWVuSWR4ID0gMTsgZmlyc3RTY3JlZW5JZHggPCBz
Y3JlZW5EZXZpY2VzLmxlbmd0aDsgZmlyc3RTY3JlZW5JZHgrKykgewogICAgICAgICAgICAgICAg
ZmluYWwgWFNjcmVlbkRldmljZSBmaXJzdERldmljZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAg
ICAgICAgICAgICAgICAgICAgZmlyc3REZXZpY2UgPSBuZXcgWFNjcmVlbkRldmljZShzY3JlZW5E
ZXZpY2VzW2ZpcnN0U2NyZWVuSWR4XSk7CiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5w
cmludGxuKCJTZWFyY2hpbmcgZm9yIFR3aW5WaWV3IGNvbXBsZW1lbnQgdG86ICIgKyBmaXJzdERl
dmljZSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24g
aWFlKSB7CiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZXZpY2U6ICIg
KyBzY3JlZW5EZXZpY2VzW2ZpcnN0U2NyZWVuSWR4XS5nZXRJRHN0cmluZygpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYW4gWCBz
Y3JlZW4iKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0K
CiAgICAgICAgICAgICAgICBmb3IgKGludCBzZWNvbmRTY3JlZW5JZHggPSBmaXJzdFNjcmVlbklk
eCAtIDE7IHNlY29uZFNjcmVlbklkeCA+PSAwOyBzZWNvbmRTY3JlZW5JZHgtLSkgewogICAgICAg
ICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFhTY3JlZW5E
ZXZpY2Ugc2Vjb25kRGV2aWNlID0gbmV3IFhTY3JlZW5EZXZpY2Uoc2NyZWVuRGV2aWNlc1tzZWNv
bmRTY3JlZW5JZHhdKTsKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxu
KCJcdFRlc3Rpbmc6ICIgKyBzZWNvbmREZXZpY2UpOwogICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoZmlyc3REZXZpY2UuaXNUd2luVmlld0NvbXBsZW1lbnQoc2Vjb25kRGV2aWNlKSkgewogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUd2luVmlldyBQYWly
IElkZW50aWZpZWQhIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhT
Y3JlZW5EZXZpY2VbXSB7IGZpcnN0RGV2aWNlLCBzZWNvbmREZXZpY2UgfTsKICAgICAgICAgICAg
ICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVu
dEV4Y2VwdGlvbiBpYWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAg
ICAgICAgICAgICAgICogQWxyZWFkeSB3YXJuZWQgYWJvdmUuLi4KICAgICAgICAgICAgICAgICAg
ICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAg
ICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIE5vbmUgZm91bmQuCiAgICAgICAg
ICAgICAqLwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9Cn0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>107</attachid>
            <date>2007-09-28 09:28:00 +0200</date>
            <delta_ts>2007-09-28 09:28:00 +0200</delta_ts>
            <desc>Proposed patch to GLCanvas to choose a visual as late as possible, seems to fix checkGD issues on Linux/Xorg/Xinerama.</desc>
            <filename>jogl-1.1.1-issue-316.patch</filename>
            <type>text/plain</type>
            <size>5946</size>
            <attacher name="Sven Gothel">sgothel</attacher>
            
              <data encoding="base64">LS0tIGpvZ2wvc3JjL2NsYXNzZXMvamF2YXgvbWVkaWEvb3BlbmdsL0dMQ2FudmFzLmphdmEJMjAw
Ny0wOS0yOCAxMjoyNDoxMC4wMDAwMDAwMDAgLTA0MDAKKysrIC9ob21lL2tyaXNoZXIvd29ya3Nw
YWNlcy93b3Jrc3BhY2UubmV3L2pvZ2wtaXNzdWUvc3JjL21haW4vamF2YS9qYXZheC9tZWRpYS9v
cGVuZ2wvR0xDYW52YXMuamF2YQkyMDA3LTA5LTI4IDEyOjIyOjEyLjAwMDAwMDAwMCAtMDQwMApA
QCAtNzEsNiArNzEsMTAgQEAKICAgcHJpdmF0ZSBHTENvbnRleHRJbXBsIGNvbnRleHQ7CiAgIHBy
aXZhdGUgYm9vbGVhbiBhdXRvU3dhcEJ1ZmZlck1vZGUgPSB0cnVlOwogICBwcml2YXRlIGJvb2xl
YW4gc2VuZFJlc2hhcGUgPSBmYWxzZTsKKyAgCisgIHByaXZhdGUgR3JhcGhpY3NDb25maWd1cmF0
aW9uIGNob3NlbjsKKyAgcHJpdmF0ZSBHTENhcGFiaWxpdGllcyBnbENhcHM7CisgIHByaXZhdGUg
R0xDYXBhYmlsaXRpZXNDaG9vc2VyIGdsQ2FwQ2hvb3NlcjsKIAogICAvKiogQ3JlYXRlcyBhIG5l
dyBHTENhbnZhcyBjb21wb25lbnQgd2l0aCBhIGRlZmF1bHQgc2V0IG9mIE9wZW5HTAogICAgICAg
Y2FwYWJpbGl0aWVzLCB1c2luZyB0aGUgZGVmYXVsdCBPcGVuR0wgY2FwYWJpbGl0aWVzIHNlbGVj
dGlvbgpAQCAtMTE0LDcgKzExOCwyNiBAQAogICAgIC8vIGxlYXN0IGluIHRoZSBTdW4gQVdUIGlt
cGxlbWVudGF0aW9uKSB0aGF0IHRoaXMgd2lsbCByZXN1bHQgaW4KICAgICAvLyBlcXVpdmFsZW50
IGJlaGF2aW9yIHRvIGNhbGxpbmcgdGhlIG5vLWFyZyBzdXBlcigpIGNvbnN0cnVjdG9yCiAgICAg
Ly8gZm9yIENhbnZhcy4KLSAgICBzdXBlcihjaG9vc2VHcmFwaGljc0NvbmZpZ3VyYXRpb24oY2Fw
YWJpbGl0aWVzLCBjaG9vc2VyLCBkZXZpY2UpKTsKKyAgICAgIC8qCisgICAgICAgKiBXb3JrYXJv
dW5kIGZvciBYaW5lcmFtYSwgYWx3YXlzIHBhc3MgbnVsbCBzbyB3ZSBjYW4gZGV0ZWN0IHdoZXRo
ZXIKKyAgICAgICAqIHN1cGVyLmdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpIGlzIHJldHVybmlu
ZyB0aGUgQ2FudmFzJyBHQyAobnVsbCksCisgICAgICAgKiBvciBhbiBhbmNlc3RvciBjb21wb25l
bnQncyBHQyAobm9uLW51bGwpIGluIHRoZSBvdmVycmlkZGVuIHZlcnNpb24KKyAgICAgICAqIGJl
bG93LgorICAgICAgICovCisgICAgc3VwZXIoKTsKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIGNo
b3NlbiBjYXBhYmlsaXRpZXMgZm9yIHVzZSBpbiBnZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKS4K
KyAgICAgKi8KKyAgICBjaG9zZW4gPSBjaG9vc2VHcmFwaGljc0NvbmZpZ3VyYXRpb24oY2FwYWJp
bGl0aWVzLCBjaG9vc2VyLCBkZXZpY2UpOworICAgIGlmIChjaG9zZW4gIT0gbnVsbCkgeworICAg
ICAgICAvKgorICAgICAgICAgKiBJZiB3ZSBhcmUgcnVubmluZyBvbiBhIHBsYXRmb3JtIHRoYXQK
KyAgICAgICAgICogbXVzdCBzZWxlY3QgYSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gbm93LAorICAg
ICAgICAgKiBzYXZlIHRoZXNlIGZvciBsYXRlciB1c2UgaW4gZ2V0R3JhcGhpY3NDb25maWd1cmF0
aW9uKCkuCisgICAgICAgICAqLworICAgICAgICB0aGlzLmdsQ2FwQ2hvb3NlciA9IGNob29zZXI7
CisgICAgICAgIHRoaXMuZ2xDYXBzID0gY2FwYWJpbGl0aWVzOworICAgIH0KICAgICBpZiAoIUJl
YW5zLmlzRGVzaWduVGltZSgpKSB7CiAgICAgICBkcmF3YWJsZSA9IEdMRHJhd2FibGVGYWN0b3J5
LmdldEZhY3RvcnkoKS5nZXRHTERyYXdhYmxlKHRoaXMsIGNhcGFiaWxpdGllcywgY2hvb3Nlcik7
CiAgICAgICBjb250ZXh0ID0gKEdMQ29udGV4dEltcGwpIGRyYXdhYmxlLmNyZWF0ZUNvbnRleHQo
c2hhcmVXaXRoKTsKQEAgLTEyMiw2ICsxNDUsOTMgQEAKICAgICB9CiAgIH0KICAgCisgIC8qKgor
ICAgKiBPdmVycmlkZGVuIHRvIGNob29zZSBhIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBvbiBhIHBh
cmVudCBjb250YWluZXIncworICAgKiBHcmFwaGljc0RldmljZSBiZWNhdXNlIGJvdGggZGV2aWNl
cworICAgKi8KKyAgcHVibGljIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnZXRHcmFwaGljc0NvbmZp
Z3VyYXRpb24oKSB7CisgICAgICAvKgorICAgICAgICogV29ya2Fyb3VuZCBmb3IgcHJvYmxlbXMg
d2l0aCBYaW5lcmFtYSBhbmQgamF2YS5hd3QuQ29tcG9uZW50LmNoZWNrR0QKKyAgICAgICAqIHdo
ZW4gYWRkaW5nIHRvIGEgY29udGFpbmVyIG9uIGEgZGlmZmVyZW50IGdyYXBoaWNzIGRldmljZSB0
aGFuIHRoZQorICAgICAgICogb25lIHRoYXQgdGhpcyBDYW52YXMgaXMgYXNzb2NpYXRlZCB3aXRo
LgorICAgICAgICogCisgICAgICAgKiBHQyB3aWxsIGJlIG51bGwgdW5sZXNzOiAqIEEgbmF0aXZl
IHBlZXIgaGFzIGFzc2lnbmVkIGl0LiBUaGlzIG1lYW5zCisgICAgICAgKiB3ZSBoYXZlIGEgbmF0
aXZlIHBlZXIsIGFuZCBhcmUgYWxyZWFkeSBjb21pdHRlZCB0byBhIGdyYXBoaWNzCisgICAgICAg
KiBjb25maWd1cmF0aW9uLiAqIFRoaXMgY2FudmFzIGhhcyBiZWVuIGFkZGVkIHRvIGEgY29tcG9u
ZW50IGhpZXJhcmNoeQorICAgICAgICogYW5kIGhhcyBhbiBhbmNlc3RvciB3aXRoIGEgbm9uLW51
bGwgR0MsIGJ1dCB0aGUgbmF0aXZlIHBlZXIgaGFzIG5vdAorICAgICAgICogeWV0IGJlZW4gY3Jl
YXRlZC4gVGhpcyBtZWFucyB3ZSBjYW4gc3RpbGwgY2hvb3NlIHRoZSBHQyBvbiBhbGwKKyAgICAg
ICAqIHBsYXRmb3JtcyBzaW5jZSB0aGUgcGVlciBoYXNuJ3QgYmVlbiBjcmVhdGVkLgorICAgICAg
ICovCisgICAgICBmaW5hbCBHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2MgPSBzdXBlci5nZXRHcmFw
aGljc0NvbmZpZ3VyYXRpb24oKTsKKyAgICAgIC8qCisgICAgICAgKiBjaG9zZW4gaXMgb25seSBu
b24tbnVsbCBvbiBwbGF0Zm9ybXMgd2hlcmUgdGhlIEdMRHJhd2FibGVGYWN0b3J5CisgICAgICAg
KiByZXR1cm5zIGEgbm9uLW51bGwgR3JhcGhpY3NDb25maWd1cmF0aW9uIChpbiB0aGUgR0xDYW52
YXMKKyAgICAgICAqIGNvbnN0cnVjdG9yKS4KKyAgICAgICAqIAorICAgICAgICogaWYgZ2MgaXMg
ZnJvbSB0aGlzIENhbnZhcycgbmF0aXZlIHBlZXIgdGhlbiBpdCBzaG91bGQgZXF1YWwgY2hvc2Vu
LAorICAgICAgICogb3RoZXJ3aXNlIGl0IGlzIGZyb20gYW4gYW5jZXN0b3IgY29tcG9uZW50IHRo
YXQgdGhpcyBDYW52YXMgaXMgYmVpbmcKKyAgICAgICAqIGFkZGVkIHRvLCBhbmQgd2UgZ28gaW50
byB0aGlzIGJsb2NrLgorICAgICAgICovCisgICAgICBpZiAoZ2MgIT0gbnVsbCAmJiBjaG9zZW4g
IT0gbnVsbCAmJiAhY2hvc2VuLmVxdWFscyhnYykpIHsKKyAgICAgICAgICAvKgorICAgICAgICAg
ICAqIENoZWNrIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZ2MuIElmIHRoZXkgZGlmZmVyIGJ5IG9u
bHkgdGhlCisgICAgICAgICAgICogZGV2aWNlIHRoZW4gcmV0dXJuIGEgbmV3IEdDY29uZmlnIHdp
dGggdGhlIHN1cGVyLWNsYXNzJyBHRGV2aWNlCisgICAgICAgICAgICogKGFuZCBwcmVzdW1hYmx5
IHRoZSBzYW1lIHZpc3VhbCBJRCBpbiBYaW5lcmFtYSkuCisgICAgICAgICAgICogCisgICAgICAg
ICAgICovCisgICAgICAgICAgaWYgKCFjaG9zZW4uZ2V0RGV2aWNlKCkuZ2V0SURzdHJpbmcoKS5l
cXVhbHMoZ2MuZ2V0RGV2aWNlKCkuZ2V0SURzdHJpbmcoKSkpIHsKKyAgICAgICAgICAgICAgLyoK
KyAgICAgICAgICAgICAgICogSGVyZSB3ZSBzZWxlY3QgYSBHcmFwaGljc0NvbmZpZ3VyYXRpb24g
b24gdGhlIGFsdGVybmF0ZQorICAgICAgICAgICAgICAgKiBkZXZpY2UgdGhhdCBpcyBwcmVzdW1h
Ymx5IGlkZW50aWNhbCB0byB0aGUgY2hvc2VuCisgICAgICAgICAgICAgICAqIGNvbmZpZ3VyYXRp
b24sIGJ1dCBvbiB0aGUgb3RoZXIgZGV2aWNlLgorICAgICAgICAgICAgICAgKiAKKyAgICAgICAg
ICAgICAgICogU2hvdWxkIHJlYWxseSBjaGVjayB0byBlbnN1cmUgdGhhdCB3ZSBzZWxlY3QgYSBj
b25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAqIHdpdGggdGhlIHNhbWUgWCB2aXN1YWwgSUQg
Zm9yIFhpbmVyYW1hIHNjcmVlbnMsIG90aGVyd2lzZSB0aGUKKyAgICAgICAgICAgICAgICogR0xE
cmF3YWJsZSBtYXkgaGF2ZSB0aGUgd3JvbmcgdmlzdWFsIElEIChJIGRvbid0IHRoaW5rIHRoaXMK
KyAgICAgICAgICAgICAgICogZXZlciBnZXRzIHVwZGF0ZWQpLiBNYXkgbmVlZCB0byBhZGQgYSBt
ZXRob2QgdG8KKyAgICAgICAgICAgICAgICogWDExR0xEcmF3YWJsZUZhY3RvcnkgdG8gZG8gdGhp
cyBpbiBhIHBsYXRmb3JtIHNwZWNpZmljCisgICAgICAgICAgICAgICAqIG1hbm5lci4KKyAgICAg
ICAgICAgICAgICogCisgICAgICAgICAgICAgICAqIEhvd2V2ZXIsIG9uIHBsYXRmb3JtcyB3aGVy
ZSB3ZSBjYW4gYWN0dWFsbHkgZ2V0IGludG8gdGhpcworICAgICAgICAgICAgICAgKiBibG9jaywg
Ym90aCBkZXZpY2VzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHZpc3VhbCBsaXN0LCBhbmQgdGhlCisg
ICAgICAgICAgICAgICAqIHNhbWUgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgc2VsZWN0ZWQgaGVy
ZS4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGZpbmFsIEdyYXBoaWNzQ29uZmln
dXJhdGlvbiBjb21wYXRpYmxlID0gY2hvb3NlR3JhcGhpY3NDb25maWd1cmF0aW9uKGdsQ2Fwcywg
Z2xDYXBDaG9vc2VyLCBnYy5nZXREZXZpY2UoKSk7CisKKyAgICAgICAgICAgICAgaWYgKGNvbXBh
dGlibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAg
ICAqIFNhdmUgdGhlIG5ldyBHQyBmb3IgZXF1YWxzIHRlc3QgYWJvdmUsIGFuZCB0byByZXR1cm4g
dG8KKyAgICAgICAgICAgICAgICAgICAqIGFueSBvdXRzaWRlIGNhbGxlcnMgb2YgdGhpcyBtZXRo
b2QuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGNob3NlbiA9IGNv
bXBhdGlibGU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKgor
ICAgICAgICAgICAqIElmIGEgY29tcGF0aWJsZSBHQyB3YXMgbm90IGZvdW5kIGluIHRoZSBibG9j
ayBhYm92ZSwgdGhpcyB3aWxsCisgICAgICAgICAgICogcmV0dXJuIHRoZSBHQyB0aGF0IHdhcyBz
ZWxlY3RlZCBpbiB0aGUgY29uc3RydWN0b3IgKGFuZCBtaWdodAorICAgICAgICAgICAqIGNhdXNl
IGFuIGV4Y2VwdGlvbiBpbiBDb21wb25lbnQuY2hlY2tHRCB3aGVuIGFkZGluZyB0byBhCisgICAg
ICAgICAgICogY29udGFpbmVyLCBidXQgaW4gdGhpcyBjYXNlIHRoYXQgd291bGQgYmUgdGhlIGRl
c2lyZWQgYmVoYXZpb3IpLgorICAgICAgICAgICAqIAorICAgICAgICAgICAqLworICAgICAgICAg
IHJldHVybiBjaG9zZW47CisgICAgICB9IGVsc2UgaWYgKGdjID09IG51bGwpIHsKKyAgICAgICAg
ICAvKgorICAgICAgICAgICAqIFRoZSBHQyBpcyBudWxsLCB3aGljaCBtZWFucyB3ZSBoYXZlIG5v
IG5hdGl2ZSBwZWVyLCBhbmQgYXJlIG5vdAorICAgICAgICAgICAqIHBhcnQgb2YgYSAocmVhbGl6
ZWQpIGNvbXBvbmVudCBoaWVyYXJjaHkuIFNvIHdlIHJldHVybiB0aGUKKyAgICAgICAgICAgKiBk
ZXNpcmVkIHZpc3VhbCB0aGF0IHdhcyBzZWxlY3RlZCBpbiB0aGUgY29uc3RydWN0b3IgKHBvc3Np
Ymx5CisgICAgICAgICAgICogbnVsbCkuCisgICAgICAgICAgICovCisgICAgICAgICAgcmV0dXJu
IGNob3NlbjsKKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICAqIE90aGVyd2lzZSB3ZSBoYXZl
IG5vdCBleHBsaWNpdGx5IHNlbGVjdGVkIGEgR0MgaW4gdGhlIGNvbnN0cnVjdG9yLCBzbworICAg
ICAgICoganVzdCByZXR1cm4gd2hhdCBDYW52YXMgd291bGQgaGF2ZS4KKyAgICAgICAqLworICAg
ICAgcmV0dXJuIGdjOworICB9CisgIAogICBwdWJsaWMgR0xDb250ZXh0IGNyZWF0ZUNvbnRleHQo
R0xDb250ZXh0IHNoYXJlV2l0aCkgewogICAgIHJldHVybiBkcmF3YWJsZS5jcmVhdGVDb250ZXh0
KHNoYXJlV2l0aCk7CiAgIH0K
</data>

          </attachment>
      

    </bug>

</bugzilla>