merge mozilla-inbound to mozilla-central. r=merge a=merge
authorSebastian Hengst <archaeopteryx@coole-files.de>
Sat, 23 Sep 2017 11:38:06 +0200
changeset 382607 8db0c4ecd94cb62a35a25a5fe411d9f0aed7087e
parent 382586 8c3a1558322331c1fab9d1d2d7a94ef69f2a9212 (current diff)
parent 382606 15089d2ffe3c344a94e1af5b363382edca9b9098 (diff)
child 382608 a3b78b27e4b51f3edbd33749e9bc4b688ffd7888
child 382610 3828e44f5b0a56e7933b817d430cf32d41b03fe6
child 382619 0b8b08421289dd2df01352b7594102acab8e3ddc
push id51925
push userarchaeopteryx@coole-files.de
push dateSat, 23 Sep 2017 09:47:54 +0000
treeherderautoland@a3b78b27e4b5 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone58.0a1
first release with
nightly linux32
8db0c4ecd94c / 58.0a1 / 20170923100045 / files
nightly linux64
8db0c4ecd94c / 58.0a1 / 20170923100045 / files
nightly mac
8db0c4ecd94c / 58.0a1 / 20170923100045 / files
nightly win32
8db0c4ecd94c / 58.0a1 / 20170923100045 / files
nightly win64
8db0c4ecd94c / 58.0a1 / 20170923100045 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
merge mozilla-inbound to mozilla-central. r=merge a=merge MozReview-Commit-ID: It9WfByQfV3
dom/html/HTMLInputElement.cpp
dom/html/HTMLInputElement.h
netwerk/dns/nameprep.c
netwerk/dns/nameprep_template.c
netwerk/dns/nameprepdata.c
testing/web-platform/meta/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini
--- a/browser/components/preferences/containers.xul
+++ b/browser/components/preferences/containers.xul
@@ -27,17 +27,17 @@
 
   <keyset>
     <key key="&windowClose.key;" modifiers="accel" oncommand="window.close();"/>
   </keyset>
 
   <vbox class="contentPane largeDialogContainer" flex="1" hidden="true" id="containers-content">
     <hbox align="start">
       <label id="nameLabel" control="name" accesskey="&name2.accesskey;">&name2.label;</label>
-      <textbox id="name" placeholder="&name.placeholder;" flex="1" onkeyup="gContainersManager.checkForm();" />
+      <textbox id="name" placeholder="&name.placeholder;" flex="1" oninput="gContainersManager.checkForm();" />
     </hbox>
     <hbox align="center" id="iconWrapper">
       <label id="iconLabel" control="icon" accesskey="&icon2.accesskey;">&icon2.label;</label>
     </hbox>
     <hbox align="center" id="colorWrapper">
       <label id="colorLabel" control="color" accesskey="&color2.accesskey;">&color2.label;</label>
     </hbox>
   </vbox>
--- a/browser/components/preferences/in-content/containers.xul
+++ b/browser/components/preferences/in-content/containers.xul
@@ -34,12 +34,12 @@
   <vbox id="browserContainersbox">
 
     <richlistbox id="containersView" orient="vertical" persist="lastSelectedType"
                  flex="1">
     </richlistbox>
   </vbox>
   <vbox>
     <hbox flex="1">
-      <button onclick="gContainersPane.onAddButtonClick();" accesskey="&addButton.accesskey;" label="&addButton.label;"/>
+      <button id="containersAdd" onclick="gContainersPane.onAddButtonClick();" accesskey="&addButton.accesskey;" label="&addButton.label;"/>
     </hbox>
   </vbox>
 </groupbox>
--- a/browser/components/preferences/in-content/tests/browser.ini
+++ b/browser/components/preferences/in-content/tests/browser.ini
@@ -74,8 +74,10 @@ skip-if = e10s
 [browser_cookies_dialog.js]
 [browser_subdialogs.js]
 support-files =
   subdialog.xul
   subdialog2.xul
 [browser_telemetry.js]
 # Skip this test on Android as FHR and Telemetry are separate systems there.
 skip-if = !healthreport || !telemetry || (os == 'linux' && debug) || (os == 'android')
+[browser_containers_name_input.js]
+run-if = nightly_build # Containers is enabled only on Nightly
new file mode 100644
--- /dev/null
+++ b/browser/components/preferences/in-content/tests/browser_containers_name_input.js
@@ -0,0 +1,50 @@
+const CONTAINERS_URL = "chrome://browser/content/preferences/containers.xul";
+
+add_task(async function setup() {
+  await openPreferencesViaOpenPreferencesAPI("containers", { leaveOpen: true });
+  registerCleanupFunction(async function() {
+    await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+  });
+});
+
+add_task(async function() {
+  async function openDialog() {
+    let doc = gBrowser.selectedBrowser.contentDocument;
+
+    let dialogPromise = promiseLoadSubDialog(CONTAINERS_URL);
+
+    let addButton = doc.getElementById("containersAdd");
+    addButton.click();
+
+    let dialog = await dialogPromise;
+
+    return dialog.document;
+  }
+
+  let doc = await openDialog();
+
+  let name = doc.getElementById("name");
+  let btnApplyChanges = doc.getElementById("btnApplyChanges");
+
+  Assert.equal(name.value, "",
+               "The name textbox should initlally be empty");
+  Assert.ok(btnApplyChanges.disabled,
+            "The done button should initially be disabled");
+
+  function setName(value) {
+    name.value = value;
+
+    let event = new doc.defaultView.InputEvent("input", { data: value });
+    SpecialPowers.dispatchEvent(doc.defaultView, name, event);
+  }
+
+  setName("test");
+
+  Assert.ok(!btnApplyChanges.disabled,
+            "The done button should be enabled when the value is not empty");
+
+  setName("");
+
+  Assert.ok(btnApplyChanges.disabled,
+            "The done button should be disabled when the value is empty");
+});
--- a/build/mobile/remoteautomation.py
+++ b/build/mobile/remoteautomation.py
@@ -378,31 +378,32 @@ class RemoteAutomation(Automation):
             timer = 0
             noOutputTimer = 0
             interval = 10
             if timeout == None:
                 timeout = self.timeout
             status = 0
             top = self.procName
             slowLog = False
+            endTime = datetime.datetime.now() + datetime.timedelta(seconds = timeout)
             while (top == self.procName):
                 # Get log updates on each interval, but if it is taking
                 # too long, only do it every 60 seconds
                 hasOutput = False
                 if (not slowLog) or (timer % 60 == 0):
                     startRead = datetime.datetime.now()
                     hasOutput = self.read_stdout()
                     if (datetime.datetime.now() - startRead) > datetime.timedelta(seconds=5):
                         slowLog = True
                     if hasOutput:
                         noOutputTimer = 0
                 time.sleep(interval)
                 timer += interval
                 noOutputTimer += interval
-                if (timer > timeout):
+                if datetime.datetime.now() > endTime:
                     status = 1
                     break
                 if (noOutputTimeout and noOutputTimer > noOutputTimeout):
                     status = 2
                     break
                 if not hasOutput:
                     top = self.dm.getTopActivity()
             # Flush anything added to stdout during the sleep
--- a/devtools/client/themes/variables.css
+++ b/devtools/client/themes/variables.css
@@ -29,17 +29,17 @@
   --theme-toolbar-background-hover: rgba(221, 225, 228, 0.66);
   --theme-toolbar-background-alt: #f5f5f5;
   --theme-toolbar-hover: var(--grey-20);
   --theme-toolbar-hover-active: var(--grey-20);
 
   /* Selection */
   --theme-selection-background: var(--blue-55);
   --theme-selection-background-hover: #F0F9FE;
-  --theme-selection-color: #f5f7fa;
+  --theme-selection-color: #ffffff;
 
   /* Border color that splits the toolbars/panels/headers.
    * This needs to be sync with commandline.css and commandline-browser.css. */
   --theme-splitter-color: #e0e0e1;
 
   --theme-comment: var(--grey-50);
   --theme-comment-alt: #ccd1d5;
 
@@ -114,17 +114,17 @@
   --theme-toolbar-background-hover: #20232B;
   --theme-toolbar-background-alt: #2F343E;
   --theme-toolbar-hover: #252526;
   --theme-toolbar-hover-active: #252526;
 
   /* Selection */
   --theme-selection-background: #204E8A;
   --theme-selection-background-hover: #353B48;
-  --theme-selection-color: #f5f7fa;
+  --theme-selection-color: #ffffff;
 
   /* Border color that splits the toolbars/panels/headers.
    * This needs to be sync with commandline.css and commandline-browser.css. */
   --theme-splitter-color: #3c3c3d;
 
   --theme-comment: #939393;
   --theme-comment-alt: #939393;
 
--- a/dom/base/DOMRequest.cpp
+++ b/dom/base/DOMRequest.cpp
@@ -75,19 +75,16 @@ NS_IMPL_ADDREF_INHERITED(DOMRequest, DOM
 NS_IMPL_RELEASE_INHERITED(DOMRequest, DOMEventTargetHelper)
 
 /* virtual */ JSObject*
 DOMRequest::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
 {
   return DOMRequestBinding::Wrap(aCx, this, aGivenProto);
 }
 
-NS_IMPL_EVENT_HANDLER(DOMRequest, success)
-NS_IMPL_EVENT_HANDLER(DOMRequest, error)
-
 NS_IMETHODIMP
 DOMRequest::GetReadyState(nsAString& aReadyState)
 {
   DOMRequestReadyState readyState = ReadyState();
   switch (readyState) {
     case DOMRequestReadyState::Pending:
       aReadyState.AssignLiteral("pending");
       break;
--- a/dom/base/nsDOMDataChannel.cpp
+++ b/dom/base/nsDOMDataChannel.cpp
@@ -106,21 +106,16 @@ nsDOMDataChannel::Init(nsPIDOMWindowInne
   rv = CheckInnerWindowCorrectness();
   NS_ENSURE_SUCCESS(rv,rv);
 
   rv = nsContentUtils::GetUTFOrigin(principal,mOrigin);
   LOG(("%s: origin = %s\n",__FUNCTION__,NS_LossyConvertUTF16toASCII(mOrigin).get()));
   return rv;
 }
 
-NS_IMPL_EVENT_HANDLER(nsDOMDataChannel, open)
-NS_IMPL_EVENT_HANDLER(nsDOMDataChannel, error)
-NS_IMPL_EVENT_HANDLER(nsDOMDataChannel, close)
-NS_IMPL_EVENT_HANDLER(nsDOMDataChannel, message)
-
 // Most of the GetFoo()/SetFoo()s don't need to touch shared resources and
 // are safe after Close()
 NS_IMETHODIMP
 nsDOMDataChannel::GetLabel(nsAString& aLabel)
 {
   mDataChannel->GetLabel(aLabel);
   return NS_OK;
 }
--- a/dom/base/nsIDOMDOMRequest.idl
+++ b/dom/base/nsIDOMDOMRequest.idl
@@ -14,19 +14,16 @@ interface nsICursorContinueCallback;
 interface nsIDOMDOMRequest : nsIDOMEventTarget
 {
   readonly attribute DOMString readyState; // "pending" or "done"
 
   readonly attribute jsval result;
 
   // DOMError
   readonly attribute nsISupports error;
-
-  [implicit_jscontext] attribute jsval onsuccess;
-  [implicit_jscontext] attribute jsval onerror;
 };
 
 [scriptable, builtinclass, uuid(9a57e5de-ce93-45fa-8145-755722834f7c)]
 interface nsIDOMRequestService : nsISupports
 {
   nsIDOMDOMRequest createRequest(in mozIDOMWindow window);
   /*
    * @param aCallback
--- a/dom/base/nsIDOMDataChannel.idl
+++ b/dom/base/nsIDOMDataChannel.idl
@@ -21,17 +21,12 @@ interface nsIDOMDataChannel : nsIDOMEven
   readonly attribute boolean reliable;
   readonly attribute boolean ordered;
 
   readonly attribute DOMString readyState;
   readonly attribute unsigned long bufferedAmount;
 
   readonly attribute unsigned short id;
 
-  [implicit_jscontext] attribute jsval onopen;
-  [implicit_jscontext] attribute jsval onerror;
-  [implicit_jscontext] attribute jsval onclose;
-  [implicit_jscontext] attribute jsval onmessage;
-
   attribute DOMString binaryType;
 
   void close();
 };
--- a/dom/events/DOMEventTargetHelper.cpp
+++ b/dom/events/DOMEventTargetHelper.cpp
@@ -299,43 +299,16 @@ DOMEventTargetHelper::DispatchTrustedEve
 {
   event->SetTrusted(true);
 
   bool dummy;
   return DispatchEvent(event, &dummy);
 }
 
 nsresult
-DOMEventTargetHelper::SetEventHandler(nsIAtom* aType,
-                                      JSContext* aCx,
-                                      const JS::Value& aValue)
-{
-  RefPtr<EventHandlerNonNull> handler;
-  JS::Rooted<JSObject*> callable(aCx);
-  if (aValue.isObject() && JS::IsCallable(callable = &aValue.toObject())) {
-    handler = new EventHandlerNonNull(aCx, callable, dom::GetIncumbentGlobal());
-  }
-  SetEventHandler(aType, EmptyString(), handler);
-  return NS_OK;
-}
-
-void
-DOMEventTargetHelper::GetEventHandler(nsIAtom* aType,
-                                      JSContext* aCx,
-                                      JS::Value* aValue)
-{
-  EventHandlerNonNull* handler = GetEventHandler(aType, EmptyString());
-  if (handler) {
-    *aValue = JS::ObjectValue(*handler->Callback(aCx));
-  } else {
-    *aValue = JS::NullValue();
-  }
-}
-
-nsresult
 DOMEventTargetHelper::GetEventTargetParent(EventChainPreVisitor& aVisitor)
 {
   aVisitor.mCanHandle = true;
   aVisitor.mParentTarget = nullptr;
   return NS_OK;
 }
 
 nsresult
--- a/dom/events/DOMEventTargetHelper.h
+++ b/dom/events/DOMEventTargetHelper.h
@@ -113,24 +113,16 @@ public:
     return mListenerManager && mListenerManager->HasListenersFor(aType);
   }
 
   bool HasListenersFor(nsIAtom* aTypeWithOn)
   {
     return mListenerManager && mListenerManager->HasListenersFor(aTypeWithOn);
   }
 
-  nsresult SetEventHandler(nsIAtom* aType,
-                           JSContext* aCx,
-                           const JS::Value& aValue);
-  using dom::EventTarget::SetEventHandler;
-  void GetEventHandler(nsIAtom* aType,
-                       JSContext* aCx,
-                       JS::Value* aValue);
-  using dom::EventTarget::GetEventHandler;
   virtual nsPIDOMWindowOuter* GetOwnerGlobalForBindings() override
   {
     return nsPIDOMWindowOuter::GetFromCurrentInner(GetOwner());
   }
 
   nsresult CheckInnerWindowCorrectness() const
   {
     NS_ENSURE_STATE(!mHasOrHasHadOwnerWindow || mOwnerWindow);
@@ -222,42 +214,16 @@ private:
   bool mIsKeptAlive;
 };
 
 NS_DEFINE_STATIC_IID_ACCESSOR(DOMEventTargetHelper,
                               NS_DOMEVENTTARGETHELPER_IID)
 
 } // namespace mozilla
 
-// XPIDL event handlers
-#define NS_IMPL_EVENT_HANDLER(_class, _event)                                 \
-    NS_IMETHODIMP _class::GetOn##_event(JSContext* aCx,                       \
-                                        JS::MutableHandle<JS::Value> aValue)  \
-    {                                                                         \
-      GetEventHandler(nsGkAtoms::on##_event, aCx, aValue.address());          \
-      return NS_OK;                                                           \
-    }                                                                         \
-    NS_IMETHODIMP _class::SetOn##_event(JSContext* aCx,                       \
-                                        JS::Handle<JS::Value> aValue)         \
-    {                                                                         \
-      return SetEventHandler(nsGkAtoms::on##_event, aCx, aValue);             \
-    }
-
-#define NS_IMPL_FORWARD_EVENT_HANDLER(_class, _event, _baseclass)             \
-    NS_IMETHODIMP _class::GetOn##_event(JSContext* aCx,                       \
-                                        JS::MutableHandle<JS::Value> aValue)  \
-    {                                                                         \
-      return _baseclass::GetOn##_event(aCx, aValue);                          \
-    }                                                                         \
-    NS_IMETHODIMP _class::SetOn##_event(JSContext* aCx,                       \
-                                        JS::Handle<JS::Value> aValue)         \
-    {                                                                         \
-      return _baseclass::SetOn##_event(aCx, aValue);                          \
-    }
-
 // WebIDL event handlers
 #define IMPL_EVENT_HANDLER(_event)                                        \
   inline mozilla::dom::EventHandlerNonNull* GetOn##_event()               \
   {                                                                       \
     if (NS_IsMainThread()) {                                              \
       return GetEventHandler(nsGkAtoms::on##_event, EmptyString());       \
     }                                                                     \
     return GetEventHandler(nullptr, NS_LITERAL_STRING(#_event));          \
--- a/dom/html/HTMLInputElement.cpp
+++ b/dom/html/HTMLInputElement.cpp
@@ -3323,17 +3323,19 @@ HTMLInputElement::SetCheckedInternal(boo
   // Notify the frame
   if (mType == NS_FORM_INPUT_CHECKBOX || mType == NS_FORM_INPUT_RADIO) {
     nsIFrame* frame = GetPrimaryFrame();
     if (frame) {
       frame->InvalidateFrameSubtree();
     }
   }
 
-  UpdateAllValidityStates(aNotify);
+  // No need to update element state, since we're about to call
+  // UpdateState anyway.
+  UpdateAllValidityStatesButNotElementState();
 
   // Notify the document that the CSS :checked pseudoclass for this element
   // has changed state.
   UpdateState(aNotify);
 
   // Notify all radios in the group that value has changed, this is to let
   // radios to have the chance to update its states, e.g., :indeterminate.
   if (mType == NS_FORM_INPUT_RADIO) {
@@ -5012,18 +5014,19 @@ HTMLInputElement::HandleTypeChange(uint8
   } else if (aNotify) {
     RemoveStates(REQUIRED_STATES);
   } else {
     RemoveStatesSilently(REQUIRED_STATES);
   }
 
   UpdateHasRange();
 
-  // Do not notify, it will be done after if needed.
-  UpdateAllValidityStates(false);
+  // Update validity states, but not element state.  We'll update
+  // element state later, as part of this attribute change.
+  UpdateAllValidityStatesButNotElementState();
 
   UpdateApzAwareFlag();
 
   UpdateBarredFromConstraintValidation();
 
   if (oldType == NS_FORM_INPUT_IMAGE) {
     // We're no longer an image input.  Cancel our image requests, if we have
     // any.
@@ -7330,29 +7333,35 @@ HTMLInputElement::UpdateBadInputValidity
 {
   SetValidityState(VALIDITY_STATE_BAD_INPUT, HasBadInput());
 }
 
 void
 HTMLInputElement::UpdateAllValidityStates(bool aNotify)
 {
   bool validBefore = IsValid();
+  UpdateAllValidityStatesButNotElementState();
+
+  if (validBefore != IsValid()) {
+    UpdateState(aNotify);
+  }
+}
+
+void
+HTMLInputElement::UpdateAllValidityStatesButNotElementState()
+{
   UpdateTooLongValidityState();
   UpdateTooShortValidityState();
   UpdateValueMissingValidityState();
   UpdateTypeMismatchValidityState();
   UpdatePatternMismatchValidityState();
   UpdateRangeOverflowValidityState();
   UpdateRangeUnderflowValidityState();
   UpdateStepMismatchValidityState();
   UpdateBadInputValidityState();
-
-  if (validBefore != IsValid()) {
-    UpdateState(aNotify);
-  }
 }
 
 void
 HTMLInputElement::UpdateBarredFromConstraintValidation()
 {
   SetBarredFromConstraintValidation(mType == NS_FORM_INPUT_HIDDEN ||
                                     mType == NS_FORM_INPUT_BUTTON ||
                                     mType == NS_FORM_INPUT_RESET ||
--- a/dom/html/HTMLInputElement.h
+++ b/dom/html/HTMLInputElement.h
@@ -361,17 +361,24 @@ public:
   void     UpdateTooShortValidityState();
   void     UpdateValueMissingValidityState();
   void     UpdateTypeMismatchValidityState();
   void     UpdatePatternMismatchValidityState();
   void     UpdateRangeOverflowValidityState();
   void     UpdateRangeUnderflowValidityState();
   void     UpdateStepMismatchValidityState();
   void     UpdateBadInputValidityState();
+  // Update all our validity states and then update our element state
+  // as needed.  aNotify controls whether the element state update
+  // needs to notify.
   void     UpdateAllValidityStates(bool aNotify);
+  // Update all our validity states without updating element state.
+  // This should be called instead of UpdateAllValidityStates any time
+  // we're guaranteed that element state will be updated anyway.
+  void     UpdateAllValidityStatesButNotElementState();
   void     UpdateBarredFromConstraintValidation();
   nsresult GetValidationMessage(nsAString& aValidationMessage,
                                 ValidityStateType aType) override;
 
   // Override SetCustomValidity so we update our state properly when it's called
   // via bindings.
   void SetCustomValidity(const nsAString& aError);
 
--- a/dom/interfaces/offline/nsIDOMOfflineResourceList.idl
+++ b/dom/interfaces/offline/nsIDOMOfflineResourceList.idl
@@ -83,19 +83,9 @@ interface nsIDOMOfflineResourceList : ns
    */
   void update();
 
   /**
    * Swap in the newest version of the application cache, or disassociate
    * from the cache if the cache group is obsolete.
    */
   void swapCache();
-
-  /* Events */
-  [implicit_jscontext] attribute jsval onchecking;
-  [implicit_jscontext] attribute jsval onerror;
-  [implicit_jscontext] attribute jsval onnoupdate;
-  [implicit_jscontext] attribute jsval ondownloading;
-  [implicit_jscontext] attribute jsval onprogress;
-  [implicit_jscontext] attribute jsval onupdateready;
-  [implicit_jscontext] attribute jsval oncached;
-  [implicit_jscontext] attribute jsval onobsolete;
 };
--- a/dom/offline/nsDOMOfflineResourceList.cpp
+++ b/dom/offline/nsDOMOfflineResourceList.cpp
@@ -66,25 +66,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
   NS_INTERFACE_MAP_ENTRY(nsIOfflineCacheUpdateObserver)
   NS_INTERFACE_MAP_ENTRY(nsIObserver)
   NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
 NS_IMPL_ADDREF_INHERITED(nsDOMOfflineResourceList, DOMEventTargetHelper)
 NS_IMPL_RELEASE_INHERITED(nsDOMOfflineResourceList, DOMEventTargetHelper)
 
-NS_IMPL_EVENT_HANDLER(nsDOMOfflineResourceList, checking)
-NS_IMPL_EVENT_HANDLER(nsDOMOfflineResourceList, error)
-NS_IMPL_EVENT_HANDLER(nsDOMOfflineResourceList, noupdate)
-NS_IMPL_EVENT_HANDLER(nsDOMOfflineResourceList, downloading)
-NS_IMPL_EVENT_HANDLER(nsDOMOfflineResourceList, progress)
-NS_IMPL_EVENT_HANDLER(nsDOMOfflineResourceList, cached)
-NS_IMPL_EVENT_HANDLER(nsDOMOfflineResourceList, updateready)
-NS_IMPL_EVENT_HANDLER(nsDOMOfflineResourceList, obsolete)
-
 nsDOMOfflineResourceList::nsDOMOfflineResourceList(nsIURI *aManifestURI,
                                                    nsIURI *aDocumentURI,
                                                    nsIPrincipal *aLoadingPrincipal,
                                                    nsPIDOMWindowInner *aWindow)
   : DOMEventTargetHelper(aWindow)
   , mInitialized(false)
   , mManifestURI(aManifestURI)
   , mDocumentURI(aDocumentURI)
--- a/dom/workers/ServiceWorkerManager.h
+++ b/dom/workers/ServiceWorkerManager.h
@@ -331,16 +331,19 @@ public:
                 const Maybe<nsTArray<uint8_t>>& aData);
 
   nsresult
   NotifyUnregister(nsIPrincipal* aPrincipal, const nsAString& aScope);
 
   void
   WorkerIsIdle(ServiceWorkerInfo* aWorker);
 
+  void
+  CheckPendingReadyPromises();
+
 private:
   ServiceWorkerManager();
   ~ServiceWorkerManager();
 
   void
   Init(ServiceWorkerRegistrar* aRegistrar);
 
   void
@@ -441,19 +444,16 @@ private:
 
   void
   FireControllerChange(ServiceWorkerRegistrationInfo* aRegistration);
 
   void
   StorePendingReadyPromise(nsPIDOMWindowInner* aWindow, nsIURI* aURI,
                            Promise* aPromise);
 
-  void
-  CheckPendingReadyPromises();
-
   bool
   CheckReadyPromise(nsPIDOMWindowInner* aWindow, nsIURI* aURI,
                     Promise* aPromise);
 
   struct PendingReadyPromise final
   {
     PendingReadyPromise(nsIURI* aURI, Promise* aPromise)
       : mURI(aURI), mPromise(aPromise)
--- a/dom/workers/ServiceWorkerRegisterJob.cpp
+++ b/dom/workers/ServiceWorkerRegisterJob.cpp
@@ -41,19 +41,24 @@ ServiceWorkerRegisterJob::AsyncExecute()
     bool sameUVC = GetUpdateViaCache() == registration->GetUpdateViaCache();
     registration->SetUpdateViaCache(GetUpdateViaCache());
 
     // If we are resurrecting an uninstalling registration, then persist
     // it to disk again.  We preemptively removed it earlier during
     // unregister so that closing the window by shutting down the browser
     // results in the registration being gone on restart.
     if (registration->mPendingUninstall) {
+      registration->mPendingUninstall = false;
       swm->StoreRegistration(mPrincipal, registration);
+      // Its possible that a ready promise is created between when the
+      // uninstalling flag is set and when we resurrect the registration
+      // here.  In that case we might need to fire the ready promise
+      // now.
+      swm->CheckPendingReadyPromises();
     }
-    registration->mPendingUninstall = false;
     RefPtr<ServiceWorkerInfo> newest = registration->Newest();
     if (newest && mScriptSpec.Equals(newest->ScriptSpec()) && sameUVC) {
       SetRegistration(registration);
       Finish(NS_OK);
       return;
     }
   } else {
     registration = swm->CreateNewRegistration(mScope, mPrincipal,
--- a/dom/xhr/XMLHttpRequestMainThread.cpp
+++ b/dom/xhr/XMLHttpRequestMainThread.cpp
@@ -391,18 +391,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
   NS_INTERFACE_MAP_ENTRY(nsITimerCallback)
   NS_INTERFACE_MAP_ENTRY(nsINamed)
   NS_INTERFACE_MAP_ENTRY(nsISizeOfEventTarget)
 NS_INTERFACE_MAP_END_INHERITING(XMLHttpRequestEventTarget)
 
 NS_IMPL_ADDREF_INHERITED(XMLHttpRequestMainThread, XMLHttpRequestEventTarget)
 NS_IMPL_RELEASE_INHERITED(XMLHttpRequestMainThread, XMLHttpRequestEventTarget)
 
-NS_IMPL_EVENT_HANDLER(XMLHttpRequestMainThread, readystatechange)
-
 void
 XMLHttpRequestMainThread::DisconnectFromOwner()
 {
   XMLHttpRequestEventTarget::DisconnectFromOwner();
   Abort();
 }
 
 size_t
--- a/dom/xhr/nsIXMLHttpRequest.idl
+++ b/dom/xhr/nsIXMLHttpRequest.idl
@@ -287,29 +287,16 @@ interface nsIXMLHttpRequest : nsISupport
                        [optional] in nsILoadGroup loadGroup);
 
   /**
    * Upload process can be tracked by adding event listener to |upload|.
    */
   readonly attribute nsIXMLHttpRequestUpload upload;
 
   /**
-   * Meant to be a script-only mechanism for setting a callback function.
-   * The attribute is expected to be JavaScript function object. When the
-   * readyState changes, the callback function will be called.
-   * This attribute should not be used from native code!!
-   *
-   * After the initial response, all event listeners will be cleared.
-   * // XXXbz what does that mean, exactly?   
-   *
-   * Call open() before setting an onreadystatechange listener.
-   */
-  [implicit_jscontext] attribute jsval onreadystatechange;
-
-  /**
    * If true, the request will be sent without cookie and authentication
    * headers.
    */
   readonly attribute boolean mozAnon;
 
   /**
    * If true, the same origin policy will not be enforced on the request.
    */
--- a/gfx/2d/DrawTargetD2D1.cpp
+++ b/gfx/2d/DrawTargetD2D1.cpp
@@ -40,17 +40,17 @@ StaticRefPtr<ID2D1Factory1> DrawTargetD2
 RefPtr<ID2D1Factory1> D2DFactory()
 {
   return DrawTargetD2D1::factory();
 }
 
 DrawTargetD2D1::DrawTargetD2D1()
   : mPushedLayers(1)
   , mUsedCommandListsSincePurge(0)
-  , mDidComplexBlendWithListInList(false)
+  , mComplexBlendsWithListInList(0)
   , mDeviceSeq(0)
 {
 }
 
 DrawTargetD2D1::~DrawTargetD2D1()
 {
   PopAllClips();
 
@@ -945,16 +945,18 @@ DrawTargetD2D1::PopLayer()
 
   list->Close();
   mDC->SetTransform(D2D1::IdentityMatrix());
   mTransformDirty = true;
 
   DCCommandSink sink(mDC);
   list->Stream(&sink);
 
+  mComplexBlendsWithListInList = 0;
+
   mDC->PopLayer();
 }
 
 already_AddRefed<SourceSurface>
 DrawTargetD2D1::CreateSourceSurfaceFromData(unsigned char *aData,
                                             const IntSize &aSize,
                                             int32_t aStride,
                                             SurfaceFormat aFormat) const
@@ -1415,22 +1417,17 @@ DrawTargetD2D1::FinalizeDrawing(Composit
     }
 
     blendEffect->SetInput(0, tmpImage);
     blendEffect->SetInput(1, source);
     blendEffect->SetValue(D2D1_BLEND_PROP_MODE, D2DBlendMode(aOp));
 
     mDC->DrawImage(blendEffect, D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR, D2D1_COMPOSITE_MODE_BOUNDED_SOURCE_COPY);
 
-    // This may seem a little counter intuitive. If this is false, we go through the regular
-    // codepaths and set it to true. When this was true, GetImageForLayerContent will return
-    // a bitmap for the current command list and we will no longer have a complex blend
-    // with a list for tmpImage. Therefore we can set it to false again.
-    mDidComplexBlendWithListInList = !mDidComplexBlendWithListInList;
-
+    mComplexBlendsWithListInList++;
     return;
   }
 
   const RadialGradientPattern *pat = static_cast<const RadialGradientPattern*>(&aPattern);
   if (pat->mCenter1 == pat->mCenter2 && pat->mRadius1 == pat->mRadius2) {
     // Draw nothing!
     return;
   }
@@ -1501,16 +1498,18 @@ DrawTargetD2D1::GetDeviceSpaceClipRect(D
     aClipRect = IntersectRect(aClipRect, iter->mBounds);
     if (!iter->mIsPixelAligned) {
       aIsPixelAligned = false;
     }
   }
   return true;
 }
 
+static const uint32_t sComplexBlendsWithListAllowedInList = 4;
+
 already_AddRefed<ID2D1Image>
 DrawTargetD2D1::GetImageForLayerContent(bool aShouldPreserveContent)
 {
   PopAllClips();
 
   if (!CurrentLayer().mCurrentList) {
     RefPtr<ID2D1Bitmap> tmpBitmap;
     HRESULT hr = mDC->CreateBitmap(D2DIntSize(mSize), D2D1::BitmapProperties(D2DPixelFormat(mFormat)), getter_AddRefs(tmpBitmap));
@@ -1530,36 +1529,37 @@ DrawTargetD2D1::GetImageForLayerContent(
     return tmpBitmap.forget();
   } else {
     RefPtr<ID2D1CommandList> list = CurrentLayer().mCurrentList;
     mDC->CreateCommandList(getter_AddRefs(CurrentLayer().mCurrentList));
     mDC->SetTarget(CurrentTarget());
     list->Close();
 
     RefPtr<ID2D1Bitmap1> tmpBitmap;
-    if (mDidComplexBlendWithListInList) {
+    if (mComplexBlendsWithListInList >= sComplexBlendsWithListAllowedInList) {
       D2D1_BITMAP_PROPERTIES1 props =
         D2D1::BitmapProperties1(D2D1_BITMAP_OPTIONS_TARGET,
                                 D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,
                                                   D2D1_ALPHA_MODE_PREMULTIPLIED));
       mDC->CreateBitmap(mBitmap->GetPixelSize(), nullptr, 0, &props, getter_AddRefs(tmpBitmap));
       mDC->SetTransform(D2D1::IdentityMatrix());
       mDC->SetTarget(tmpBitmap);
       mDC->DrawImage(list, D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR, D2D1_COMPOSITE_MODE_BOUNDED_SOURCE_COPY);
       mDC->SetTarget(CurrentTarget());
+      mComplexBlendsWithListInList = 0;
     }
 
     DCCommandSink sink(mDC);
 
     if (aShouldPreserveContent) {
       list->Stream(&sink);
       PushAllClips();
     }
 
-    if (mDidComplexBlendWithListInList) {
+    if (tmpBitmap) {
       return tmpBitmap.forget();
     }
 
     return list.forget();
   }
 }
 
 already_AddRefed<ID2D1Geometry>
--- a/gfx/2d/DrawTargetD2D1.h
+++ b/gfx/2d/DrawTargetD2D1.h
@@ -286,17 +286,17 @@ private:
   TargetSet mDependingOnTargets;
 
   uint32_t mUsedCommandListsSincePurge;
   // When a BlendEffect has been drawn to a command list, and that command list is
   // subsequently used -again- as an input to a blend effect for a command list,
   // this causes an infinite recursion inside D2D as it tries to resolve the bounds.
   // If we resolve the current command list before this happens
   // we can avoid the subsequent hang. (See bug 1293586)
-  bool mDidComplexBlendWithListInList;
+  uint32_t mComplexBlendsWithListInList;
 
   static StaticRefPtr<ID2D1Factory1> mFactory;
   // This value is uesed to verify if the DrawTarget is created by a stale device.
   uint32_t mDeviceSeq;
 
   // List of effects we use
   bool EnsureLuminanceEffect();
   RefPtr<ID2D1Effect> mLuminanceEffect;
--- a/gfx/layers/TextureSourceProvider.h
+++ b/gfx/layers/TextureSourceProvider.h
@@ -56,17 +56,17 @@ public:
   virtual bool SupportsEffect(EffectTypes aEffect) { return true; }
 
   /// Most compositor backends operate asynchronously under the hood. This
   /// means that when a layer stops using a texture it is often desirable to
   /// wait for the end of the next composition before releasing the texture's
   /// ReadLock.
   /// This function provides a convenient way to do this delayed unlocking, if
   /// the texture itself requires it.
-  void UnlockAfterComposition(TextureHost* aTexture);
+  virtual void UnlockAfterComposition(TextureHost* aTexture);
 
   /// Most compositor backends operate asynchronously under the hood. This
   /// means that when a layer stops using a texture it is often desirable to
   /// wait for the end of the next composition before NotifyNotUsed() call.
   /// This function provides a convenient way to do this delayed NotifyNotUsed()
   /// call, if the texture itself requires it.
   /// See bug 1260611 and bug 1252835
   ///
--- a/gfx/layers/mlgpu/TextureSourceProviderMLGPU.cpp
+++ b/gfx/layers/mlgpu/TextureSourceProviderMLGPU.cpp
@@ -87,19 +87,31 @@ TextureSourceProviderMLGPU::CreateDataTe
 
 already_AddRefed<DataTextureSource>
 TextureSourceProviderMLGPU::CreateDataTextureSourceAround(gfx::DataSourceSurface* aSurface)
 {
   MOZ_ASSERT_UNREACHABLE("NYI");
   return nullptr;
 }
 
+void
+TextureSourceProviderMLGPU::UnlockAfterComposition(TextureHost* aTexture)
+{
+  TextureSourceProvider::UnlockAfterComposition(aTexture);
+
+  // If this is being called after we shutdown the compositor, we must finish
+  // read unlocking now to prevent a cycle.
+  if (!IsValid()) {
+    ReadUnlockTextures();
+  }
+}
+
 bool
 TextureSourceProviderMLGPU::NotifyNotUsedAfterComposition(TextureHost* aTextureHost)
 {
-  if (!mDevice) {
+  if (!IsValid()) {
     return false;
   }
   return TextureSourceProvider::NotifyNotUsedAfterComposition(aTextureHost);
 }
 
 } // namespace layers
 } // namespace mozilla
--- a/gfx/layers/mlgpu/TextureSourceProviderMLGPU.h
+++ b/gfx/layers/mlgpu/TextureSourceProviderMLGPU.h
@@ -21,16 +21,17 @@ public:
   ~TextureSourceProviderMLGPU() override;
 
   already_AddRefed<DataTextureSource>
   CreateDataTextureSource(TextureFlags aFlags) override;
 
   already_AddRefed<DataTextureSource>
   CreateDataTextureSourceAround(gfx::DataSourceSurface* aSurface) override;
 
+  void UnlockAfterComposition(TextureHost* aTexture) override;
   bool NotifyNotUsedAfterComposition(TextureHost* aTextureHost) override;
 
   int32_t GetMaxTextureSize() const override;
   TimeStamp GetLastCompositionEndTime() const override;
   bool SupportsEffect(EffectTypes aEffect) override;
   bool IsValid() const override;
 
 #ifdef XP_WIN
--- a/js/src/jsscript.cpp
+++ b/js/src/jsscript.cpp
@@ -66,16 +66,32 @@ using namespace js;
 using namespace js::gc;
 using namespace js::frontend;
 
 using mozilla::AsVariant;
 using mozilla::PodCopy;
 using mozilla::PodZero;
 using mozilla::RotateLeft;
 
+
+// Check that JSScript::data hasn't experienced obvious memory corruption.
+// This is a diagnositic for Bug 1367896.
+static void
+CheckScriptDataIntegrity(JSScript* script)
+{
+    ScopeArray* sa = script->scopes();
+    uint8_t* ptr = reinterpret_cast<uint8_t*>(sa->vector);
+
+    // Check that scope data - who's pointer is stored in data region - also
+    // points within the data region.
+    MOZ_RELEASE_ASSERT(ptr >= script->data &&
+                       ptr + sa->length <= script->data + script->dataSize(),
+                       "Corrupt JSScript::data");
+}
+
 template<XDRMode mode>
 bool
 js::XDRScriptConst(XDRState<mode>* xdr, MutableHandleValue vp)
 {
     JSContext* cx = xdr->cx();
 
     /*
      * A script constant can be an arbitrary primitive value as they are used
@@ -357,16 +373,18 @@ js::XDRScript(XDRState<mode>* xdr, Handl
     RootedScript script(cx);
     natoms = nsrcnotes = 0;
     nconsts = nobjects = nscopes = nregexps = ntrynotes = nscopenotes = nyieldoffsets = 0;
 
     if (mode == XDR_ENCODE) {
         script = scriptp.get();
         MOZ_ASSERT(script->functionNonDelazifying() == fun);
 
+        CheckScriptDataIntegrity(script);
+
         if (!fun && script->treatAsRunOnce() && script->hasRunOnce()) {
             // This is a toplevel or eval script that's runOnce.  We want to
             // make sure that we're not XDR-saving an object we emitted for
             // JSOP_OBJECT that then got modified.  So throw if we're not
             // cloning in JSOP_OBJECT or if we ever didn't clone in it in the
             // past.
             JSCompartment* comp = cx->compartment();
             if (!comp->creationOptions().cloneSingletons() ||
@@ -932,16 +950,18 @@ js::XDRScript(XDRState<mode>* xdr, Handl
         if (!XDRRelazificationInfo(xdr, fun, script, scriptEnclosingScope, &lazy))
             return false;
 
         if (mode == XDR_DECODE)
             script->setLazyScript(lazy);
     }
 
     if (mode == XDR_DECODE) {
+        CheckScriptDataIntegrity(script);
+
         scriptp.set(script);
 
         /* see BytecodeEmitter::tellDebuggerAboutCompiledScript */
         if (!fun && !cx->helperThread())
             Debugger::onNewScript(cx, script);
     }
 
     return true;
@@ -3488,16 +3508,18 @@ js::detail::CopyScript(JSContext* cx, Ha
 {
     if (src->treatAsRunOnce() && !src->functionNonDelazifying()) {
         JS_ReportErrorASCII(cx, "No cloning toplevel run-once scripts");
         return false;
     }
 
     /* NB: Keep this in sync with XDRScript. */
 
+    CheckScriptDataIntegrity(src);
+
     /* Some embeddings are not careful to use ExposeObjectToActiveJS as needed. */
     MOZ_ASSERT(!src->sourceObject()->isMarkedGray());
 
     uint32_t nconsts   = src->hasConsts()   ? src->consts()->length   : 0;
     uint32_t nobjects  = src->hasObjects()  ? src->objects()->length  : 0;
     uint32_t nscopes   = src->scopes()->length;
     uint32_t ntrynotes = src->hasTrynotes() ? src->trynotes()->length : 0;
     uint32_t nscopenotes = src->hasScopeNotes() ? src->scopeNotes()->length : 0;
new file mode 100644
--- /dev/null
+++ b/layout/base/crashtests/1401840.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<style>
+  html { display: table; }
+  body { overflow: scroll; }
+</style>
+<script>
+  onload = function() {
+    document.body.style.display = 'inline';
+  }
+</script>
--- a/layout/base/crashtests/crashtests.list
+++ b/layout/base/crashtests/crashtests.list
@@ -498,8 +498,9 @@ load 1390389.html
 load 1395591-1.html
 load 1395715-1.html
 load 1397398-1.html
 load 1397398-2.html
 load 1397398-3.html
 load 1398500.html
 load 1400438-1.html
 load 1400599-1.html
+load 1401840.html
--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -8631,23 +8631,31 @@ nsCSSFrameConstructor::ContentRemoved(ns
     // source is a fullscreen element, and we have code elsewhere to update
     // scrollbars after fullscreen elements are removed -- specifically, it's
     // part of the fullscreen cleanup code called by Element::UnbindFromTree.
     // We don't handle the fullscreen case here, because it doesn't change the
     // scrollbar styles override element stored on the prescontext.)
     Element* newOverrideElement =
       presContext->UpdateViewportScrollbarStylesOverride();
 
-    // Now if newOverrideElement is not the root and isn't aChild (which it
-    // could be if all we're doing here is reframing the current override
-    // element), it needs reframing.  In particular, it used to have a
-    // scrollframe (because its overflow was not "visible"), but now it will
+    // If aChild is the root (i.e. aContainer is null), then we don't
+    // need to do any reframing of newOverrideElement, because we're
+    // about to tear down the whole frame tree anyway.  And we need to
+    // make sure we don't do any such reframing, because reframing the
+    // <body> can trigger a reframe of the <html> and then reenter
+    // here.
+    //
+    // But if aChild is not the root, and if newOverrideElement is not
+    // the root and isn't aChild (which it could be if all we're doing
+    // here is reframing the current override element), it needs
+    // reframing.  In particular, it used to have a scrollframe
+    // (because its overflow was not "visible"), but now it will
     // propagate its overflow to the viewport, so it should not need a
     // scrollframe anymore.
-    if (newOverrideElement && newOverrideElement->GetParent() &&
+    if (aContainer && newOverrideElement && newOverrideElement->GetParent() &&
         newOverrideElement != aChild) {
       LAYOUT_PHASE_TEMP_EXIT();
       RecreateFramesForContent(newOverrideElement, InsertionKind::Async);
       LAYOUT_PHASE_TEMP_REENTER();
     }
   }
 
 #ifdef DEBUG
--- a/layout/reftests/forms/input/reftest.list
+++ b/layout/reftests/forms/input/reftest.list
@@ -7,8 +7,11 @@ include number/reftest.list
 include file/reftest.list
 include radio/reftest.list
 include range/reftest.list
 include text/reftest.list
 include percentage/reftest.list
 include hidden/reftest.list
 include color/reftest.list
 include datetime/reftest.list
+
+== selector-read-write-type-change-001.html selector-read-write-type-change-001-ref.html
+== selector-read-write-type-change-002.html selector-read-write-type-change-002-ref.html
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/input/selector-read-write-type-change-001-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      span { color: green; }
+    </style>
+  </head>
+  <body>
+    <input type="button"><span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/input/selector-read-write-type-change-001.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Check for correctly updating :read-write matching on type change</title>
+    <link rel="match" href="selector-read-write-type-change-001-ref.html">
+    <style>
+      span { color: green; }
+      :-moz-read-write + span { color: red }
+    </style>
+    <script>
+      onload = function() {
+        document.querySelector("input").type = "button";
+      }
+    </script>
+  </head>
+  <body>
+    <input required><span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/input/selector-read-write-type-change-002-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      span { color: green; }
+    </style>
+  </head>
+  <body>
+    <input required><span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/input/selector-read-write-type-change-002.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <title>Check for correctly updating :read-write matching on type change</title>
+    <link rel="match" href="selector-read-write-type-change-002-ref.html">
+    <style>
+      span { color: red; }
+      :-moz-read-write + span { color: green }
+    </style>
+    <script>
+      onload = function() {
+        // setTimeout because in some browsers apparently a toplevel restyle
+        // happens right after the load event fires?
+        setTimeout(function() {
+          document.querySelector("input").type = "";
+          document.documentElement.className = "";
+        }, 10);
+      }
+    </script>
+  </head>
+  <body>
+    <input type="hidden" required><span>This should be green</span>
+  </body>
+</html>
--- a/layout/tools/reftest/reftest.jsm
+++ b/layout/tools/reftest/reftest.jsm
@@ -800,17 +800,17 @@ function BuildConditionSandbox(aURL) {
     // for other platforms.  The integer is formed by 100 times the
     // major version plus the minor version, so 1006 for 10.6, 1010 for
     // 10.10, etc.
     var osxmatch = /Mac OS X (\d+).(\d+)$/.exec(hh.oscpu);
     sandbox.OSX = osxmatch ? parseInt(osxmatch[1]) * 100 + parseInt(osxmatch[2]) : undefined;
 
     // see if we have the test plugin available,
     // and set a sandox prop accordingly
-    sandbox.haveTestPlugin = !!getTestPlugin("Test Plug-in");
+    sandbox.haveTestPlugin = !sandbox.Android && !!getTestPlugin("Test Plug-in");
 
     // Set a flag on sandbox if the windows default theme is active
     sandbox.windowsDefaultTheme = gContainingWindow.matchMedia("(-moz-windows-default-theme)").matches;
 
     try {
         sandbox.nativeThemePref = !prefs.getBoolPref("mozilla.widget.disable-native-theme");
     } catch (e) {
         sandbox.nativeThemePref = true;
--- a/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_format_vp8.cc
+++ b/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_format_vp8.cc
@@ -612,19 +612,16 @@ size_t RtpPacketizerVp8::PayloadDescript
     ++length_bytes;  // Include the extension field.
   return length_bytes;
 }
 
 size_t RtpPacketizerVp8::PictureIdLength() const {
   if (hdr_info_.pictureId == kNoPictureId) {
     return 0;
   }
-  if (hdr_info_.pictureId <= 0x7F) {
-    return 1;
-  }
   return 2;
 }
 
 bool RtpPacketizerVp8::XFieldPresent() const {
   return (TIDFieldPresent() || TL0PicIdxFieldPresent() || PictureIdPresent() ||
           KeyIdxFieldPresent());
 }
 
--- a/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_format_vp8_test_helper.cc
+++ b/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_format_vp8_test_helper.cc
@@ -154,27 +154,21 @@ void RtpFormatVp8TestHelper::CheckHeader
 }
 
 // Verify that the I bit and the PictureID field are both set in accordance
 // with the information in hdr_info_->pictureId.
 void RtpFormatVp8TestHelper::CheckPictureID() {
   auto buffer = packet_.payload();
   if (hdr_info_->pictureId != kNoPictureId) {
     EXPECT_BIT_I_EQ(buffer[1], 1);
-    if (hdr_info_->pictureId > 0x7F) {
-      EXPECT_BIT_EQ(buffer[payload_start_], 7, 1);
-      EXPECT_EQ(buffer[payload_start_] & 0x7F,
-                (hdr_info_->pictureId >> 8) & 0x7F);
-      EXPECT_EQ(buffer[payload_start_ + 1], hdr_info_->pictureId & 0xFF);
-      payload_start_ += 2;
-    } else {
-      EXPECT_BIT_EQ(buffer[payload_start_], 7, 0);
-      EXPECT_EQ(buffer[payload_start_] & 0x7F, (hdr_info_->pictureId) & 0x7F);
-      payload_start_ += 1;
-    }
+    EXPECT_BIT_EQ(buffer[payload_start_], 7, 1);
+    EXPECT_EQ(buffer[payload_start_] & 0x7F,
+              (hdr_info_->pictureId >> 8) & 0x7F);
+    EXPECT_EQ(buffer[payload_start_ + 1], hdr_info_->pictureId & 0xFF);
+    payload_start_ += 2;
   } else {
     EXPECT_BIT_I_EQ(buffer[1], 0);
   }
 }
 
 // Verify that the L bit and the TL0PICIDX field are both set in accordance
 // with the information in hdr_info_->tl0PicIdx.
 void RtpFormatVp8TestHelper::CheckTl0PicIdx() {
--- a/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_format_vp8_unittest.cc
+++ b/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_format_vp8_unittest.cc
@@ -100,17 +100,17 @@ class RtpPacketizerVp8Test : public ::te
   test::RtpFormatVp8TestHelper* helper_;
 };
 
 TEST_F(RtpPacketizerVp8Test, TestStrictMode) {
   const size_t kSizeVector[] = {10, 8, 27};
   const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
   ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
 
-  hdr_info_.pictureId = 200;  // > 0x7F should produce 2-byte PictureID.
+  hdr_info_.pictureId = 200;
   const size_t kMaxPayloadSize = 13;
   RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, kStrict);
   packetizer.SetPayloadData(helper_->payload_data(),
                             helper_->payload_size(),
                             helper_->fragmentation());
 
   // The expected sizes are obtained by running a verified good implementation.
   const size_t kExpectedSizes[] = {9, 9, 12, 11, 11, 11, 10};
@@ -131,17 +131,17 @@ TEST_F(RtpPacketizerVp8Test, TestStrictM
 // Verify that we get a minimal number of packets if the partition plus header
 // size fits exactly in the maximum packet size.
 // Test is disabled: https://code.google.com/p/webrtc/issues/detail?id=4019.
 TEST_F(RtpPacketizerVp8Test, DISABLED_TestStrictEqualTightPartitions) {
   const size_t kSizeVector[] = {10, 10, 10};
   const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
   ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
 
-  hdr_info_.pictureId = 200;  // > 0x7F should produce 2-byte PictureID.
+  hdr_info_.pictureId = 200;
   const int kMaxPayloadSize = 14;
   RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, kStrict);
   packetizer.SetPayloadData(helper_->payload_data(), helper_->payload_size(),
                             helper_->fragmentation());
 
   // The expected sizes are obtained by running a verified good implementation.
   const size_t kExpectedSizes[] = {14, 14, 14};
   const int kExpectedPart[] = {0, 1, 2};
@@ -154,25 +154,25 @@ TEST_F(RtpPacketizerVp8Test, DISABLED_Te
                                  kExpectedFragStart, kExpectedNum);
 }
 
 TEST_F(RtpPacketizerVp8Test, TestAggregateMode) {
   const size_t kSizeVector[] = {60, 10, 10};
   const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
   ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
 
-  hdr_info_.pictureId = 20;  // <= 0x7F should produce 1-byte PictureID.
+  hdr_info_.pictureId = 20;
   const size_t kMaxPayloadSize = 25;
   RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, kAggregate);
   packetizer.SetPayloadData(helper_->payload_data(),
                             helper_->payload_size(),
                             helper_->fragmentation());
 
-  // The expected sizes are obtained by running a verified good implementation.
-  const size_t kExpectedSizes[] = {23, 23, 23, 23};
+  // The expected sizes are obtained by hand.
+  const size_t kExpectedSizes[] = {24, 24, 24, 24};
   const int kExpectedPart[] = {0, 0, 0, 1};
   const bool kExpectedFragStart[] = {true, false, false, true};
   const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
   CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
   CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
 
   helper_->GetAllPacketsAndCheck(&packetizer,
                                  kExpectedSizes,
@@ -181,25 +181,25 @@ TEST_F(RtpPacketizerVp8Test, TestAggrega
                                  kExpectedNum);
 }
 
 TEST_F(RtpPacketizerVp8Test, TestAggregateModeManyPartitions1) {
   const size_t kSizeVector[] = {1600, 200, 200, 200, 200, 200, 200, 200, 200};
   const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
   ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
 
-  hdr_info_.pictureId = 20;  // <= 0x7F should produce 1-byte PictureID.
+  hdr_info_.pictureId = 20;
   const size_t kMaxPayloadSize = 1000;
   RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, kAggregate);
   packetizer.SetPayloadData(helper_->payload_data(),
                             helper_->payload_size(),
                             helper_->fragmentation());
 
-  // The expected sizes are obtained by running a verified good implementation.
-  const size_t kExpectedSizes[] = {803, 803, 803, 803};
+  // The expected sizes are obtained by hand
+  const size_t kExpectedSizes[] = {804, 804, 804, 804};
   const int kExpectedPart[] = {0, 0, 1, 5};
   const bool kExpectedFragStart[] = {true, false, true, true};
   const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
   CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
   CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
 
   helper_->GetAllPacketsAndCheck(&packetizer,
                                  kExpectedSizes,
@@ -208,25 +208,25 @@ TEST_F(RtpPacketizerVp8Test, TestAggrega
                                  kExpectedNum);
 }
 
 TEST_F(RtpPacketizerVp8Test, TestAggregateModeManyPartitions2) {
   const size_t kSizeVector[] = {1599, 200, 200, 200, 1600, 200, 200, 200, 200};
   const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
   ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
 
-  hdr_info_.pictureId = 20;  // <= 0x7F should produce 1-byte PictureID.
+  hdr_info_.pictureId = 20;
   const size_t kMaxPayloadSize = 1000;
   RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, kAggregate);
   packetizer.SetPayloadData(helper_->payload_data(),
                             helper_->payload_size(),
                             helper_->fragmentation());
 
-  // The expected sizes are obtained by running a verified good implementation.
-  const size_t kExpectedSizes[] = {803, 802, 603, 803, 803, 803};
+  // The expected sizes are obtained by hand
+  const size_t kExpectedSizes[] = {804, 803, 604, 804, 804, 804};
   const int kExpectedPart[] = {0, 0, 1, 4, 4, 5};
   const bool kExpectedFragStart[] = {true, false, true, true, false, true};
   const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
   CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
   CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
 
   helper_->GetAllPacketsAndCheck(&packetizer,
                                  kExpectedSizes,
@@ -235,25 +235,25 @@ TEST_F(RtpPacketizerVp8Test, TestAggrega
                                  kExpectedNum);
 }
 
 TEST_F(RtpPacketizerVp8Test, TestAggregateModeTwoLargePartitions) {
   const size_t kSizeVector[] = {1654, 2268};
   const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
   ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
 
-  hdr_info_.pictureId = 20;  // <= 0x7F should produce 1-byte PictureID.
+  hdr_info_.pictureId = 20;
   const size_t kMaxPayloadSize = 1460;
   RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, kAggregate);
   packetizer.SetPayloadData(helper_->payload_data(),
                             helper_->payload_size(),
                             helper_->fragmentation());
 
-  // The expected sizes are obtained by running a verified good implementation.
-  const size_t kExpectedSizes[] = {830, 830, 1137, 1137};
+  // The expected sizes are obtained by hand
+  const size_t kExpectedSizes[] = {831, 831, 1138, 1138};
   const int kExpectedPart[] = {0, 0, 1, 1};
   const bool kExpectedFragStart[] = {true, false, true, false};
   const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
   CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
   CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
 
   helper_->GetAllPacketsAndCheck(&packetizer,
                                  kExpectedSizes,
@@ -263,17 +263,17 @@ TEST_F(RtpPacketizerVp8Test, TestAggrega
 }
 
 // Verify that EqualSize mode is forced if fragmentation info is missing.
 TEST_F(RtpPacketizerVp8Test, TestEqualSizeModeFallback) {
   const size_t kSizeVector[] = {10, 10, 10};
   const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
   ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
 
-  hdr_info_.pictureId = 200;          // > 0x7F should produce 2-byte PictureID
+  hdr_info_.pictureId = 200;
   const size_t kMaxPayloadSize = 12;  // Small enough to produce 4 packets.
   RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize);
   packetizer.SetPayloadData(
       helper_->payload_data(), helper_->payload_size(), NULL);
 
   // Expecting three full packets, and one with the remainder.
   const size_t kExpectedSizes[] = {12, 11, 12, 11};
   const int kExpectedPart[] = {0, 0, 0, 0};  // Always 0 for equal size mode.
--- a/netwerk/dns/moz.build
+++ b/netwerk/dns/moz.build
@@ -64,18 +64,12 @@ etld_data = GENERATED_FILES['etld_data.i
 etld_data.script = 'prepare_tlds.py'
 etld_data.inputs = ['effective_tld_names.dat']
 
 # need to include etld_data.inc
 LOCAL_INCLUDES += [
     '/netwerk/base',
 ]
 
-if CONFIG['ENABLE_INTL_API']:
-    DEFINES['IDNA2008'] = True
-    USE_LIBS += ['icu']
-else:
-    UNIFIED_SOURCES += [
-        'nameprep.c',
-    ]
+USE_LIBS += ['icu']
 
 if CONFIG['GNU_CXX']:
     CXXFLAGS += ['-Wno-error=shadow']
deleted file mode 100644
--- a/netwerk/dns/nameprep.c
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * Copyright (c) 2001,2002 Japan Network Information Center.
- * All rights reserved.
- *
- * By using this file, you agree to the terms and conditions set forth bellow.
- *
- * 			LICENSE TERMS AND CONDITIONS
- *
- * The following License Terms and Conditions apply, unless a different
- * license is obtained from Japan Network Information Center ("JPNIC"),
- * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda,
- * Chiyoda-ku, Tokyo 101-0047, Japan.
- *
- * 1. Use, Modification and Redistribution (including distribution of any
- *    modified or derived work) in source and/or binary forms is permitted
- *    under this License Terms and Conditions.
- *
- * 2. Redistribution of source code must retain the copyright notices as they
- *    appear in each source code file, this License Terms and Conditions.
- *
- * 3. Redistribution in binary form must reproduce the Copyright Notice,
- *    this License Terms and Conditions, in the documentation and/or other
- *    materials provided with the distribution.  For the purposes of binary
- *    distribution the "Copyright Notice" refers to the following language:
- *    "Copyright (c) 2000-2002 Japan Network Information Center.  All rights reserved."
- *
- * 4. The name of JPNIC may not be used to endorse or promote products
- *    derived from this Software without specific prior written approval of
- *    JPNIC.
- *
- * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC
- *    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- *    PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL JPNIC BE LIABLE
- *    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- *    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- *    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- *    BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- *    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- *    OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- *    ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- */
-
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "nsIDNKitInterface.h"
-
-#define UCS_MAX		0x7fffffff
-#define UNICODE_MAX	0x10ffff
-
-
-/*
- * Load NAMEPREP compiled tables.
- */
-#include "nameprepdata.c"
-
-/*
- * Define mapping/checking functions for each version of the draft.
- */
-
-#define VERSION id11
-#include "nameprep_template.c"
-#undef VERSION
-
-typedef const char	*(*nameprep_mapproc)(uint32_t v);
-typedef int		(*nameprep_checkproc)(uint32_t v);
-typedef idn_biditype_t	(*nameprep_biditypeproc)(uint32_t v);
-
-static struct idn_nameprep {
-	char *version;
-	nameprep_mapproc map_proc;
-	nameprep_checkproc prohibited_proc;
-	nameprep_checkproc unassigned_proc;
-	nameprep_biditypeproc biditype_proc;
-} nameprep_versions[] = {
-#define MAKE_NAMEPREP_HANDLE(version, id) \
-	{ version, \
-	  compose_sym2(nameprep_map_, id), \
-	  compose_sym2(nameprep_prohibited_, id), \
-	  compose_sym2(nameprep_unassigned_, id), \
-	  compose_sym2(nameprep_biditype_, id), }
-	MAKE_NAMEPREP_HANDLE("nameprep-11", id11),
-	{ NULL, NULL, NULL, NULL, NULL },
-};
-
-static idn_result_t	idn_nameprep_check(nameprep_checkproc proc,
-					   const uint32_t *str,
-					   const uint32_t **found);
-
-idn_result_t
-idn_nameprep_create(const char *version, idn_nameprep_t *handlep) {
-	idn_nameprep_t handle;
-
-	assert(handlep != NULL);
-
-	TRACE(("idn_nameprep_create(version=%-.50s)\n",
-	       version == NULL ? "<NULL>" : version));
-
-	if (version == NULL)
-		version = IDN_NAMEPREP_CURRENT;
-
-	/*
-	 * Lookup table for the specified version.  Since the number of
-	 * versions won't be large (I don't want see draft-23 or such :-),
-	 * simple linear search is OK.
-	 */
-	for (handle = nameprep_versions; handle->version != NULL; handle++) {
-		if (strcmp(handle->version, version) == 0) {
-			*handlep = handle;
-			return (idn_success);
-		}
-	}
-	return (idn_notfound);
-}
-
-void
-idn_nameprep_destroy(idn_nameprep_t handle) {
-	assert(handle != NULL);
-
-	TRACE(("idn_nameprep_destroy()\n"));
-
-	/* Nothing to do. */
-}
-
-idn_result_t
-idn_nameprep_map(idn_nameprep_t handle, const uint32_t *from,
-		 uint32_t *to, size_t tolen) {
-	assert(handle != NULL && from != NULL && to != NULL);
-
-	TRACE(("idn_nameprep_map(ctx=%s, from=\"%s\")\n",
-	       handle->version, idn__debug_ucs4xstring(from, 50)));
-
-	while (*from != '\0') {
-		uint32_t v = *from;
-		const char *mapped;
-
-		if (v > UCS_MAX) {
-			/* This cannot happen, but just in case.. */
-			return (idn_invalid_codepoint);
-		} else if (v > UNICODE_MAX) {
-			/* No mapping is possible. */
-			mapped = NULL;
-		} else {
-			/* Try mapping. */
-			mapped = (*handle->map_proc)(v);
-		}
-
-		if (mapped == NULL) {
-			/* No mapping. Just copy verbatim. */
-			if (tolen < 1)
-				return (idn_buffer_overflow);
-			*to++ = v;
-			tolen--;
-		} else {
-			const unsigned char *mappeddata;
-			size_t mappedlen;
-
-			mappeddata = (const unsigned char *)mapped + 1;
-			mappedlen = *mapped;
-
-			if (tolen < (mappedlen + 3) / 4)
-				return (idn_buffer_overflow);
-			tolen -= (mappedlen + 3) / 4;
-			while (mappedlen >= 4) {
-				*to  = *mappeddata++;
-				*to |= *mappeddata++ <<  8;
-				*to |= *mappeddata++ << 16;
-				*to |= *mappeddata++ << 24;
-				mappedlen -= 4;
-				to++;
-			}
-			if (mappedlen > 0) {
-				*to  = *mappeddata++;
-				*to |= (mappedlen >= 2) ?
-				       *mappeddata++ <<  8: 0;
-				*to |= (mappedlen >= 3) ?
-				       *mappeddata++ << 16: 0;
-				to++;
-			}
-		}
-		from++;
-	}
-	if (tolen == 0)
-		return (idn_buffer_overflow);
-	*to = '\0';
-	return (idn_success);
-}
-
-idn_result_t
-idn_nameprep_isprohibited(idn_nameprep_t handle, const uint32_t *str,
-			  const uint32_t **found) {
-	assert(handle != NULL && str != NULL && found != NULL);
-
-	TRACE(("idn_nameprep_isprohibited(ctx=%s, str=\"%s\")\n",
-	       handle->version, idn__debug_ucs4xstring(str, 50)));
-
-	return (idn_nameprep_check(handle->prohibited_proc, str, found));
-}
-
-idn_result_t
-idn_nameprep_isunassigned(idn_nameprep_t handle, const uint32_t *str,
-			  const uint32_t **found) {
-	assert(handle != NULL && str != NULL && found != NULL);
-
-	TRACE(("idn_nameprep_isunassigned(handle->version, str=\"%s\")\n",
-	       handle->version, idn__debug_ucs4xstring(str, 50)));
-
-	return (idn_nameprep_check(handle->unassigned_proc, str, found));
-}
-
-static idn_result_t
-idn_nameprep_check(nameprep_checkproc proc, const uint32_t *str,
-		   const uint32_t **found) {
-	uint32_t v;
-
-	while (*str != '\0') {
-		v = *str;
-
-		if (v > UCS_MAX) {
-			/* This cannot happen, but just in case.. */
-			return (idn_invalid_codepoint);
-		} else if (v > UNICODE_MAX) {
-			/* It is invalid.. */
-			*found = str;
-			return (idn_success);
-		} else if ((*proc)(v)) {
-			*found = str;
-			return (idn_success);
-		}
-		str++;
-	}
-	*found = NULL;
-	return (idn_success);
-}
-
-idn_result_t
-idn_nameprep_isvalidbidi(idn_nameprep_t handle, const uint32_t *str,
-			 const uint32_t **found) {
-	uint32_t v;
-	idn_biditype_t first_char;
-	idn_biditype_t last_char;
-	int found_r_al;
-
-	assert(handle != NULL && str != NULL && found != NULL);
-
-	TRACE(("idn_nameprep_isvalidbidi(ctx=%s, str=\"%s\")\n",
-	       handle->version, idn__debug_ucs4xstring(str, 50)));
-
-	if (*str == '\0') {
-		*found = NULL;
-		return (idn_success);
-	}
-
-	/*
-	 * check first character's type and initialize variables.
-	 */
-	found_r_al = 0;
-	if (*str > UCS_MAX) {
-		/* This cannot happen, but just in case.. */
-		return (idn_invalid_codepoint);
-	} else if (*str > UNICODE_MAX) {
-		/* It is invalid.. */
-		*found = str;
-		return (idn_success);
-	}
-	first_char = last_char = (*(handle->biditype_proc))(*str);
-	if (first_char == idn_biditype_r_al) {
-		found_r_al = 1;
-	}
-	str++;
-
-	/*
-	 * see whether string is valid or not.
-	 */
-	while (*str != '\0') {
-		v = *str;
-
-		if (v > UCS_MAX) {
-			/* This cannot happen, but just in case.. */
-			return (idn_invalid_codepoint);
-		} else if (v > UNICODE_MAX) {
-			/* It is invalid.. */
-			*found = str;
-			return (idn_success);
-		} else {
-			last_char = (*(handle->biditype_proc))(v);
-			if (found_r_al && last_char == idn_biditype_l) {
-				*found = str;
-				return (idn_success);
-			}
-			if (first_char != idn_biditype_r_al && last_char == idn_biditype_r_al) {
-				*found = str;
-				return (idn_success);
-			}
-			if (last_char == idn_biditype_r_al) {
-				found_r_al = 1;
-			}
-		}
-		str++;
-	}
-
-	if (found_r_al) {
-		if (last_char != idn_biditype_r_al) {
-			*found = str - 1;
-			return (idn_success);
-		}
-	}
-
-	*found = NULL;
-	return (idn_success);
-}
-
-idn_result_t
-idn_nameprep_createproc(const char *parameter, void **handlep) {
-	return idn_nameprep_create(parameter, (idn_nameprep_t *)handlep);
-}
-
-void
-idn_nameprep_destroyproc(void *handle) {
-	idn_nameprep_destroy((idn_nameprep_t)handle);
-}
-
-idn_result_t
-idn_nameprep_mapproc(void *handle, const uint32_t *from,
-		      uint32_t *to, size_t tolen) {
-	return idn_nameprep_map((idn_nameprep_t)handle, from, to, tolen);
-}
-
-idn_result_t
-idn_nameprep_prohibitproc(void *handle, const uint32_t *str,
-			   const uint32_t **found) {
-	return idn_nameprep_isprohibited((idn_nameprep_t)handle, str, found);
-}
-
-idn_result_t
-idn_nameprep_unassignedproc(void *handle, const uint32_t *str,
-			     const uint32_t **found) {
-	return idn_nameprep_isunassigned((idn_nameprep_t)handle, str, found);
-}
-
-idn_result_t
-idn_nameprep_bidiproc(void *handle, const uint32_t *str,
-		      const uint32_t **found) {
-	return idn_nameprep_isvalidbidi((idn_nameprep_t)handle, str, found);
-}
deleted file mode 100644
--- a/netwerk/dns/nameprep_template.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2001 Japan Network Information Center.  All rights reserved.
- *
- * By using this file, you agree to the terms and conditions set forth bellow.
- *
- * 			LICENSE TERMS AND CONDITIONS
- *
- * The following License Terms and Conditions apply, unless a different
- * license is obtained from Japan Network Information Center ("JPNIC"),
- * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda,
- * Chiyoda-ku, Tokyo 101-0047, Japan.
- *
- * 1. Use, Modification and Redistribution (including distribution of any
- *    modified or derived work) in source and/or binary forms is permitted
- *    under this License Terms and Conditions.
- *
- * 2. Redistribution of source code must retain the copyright notices as they
- *    appear in each source code file, this License Terms and Conditions.
- *
- * 3. Redistribution in binary form must reproduce the Copyright Notice,
- *    this License Terms and Conditions, in the documentation and/or other
- *    materials provided with the distribution.  For the purposes of binary
- *    distribution the "Copyright Notice" refers to the following language:
- *    "Copyright (c) 2000-2002 Japan Network Information Center.  All rights reserved."
- *
- * 4. The name of JPNIC may not be used to endorse or promote products
- *    derived from this Software without specific prior written approval of
- *    JPNIC.
- *
- * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC
- *    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- *    PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL JPNIC BE LIABLE
- *    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- *    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- *    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- *    BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- *    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- *    OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- *    ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- */
-
-/*
- * Include this file once for each version of NAMEPREP.
- * VERSION should be defined to appropriate value before inclusion.
- */
-
-#ifndef NAMEPREP_TEMPLATE_INIT
-#define NAMEPREP_TEMPLATE_INIT
-
-/* Symbol composition. */
-#define compose_sym2(a, b)		compose_sym2X(a, b)
-#define compose_sym2X(a, b)		a ## b
-#define compose_sym3(a, b, c)		compose_sym3X(a, b, c)
-#define compose_sym3X(a, b, c)		a ## b ## c
-
-/* The table is based on "Optimized Two-Stage Table" mentioned in
- * Unicode 3.0 page 106, extended to handle 21bit data instead of 16 bit.
- */
-
-/* Index calculation for multi-level index tables. */
-#define IDX0(type, v) IDX_0(v, BITS1(type), BITS2(type))
-#define IDX1(type, v) IDX_1(v, BITS1(type), BITS2(type))
-#define IDX2(type, v) IDX_2(v, BITS1(type), BITS2(type))
-
-#define IDX_0(v, bits1, bits2)	((v) >> ((bits1) + (bits2)))
-#define IDX_1(v, bits1, bits2)	(((v) >> (bits2)) & ((1 << (bits1)) - 1))
-#define IDX_2(v, bits1, bits2)	((v) & ((1 << (bits2)) - 1))
-
-#define BITS1(type)	type ## _BITS_1
-#define BITS2(type)	type ## _BITS_2
-
-#endif /* NAMEPREP_TEMPLATE_INIT */
-
-static const char *
-compose_sym2(nameprep_map_, VERSION) (uint32_t v) {
-	int idx0 = IDX0(MAP, v);
-	int idx1 = IDX1(MAP, v);
-	int idx2 = IDX2(MAP, v);
-	int offset;
-
-#define IMAP	compose_sym3(nameprep_, VERSION, _map_imap)
-#define TABLE	compose_sym3(nameprep_, VERSION, _map_table)
-#define DATA	compose_sym3(nameprep_, VERSION, _map_data)
-	offset = TABLE[IMAP[IMAP[idx0] + idx1]].tbl[idx2];
-	if (offset == 0)
-		return (NULL);	/* no mapping */
-	return (const char *)(DATA + offset);
-#undef IMAP
-#undef TABLE
-#undef DATA
-}
-
-static int
-compose_sym2(nameprep_prohibited_, VERSION) (uint32_t v) {
-	int idx0 = IDX0(PROH, v);
-	int idx1 = IDX1(PROH, v);
-	int idx2 = IDX2(PROH, v);
-	const unsigned char *bm;
-
-#define IMAP	compose_sym3(nameprep_, VERSION, _prohibited_imap)
-#define BITMAP	compose_sym3(nameprep_, VERSION, _prohibited_bitmap)
-	bm = BITMAP[IMAP[IMAP[idx0] + idx1]].bm;
-	return (bm[idx2 / 8] & (1 << (idx2 % 8)));
-#undef IMAP
-#undef BITMAP
-}
-
-static int
-compose_sym2(nameprep_unassigned_, VERSION) (uint32_t v) {
-	int idx0 = IDX0(UNAS, v);
-	int idx1 = IDX1(UNAS, v);
-	int idx2 = IDX2(UNAS, v);
-	const unsigned char *bm;
-
-#define IMAP	compose_sym3(nameprep_, VERSION, _unassigned_imap)
-#define BITMAP	compose_sym3(nameprep_, VERSION, _unassigned_bitmap)
-	bm = BITMAP[IMAP[IMAP[idx0] + idx1]].bm;
-	return (bm[idx2 / 8] & (1 << (idx2 % 8)));
-#undef IMAP
-#undef BITMAP
-}
-
-static idn_biditype_t
-compose_sym2(nameprep_biditype_, VERSION) (uint32_t v) {
-	int idx0 = IDX0(BIDI, v);
-	int idx1 = IDX1(BIDI, v);
-	int idx2 = IDX2(BIDI, v);
-	int offset;
-
-#define IMAP	compose_sym3(nameprep_, VERSION, _bidi_imap)
-#define TABLE	compose_sym3(nameprep_, VERSION, _bidi_table)
-#define DATA	compose_sym3(nameprep_, VERSION, _bidi_data)
-	offset = TABLE[IMAP[IMAP[idx0] + idx1]].tbl[idx2];
-	return DATA[offset];
-#undef IMAP
-#undef TABLE
-#undef DATA
-}
deleted file mode 100644
--- a/netwerk/dns/nameprepdata.c
+++ /dev/null
@@ -1,2588 +0,0 @@
-/*
- * Copyright (c) 2001,2002 Japan Network Information Center.
- * All rights reserved.
- *
- * By using this file, you agree to the terms and conditions set forth bellow.
- *
- * 			LICENSE TERMS AND CONDITIONS
- *
- * The following License Terms and Conditions apply, unless a different
- * license is obtained from Japan Network Information Center ("JPNIC"),
- * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda,
- * Chiyoda-ku, Tokyo 101-0047, Japan.
- *
- * 1. Use, Modification and Redistribution (including distribution of any
- *    modified or derived work) in source and/or binary forms is permitted
- *    under this License Terms and Conditions.
- *
- * 2. Redistribution of source code must retain the copyright notices as they
- *    appear in each source code file, this License Terms and Conditions.
- *
- * 3. Redistribution in binary form must reproduce the Copyright Notice,
- *    this License Terms and Conditions, in the documentation and/or other
- *    materials provided with the distribution.  For the purposes of binary
- *    distribution the "Copyright Notice" refers to the following language:
- *    "Copyright (c) 2000-2002 Japan Network Information Center.  All rights reserved."
- *
- * 4. The name of JPNIC may not be used to endorse or promote products
- *    derived from this Software without specific prior written approval of
- *    JPNIC.
- *
- * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC
- *    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- *    PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL JPNIC BE LIABLE
- *    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- *    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- *    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- *    BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- *    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- *    OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- *    ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- */
-
- /*
- * Do not edit this file!
- * This file is generated from NAMEPREP specification.
- */
-
-#define MAP_BITS_0	9
-#define MAP_BITS_1	7
-#define MAP_BITS_2	5
-
-#define PROH_BITS_0	7
-#define PROH_BITS_1	7
-#define PROH_BITS_2	7
-
-#define UNAS_BITS_0	7
-#define UNAS_BITS_1	7
-#define UNAS_BITS_2	7
-
-#define BIDI_BITS_0	9
-#define BIDI_BITS_1	7
-#define BIDI_BITS_2	5
-
-
-static const unsigned short nameprep_id11_map_imap[] = {
-	  272,   400,   528,   656,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   912,
-	 1040,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,  1168,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	  784,   784,   784,   784,   784,   784,   784,   784,
-	    0,     0,     1,     0,     0,     2,     3,     0,
-	    4,     5,     6,     7,     8,     9,    10,    11,
-	   12,    13,     0,     0,     0,     0,     0,     0,
-	    0,     0,    14,    15,    16,    17,    18,    19,
-	   20,    21,     0,    22,    23,    24,    25,    26,
-	   27,    28,    29,     0,    30,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	   31,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	   32,    33,    34,    35,    36,    37,    38,    39,
-	   40,    41,    42,    43,    44,    45,    46,    47,
-	   48,     0,     0,    49,     0,    50,     0,     0,
-	   51,    52,    53,    54,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,    55,    56,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,    57,    58,    59,    60,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	   61,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	   62,     0,     0,     0,     0,     0,     0,    63,
-	    0,    64,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	   65,    66,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	   67,    68,    69,    70,    71,    72,    73,    74,
-	   75,    76,    77,    78,    79,    67,    68,    69,
-	   70,    80,    81,    73,    74,    82,    83,    84,
-	   85,    86,    87,    88,    89,    90,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-};
-
-static const struct {
-	unsigned short tbl[32];
-} nameprep_id11_map_table[] = {
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    2,    4,    6,    8,   10,   12,   14,   16,   18,   20,
-	  22,   24,   26,   28,   30,   32,   34,   36,   38,   40,   42,
-	  44,   46,   48,   50,   52,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    1,    0,    0,    0,    0,    0,    0,    0,   54,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	  57,   59,   61,   63,   65,   67,   69,   71,   73,   75,   77,
-	  79,   81,   83,   85,   87,   89,   91,   93,   95,   97,   99,
-	 101,    0,  103,  105,  107,  109,  111,  113,  115,  117,
-	}},
-	{{
-	 123,    0,  126,    0,  129,    0,  132,    0,  135,    0,  138,
-	   0,  141,    0,  144,    0,  147,    0,  150,    0,  153,    0,
-	 156,    0,  159,    0,  162,    0,  165,    0,  168,    0,
-	}},
-	{{
-	 171,    0,  174,    0,  177,    0,  180,    0,  183,    0,  186,
-	   0,  189,    0,  192,    0,  195,    0,  202,    0,  205,    0,
-	 208,    0,    0,  211,    0,  214,    0,  217,    0,  220,
-	}},
-	{{
-	   0,  223,    0,  226,    0,  229,    0,  232,    0,  235,  241,
-	   0,  244,    0,  247,    0,  250,    0,  253,    0,  256,    0,
-	 259,    0,  262,    0,  265,    0,  268,    0,  271,    0,
-	}},
-	{{
-	 274,    0,  277,    0,  280,    0,  283,    0,  286,    0,  289,
-	   0,  292,    0,  295,    0,  298,    0,  301,    0,  304,    0,
-	 307,    0,  310,  312,    0,  315,    0,  318,    0,   38,
-	}},
-	{{
-	   0,  321,  324,    0,  327,    0,  330,  333,    0,  336,  339,
-	 342,    0,    0,  345,  348,  351,  354,    0,  357,  360,    0,
-	 363,  366,  369,    0,    0,    0,  372,  375,    0,  378,
-	}},
-	{{
-	 381,    0,  384,    0,  387,    0,  390,  393,    0,  396,    0,
-	   0,  399,    0,  402,  405,    0,  408,  411,  414,    0,  417,
-	   0,  420,  423,    0,    0,    0,  426,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,  429,  429,    0,  432,  432,    0,  435,
-	 435,    0,  438,    0,  441,    0,  444,    0,  447,    0,  450,
-	   0,  453,    0,  456,    0,  459,    0,    0,  462,    0,
-	}},
-	{{
-	 465,    0,  468,    0,  471,    0,  474,    0,  477,    0,  480,
-	   0,  483,    0,  486,    0,  489,  496,  496,    0,  499,    0,
-	 502,  505,  508,    0,  511,    0,  514,    0,  517,    0,
-	}},
-	{{
-	 520,    0,  523,    0,  526,    0,  529,    0,  532,    0,  535,
-	   0,  538,    0,  541,    0,  544,    0,  547,    0,  550,    0,
-	 553,    0,  556,    0,  559,    0,  562,    0,  565,    0,
-	}},
-	{{
-	 568,    0,  571,    0,  574,    0,  577,    0,  580,    0,  583,
-	   0,  586,    0,  589,    0,  592,    0,  595,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,  598,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    1,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,  601,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,  608,    0,  611,  614,  617,
-	   0,  620,    0,  623,  626,  629,  640,  643,  646,  649,  652,
-	 655,  658,  661,  598,  664,  667,   54,  670,  673,  676,
-	}},
-	{{
-	 679,  682,    0,  685,  688,  691,  694,  697,  700,  703,  706,
-	 709,    0,    0,    0,    0,  712,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,  685,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,  643,  661,  691,  623,  709,  694,
-	 679,    0,  723,    0,  726,    0,  729,    0,  732,    0,
-	}},
-	{{
-	 735,    0,  738,    0,  741,    0,  744,    0,  747,    0,  750,
-	   0,  753,    0,  756,    0,  664,  682,  685,    0,  661,  652,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	 759,  762,  765,  768,  771,  774,  777,  780,  783,  786,  789,
-	 792,  795,  798,  801,  804,  807,  810,  813,  816,  819,  822,
-	 825,  828,  831,  834,  837,  840,  843,  846,  849,  852,
-	}},
-	{{
-	 855,  858,  861,  864,  867,  870,  873,  876,  879,  882,  885,
-	 888,  891,  894,  897,  900,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	 903,    0,  906,    0,  909,    0,  912,    0,  915,    0,  918,
-	   0,  921,    0,  924,    0,  927,    0,  930,    0,  933,    0,
-	 936,    0,  939,    0,  942,    0,  945,    0,  948,    0,
-	}},
-	{{
-	 951,    0,    0,    0,    0,    0,    0,    0,    0,    0,  954,
-	   0,  957,    0,  960,    0,  963,    0,  966,    0,  969,    0,
-	 972,    0,  975,    0,  978,    0,  981,    0,  984,    0,
-	}},
-	{{
-	 987,    0,  990,    0,  993,    0,  996,    0,  999,    0, 1002,
-	   0, 1005,    0, 1008,    0, 1011,    0, 1014,    0, 1017,    0,
-	1020,    0, 1023,    0, 1026,    0, 1029,    0, 1032,    0,
-	}},
-	{{
-	   0, 1035,    0, 1038,    0, 1041,    0, 1044,    0, 1047,    0,
-	1050,    0, 1053,    0,    0, 1056,    0, 1059,    0, 1062,    0,
-	1065,    0, 1068,    0, 1071,    0, 1074,    0, 1077,    0,
-	}},
-	{{
-	1080,    0, 1083,    0, 1086,    0, 1089,    0, 1092,    0, 1095,
-	   0, 1098,    0, 1101,    0, 1104,    0, 1107,    0, 1110,    0,
-	   0,    0, 1113,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	1116,    0, 1119,    0, 1122,    0, 1125,    0, 1128,    0, 1131,
-	   0, 1134,    0, 1137,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0, 1140, 1143, 1146, 1149, 1152,
-	1155, 1158, 1161, 1164, 1167, 1170, 1173, 1176, 1179, 1182,
-	}},
-	{{
-	1185, 1188, 1191, 1194, 1197, 1200, 1203, 1206, 1209, 1212, 1215,
-	1218, 1221, 1224, 1227, 1230, 1233, 1236, 1239, 1242, 1245, 1248,
-	1251,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0, 1254,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    1,    0,    0,    0,    0,
-	   1,    1,    1,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	1261,    0, 1264,    0, 1267,    0, 1270,    0, 1273,    0, 1276,
-	   0, 1279,    0, 1282,    0, 1285,    0, 1288,    0, 1291,    0,
-	1294,    0, 1297,    0, 1300,    0, 1303,    0, 1306,    0,
-	}},
-	{{
-	1309,    0, 1312,    0, 1315,    0, 1318,    0, 1321,    0, 1324,
-	   0, 1327,    0, 1330,    0, 1333,    0, 1336,    0, 1339,    0,
-	1342,    0, 1345,    0, 1348,    0, 1351,    0, 1354,    0,
-	}},
-	{{
-	1357,    0, 1360,    0, 1363,    0, 1366,    0, 1369,    0, 1372,
-	   0, 1375,    0, 1378,    0, 1381,    0, 1384,    0, 1387,    0,
-	1390,    0, 1393,    0, 1396,    0, 1399,    0, 1402,    0,
-	}},
-	{{
-	1405,    0, 1408,    0, 1411,    0, 1414,    0, 1417,    0, 1420,
-	   0, 1423,    0, 1426,    0, 1429,    0, 1432,    0, 1435,    0,
-	1438,    0, 1441,    0, 1444,    0, 1447,    0, 1450,    0,
-	}},
-	{{
-	1453,    0, 1456,    0, 1459,    0, 1462,    0, 1465,    0, 1468,
-	   0, 1471,    0, 1474,    0, 1477,    0, 1480,    0, 1483,    0,
-	1486, 1493, 1500, 1507, 1514, 1405,    0,    0,    0,    0,
-	}},
-	{{
-	1521,    0, 1524,    0, 1527,    0, 1530,    0, 1533,    0, 1536,
-	   0, 1539,    0, 1542,    0, 1545,    0, 1548,    0, 1551,    0,
-	1554,    0, 1557,    0, 1560,    0, 1563,    0, 1566,    0,
-	}},
-	{{
-	1569,    0, 1572,    0, 1575,    0, 1578,    0, 1581,    0, 1584,
-	   0, 1587,    0, 1590,    0, 1593,    0, 1596,    0, 1599,    0,
-	1602,    0, 1605,    0, 1608,    0, 1611,    0, 1614,    0,
-	}},
-	{{
-	1617,    0, 1620,    0, 1623,    0, 1626,    0, 1629,    0, 1632,
-	   0, 1635,    0, 1638,    0, 1641,    0, 1644,    0, 1647,    0,
-	1650,    0, 1653,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0, 1656, 1659, 1662,
-	1665, 1668, 1671, 1674, 1677,    0,    0,    0,    0,    0,    0,
-	   0,    0, 1680, 1683, 1686, 1689, 1692, 1695,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0, 1698, 1701, 1704,
-	1707, 1710, 1713, 1716, 1719,    0,    0,    0,    0,    0,    0,
-	   0,    0, 1722, 1725, 1728, 1731, 1734, 1737, 1740, 1743,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0, 1746, 1749, 1752,
-	1755, 1758, 1761,    0,    0, 1764,    0, 1771,    0, 1782,    0,
-	1793,    0,    0, 1804,    0, 1807,    0, 1810,    0, 1813,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0, 1816, 1819, 1822,
-	1825, 1828, 1831, 1834, 1837,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	1840, 1847, 1854, 1861, 1868, 1875, 1882, 1889, 1840, 1847, 1854,
-	1861, 1868, 1875, 1882, 1889, 1896, 1903, 1910, 1917, 1924, 1931,
-	1938, 1945, 1896, 1903, 1910, 1917, 1924, 1931, 1938, 1945,
-	}},
-	{{
-	1952, 1959, 1966, 1973, 1980, 1987, 1994, 2001, 1952, 1959, 1966,
-	1973, 1980, 1987, 1994, 2001,    0,    0, 2008, 2015, 2022,    0,
-	2029, 2036, 2047, 2050, 2053, 2056, 2015,    0,  598,    0,
-	}},
-	{{
-	   0,    0, 2059, 2066, 2073,    0, 2080, 2087, 2098, 2101, 2104,
-	2107, 2066,    0,    0,    0,    0,    0, 2110,  629,    0,    0,
-	2121, 2128, 2139, 2142, 2145, 2148,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0, 2151,  712, 2162,    0, 2169, 2176, 2187, 2190, 2193,
-	2196, 2199,    0,    0,    0,    0,    0, 2202, 2209, 2216,    0,
-	2223, 2230, 2241, 2244, 2247, 2250, 2209,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   1,    1,    1,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   1,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0, 2253,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    6, 2259,    0,    0,    0,  351,    0, 2265,    0,
-	  16,   16,   16,    0,    0,   18,   18,   24,    0,    0,   28,
-	2271,    0,    0,   32,   34,   36,   36,   36,    0,    0,
-	}},
-	{{
-	2277, 2283, 2293,    0,   52,    0,  703,    0,   52,    0,   22,
-	  67,    4,    6,    0,    0,   10,   12,    0,   26,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,  646,  679,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    8,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	2299, 2302, 2305, 2308, 2311, 2314, 2317, 2320, 2323, 2326, 2329,
-	2332, 2335, 2338, 2341, 2344,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	2347, 2350, 2353, 2356, 2359, 2362, 2365, 2368, 2371, 2374,
-	}},
-	{{
-	2377, 2380, 2383, 2386, 2389, 2392, 2395, 2398, 2401, 2404, 2407,
-	2410, 2413, 2416, 2419, 2422,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0, 2425,    0, 2435,    0, 2441,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	2447, 2453, 2459, 2465, 2471, 2477, 2483, 2489,    0,    0, 2495,
-	2501, 2507,    0,    0,    0, 2513, 2519, 2529, 2539, 2549,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    0, 2447, 2559,
-	2569, 2579,    0,    0,    0,    0,    0,    0,    0, 2589, 2595,
-	2601, 2607, 2613, 2607, 2619, 2625, 2631, 2637, 2643, 2637,
-	}},
-	{{
-	2649, 2656,    0, 2663,    0,    0, 2669, 2683, 2693, 2699,    0,
-	2705,    0, 2711, 2717,    0,    0,    0,    0,    0,    0,    0,
-	   0, 2723,    0, 2729, 2739,    0, 2745, 2751,    0,    0,
-	}},
-	{{
-	2757, 2763, 2769, 2775, 2785, 2795, 2795,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0, 2801, 2808, 2815,
-	2822, 2829,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-	   1,    1,    1,    1,    1,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    1,
-	}},
-	{{
-	   0, 2836, 2839, 2842, 2845, 2848, 2851, 2854, 2857, 2860, 2863,
-	2866, 2869, 2872, 2875, 2878, 2881, 2884, 2887, 2890, 2893, 2896,
-	2899, 2902, 2905, 2908, 2911,    0,    0,    0,    0,    0,
-	}},
-	{{
-	2914, 2918, 2922, 2926, 2930, 2934, 2938, 2942, 2946, 2950, 2954,
-	2958, 2962, 2966, 2970, 2974, 2978, 2982, 2986, 2990, 2994, 2998,
-	3002, 3006, 3010, 3014, 3018, 3022, 3026, 3030, 3034, 3038,
-	}},
-	{{
-	3042, 3046, 3050, 3054, 3058, 3062,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   2,    4,    6,    8,   10,   12,   14,   16,   18,   20,   22,
-	  24,   26,   28,   30,   32,   34,   36,   38,   40,   42,   44,
-	  46,   48,   50,   52,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    2,    4,
-	   6,    8,   10,   12,   14,   16,   18,   20,   22,   24,
-	}},
-	{{
-	  26,   28,   30,   32,   34,   36,   38,   40,   42,   44,   46,
-	  48,   50,   52,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    2,    4,    6,
-	   8,   10,   12,   14,   16,   18,   20,   22,   24,   26,   28,
-	  30,   32,   34,   36,   38,   40,   42,   44,   46,   48,
-	}},
-	{{
-	  50,   52,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    2,    0,    6,    8,
-	}},
-	{{
-	   0,    0,   14,    0,    0,   20,   22,    0,    0,   28,   30,
-	  32,   34,    0,   38,   40,   42,   44,   46,   48,   50,   52,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    2,    4,    6,    8,   10,   12,
-	  14,   16,   18,   20,   22,   24,   26,   28,   30,   32,
-	}},
-	{{
-	  34,   36,   38,   40,   42,   44,   46,   48,   50,   52,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    2,    4,    0,    8,   10,   12,   14,
-	   0,    0,   20,   22,   24,   26,   28,   30,   32,   34,    0,
-	  38,   40,   42,   44,   46,   48,   50,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    2,    4,    0,    8,   10,   12,   14,    0,
-	}},
-	{{
-	  18,   20,   22,   24,   26,    0,   30,    0,    0,    0,   38,
-	  40,   42,   44,   46,   48,   50,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    2,    4,    6,    8,   10,   12,   14,   16,   18,   20,
-	  22,   24,   26,   28,   30,   32,   34,   36,   38,   40,
-	}},
-	{{
-	  42,   44,   46,   48,   50,   52,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	  50,   52,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    2,    4,    6,    8,
-	}},
-	{{
-	  10,   12,   14,   16,   18,   20,   22,   24,   26,   28,   30,
-	  32,   34,   36,   38,   40,   42,   44,   46,   48,   50,   52,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,  640,  643,  646,
-	 649,  652,  655,  658,  661,  598,  664,  667,   54,  670,  673,
-	 676,  679,  682,  661,  685,  688,  691,  694,  697,  700,
-	}},
-	{{
-	 703,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,  685,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,  640,  643,  646,  649,  652,  655,  658,  661,  598,
-	 664,  667,   54,  670,  673,  676,  679,  682,  661,  685,  688,
-	 691,  694,  697,  700,  703,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,  685,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,  640,  643,  646,  649,
-	}},
-	{{
-	 652,  655,  658,  661,  598,  664,  667,   54,  670,  673,  676,
-	 679,  682,  661,  685,  688,  691,  694,  697,  700,  703,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,    0,    0,    0,    0,    0,    0,  685,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	 640,  643,  646,  649,  652,  655,  658,  661,  598,  664,
-	}},
-	{{
-	 667,   54,  670,  673,  676,  679,  682,  661,  685,  688,  691,
-	 694,  697,  700,  703,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	}},
-	{{
-	   0,  685,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,  640,  643,  646,  649,  652,  655,
-	 658,  661,  598,  664,  667,   54,  670,  673,  676,  679,
-	}},
-	{{
-	 682,  661,  685,  688,  691,  694,  697,  700,  703,    0,    0,
-	   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	   0,    0,    0,    0,    0,  685,    0,    0,    0,    0,
-	}},
-};
-
-static const unsigned char nameprep_id11_map_data[] = {
-	  0,   0,   1,  97,   1,  98,   1,  99,   1, 100,   1, 101,
-	  1, 102,   1, 103,   1, 104,   1, 105,   1, 106,   1, 107,
-	  1, 108,   1, 109,   1, 110,   1, 111,   1, 112,   1, 113,
-	  1, 114,   1, 115,   1, 116,   1, 117,   1, 118,   1, 119,
-	  1, 120,   1, 121,   1, 122,   2, 188,   3,   1, 224,   1,
-	225,   1, 226,   1, 227,   1, 228,   1, 229,   1, 230,   1,
-	231,   1, 232,   1, 233,   1, 234,   1, 235,   1, 236,   1,
-	237,   1, 238,   1, 239,   1, 240,   1, 241,   1, 242,   1,
-	243,   1, 244,   1, 245,   1, 246,   1, 248,   1, 249,   1,
-	250,   1, 251,   1, 252,   1, 253,   1, 254,   5, 115,   0,
-	  0,   0, 115,   2,   1,   1,   2,   3,   1,   2,   5,   1,
-	  2,   7,   1,   2,   9,   1,   2,  11,   1,   2,  13,   1,
-	  2,  15,   1,   2,  17,   1,   2,  19,   1,   2,  21,   1,
-	  2,  23,   1,   2,  25,   1,   2,  27,   1,   2,  29,   1,
-	  2,  31,   1,   2,  33,   1,   2,  35,   1,   2,  37,   1,
-	  2,  39,   1,   2,  41,   1,   2,  43,   1,   2,  45,   1,
-	  2,  47,   1,   6, 105,   0,   0,   0,   7,   3,   2,  51,
-	  1,   2,  53,   1,   2,  55,   1,   2,  58,   1,   2,  60,
-	  1,   2,  62,   1,   2,  64,   1,   2,  66,   1,   2,  68,
-	  1,   2,  70,   1,   2,  72,   1,   5, 188,   2,   0,   0,
-	110,   2,  75,   1,   2,  77,   1,   2,  79,   1,   2,  81,
-	  1,   2,  83,   1,   2,  85,   1,   2,  87,   1,   2,  89,
-	  1,   2,  91,   1,   2,  93,   1,   2,  95,   1,   2,  97,
-	  1,   2,  99,   1,   2, 101,   1,   2, 103,   1,   2, 105,
-	  1,   2, 107,   1,   2, 109,   1,   2, 111,   1,   2, 113,
-	  1,   2, 115,   1,   2, 117,   1,   2, 119,   1,   1, 255,
-	  2, 122,   1,   2, 124,   1,   2, 126,   1,   2,  83,   2,
-	  2, 131,   1,   2, 133,   1,   2,  84,   2,   2, 136,   1,
-	  2,  86,   2,   2,  87,   2,   2, 140,   1,   2, 221,   1,
-	  2,  89,   2,   2,  91,   2,   2, 146,   1,   2,  96,   2,
-	  2,  99,   2,   2, 105,   2,   2, 104,   2,   2, 153,   1,
-	  2, 111,   2,   2, 114,   2,   2, 117,   2,   2, 161,   1,
-	  2, 163,   1,   2, 165,   1,   2, 128,   2,   2, 168,   1,
-	  2, 131,   2,   2, 173,   1,   2, 136,   2,   2, 176,   1,
-	  2, 138,   2,   2, 139,   2,   2, 180,   1,   2, 182,   1,
-	  2, 146,   2,   2, 185,   1,   2, 189,   1,   2, 198,   1,
-	  2, 201,   1,   2, 204,   1,   2, 206,   1,   2, 208,   1,
-	  2, 210,   1,   2, 212,   1,   2, 214,   1,   2, 216,   1,
-	  2, 218,   1,   2, 220,   1,   2, 223,   1,   2, 225,   1,
-	  2, 227,   1,   2, 229,   1,   2, 231,   1,   2, 233,   1,
-	  2, 235,   1,   2, 237,   1,   2, 239,   1,   6, 106,   0,
-	  0,   0,  12,   3,   2, 243,   1,   2, 245,   1,   2, 149,
-	  1,   2, 191,   1,   2, 249,   1,   2, 251,   1,   2, 253,
-	  1,   2, 255,   1,   2,   1,   2,   2,   3,   2,   2,   5,
-	  2,   2,   7,   2,   2,   9,   2,   2,  11,   2,   2,  13,
-	  2,   2,  15,   2,   2,  17,   2,   2,  19,   2,   2,  21,
-	  2,   2,  23,   2,   2,  25,   2,   2,  27,   2,   2,  29,
-	  2,   2,  31,   2,   2, 158,   1,   2,  35,   2,   2,  37,
-	  2,   2,  39,   2,   2,  41,   2,   2,  43,   2,   2,  45,
-	  2,   2,  47,   2,   2,  49,   2,   2,  51,   2,   2, 185,
-	  3,   6,  32,   0,   0,   0, 185,   3,   2, 172,   3,   2,
-	173,   3,   2, 174,   3,   2, 175,   3,   2, 204,   3,   2,
-	205,   3,   2, 206,   3,  10, 185,   3,   0,   0,   8,   3,
-	  0,   0,   1,   3,   2, 177,   3,   2, 178,   3,   2, 179,
-	  3,   2, 180,   3,   2, 181,   3,   2, 182,   3,   2, 183,
-	  3,   2, 184,   3,   2, 186,   3,   2, 187,   3,   2, 189,
-	  3,   2, 190,   3,   2, 191,   3,   2, 192,   3,   2, 193,
-	  3,   2, 195,   3,   2, 196,   3,   2, 197,   3,   2, 198,
-	  3,   2, 199,   3,   2, 200,   3,   2, 201,   3,   2, 202,
-	  3,   2, 203,   3,  10, 197,   3,   0,   0,   8,   3,   0,
-	  0,   1,   3,   2, 217,   3,   2, 219,   3,   2, 221,   3,
-	  2, 223,   3,   2, 225,   3,   2, 227,   3,   2, 229,   3,
-	  2, 231,   3,   2, 233,   3,   2, 235,   3,   2, 237,   3,
-	  2, 239,   3,   2,  80,   4,   2,  81,   4,   2,  82,   4,
-	  2,  83,   4,   2,  84,   4,   2,  85,   4,   2,  86,   4,
-	  2,  87,   4,   2,  88,   4,   2,  89,   4,   2,  90,   4,
-	  2,  91,   4,   2,  92,   4,   2,  93,   4,   2,  94,   4,
-	  2,  95,   4,   2,  48,   4,   2,  49,   4,   2,  50,   4,
-	  2,  51,   4,   2,  52,   4,   2,  53,   4,   2,  54,   4,
-	  2,  55,   4,   2,  56,   4,   2,  57,   4,   2,  58,   4,
-	  2,  59,   4,   2,  60,   4,   2,  61,   4,   2,  62,   4,
-	  2,  63,   4,   2,  64,   4,   2,  65,   4,   2,  66,   4,
-	  2,  67,   4,   2,  68,   4,   2,  69,   4,   2,  70,   4,
-	  2,  71,   4,   2,  72,   4,   2,  73,   4,   2,  74,   4,
-	  2,  75,   4,   2,  76,   4,   2,  77,   4,   2,  78,   4,
-	  2,  79,   4,   2,  97,   4,   2,  99,   4,   2, 101,   4,
-	  2, 103,   4,   2, 105,   4,   2, 107,   4,   2, 109,   4,
-	  2, 111,   4,   2, 113,   4,   2, 115,   4,   2, 117,   4,
-	  2, 119,   4,   2, 121,   4,   2, 123,   4,   2, 125,   4,
-	  2, 127,   4,   2, 129,   4,   2, 139,   4,   2, 141,   4,
-	  2, 143,   4,   2, 145,   4,   2, 147,   4,   2, 149,   4,
-	  2, 151,   4,   2, 153,   4,   2, 155,   4,   2, 157,   4,
-	  2, 159,   4,   2, 161,   4,   2, 163,   4,   2, 165,   4,
-	  2, 167,   4,   2, 169,   4,   2, 171,   4,   2, 173,   4,
-	  2, 175,   4,   2, 177,   4,   2, 179,   4,   2, 181,   4,
-	  2, 183,   4,   2, 185,   4,   2, 187,   4,   2, 189,   4,
-	  2, 191,   4,   2, 194,   4,   2, 196,   4,   2, 198,   4,
-	  2, 200,   4,   2, 202,   4,   2, 204,   4,   2, 206,   4,
-	  2, 209,   4,   2, 211,   4,   2, 213,   4,   2, 215,   4,
-	  2, 217,   4,   2, 219,   4,   2, 221,   4,   2, 223,   4,
-	  2, 225,   4,   2, 227,   4,   2, 229,   4,   2, 231,   4,
-	  2, 233,   4,   2, 235,   4,   2, 237,   4,   2, 239,   4,
-	  2, 241,   4,   2, 243,   4,   2, 245,   4,   2, 249,   4,
-	  2,   1,   5,   2,   3,   5,   2,   5,   5,   2,   7,   5,
-	  2,   9,   5,   2,  11,   5,   2,  13,   5,   2,  15,   5,
-	  2,  97,   5,   2,  98,   5,   2,  99,   5,   2, 100,   5,
-	  2, 101,   5,   2, 102,   5,   2, 103,   5,   2, 104,   5,
-	  2, 105,   5,   2, 106,   5,   2, 107,   5,   2, 108,   5,
-	  2, 109,   5,   2, 110,   5,   2, 111,   5,   2, 112,   5,
-	  2, 113,   5,   2, 114,   5,   2, 115,   5,   2, 116,   5,
-	  2, 117,   5,   2, 118,   5,   2, 119,   5,   2, 120,   5,
-	  2, 121,   5,   2, 122,   5,   2, 123,   5,   2, 124,   5,
-	  2, 125,   5,   2, 126,   5,   2, 127,   5,   2, 128,   5,
-	  2, 129,   5,   2, 130,   5,   2, 131,   5,   2, 132,   5,
-	  2, 133,   5,   2, 134,   5,   6, 101,   5,   0,   0, 130,
-	  5,   2,   1,  30,   2,   3,  30,   2,   5,  30,   2,   7,
-	 30,   2,   9,  30,   2,  11,  30,   2,  13,  30,   2,  15,
-	 30,   2,  17,  30,   2,  19,  30,   2,  21,  30,   2,  23,
-	 30,   2,  25,  30,   2,  27,  30,   2,  29,  30,   2,  31,
-	 30,   2,  33,  30,   2,  35,  30,   2,  37,  30,   2,  39,
-	 30,   2,  41,  30,   2,  43,  30,   2,  45,  30,   2,  47,
-	 30,   2,  49,  30,   2,  51,  30,   2,  53,  30,   2,  55,
-	 30,   2,  57,  30,   2,  59,  30,   2,  61,  30,   2,  63,
-	 30,   2,  65,  30,   2,  67,  30,   2,  69,  30,   2,  71,
-	 30,   2,  73,  30,   2,  75,  30,   2,  77,  30,   2,  79,
-	 30,   2,  81,  30,   2,  83,  30,   2,  85,  30,   2,  87,
-	 30,   2,  89,  30,   2,  91,  30,   2,  93,  30,   2,  95,
-	 30,   2,  97,  30,   2,  99,  30,   2, 101,  30,   2, 103,
-	 30,   2, 105,  30,   2, 107,  30,   2, 109,  30,   2, 111,
-	 30,   2, 113,  30,   2, 115,  30,   2, 117,  30,   2, 119,
-	 30,   2, 121,  30,   2, 123,  30,   2, 125,  30,   2, 127,
-	 30,   2, 129,  30,   2, 131,  30,   2, 133,  30,   2, 135,
-	 30,   2, 137,  30,   2, 139,  30,   2, 141,  30,   2, 143,
-	 30,   2, 145,  30,   2, 147,  30,   2, 149,  30,   6, 104,
-	  0,   0,   0,  49,   3,   6, 116,   0,   0,   0,   8,   3,
-	  6, 119,   0,   0,   0,  10,   3,   6, 121,   0,   0,   0,
-	 10,   3,   6,  97,   0,   0,   0, 190,   2,   2, 161,  30,
-	  2, 163,  30,   2, 165,  30,   2, 167,  30,   2, 169,  30,
-	  2, 171,  30,   2, 173,  30,   2, 175,  30,   2, 177,  30,
-	  2, 179,  30,   2, 181,  30,   2, 183,  30,   2, 185,  30,
-	  2, 187,  30,   2, 189,  30,   2, 191,  30,   2, 193,  30,
-	  2, 195,  30,   2, 197,  30,   2, 199,  30,   2, 201,  30,
-	  2, 203,  30,   2, 205,  30,   2, 207,  30,   2, 209,  30,
-	  2, 211,  30,   2, 213,  30,   2, 215,  30,   2, 217,  30,
-	  2, 219,  30,   2, 221,  30,   2, 223,  30,   2, 225,  30,
-	  2, 227,  30,   2, 229,  30,   2, 231,  30,   2, 233,  30,
-	  2, 235,  30,   2, 237,  30,   2, 239,  30,   2, 241,  30,
-	  2, 243,  30,   2, 245,  30,   2, 247,  30,   2, 249,  30,
-	  2,   0,  31,   2,   1,  31,   2,   2,  31,   2,   3,  31,
-	  2,   4,  31,   2,   5,  31,   2,   6,  31,   2,   7,  31,
-	  2,  16,  31,   2,  17,  31,   2,  18,  31,   2,  19,  31,
-	  2,  20,  31,   2,  21,  31,   2,  32,  31,   2,  33,  31,
-	  2,  34,  31,   2,  35,  31,   2,  36,  31,   2,  37,  31,
-	  2,  38,  31,   2,  39,  31,   2,  48,  31,   2,  49,  31,
-	  2,  50,  31,   2,  51,  31,   2,  52,  31,   2,  53,  31,
-	  2,  54,  31,   2,  55,  31,   2,  64,  31,   2,  65,  31,
-	  2,  66,  31,   2,  67,  31,   2,  68,  31,   2,  69,  31,
-	  6, 197,   3,   0,   0,  19,   3,  10, 197,   3,   0,   0,
-	 19,   3,   0,   0,   0,   3,  10, 197,   3,   0,   0,  19,
-	  3,   0,   0,   1,   3,  10, 197,   3,   0,   0,  19,   3,
-	  0,   0,  66,   3,   2,  81,  31,   2,  83,  31,   2,  85,
-	 31,   2,  87,  31,   2,  96,  31,   2,  97,  31,   2,  98,
-	 31,   2,  99,  31,   2, 100,  31,   2, 101,  31,   2, 102,
-	 31,   2, 103,  31,   6,   0,  31,   0,   0, 185,   3,   6,
-	  1,  31,   0,   0, 185,   3,   6,   2,  31,   0,   0, 185,
-	  3,   6,   3,  31,   0,   0, 185,   3,   6,   4,  31,   0,
-	  0, 185,   3,   6,   5,  31,   0,   0, 185,   3,   6,   6,
-	 31,   0,   0, 185,   3,   6,   7,  31,   0,   0, 185,   3,
-	  6,  32,  31,   0,   0, 185,   3,   6,  33,  31,   0,   0,
-	185,   3,   6,  34,  31,   0,   0, 185,   3,   6,  35,  31,
-	  0,   0, 185,   3,   6,  36,  31,   0,   0, 185,   3,   6,
-	 37,  31,   0,   0, 185,   3,   6,  38,  31,   0,   0, 185,
-	  3,   6,  39,  31,   0,   0, 185,   3,   6,  96,  31,   0,
-	  0, 185,   3,   6,  97,  31,   0,   0, 185,   3,   6,  98,
-	 31,   0,   0, 185,   3,   6,  99,  31,   0,   0, 185,   3,
-	  6, 100,  31,   0,   0, 185,   3,   6, 101,  31,   0,   0,
-	185,   3,   6, 102,  31,   0,   0, 185,   3,   6, 103,  31,
-	  0,   0, 185,   3,   6, 112,  31,   0,   0, 185,   3,   6,
-	177,   3,   0,   0, 185,   3,   6, 172,   3,   0,   0, 185,
-	  3,   6, 177,   3,   0,   0,  66,   3,  10, 177,   3,   0,
-	  0,  66,   3,   0,   0, 185,   3,   2, 176,  31,   2, 177,
-	 31,   2, 112,  31,   2, 113,  31,   6, 116,  31,   0,   0,
-	185,   3,   6, 183,   3,   0,   0, 185,   3,   6, 174,   3,
-	  0,   0, 185,   3,   6, 183,   3,   0,   0,  66,   3,  10,
-	183,   3,   0,   0,  66,   3,   0,   0, 185,   3,   2, 114,
-	 31,   2, 115,  31,   2, 116,  31,   2, 117,  31,  10, 185,
-	  3,   0,   0,   8,   3,   0,   0,   0,   3,   6, 185,   3,
-	  0,   0,  66,   3,  10, 185,   3,   0,   0,   8,   3,   0,
-	  0,  66,   3,   2, 208,  31,   2, 209,  31,   2, 118,  31,
-	  2, 119,  31,  10, 197,   3,   0,   0,   8,   3,   0,   0,
-	  0,   3,   6, 193,   3,   0,   0,  19,   3,   6, 197,   3,
-	  0,   0,  66,   3,  10, 197,   3,   0,   0,   8,   3,   0,
-	  0,  66,   3,   2, 224,  31,   2, 225,  31,   2, 122,  31,
-	  2, 123,  31,   2, 229,  31,   6, 124,  31,   0,   0, 185,
-	  3,   6, 201,   3,   0,   0, 185,   3,   6, 206,   3,   0,
-	  0, 185,   3,   6, 201,   3,   0,   0,  66,   3,  10, 201,
-	  3,   0,   0,  66,   3,   0,   0, 185,   3,   2, 120,  31,
-	  2, 121,  31,   2, 124,  31,   2, 125,  31,   5, 114,   0,
-	  0,   0, 115,   5, 176,   0,   0,   0,  99,   5, 176,   0,
-	  0,   0, 102,   5, 110,   0,   0,   0, 111,   5, 115,   0,
-	  0,   0, 109,   9, 116,   0,   0,   0, 101,   0,   0,   0,
-	108,   5, 116,   0,   0,   0, 109,   2, 112,  33,   2, 113,
-	 33,   2, 114,  33,   2, 115,  33,   2, 116,  33,   2, 117,
-	 33,   2, 118,  33,   2, 119,  33,   2, 120,  33,   2, 121,
-	 33,   2, 122,  33,   2, 123,  33,   2, 124,  33,   2, 125,
-	 33,   2, 126,  33,   2, 127,  33,   2, 208,  36,   2, 209,
-	 36,   2, 210,  36,   2, 211,  36,   2, 212,  36,   2, 213,
-	 36,   2, 214,  36,   2, 215,  36,   2, 216,  36,   2, 217,
-	 36,   2, 218,  36,   2, 219,  36,   2, 220,  36,   2, 221,
-	 36,   2, 222,  36,   2, 223,  36,   2, 224,  36,   2, 225,
-	 36,   2, 226,  36,   2, 227,  36,   2, 228,  36,   2, 229,
-	 36,   2, 230,  36,   2, 231,  36,   2, 232,  36,   2, 233,
-	 36,   9, 104,   0,   0,   0, 112,   0,   0,   0,  97,   5,
-	 97,   0,   0,   0, 117,   5, 111,   0,   0,   0, 118,   5,
-	112,   0,   0,   0,  97,   5, 110,   0,   0,   0,  97,   5,
-	188,   3,   0,   0,  97,   5, 109,   0,   0,   0,  97,   5,
-	107,   0,   0,   0,  97,   5, 107,   0,   0,   0,  98,   5,
-	109,   0,   0,   0,  98,   5, 103,   0,   0,   0,  98,   5,
-	112,   0,   0,   0, 102,   5, 110,   0,   0,   0, 102,   5,
-	188,   3,   0,   0, 102,   5, 104,   0,   0,   0, 122,   9,
-	107,   0,   0,   0, 104,   0,   0,   0, 122,   9, 109,   0,
-	  0,   0, 104,   0,   0,   0, 122,   9, 103,   0,   0,   0,
-	104,   0,   0,   0, 122,   9, 116,   0,   0,   0, 104,   0,
-	  0,   0, 122,   9, 107,   0,   0,   0, 112,   0,   0,   0,
-	 97,   9, 109,   0,   0,   0, 112,   0,   0,   0,  97,   9,
-	103,   0,   0,   0, 112,   0,   0,   0,  97,   5, 112,   0,
-	  0,   0, 118,   5, 110,   0,   0,   0, 118,   5, 188,   3,
-	  0,   0, 118,   5, 109,   0,   0,   0, 118,   5, 107,   0,
-	  0,   0, 118,   5, 112,   0,   0,   0, 119,   5, 110,   0,
-	  0,   0, 119,   5, 188,   3,   0,   0, 119,   5, 109,   0,
-	  0,   0, 119,   5, 107,   0,   0,   0, 119,   6, 107,   0,
-	  0,   0, 201,   3,   6, 109,   0,   0,   0, 201,   3,   5,
-	 98,   0,   0,   0, 113,  13,  99,   0,   0,   0,  21,  34,
-	  0,   0, 107,   0,   0,   0, 103,   9,  99,   0,   0,   0,
-	111,   0,   0,   0,  46,   5, 100,   0,   0,   0,  98,   5,
-	103,   0,   0,   0, 121,   5, 104,   0,   0,   0, 112,   5,
-	107,   0,   0,   0, 107,   5, 107,   0,   0,   0, 109,   5,
-	112,   0,   0,   0, 104,   9, 112,   0,   0,   0, 112,   0,
-	  0,   0, 109,   5, 112,   0,   0,   0, 114,   5, 115,   0,
-	  0,   0, 118,   5, 119,   0,   0,   0,  98,   5, 102,   0,
-	  0,   0, 102,   5, 102,   0,   0,   0, 105,   5, 102,   0,
-	  0,   0, 108,   9, 102,   0,   0,   0, 102,   0,   0,   0,
-	105,   9, 102,   0,   0,   0, 102,   0,   0,   0, 108,   5,
-	115,   0,   0,   0, 116,   6, 116,   5,   0,   0, 118,   5,
-	  6, 116,   5,   0,   0, 101,   5,   6, 116,   5,   0,   0,
-	107,   5,   6, 126,   5,   0,   0, 118,   5,   6, 116,   5,
-	  0,   0, 109,   5,   2,  65, 255,   2,  66, 255,   2,  67,
-	255,   2,  68, 255,   2,  69, 255,   2,  70, 255,   2,  71,
-	255,   2,  72, 255,   2,  73, 255,   2,  74, 255,   2,  75,
-	255,   2,  76, 255,   2,  77, 255,   2,  78, 255,   2,  79,
-	255,   2,  80, 255,   2,  81, 255,   2,  82, 255,   2,  83,
-	255,   2,  84, 255,   2,  85, 255,   2,  86, 255,   2,  87,
-	255,   2,  88, 255,   2,  89, 255,   2,  90, 255,   3,  40,
-	  4,   1,   3,  41,   4,   1,   3,  42,   4,   1,   3,  43,
-	  4,   1,   3,  44,   4,   1,   3,  45,   4,   1,   3,  46,
-	  4,   1,   3,  47,   4,   1,   3,  48,   4,   1,   3,  49,
-	  4,   1,   3,  50,   4,   1,   3,  51,   4,   1,   3,  52,
-	  4,   1,   3,  53,   4,   1,   3,  54,   4,   1,   3,  55,
-	  4,   1,   3,  56,   4,   1,   3,  57,   4,   1,   3,  58,
-	  4,   1,   3,  59,   4,   1,   3,  60,   4,   1,   3,  61,
-	  4,   1,   3,  62,   4,   1,   3,  63,   4,   1,   3,  64,
-	  4,   1,   3,  65,   4,   1,   3,  66,   4,   1,   3,  67,
-	  4,   1,   3,  68,   4,   1,   3,  69,   4,   1,   3,  70,
-	  4,   1,   3,  71,   4,   1,   3,  72,   4,   1,   3,  73,
-	  4,   1,   3,  74,   4,   1,   3,  75,   4,   1,   3,  76,
-	  4,   1,   3,  77,   4,   1,
-};
-
-static const unsigned short nameprep_id11_prohibited_imap[] = {
-	   68,   196,   196,   324,   196,   196,   196,   452,
-	  196,   196,   196,   580,   196,   196,   196,   580,
-	  196,   196,   196,   580,   196,   196,   196,   580,
-	  196,   196,   196,   580,   196,   196,   196,   580,
-	  196,   196,   196,   580,   196,   196,   196,   580,
-	  196,   196,   196,   580,   196,   196,   196,   580,
-	  196,   196,   196,   580,   196,   196,   196,   580,
-	  708,   196,   196,   580,   836,   836,   836,   836,
-	  836,   836,   836,   836,     0,     1,     0,     0,
-	    0,     0,     2,     0,     0,     0,     0,     0,
-	    0,     3,     4,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     5,     0,     0,     6,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     7,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     8,     5,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,    10,
-	    0,     0,     0,    11,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,    12,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,    13,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,    13,    14,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,     9,     9,     9,     9,
-	    9,     9,     9,     9,
-};
-
-static const struct {
-	unsigned char bm[16];
-} nameprep_id11_prohibited_bitmap[] = {
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	255,255,255,255,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0,  0,  0,  0,
-	}},
-	{{
-	  0,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	255,199,  0,  0,  0,255,  0,  0,  0,  0,  0,128, 14,252,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255, 15,
-	}},
-	{{
-	255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,255,255,255,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,254,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,248,  7,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,
-	}},
-	{{
-	  2,  0,  0,  0,255,255,255,255,255,255,255,255,255,255,255,255,
-	}},
-};
-
-static const unsigned short nameprep_id11_unassigned_imap[] = {
-	   68,   196,   324,   452,   580,   708,   708,   836,
-	  964,   964,  1092,  1220,   708,   708,   708,  1348,
-	  708,   708,   708,  1348,   708,   708,   708,  1348,
-	  708,   708,   708,  1348,   708,   708,   708,  1348,
-	  708,   708,   708,  1348,   708,   708,   708,  1348,
-	  708,   708,   708,  1348,   708,   708,   708,  1348,
-	  708,   708,   708,  1348,   708,   708,   708,  1348,
-	 1476,   708,   708,  1348,   964,   964,   964,   964,
-	  964,   964,   964,   964,     0,     0,     0,     0,
-	    1,     2,     3,     4,     0,     5,     6,     7,
-	    8,     9,    10,    11,    12,    12,    13,    14,
-	   15,    16,    17,    18,    19,    20,    21,    22,
-	   23,    24,    25,    26,    27,    28,    29,    30,
-	   31,    32,    33,    34,    35,     0,     0,     0,
-	   36,    37,    38,    39,    40,    41,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	    0,    42,    43,    44,    45,    46,    47,    48,
-	    0,     0,     0,    49,    50,    51,     0,     0,
-	   52,    53,    54,    55,     0,     0,     0,     0,
-	    0,     0,    12,    12,    12,    12,    12,    12,
-	   12,    56,     0,    57,    58,    59,    60,    61,
-	   62,    63,    64,    65,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,    66,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,    67,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,    68,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,    69,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	   70,    12,    71,    72,     0,     0,    73,    74,
-	   75,    76,    35,    77,    12,    12,    12,    12,
-	   12,    12,    78,    12,    79,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,     0,    80,    81,    82,
-	   12,    12,    12,    12,    83,    84,    85,     0,
-	    0,    86,     0,    87,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    88,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,    89,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,     0,     0,     0,     0,
-	   90,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    88,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    88,    91,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,    12,    12,    12,    12,
-	   12,    12,    12,    12,
-};
-
-static const struct {
-	unsigned char bm[16];
-} nameprep_id11_unassigned_bitmap[] = {
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  2,  0,240,255,255,255,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  0,192,  0,  0,  0,  0,  0,  0,  0,128,255,255,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,255,  0,  0,207,187,
-	}},
-	{{
-	 15, 40,  0,  0,  4,  0,  0,  0,  0,128,  0,  0,  0,  0,128,255,
-	}},
-	{{
-	128,  0,  0,  0,  0,  0,  0,  0,  0,128,  0,  0,  0,  0,192,252,
-	}},
-	{{
-	  0,  0,255,255,255,255,  1,  0,  0,  0,128,  1,  1,  0,  0,  0,
-	}},
-	{{
-	  0,249,  1,  0,  4,  0,  0,  4,224,255,  0,  0,  0,248,224,255,
-	}},
-	{{
-	255,239,255,119,  1,  0,  0,248,  0,  0,192,255,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,  0,128,
-	}},
-	{{
-	  0, 64,  0,  0,  0,224,  0,  0,  0,248,255,255,255,255,255,255,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,252,255,255,255,255,255,255,255,255,255,
-	}},
-	{{
-	255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-	}},
-	{{
-	 17,  0,  0,  0,  0,  0,  0, 12,  0,192,224,  0,  0,  0,254,255,
-	}},
-	{{
-	 17, 96,  6,  0,  0,  2, 58, 44, 96,198,127, 79, 48,  0,  0,248,
-	}},
-	{{
-	 27,120,  6,  0,  0,  2,146, 44,120,198,255,161, 63,  0,224,255,
-	}},
-	{{
-	 17, 80,  4,  0,  0,  2, 18, 12, 64,196,254,255, 62,  0,255,255,
-	}},
-	{{
-	 17, 96,  6,  0,  0,  2, 50, 12,112,198, 63, 79, 60,  0,254,255,
-	}},
-	{{
-	 19, 56,194, 41,231, 56, 64, 60, 56,194,127,255,127,  0,248,255,
-	}},
-	{{
-	 17, 32,  2,  0,  0,  2, 16, 60, 32,194,159,255, 60,  0,255,255,
-	}},
-	{{
-	 19, 32,  2,  0,  0,  2, 16, 60, 32,194,159,191, 60,  0,255,255,
-	}},
-	{{
-	 19, 32,  2,  0,  0,  2,  0, 60, 48,194,127,255, 60,  0,255,255,
-	}},
-	{{
-	 19,  0,128,  3,  0,  0,  4,208,128,123,160,  0,255,255,227,255,
-	}},
-	{{
-	  1,  0,  0,  0,  0,  0,  0,120,  0,  0,  0,240,255,255,255,255,
-	}},
-	{{
-	105,218, 15,  1, 81, 19,  0,196,160,192,  0,204,255,255,255,255,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,248,  1,  0,
-	}},
-	{{
-	  0,240,  0,  1,  0,  0,  0, 32,  0, 96,255,255,255,255,255,255,
-	}},
-	{{
-	  0,  0,  0,  0,  4,  9, 56,252,  0,  0,  0,252,255,255,255,255,
-	}},
-	{{
-	255,255,255,255,  0,  0,  0,  0,192,255,  0,  0,  0,  0,  0,246,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252,
-	}},
-	{{
-	128,  0,  0,  0,  0,  0,  0,  0,128,194,128,194,  0,  0,  0,  0,
-	}},
-	{{
-	128,194,  0,  0,  0,128,194,128,194,128,128,  0,  0,128,  0,  0,
-	}},
-	{{
-	  0,128,194,128,  0,  0,  0,  0,128,  0,  0,248,  1,  0,  0,224,
-	}},
-	{{
-	255,255,255,255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,224,255,
-	}},
-	{{
-	  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,255,
-	}},
-	{{
-	  0,  0,  0,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,254,255,
-	}},
-	{{
-	  0, 32,224,255,  0,  0,128,255,  0,  0,240,255,  0, 32,242,255,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,224,  0,252,255,255,
-	}},
-	{{
-	  0,128,  0,252,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,
-	}},
-	{{
-	  0,  0,  0,  0,  0,252,255,255,255,255,255,255,255,255,255,255,
-	}},
-	{{
-	  0,  0,  0,240,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252,
-	}},
-	{{
-	  0,  0,192,192,  0,  0,  0,  0,192,192,  0, 85,  0,  0,  0,192,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0, 32,  0, 32,  0, 48, 16,  0,  0, 35,128,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,127,240,  3, 12,  0,
-	}},
-	{{
-	  0,128,255,255,  0,  0,252,255,255,255,  0,  0,  0,248,255,255,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0, 24,  0,240,  7,  0,  0,  0,  0,  0,
-	}},
-	{{
-	240,255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,128,255,255,255,255,255,255,
-	}},
-	{{
-	  0,  0,  0,  0,128,255,255,255,  0,248,255,255,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,
-	}},
-	{{
-	  0,  0, 48,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,
-	}},
-	{{
-	  0,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-	}},
-	{{
-	 33, 12,  0,  0,  0,  1,  0,  0,  0, 80,184,128,  1,  0,  0,  0,
-	}},
-	{{
-	  0,  0,224,  0,  0,  0,  1,128,255,255,  0,  0,  0,240,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,240,255,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,255,255,255,  0,240,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,128,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 31,  0,  0,  0,  0,224,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,128,  0,  0,  0,  0,  0,255,255,255,255,255,255,255,  0,  0,
-	}},
-	{{
-	  0,  0,  0,224,  0,  0,  0,  0,240,255,  1,  0,  0,  0,  0,112,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,240,  0,  0,  0,  0,  0,128,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  7,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,  0,  0,  0,128,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,192,255,255,255,255,255,255,255,255,255,
-	}},
-	{{
-	  0,  0,  0,  0,192,255,255,255,255,255,255,255,255,255,255,255,
-	}},
-	{{
-	  0,224,  0,  0,  0,  0,  0,  0,128,255,255,255,255,255,255,255,
-	}},
-	{{
-	  0,  0,  0,  0,240,255,255,255,255,255,255,255,255,255,255,255,
-	}},
-	{{
-	  0,  0,  0,  0,  0,192,  0,  0,  0,  0,  0,  0,  0,248,255,255,
-	}},
-	{{
-	128,255,  7, 31,  0,  0,128,160, 36,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,252,255,255,255,  7,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,255,255,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  3,  0,  0,  0,  0,  0,  0,255,  0,  0,  0,  0,  0,224,
-	}},
-	{{
-	  0,  0,255,255,240,255,  0,  0,128,  1,  8,  0,128,240, 32,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,128,  3,  3,  3,227,128,128,255,  1,
-	}},
-	{{
-	  0,  0,  0,128,240,255,  0,  0,  0,248,255,255,255,255,255,255,
-	}},
-	{{
-	  0,  0,  0,  0,192,  0,  0,  0,  0,192,255,255,255,255,255,255,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,255,
-	}},
-	{{
-	  0,  0,  0,  0,128,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,255,255,255,255,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0, 32,155, 33,  0, 20, 18,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 64, 24, 32, 32,  0,  0,  0,132,160,  3,  2,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,240,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 63,
-	}},
-	{{
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,255,255,255,255,255,
-	}},
-	{{
-	  0,  0,  0,192,255,255,255,255,255,255,255,255,255,255,255,255,
-	}},
-	{{
-	253,255,255,255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-};
-
-static const unsigned short nameprep_id11_bidi_imap[] = {
-	  272,   400,   528,   656,   784,   912,   912,   912,
-	  912,  1040,  1168,   912,   912,  1296,   912,  1424,
-	 1552,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1808,  1680,  1680,
-	  912,   912,   912,   912,   912,   912,   912,   912,
-	  912,   912,  1936,  1680,  1680,  1680,  1680,  2064,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	 1680,  1680,  1680,  1680,  1680,  1680,  1680,  1680,
-	  912,   912,   912,   912,   912,   912,   912,   912,
-	  912,   912,   912,   912,   912,   912,   912,  2192,
-	  912,   912,   912,   912,   912,   912,   912,   912,
-	  912,   912,   912,   912,   912,   912,   912,  2192,
-	    0,     0,     1,     1,     0,     2,     3,     3,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     5,     6,     4,     4,     7,     8,     9,
-	    0,     0,     0,    10,    11,    12,    13,    14,
-	    4,     4,     4,     4,    15,     4,    13,    16,
-	   17,    18,    19,    20,    21,    22,    23,    24,
-	   25,    26,    27,    28,    29,    29,    30,    31,
-	   32,    33,     0,     0,    29,    34,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	   35,    36,    37,    38,    39,    40,    41,    42,
-	   43,    44,    45,    46,    47,    48,    49,    50,
-	   39,    51,    41,    52,    53,    54,    55,    56,
-	   57,    58,    59,    60,    61,    62,    63,    60,
-	   61,    64,    65,    60,    66,    67,    68,    69,
-	   20,    70,    71,     0,    72,    73,    74,     0,
-	   75,    76,    77,    78,    79,    80,    81,     0,
-	    4,    82,    83,     0,     0,     4,    84,    85,
-	    4,     4,    86,     4,     4,    87,     4,    88,
-	   89,     4,    90,     4,    91,    92,    93,    13,
-	   92,     4,    94,    95,     0,     4,     4,    96,
-	   20,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,    97,     1,     4,     4,    98,
-	   99,   100,   101,   102,     4,   103,   104,   105,
-	  106,     4,     4,    83,     4,   107,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    4,     4,     4,     4,   108,     4,     4,    88,
-	  109,     4,   110,   111,     4,   112,   113,   114,
-	  115,     0,     0,   116,     0,     0,     0,     0,
-	  117,   118,   119,     4,   120,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,   121,     4,   122,   123,     0,     0,     0,
-	    0,     0,     0,     0,   124,     4,     4,   105,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	  125,   126,    20,     4,   127,    20,     4,   128,
-	  129,   130,     4,     4,    13,    83,     0,     6,
-	  131,     4,   120,   132,     4,    98,   133,   134,
-	    4,     4,     4,   135,     4,     4,   111,   134,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,    14,     0,     0,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,   136,     0,     0,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,   137,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,   120,     0,     0,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,   138,     4,   139,     0,     0,     0,     0,
-	  140,   141,   142,    29,    29,   143,   144,    29,
-	   29,    29,    29,    29,    29,    29,    29,    29,
-	   29,   145,   146,    29,   147,    29,   148,   149,
-	    0,     0,     0,   150,    29,    29,    29,   151,
-	    0,     1,     1,   152,     4,   134,   153,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	  134,   154,   139,     0,     0,     0,     0,     0,
-	    4,   155,   156,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    4,     4,     4,     4,     4,     4,     4,    14,
-	    4,   157,     4,   158,   159,   160,   111,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    4,     4,   161,     4,   162,   163,   164,     4,
-	  165,   166,   167,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,   168,     4,     4,
-	    4,     4,     4,     4,     4,     4,   105,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,    97,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	  111,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    0,     0,     0,     0,     0,     0,     0,     0,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,     4,
-	    4,     4,     4,     4,     4,     4,     4,   111,
-};
-
-static const struct {
-	unsigned char tbl[32];
-} nameprep_id11_bidi_table[] = {
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  2,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
-	 2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  2,  0,  2,  2,  2,  0,  2,  0,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  0,  0,  2,  2,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,
-	}},
-	{{
-	 1,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	}},
-	{{
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  1,
-	 1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,
-	}},
-	{{
-	 0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  0,
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	}},
-	{{
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	}},
-	{{
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	 1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  0,
-	}},
-	{{
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,
-	 0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	}},
-	{{
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  2,  2,  2,
-	}},
-	{{
-	 2,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,  2,
-	 0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  2,  2,
-	 0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,
-	 0,  2,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,  0,  2,  2,
-	}},
-	{{
-	 2,  0,  0,  0,  0,  0,  0,  2,  2,  0,  0,  2,  2,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  2,  2,  0,  2,
-	}},
-	{{
-	 2,  2,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  0,  0,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  2,  2,
-	 0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,
-	 0,  2,  2,  0,  2,  2,  0,  2,  2,  0,  0,  0,  0,  2,  2,
-	}},
-	{{
-	 2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  0,  2,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,
-	 0,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  2,  0,  2,  2,  2,  2,  2,  2,  2,  0,  2,  0,  2,  2,
-	 2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,
-	 0,  2,  2,  0,  2,  2,  2,  2,  2,  0,  0,  0,  2,  2,  2,
-	}},
-	{{
-	 2,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  2,  2,  0,  0,  0,  2,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,
-	 0,  2,  2,  0,  0,  2,  2,  2,  2,  0,  0,  0,  2,  2,  0,
-	}},
-	{{
-	 2,  2,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  2,  0,  2,  2,  2,  2,  2,  2,  0,  0,  0,  2,  2,  2,
-	 0,  2,  2,  2,  2,  0,  0,  0,  2,  2,  0,  2,  0,  2,  2,
-	}},
-	{{
-	 0,  0,  0,  2,  2,  0,  0,  0,  2,  2,  2,  0,  0,  0,  2,  2,  2,
-	 2,  2,  2,  2,  2,  0,  2,  2,  2,  0,  0,  0,  0,  2,  2,
-	}},
-	{{
-	 0,  2,  2,  0,  0,  0,  2,  2,  2,  0,  2,  2,  2,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,
-	 0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  0,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,
-	 0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  0,  2,  2,  2,  2,  2,  0,  0,  0,  0,  2,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  0,  0,  2,  2,  0,  2,  2,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  2,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  2,  2,
-	}},
-	{{
-	 2,  0,  0,  0,  0,  0,  2,  2,  2,  0,  2,  2,  2,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  0,  0,  0,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,
-	 2,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  2,  2,  0,  2,  0,  0,  2,  2,  0,  2,  0,  0,  2,  0,  0,  0,
-	 0,  0,  0,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 0,  2,  2,  2,  0,  2,  0,  2,  0,  0,  2,  2,  0,  2,  2,  2,  2,
-	 0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  2,  2,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  0,  2,  0,  2,  0,  0,  0,  0,  0,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  2,  0,  0,  2,  2,  2,  2,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  0,  0,  2,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  0,  2,  2,  2,  2,  2,  0,  2,  2,  0,  2,  0,  0,  0,  0,
-	 2,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  2,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  2,
-	}},
-	{{
-	 2,  2,  2,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  0,  2,  0,  2,  2,  2,  2,  0,  0,  2,
-	 2,  2,  2,  2,  2,  2,  0,  2,  0,  2,  2,  2,  2,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  0,  2,  0,  2,  2,  2,  2,  0,  0,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,
-	 0,  2,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  2,  2,  0,
-	}},
-	{{
-	 2,  0,  2,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  2,  2,  0,  2,
-	 2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,
-	 2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  0,  0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  0,  2,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  2,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  2,  0,  0,  2,
-	 2,  2,  2,  2,  2,  2,  2,  0,  2,  0,  2,  0,  2,  0,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  0,  2,  0,
-	}},
-	{{
-	 0,  0,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  2,
-	 2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,
-	 0,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  1,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
-	}},
-	{{
-	 0,  0,  2,  0,  0,  0,  0,  2,  0,  0,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  0,  2,  0,  0,  0,  2,  2,  2,  2,  2,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  2,  0,  2,  0,  2,  0,  2,  2,  2,  2,  0,  2,  2,
-	 2,  0,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  2,  2,  2,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,
-	 2,  2,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  1,  0,  1,
-	}},
-	{{
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,
-	 1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  0,  1,  0,
-	}},
-	{{
-	 1,  1,  0,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	}},
-	{{
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	 1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	}},
-	{{
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	}},
-	{{
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,
-	 0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	}},
-	{{
-	 1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
-	 1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	}},
-	{{
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-	 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 0,  0,  2,  2,  2,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  2,  0,
-	 0,  2,  2,  2,  2,  2,  2,  0,  0,  2,  2,  2,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,
-	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	}},
-	{{
-	 0,  0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,
-	}},
-	{{
-	 0,  0,  2,  0,  0,  2,  2,  0,  0,  2,  2,  2,  2,  0,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  0,  2,  2,  2,
-	}},
-	{{
-	 2,  0,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  0,  0,  2,  2,  2,  2,
-	 2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  0,
-	}},
-	{{
-	 2,  2,  2,  2,  2,  0,  2,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,
-	 0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-	{{
-	 2,  2,  2,  2,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-	}},
-};
-
-static const unsigned char nameprep_id11_bidi_data[] = {
-	idn_biditype_others,
-	idn_biditype_r_al,
-	idn_biditype_l,
-};
-
--- a/netwerk/dns/nsIDNService.cpp
+++ b/netwerk/dns/nsIDNService.cpp
@@ -12,26 +12,24 @@
 #include "harfbuzz/hb.h"
 #include "nsIServiceManager.h"
 #include "nsIPrefService.h"
 #include "nsIPrefBranch.h"
 #include "nsIObserverService.h"
 #include "nsISupportsPrimitives.h"
 #include "punycode.h"
 
-#ifdef IDNA2008
 // Currently we use the non-transitional processing option -- see
 // http://unicode.org/reports/tr46/
 // To switch to transitional processing, change the value of this flag
 // and kTransitionalProcessing in netwerk/test/unit/test_idna2008.js to true
 // (revert bug 1218179).
 const bool kIDNA2008_TransitionalProcessing = false;
 
 #include "ICUUtils.h"
-#endif
 
 using namespace mozilla::unicode;
 
 //-----------------------------------------------------------------------------
 // RFC 1034 - 3.1. Name space specifications and terminology
 static const uint32_t kMaxDNSNodeLen = 63;
 // RFC 3490 - 5.   ACE prefix
 static const char kACEPrefix[] = "xn--";
@@ -141,44 +139,31 @@ void nsIDNService::prefsChanged(nsIPrefB
 
 nsIDNService::nsIDNService()
   : mLock("DNService pref value lock")
   , mShowPunycode(false)
   , mIDNUseWhitelist(false)
 {
   MOZ_ASSERT(NS_IsMainThread());
 
-#ifdef IDNA2008
   uint32_t IDNAOptions = UIDNA_CHECK_BIDI | UIDNA_CHECK_CONTEXTJ;
   if (!kIDNA2008_TransitionalProcessing) {
     IDNAOptions |= UIDNA_NONTRANSITIONAL_TO_UNICODE;
   }
   UErrorCode errorCode = U_ZERO_ERROR;
   mIDNA = uidna_openUTS46(IDNAOptions, &errorCode);
-#else
-  if (idn_success != idn_nameprep_create(nullptr, &mNamePrepHandle))
-    mNamePrepHandle = nullptr;
-
-  mNormalizer = do_GetService(NS_UNICODE_NORMALIZER_CONTRACTID);
-  /* member initializers and constructor code */
-#endif
 }
 
 nsIDNService::~nsIDNService()
 {
   MOZ_ASSERT(NS_IsMainThread());
 
-#ifdef IDNA2008
   uidna_close(mIDNA);
-#else
-  idn_nameprep_destroy(mNamePrepHandle);
-#endif
 }
 
-#ifdef IDNA2008
 nsresult
 nsIDNService::IDNA2008ToUnicode(const nsACString& input, nsAString& output)
 {
   NS_ConvertUTF8toUTF16 inputStr(input);
   UIDNAInfo info = UIDNA_INFO_INITIALIZER;
   UErrorCode errorCode = U_ZERO_ERROR;
   int32_t inLen = inputStr.Length();
   int32_t outMaxLen = kMaxDNSNodeLen + 1;
@@ -241,17 +226,16 @@ nsIDNService::IDNA2008StringPrep(const n
     if (flag == eStringPrepForDNS) {
       output.Truncate();
     }
     rv = NS_ERROR_MALFORMED_URI;
   }
 
   return rv;
 }
-#endif
 
 NS_IMETHODIMP nsIDNService::ConvertUTF8toACE(const nsACString & input, nsACString & ace)
 {
   return UTF8toACE(input, ace, eStringPrepForDNS);
 }
 
 nsresult nsIDNService::UTF8toACE(const nsACString & input, nsACString & ace,
                                  stringPrepFlag flag)
@@ -541,31 +525,16 @@ static nsresult utf16ToUcs4(const nsAStr
     if (i >= outBufLen)
       return NS_ERROR_MALFORMED_URI;
   }
   out[i] = (uint32_t)'\0';
   *outLen = i;
   return NS_OK;
 }
 
-#ifndef IDNA2008
-static void ucs4toUtf16(const uint32_t *in, nsAString& out)
-{
-  while (*in) {
-    if (!IS_IN_BMP(*in)) {
-      out.Append((char16_t) H_SURROGATE(*in));
-      out.Append((char16_t) L_SURROGATE(*in));
-    }
-    else
-      out.Append((char16_t) *in);
-    in++;
-  }
-}
-#endif
-
 static nsresult punycode(const nsAString& in, nsACString& out)
 {
   uint32_t ucs4Buf[kMaxDNSNodeLen + 1];
   uint32_t ucs4Len = 0u;
   nsresult rv = utf16ToUcs4(in, ucs4Buf, kMaxDNSNodeLen, &ucs4Len);
   NS_ENSURE_SUCCESS(rv, rv);
 
   // need maximum 20 bits to encode 16 bit Unicode character
@@ -609,81 +578,17 @@ static nsresult punycode(const nsAString
 //
 // 5) Check unassigned code points -- If allowUnassigned is false, check for
 // any unassigned Unicode points and if any are found return an error.
 // This is described in section 7.
 //
 nsresult nsIDNService::stringPrep(const nsAString& in, nsAString& out,
                                   stringPrepFlag flag)
 {
-#ifdef IDNA2008
   return IDNA2008StringPrep(in, out, flag);
-#else
-  if (!mNamePrepHandle || !mNormalizer)
-    return NS_ERROR_FAILURE;
-
-  uint32_t ucs4Buf[kMaxDNSNodeLen + 1];
-  uint32_t ucs4Len;
-  nsresult rv = utf16ToUcs4(in, ucs4Buf, kMaxDNSNodeLen, &ucs4Len);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  // map
-  idn_result_t idn_err;
-
-  uint32_t namePrepBuf[kMaxDNSNodeLen * 3];   // map up to three characters
-  idn_err = idn_nameprep_map(mNamePrepHandle, (const uint32_t *) ucs4Buf,
-		                     (uint32_t *) namePrepBuf, kMaxDNSNodeLen * 3);
-  NS_ENSURE_TRUE(idn_err == idn_success, NS_ERROR_MALFORMED_URI);
-
-  nsAutoString namePrepStr;
-  ucs4toUtf16(namePrepBuf, namePrepStr);
-  if (namePrepStr.Length() >= kMaxDNSNodeLen)
-    return NS_ERROR_MALFORMED_URI;
-
-  // normalize
-  nsAutoString normlizedStr;
-  rv = mNormalizer->NormalizeUnicodeNFKC(namePrepStr, normlizedStr);
-  if (normlizedStr.Length() >= kMaxDNSNodeLen)
-    return NS_ERROR_MALFORMED_URI;
-
-  // set the result string
-  out.Assign(normlizedStr);
-
-  if (flag == eStringPrepIgnoreErrors) {
-    return NS_OK;
-  }
-
-  // prohibit
-  const uint32_t *found = nullptr;
-  idn_err = idn_nameprep_isprohibited(mNamePrepHandle,
-                                      (const uint32_t *) ucs4Buf, &found);
-  if (idn_err != idn_success || found) {
-    rv = NS_ERROR_MALFORMED_URI;
-  } else {
-    // check bidi
-    idn_err = idn_nameprep_isvalidbidi(mNamePrepHandle,
-                                       (const uint32_t *) ucs4Buf, &found);
-    if (idn_err != idn_success || found) {
-      rv = NS_ERROR_MALFORMED_URI;
-    } else  if (flag == eStringPrepForUI) {
-      // check unassigned code points
-      idn_err = idn_nameprep_isunassigned(mNamePrepHandle,
-                                          (const uint32_t *) ucs4Buf, &found);
-      if (idn_err != idn_success || found) {
-        rv = NS_ERROR_MALFORMED_URI;
-      }
-    }
-  }
-
-  if (flag == eStringPrepForDNS && NS_FAILED(rv)) {
-    out.Truncate();
-  }
-
-  return rv;
-#endif
 }
 
 nsresult nsIDNService::stringPrepAndACE(const nsAString& in, nsACString& out,
                                         stringPrepFlag flag)
 {
   nsresult rv = NS_OK;
 
   out.Truncate();
@@ -764,41 +669,19 @@ nsresult nsIDNService::decodeACE(const n
   bool isAce;
   IsACE(in, &isAce);
   if (!isAce) {
     out.Assign(in);
     return NS_OK;
   }
 
   nsAutoString utf16;
-#ifdef IDNA2008
   nsresult result = IDNA2008ToUnicode(in, utf16);
   NS_ENSURE_SUCCESS(result, result);
-#else
-  // RFC 3490 - 4.2 ToUnicode
-  // The ToUnicode output never contains more code points than its input.
-  punycode_uint output_length = in.Length() - kACEPrefixLen + 1;
-  auto *output = new punycode_uint[output_length];
-  NS_ENSURE_TRUE(output, NS_ERROR_OUT_OF_MEMORY);
 
-  enum punycode_status status = punycode_decode(in.Length() - kACEPrefixLen,
-                                                PromiseFlatCString(in).get() + kACEPrefixLen,
-                                                &output_length,
-                                                output,
-                                                nullptr);
-  if (status != punycode_success) {
-    delete [] output;
-    return NS_ERROR_MALFORMED_URI;
-  }
-
-  // UCS4 -> UTF8
-  output[output_length] = 0;
-  ucs4toUtf16(output, utf16);
-  delete [] output;
-#endif
   if (flag != eStringPrepForUI || isLabelSafe(utf16)) {
     CopyUTF16toUTF8(utf16, out);
   } else {
     out.Assign(in);
     return NS_OK;
   }
 
   // Validation: encode back to ACE and compare the strings
--- a/netwerk/dns/nsIDNService.h
+++ b/netwerk/dns/nsIDNService.h
@@ -7,22 +7,17 @@
 #define nsIDNService_h__
 
 #include "nsIIDNService.h"
 #include "nsCOMPtr.h"
 #include "nsIObserver.h"
 #include "nsUnicodeScriptCodes.h"
 #include "nsWeakReference.h"
 
-#ifdef IDNA2008
 #include "unicode/uidna.h"
-#else
-#include "nsIUnicodeNormalizer.h"
-#include "nsIDNKitInterface.h"
-#endif
 
 #include "nsString.h"
 
 class nsIPrefBranch;
 
 //-----------------------------------------------------------------------------
 // nsIDNService
 //-----------------------------------------------------------------------------
@@ -146,33 +141,28 @@ private:
    *  Latin + Han + Hangul
    *
    * For the "Moderately restrictive" profile, Latin is also allowed
    *  with other scripts except Cyrillic and Greek
    */
   bool illegalScriptCombo(mozilla::unicode::Script script,
                           int32_t& savedScript);
 
-#ifdef IDNA2008
   /**
    * Convert a DNS label from ASCII to Unicode using IDNA2008
    */
   nsresult IDNA2008ToUnicode(const nsACString& input, nsAString& output);
 
   /**
    * Convert a DNS label to a normalized form conforming to IDNA2008
    */
   nsresult IDNA2008StringPrep(const nsAString& input, nsAString& output,
                               stringPrepFlag flag);
 
   UIDNA* mIDNA;
-#else
-  idn_nameprep_t mNamePrepHandle;
-  nsCOMPtr<nsIUnicodeNormalizer> mNormalizer;
-#endif
 
   // We use this mutex to guard access to:
   // |mIDNBlacklist|, |mShowPunycode|, |mRestrictionProfile|,
   // |mIDNUseWhitelist|.
   //
   // These members can only be updated on the main thread and
   // read on any thread. Therefore, acquiring the mutex is required
   // only for threads other than the main thread.
--- a/taskcluster/ci/test/tests.yml
+++ b/taskcluster/ci/test/tests.yml
@@ -762,18 +762,18 @@ mochitest-devtools-chrome:
         extra-options:
             by-test-platform:
                 linux64-jsdcov/opt:
                     - --mochitest-suite=mochitest-devtools-chrome-coverage
                 default:
                     - --mochitest-suite=mochitest-devtools-chrome-chunked
     instance-size:
         by-test-platform:
-            # Bug 1361476 - try xlarge on asan to see if it avoids OOM
-            linux64-asan/opt: xlarge
+            # Bug 1281241: migrating to m3.large instances
+            linux64-asan/opt: legacy
             default: default
     # Bug 1296086: high number of intermittents observed with software GL and large instances
     allow-software-gl-layers: false
     tier:
         by-test-platform:
             windows10-64-asan.*: 3
             default: default
 
--- a/testing/modules/AppInfo.jsm
+++ b/testing/modules/AppInfo.jsm
@@ -53,16 +53,17 @@ this.newAppInfo = function(options = {})
     platformBuildID: origPlatformInfo.platformBuildID,
 
     // nsIXULRuntime
     inSafeMode: false,
     logConsoleErrors: true,
     OS,
     XPCOMABI: "noarch-spidermonkey",
     invalidateCachesOnRestart() {},
+    shouldBlockIncompatJaws: false,
 
     // nsIWinAppHelper
     get userCanElevate() {
       return false;
     },
   };
 
   let interfaces = [Ci.nsIXULAppInfo,
--- a/testing/mozharness/configs/unittests/win_taskcluster_unittest.py
+++ b/testing/mozharness/configs/unittests/win_taskcluster_unittest.py
@@ -252,17 +252,17 @@ config = {
             'cmd': [
                 sys.executable,
                 os.path.join(os.getcwd(),
                     'mozharness', 'external_tools', 'mouse_and_screen_resolution.py'),
                 '--configuration-file',
                 os.path.join(os.getcwd(),
                     'mozharness', 'external_tools', 'machine-configuration.json')
             ],
-            'architectures': ['32bit'],
+            'architectures': ['32bit', '64bit'],
             'halt_on_failure': True,
             'enabled': ADJUST_MOUSE_AND_SCREEN
         }
     ],
     "vcs_output_timeout": 1000,
     "minidump_save_path": "%(abs_work_dir)s/../minidumps",
     "buildbot_max_log_size": 52428800,
     "default_blob_upload_servers": [
--- a/testing/mozharness/configs/web_platform_tests/prod_config_windows_taskcluster.py
+++ b/testing/mozharness/configs/web_platform_tests/prod_config_windows_taskcluster.py
@@ -37,12 +37,37 @@ config = {
     ],
 
     "pip_index": False,
 
     "default_blob_upload_servers": [
          "https://blobupload.elasticbeanstalk.com",
     ],
 
+    "run_cmd_checks_enabled": True,
+    "preflight_run_cmd_suites": [
+        {
+            'name': 'disable_screen_saver',
+            'cmd': ['xset', 's', 'off', 's', 'reset'],
+            'architectures': ['32bit', '64bit'],
+            'halt_on_failure': False,
+            'enabled': False
+        },
+        {
+            'name': 'run mouse & screen adjustment script',
+            'cmd': [
+                sys.executable,
+                os.path.join(os.getcwd(),
+                    'mozharness', 'external_tools', 'mouse_and_screen_resolution.py'),
+                '--configuration-file',
+                os.path.join(os.getcwd(),
+                    'mozharness', 'external_tools', 'machine-configuration.json')
+            ],
+            'architectures': ['32bit', '64bit'],
+            'halt_on_failure': True,
+            'enabled': True
+        }
+    ],
+
     "blob_uploader_auth_file" : 'C:/builds/oauth.txt',
 
     "download_minidump_stackwalk": True,
 }
--- a/testing/mozharness/external_tools/mouse_and_screen_resolution.py
+++ b/testing/mozharness/external_tools/mouse_and_screen_resolution.py
@@ -40,21 +40,17 @@ def wfetch(url, retries=5):
         if retries < 0:
             raise Exception("Could not fetch url '%s'" % url)
         retries -= 1
         print("Retrying")
         time.sleep(60)
 
 def main():
 
-    if not (platform.version().startswith('6.1.760') and not 'PROGRAMFILES(X86)' in os.environ):
-        # We only want to run this for Windows 7 32-bit
-        print "INFO: This script was written to be used with Windows 7 32-bit machines."
-        return 0
-
+    # NOTE: this script was written for windows 7, but works well with windows 10
     parser = OptionParser()
     parser.add_option(
         "--configuration-url", dest="configuration_url", type="string",
         help="Specifies the url of the configuration file.")
     parser.add_option(
         "--configuration-file", dest="configuration_file", type="string",
         help="Specifies the path to the configuration file.")
     (options, args) = parser.parse_args()
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -153602,28 +153602,112 @@
       [
        "/css/selectors4/of-type-selectors-ref.xhtml",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/selectors4/selector-placeholder-shown-type-change-001.html": [
+    [
+     "/css/selectors4/selector-placeholder-shown-type-change-001.html",
+     [
+      [
+       "/css/selectors4/selector-placeholder-shown-type-change-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/selectors4/selector-placeholder-shown-type-change-002.html": [
+    [
+     "/css/selectors4/selector-placeholder-shown-type-change-002.html",
+     [
+      [
+       "/css/selectors4/selector-placeholder-shown-type-change-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/selectors4/selector-placeholder-shown-type-change-003.html": [
+    [
+     "/css/selectors4/selector-placeholder-shown-type-change-003.html",
+     [
+      [
+       "/css/selectors4/selector-placeholder-shown-type-change-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/selectors4/selector-read-write-type-change-001.html": [
+    [
+     "/css/selectors4/selector-read-write-type-change-001.html",
+     [
+      [
+       "/css/selectors4/selector-read-write-type-change-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/selectors4/selector-read-write-type-change-002.html": [
+    [
+     "/css/selectors4/selector-read-write-type-change-002.html",
+     [
+      [
+       "/css/selectors4/selector-read-write-type-change-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/selectors4/selector-required.html": [
     [
      "/css/selectors4/selector-required.html",
      [
       [
        "/css/selectors4/selector-required-ref.html",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/selectors4/selector-required-type-change-001.html": [
+    [
+     "/css/selectors4/selector-required-type-change-001.html",
+     [
+      [
+       "/css/selectors4/selector-required-type-change-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/selectors4/selector-required-type-change-002.html": [
+    [
+     "/css/selectors4/selector-required-type-change-002.html",
+     [
+      [
+       "/css/selectors4/selector-required-type-change-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/selectors4/selectors-dir-selector-ltr-001.html": [
     [
      "/css/selectors4/selectors-dir-selector-ltr-001.html",
      [
       [
        "/css/reference/ref-filled-green-100px-square.xht",
        "=="
       ]
@@ -253229,21 +253313,56 @@
      {}
     ]
    ],
    "css/selectors4/of-type-selectors-ref.xhtml": [
     [
      {}
     ]
    ],
+   "css/selectors4/selector-placeholder-shown-type-change-001-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css/selectors4/selector-placeholder-shown-type-change-002-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css/selectors4/selector-placeholder-shown-type-change-003-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css/selectors4/selector-read-write-type-change-001-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css/selectors4/selector-read-write-type-change-002-ref.html": [
+    [
+     {}
+    ]
+   ],
    "css/selectors4/selector-required-ref.html": [
     [
      {}
     ]
    ],
+   "css/selectors4/selector-required-type-change-001-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css/selectors4/selector-required-type-change-002-ref.html": [
+    [
+     {}
+    ]
+   ],
    "css/support/1x1-green.png": [
     [
      {}
     ]
    ],
    "css/support/1x1-lime.png": [
     [
      {}
@@ -545762,20 +545881,76 @@
   "css/selectors4/of-type-selectors-ref.xhtml": [
    "59f848418882c75898c422a9600c14ffab64c3d9",
    "support"
   ],
   "css/selectors4/of-type-selectors.xhtml": [
    "607553f41a33ce3630752cdf027c9f904833a19d",
    "reftest"
   ],
+  "css/selectors4/selector-placeholder-shown-type-change-001-ref.html": [
+    "92303d06943581738f58ff5d342ef1336539f66a",
+    "support"
+  ],
+  "css/selectors4/selector-placeholder-shown-type-change-002-ref.html": [
+    "ac3a88a758fd0ccc67077993d59bfb34eadf3931",
+    "support"
+  ],
+  "css/selectors4/selector-placeholder-shown-type-change-003-ref.html": [
+    "ac3a88a758fd0ccc67077993d59bfb34eadf3931",
+    "support"
+  ],
+  "css/selectors4/selector-placeholder-shown-type-change-001.html": [
+    "afb7a260d6f1c7da337a1f20a62778d1d6e302c4",
+    "reftest"
+  ],
+  "css/selectors4/selector-placeholder-shown-type-change-002.html": [
+    "df0cbd1b178d72de9f70d0e603c30858508c2edd",
+    "reftest"
+  ],
+  "css/selectors4/selector-placeholder-shown-type-change-003.html": [
+    "36046107e0f3763e219a2316ab6232785a325257",
+    "reftest"
+  ],
+  "css/selectors4/selector-read-write-type-change-001-ref.html": [
+    "812f07e03f5bbf86feb2d8eefe17aeaa7bd69970",
+    "support"
+  ],
+  "css/selectors4/selector-read-write-type-change-001.html": [
+    "95da0fbd6aafb8dcecb6f39e5cc8572f536e7eb5",
+    "reftest"
+  ],
+  "css/selectors4/selector-read-write-type-change-002-ref.html": [
+    "3579aa13253d99a430ce17ba1acd629a22261097",
+    "support"
+  ],
+  "css/selectors4/selector-read-write-type-change-002.html": [
+    "0bb1111fd76582a433204bce32852fc0a5dc5458",
+    "reftest"
+  ],
   "css/selectors4/selector-required-ref.html": [
    "815bc765614b4c2e3d8f8f6303e6bb2ee0989c23",
    "support"
   ],
+  "css/selectors4/selector-required-type-change-001-ref.html": [
+    "812f07e03f5bbf86feb2d8eefe17aeaa7bd69970",
+    "support"
+  ],
+  "css/selectors4/selector-required-type-change-001.html": [
+    "211b7b71cf1073dd15491b78b0152f9b7a5e9aec",
+    "reftest"
+  ],
+  "css/selectors4/selector-required-type-change-002-ref.html": [
+    "3579aa13253d99a430ce17ba1acd629a22261097",
+    "support"
+  ],
+  "css/selectors4/selector-required-type-change-002.html": [
+    "f27dbc7bd1e2aa0753bcae73fdf2d83f7248118a",
+    "reftest"
+  ],
   "css/selectors4/selector-required.html": [
    "601b8b8426c64717f82831e6258f8fe4188c797c",
    "reftest"
   ],
   "css/selectors4/selectors-dir-selector-ltr-001.html": [
    "3682f8a499ad2a1348f620b33b83944c0dc90788",
    "reftest"
   ],
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/selectors4/selector-placeholder-shown-type-change-001.html.ini
@@ -0,0 +1,4 @@
+[selector-placeholder-shown-type-change-001.html]
+  type: reftest
+  expected: FAIL
+  bug: 1401657
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/selectors4/selector-read-write-type-change-002.html.ini
@@ -0,0 +1,4 @@
+[selector-read-write-type-change-002.html]
+  type: reftest
+  expected: FAIL
+  bug: 312971
--- a/testing/web-platform/meta/cssom-view/CaretPosition-001.html.ini
+++ b/testing/web-platform/meta/cssom-view/CaretPosition-001.html.ini
@@ -1,7 +1,6 @@
 [CaretPosition-001.html]
   type: testharness
   [Element at (400, 900)]
     expected:
-      if (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
       FAIL
 
deleted file mode 100644
--- a/testing/web-platform/meta/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini
+++ /dev/null
@@ -1,38 +0,0 @@
-[open-features-non-integer-screeny.html]
-  type: testharness
-  [features "screeny=405.5" should set "height=405"]
-    expected:
-      if (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-
-  [features "screeny=405.32" should set "height=405"]
-    expected:
-      if (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-
-  [features "screeny=405LLl" should set "height=405"]
-    expected:
-      if (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-
-  [features "screeny=405^4" should set "height=405"]
-    expected:
-      if (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-
-  [features "screeny=405*3" should set "height=405"]
-    expected:
-      if (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-
-  [features "screeny=405/5" should set "height=405"]
-    expected:
-      if (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-
-  [features "screeny=405  " should set "height=405"]
-    expected:
-      if (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-
-  [features "screeny=405e1" should set "height=405"]
-    expected:
-      if (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-
-  [features "screeny=405e-1" should set "height=405"]
-    expected:
-      if (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-
--- a/testing/web-platform/meta/html/semantics/embedded-content/the-img-element/usemap-casing.html.ini
+++ b/testing/web-platform/meta/html/semantics/embedded-content/the-img-element/usemap-casing.html.ini
@@ -1,13 +1,5 @@
 [usemap-casing.html]
   type: testharness
   [Image with usemap of #sanityCheck should match the area with map named sanityCheck]
     expected: FAIL
 
-  [Image with usemap of #tÉdz5アパートFi should not match any of the areas]
-    expected:
-      if (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-
-  [Image with usemap of #ΣΣ should not match any of the areas]
-    expected:
-      if (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-
--- a/testing/web-platform/meta/html/semantics/embedded-content/the-object-element/usemap-casing.html.ini
+++ b/testing/web-platform/meta/html/semantics/embedded-content/the-object-element/usemap-casing.html.ini
@@ -1,13 +1,5 @@
 [usemap-casing.html]
   type: testharness
   [Object with usemap of #sanityCheck should match the area with map named sanityCheck]
     expected: FAIL
 
-  [Object with usemap of #tÉdz5アパートFi should not match any of the areas]
-    expected:
-      if (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-
-  [Object with usemap of #ΣΣ should not match any of the areas]
-    expected:
-      if (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/selectors4/selector-placeholder-shown-type-change-001-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      span { color: green; }
+    </style>
+  </head>
+  <body>
+    <input placeholder="text"><span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/selectors4/selector-placeholder-shown-type-change-001.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <title>Check for correctly updating :placeholder-shown matching on type change</title>
+    <link rel="match" href="selector-placeholder-shown-type-change-001-ref.html">
+    <style>
+      span { color: red; }
+      :placeholder-shown + span { color: green }
+    </style>
+    <script>
+      onload = function() {
+        // setTimeout because in some browsers apparently a toplevel restyle
+        // happens right after the load event fires?
+        setTimeout(function() {
+          document.querySelector("input").type = "";
+          document.documentElement.className = "";
+        }, 10);
+      }
+    </script>
+  </head>
+  <body>
+    <input type="hidden" placeholder="text"><span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/selectors4/selector-placeholder-shown-type-change-002-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      span { color: green; }
+    </style>
+  </head>
+  <body>
+    <span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/selectors4/selector-placeholder-shown-type-change-002.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <title>Check for correctly updating :placeholder-shown matching on type change</title>
+    <link rel="match" href="selector-placeholder-shown-type-change-002-ref.html">
+    <style>
+      span { color: green; }
+      :placeholder-shown + span { color: red }
+    </style>
+    <script>
+      onload = function() {
+        // setTimeout because in some browsers apparently a toplevel restyle
+        // happens right after the load event fires?
+        setTimeout(function() {
+          document.querySelector("input").type = "hidden";
+          document.documentElement.className = "";
+        }, 10);
+      }
+    </script>
+  </head>
+  <body>
+    <input placeholder="text"><span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/selectors4/selector-placeholder-shown-type-change-003-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      span { color: green; }
+    </style>
+  </head>
+  <body>
+    <span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/selectors4/selector-placeholder-shown-type-change-003.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <title>Check for correctly updating :placeholder-shown matching on type change</title>
+    <link rel="match" href="selector-placeholder-shown-type-change-003-ref.html">
+    <style>
+      span { color: green; }
+      :placeholder-shown + span { color: red }
+    </style>
+    <script>
+      onload = function() {
+        // setTimeout because in some browsers apparently a toplevel restyle
+        // happens right after the load event fires?
+        setTimeout(function() {
+          document.querySelector("input").type = "hidden";
+          document.documentElement.className = "";
+        }, 10);
+      }
+    </script>
+  </head>
+  <body>
+    <input required placeholder="text"><span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/selectors4/selector-read-write-type-change-001-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      span { color: green; }
+    </style>
+  </head>
+  <body>
+    <input type="button"><span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/selectors4/selector-read-write-type-change-001.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Check for correctly updating :read-write matching on type change</title>
+    <link rel="match" href="selector-read-write-type-change-001-ref.html">
+    <style>
+      span { color: green; }
+      :read-write + span { color: red }
+    </style>
+    <script>
+      onload = function() {
+        document.querySelector("input").type = "button";
+      }
+    </script>
+  </head>
+  <body>
+    <input required><span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/selectors4/selector-read-write-type-change-002-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      span { color: green; }
+    </style>
+  </head>
+  <body>
+    <input required><span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/selectors4/selector-read-write-type-change-002.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <title>Check for correctly updating :read-write matching on type change</title>
+    <link rel="match" href="selector-read-write-type-change-002-ref.html">
+    <style>
+      span { color: red; }
+      :read-write + span { color: green }
+    </style>
+    <script>
+      onload = function() {
+        // setTimeout because in some browsers apparently a toplevel restyle
+        // happens right after the load event fires?
+        setTimeout(function() {
+          document.querySelector("input").type = "";
+          document.documentElement.className = "";
+        }, 10);
+      }
+    </script>
+  </head>
+  <body>
+    <input type="hidden" required><span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/selectors4/selector-required-type-change-001-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      span { color: green; }
+    </style>
+  </head>
+  <body>
+    <input type="button"><span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/selectors4/selector-required-type-change-001.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Check for correctly updating :required matching on type change</title>
+    <link rel="match" href="selector-required-type-change-001-ref.html">
+    <style>
+      span { color: green; }
+      :required + span { color: red }
+    </style>
+    <script>
+      onload = function() {
+        document.querySelector("input").type = "button";
+      }
+    </script>
+  </head>
+  <body>
+    <input required><span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/selectors4/selector-required-type-change-002-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      span { color: green; }
+    </style>
+  </head>
+  <body>
+    <input required><span>This should be green</span>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/selectors4/selector-required-type-change-002.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <title>Check for correctly updating :required matching on type change</title>
+    <link rel="match" href="selector-required-type-change-002-ref.html">
+    <style>
+      span { color: red; }
+      :required + span { color: green }
+    </style>
+    <script>
+      onload = function() {
+        // setTimeout because in some browsers apparently a toplevel restyle
+        // happens right after the load event fires?
+        setTimeout(function() {
+          document.querySelector("input").type = "";
+          document.documentElement.className = "";
+        }, 10);
+      }
+    </script>
+  </head>
+  <body>
+    <input type="hidden" required><span>This should be green</span>
+  </body>
+</html>
--- a/testing/web-platform/tests/service-workers/service-worker/ready.https.html
+++ b/testing/web-platform/tests/service-workers/service-worker/ready.https.html
@@ -243,9 +243,58 @@ promise_test(function(t) {
             });
           return frame.contentWindow.navigator.serviceWorker.ready;
         })
       .then(function(r) {
           assert_equals(r.scope, normalizeURL(matched_scope),
                         'ready should only be resolved once');
         });
   }, 'access ready after it has been resolved');
+
+promise_test(async function(t) {
+    var url = 'resources/empty-worker.js';
+    var matched_scope = 'resources/blank.html?ready-after-resurrect';
+
+    let reg1 = await service_worker_unregister_and_register(t, url, matched_scope);
+    add_completion_callback(function() {
+        reg1.unregister();
+      });
+    await wait_for_state(t, reg1.installing, 'activated');
+
+    // Hold the worker alive with a controlled worker
+    let frame = await with_iframe(matched_scope);
+    add_completion_callback(function() {
+        frame.remove();
+      });
+
+    // Doom the registration as uninstalling.
+    await reg1.unregister();
+
+    // Access the ready promise while the registration is doomed.
+    let readyPromise = frame.contentWindow.navigator.serviceWorker.ready;
+
+    // Resurrect the doomed registration;
+    let reg2 = await service_worker_unregister_and_register(t, url, matched_scope);
+    assert_equals(reg1, reg2, 'existing registration should be resurrected');
+
+    // We are trying to test if the ready promise ever resolves here.  Use
+    // an explicit timeout check here rather than forcing a full infrastructure
+    // level timeout.
+    let timeoutId;
+    let timeoutPromise = new Promise(resolve => {
+      timeoutId = setTimeout(_ => {
+        timeoutId = null;
+        resolve();
+      }, 500);
+    });
+
+    // This should resolve immediately since there is an alive registration
+    // with an active promise for the matching scope.
+    await Promise.race([readyPromise, timeoutPromise]);
+
+    assert_not_equals(timeoutId, null,
+                      'ready promise should resolve before timeout');
+    clearTimeout(timeoutId);
+
+    // We should get here and not time out.
+
+  }, 'access ready on uninstalling registration that is resurrected');
 </script>
--- a/toolkit/modules/UpdateUtils.jsm
+++ b/toolkit/modules/UpdateUtils.jsm
@@ -130,17 +130,30 @@ this.UpdateUtils = {
 };
 
 /* Get the distribution pref values, from defaults only */
 function getDistributionPrefValue(aPrefName) {
   return Services.prefs.getDefaultBranch(null).getCharPref(aPrefName, "default");
 }
 
 function getSystemCapabilities() {
-  return "ISET:" + gInstructionSet + ",MEM:" + getMemoryMB();
+  return "ISET:" + gInstructionSet + ",MEM:" + getMemoryMB() + getJAWS();
+}
+
+/**
+ * Gets the appropriate update url string for whether a JAWS screen reader that
+ * is incompatible with e10s is present on Windows. For platforms other than
+ * Windows this returns an empty string which is easier for balrog to detect.
+ */
+function getJAWS() {
+  if (AppConstants.platform != "win") {
+    return "";
+  }
+
+  return ",JAWS:" + (Services.appinfo.shouldBlockIncompatJaws ? "1" : "0");
 }
 
 /**
  * Gets the RAM size in megabytes. This will round the value because sysinfo
  * doesn't always provide RAM in multiples of 1024.
  */
 function getMemoryMB() {
   let memoryMB = "unknown";
--- a/toolkit/modules/tests/xpcshell/test_UpdateUtils_url.js
+++ b/toolkit/modules/tests/xpcshell/test_UpdateUtils_url.js
@@ -341,11 +341,16 @@ add_task(async function test_custom() {
   Assert.equal(await getResult(url), "custom",
                "the url query string for %CUSTOM%" + MSG_SHOULD_EQUAL);
 });
 
 // url constructed with %SYSTEM_CAPABILITIES%
 add_task(async function test_systemCapabilities() {
   let url = URL_PREFIX + "%SYSTEM_CAPABILITIES%/";
   let systemCapabilities = "ISET:" + getInstructionSet() + ",MEM:" + getMemoryMB();
+  if (AppConstants.platform == "win") {
+    // The default value for shouldBlockIncompatJaws in the mock
+    // Services.appinfo is false so the value should be JAWS:0
+    systemCapabilities += ",JAWS:0";
+  }
   Assert.equal(await getResult(url), systemCapabilities,
                "the url param for %SYSTEM_CAPABILITIES%" + MSG_SHOULD_EQUAL);
 });