From d4f7471bf437a5e1beb1d36642346fe9f0c90264 Mon Sep 17 00:00:00 2001 From: Masayuki Nakano Date: Tue, 5 Jul 2011 13:30:26 +0900 Subject: [PATCH 01/13] Bug 610829 Should associate default IMC at committing or canceling composition r=emk --- widget/src/windows/nsIMM32Handler.cpp | 20 +++++++++++ widget/src/windows/nsWindow.cpp | 51 +++++++++++++++++++-------- widget/src/windows/nsWindow.h | 16 ++++++++- 3 files changed, 72 insertions(+), 15 deletions(-) diff --git a/widget/src/windows/nsIMM32Handler.cpp b/widget/src/windows/nsIMM32Handler.cpp index ca7be887cd9c..20c5db737f75 100644 --- a/widget/src/windows/nsIMM32Handler.cpp +++ b/widget/src/windows/nsIMM32Handler.cpp @@ -293,11 +293,21 @@ nsIMM32Handler::CommitComposition(nsWindow* aWindow, PRBool aForce) if (!aForce && !IsComposingWindow(aWindow)) { return; } + + PRBool associated = aWindow->AssociateDefaultIMC(PR_TRUE); + PR_LOG(gIMM32Log, PR_LOG_ALWAYS, + ("IMM32: CommitComposition, associated=%s\n", + associated ? "YES" : "NO")); + nsIMEContext IMEContext(aWindow->GetWindowHandle()); if (IMEContext.IsValid()) { ::ImmNotifyIME(IMEContext.get(), NI_COMPOSITIONSTR, CPS_COMPLETE, 0); ::ImmNotifyIME(IMEContext.get(), NI_COMPOSITIONSTR, CPS_CANCEL, 0); } + + if (associated) { + aWindow->AssociateDefaultIMC(PR_FALSE); + } } /* static */ void @@ -314,10 +324,20 @@ nsIMM32Handler::CancelComposition(nsWindow* aWindow, PRBool aForce) if (!aForce && !IsComposingWindow(aWindow)) { return; } + + PRBool associated = aWindow->AssociateDefaultIMC(PR_TRUE); + PR_LOG(gIMM32Log, PR_LOG_ALWAYS, + ("IMM32: CancelComposition, associated=%s\n", + associated ? "YES" : "NO")); + nsIMEContext IMEContext(aWindow->GetWindowHandle()); if (IMEContext.IsValid()) { ::ImmNotifyIME(IMEContext.get(), NI_COMPOSITIONSTR, CPS_CANCEL, 0); } + + if (associated) { + aWindow->AssociateDefaultIMC(PR_FALSE); + } } /* static */ PRBool diff --git a/widget/src/windows/nsWindow.cpp b/widget/src/windows/nsWindow.cpp index b8a0a5bf7523..d7d13bf56081 100644 --- a/widget/src/windows/nsWindow.cpp +++ b/widget/src/windows/nsWindow.cpp @@ -370,7 +370,6 @@ nsWindow::nsWindow() : nsBaseWidget() mWnd = nsnull; mPaintDC = nsnull; mPrevWndProc = nsnull; - mOldIMC = nsnull; mNativeDragTarget = nsnull; mInDtor = PR_FALSE; mIsVisible = PR_FALSE; @@ -6669,7 +6668,7 @@ LRESULT nsWindow::OnKeyDown(const MSG &aMsg, static PRBool sRedirectedKeyDownEventPreventedDefault = PR_FALSE; PRBool noDefault; if (aFakeCharMessage || !IsRedirectedKeyDownMessage(aMsg)) { - HIMC oldIMC = mOldIMC; + nsIMEContext IMEContext(mWnd); noDefault = DispatchKeyEvent(NS_KEY_DOWN, 0, nsnull, DOMKeyCode, &aMsg, aModKeyState); if (aEventDispatched) { @@ -6685,8 +6684,9 @@ LRESULT nsWindow::OnKeyDown(const MSG &aMsg, // application, we shouldn't redirect the message to it because the keydown // message is processed by us, so, nobody shouldn't process it. HWND focusedWnd = ::GetFocus(); - if (!noDefault && !aFakeCharMessage && oldIMC && !mOldIMC && focusedWnd && - !PluginHasFocus()) { + nsIMEContext newIMEContext(mWnd); + if (!noDefault && !aFakeCharMessage && focusedWnd && !PluginHasFocus() && + !IMEContext.get() && newIMEContext.get()) { RemoveNextCharMessage(focusedWnd); INPUT keyinput; @@ -7315,11 +7315,8 @@ void nsWindow::OnDestroy() CaptureRollupEvents(nsnull, nsnull, PR_FALSE, PR_TRUE); } - // If IME is disabled, restore it. - if (mOldIMC) { - mOldIMC = ::ImmAssociateContext(mWnd, mOldIMC); - NS_ASSERTION(!mOldIMC, "Another IMC was associated"); - } + // Restore the IM context. + AssociateDefaultIMC(PR_TRUE); // Turn off mouse trails if enabled. MouseTrailer* mtrailer = nsToolkit::gMouseTrailer; @@ -7958,11 +7955,7 @@ NS_IMETHODIMP nsWindow::SetInputMode(const IMEContext& aContext) PRBool enable = (status == nsIWidget::IME_STATUS_ENABLED || status == nsIWidget::IME_STATUS_PLUGIN); - if (!enable != !mOldIMC) - return NS_OK; - mOldIMC = ::ImmAssociateContext(mWnd, enable ? mOldIMC : NULL); - NS_ASSERTION(!enable || !mOldIMC, "Another IMC was associated"); - + AssociateDefaultIMC(enable); return NS_OK; } @@ -8025,6 +8018,36 @@ nsWindow::OnIMESelectionChange(void) } #endif //NS_ENABLE_TSF +PRBool nsWindow::AssociateDefaultIMC(PRBool aAssociate) +{ + nsIMEContext IMEContext(mWnd); + + if (aAssociate) { + BOOL ret = ::ImmAssociateContextEx(mWnd, NULL, IACE_DEFAULT); + NS_ASSERTION(ret, "ImmAssociateContextEx failed to restore default IMC"); +#ifdef DEBUG + nsIMEContext newIMEContext(mWnd); + NS_ASSERTION(!IMEContext.get() || newIMEContext.get() == IMEContext.get(), + "Unknown IMC had been associated"); +#endif + return ret && !IMEContext.get(); + } + + if (mOnDestroyCalled) { + // If OnDestroy() has been called, we shouldn't disassociate the default + // IMC at destroying the window. + return PR_FALSE; + } + + if (!IMEContext.get()) { + return PR_FALSE; // already disassociated + } + + BOOL ret = ::ImmAssociateContextEx(mWnd, NULL, 0); + NS_ASSERTION(ret, "ImmAssociateContextEx failed to disassociate the IMC"); + return ret != FALSE; +} + #ifdef ACCESSIBILITY #ifdef DEBUG_WMGETOBJECT diff --git a/widget/src/windows/nsWindow.h b/widget/src/windows/nsWindow.h index 3488cf3011cb..efb1f3331991 100644 --- a/widget/src/windows/nsWindow.h +++ b/widget/src/windows/nsWindow.h @@ -262,6 +262,21 @@ public: */ static void StartAllowingD3D9(bool aReinitialize); + /** + * AssociateDefaultIMC() associates or disassociates the default IMC for + * the window. + * + * @param aAssociate TRUE, associates the default IMC with the window. + * Otherwise, disassociates the default IMC from the + * window. + * @return TRUE if this method associated the default IMC with + * disassociated window or disassociated the default IMC + * from associated window. + * Otherwise, i.e., if this method did nothing actually, + * FALSE. + */ + PRBool AssociateDefaultIMC(PRBool aAssociate); + #if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_WIN7 PRBool HasTaskbarIconBeenCreated() { return mHasTaskbarIconBeenCreated; } // Called when either the nsWindow or an nsITaskbarTabPreview receives the noticiation that this window @@ -504,7 +519,6 @@ protected: PRUint32 mBlurSuppressLevel; DWORD_PTR mOldStyle; DWORD_PTR mOldExStyle; - HIMC mOldIMC; IMEContext mIMEContext; nsNativeDragTarget* mNativeDragTarget; HKL mLastKeyboardLayout; From 7cc44abc731d71df584e0c232d19ebcd03acdc7f Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Tue, 5 Jul 2011 15:34:41 +1000 Subject: [PATCH 02/13] Bug 660731 - Add GetExplicit and GetResident methods to NSIMemoryReporterManager, attempt 2. r=khuey, sr=bz. --- dom/ipc/ContentChild.cpp | 8 +- .../tests/chrome/test_aboutmemory.xul | 27 ++- .../telemetry/TelemetryHistograms.h | 3 +- toolkit/components/telemetry/TelemetryPing.js | 6 +- xpcom/base/nsIMemoryReporter.idl | 23 ++- xpcom/base/nsMemoryReporterManager.cpp | 160 ++++++++++++++++++ 6 files changed, 214 insertions(+), 13 deletions(-) diff --git a/dom/ipc/ContentChild.cpp b/dom/ipc/ContentChild.cpp index 41e1c5ff89be..d9147bd85286 100644 --- a/dom/ipc/ContentChild.cpp +++ b/dom/ipc/ContentChild.cpp @@ -377,13 +377,13 @@ ContentChild::RecvPMemoryReportRequestConstructor(PMemoryReportRequestChild* chi // one, whereupon the callback will turn each measurement into a // MemoryReport. mgr->EnumerateMultiReporters(getter_AddRefs(e)); - MemoryReportsWrapper wrappedReports(&reports); - MemoryReportCallback cb(process); + nsRefPtr wrappedReports = + new MemoryReportsWrapper(&reports); + nsRefPtr cb = new MemoryReportCallback(process); while (NS_SUCCEEDED(e->HasMoreElements(&more)) && more) { nsCOMPtr r; e->GetNext(getter_AddRefs(r)); - - r->CollectReports(&cb, &wrappedReports); + r->CollectReports(cb, wrappedReports); } child->Send__delete__(child, reports); diff --git a/toolkit/components/aboutmemory/tests/chrome/test_aboutmemory.xul b/toolkit/components/aboutmemory/tests/chrome/test_aboutmemory.xul index 47d85af651e2..602032589f3a 100644 --- a/toolkit/components/aboutmemory/tests/chrome/test_aboutmemory.xul +++ b/toolkit/components/aboutmemory/tests/chrome/test_aboutmemory.xul @@ -77,6 +77,8 @@ f("", "explicit/b/b", HEAP, 75 * MB), f("", "explicit/b/c/a", HEAP, 70 * MB), f("", "explicit/b/c/b", HEAP, 2 * MB), // omitted + f("", "explicit/c", MAPPED, 100 * MB), + f("", "explicit/c/d", MAPPED, 13 * MB), // subsumed by parent f("", "explicit/g", HEAP, 1 * MB), // internal, dup: merge f("", "explicit/g/a", HEAP, 6 * MB), f("", "explicit/g/b", HEAP, 5 * MB), @@ -87,7 +89,9 @@ var fakeMultiReporters = [ { collectReports: function(cbObj, closure) { function f(p, k, u, a) { cbObj.callback("", p, k, u, a, "(desc)", closure); } - f("explicit/c", MAPPED, BYTES, 123 * MB); + f("explicit/c/d", MAPPED, BYTES, 10 * MB), // dup, subsumed by parent + f("explicit/cc", MAPPED, BYTES, 13 * MB); + f("explicit/cc", MAPPED, BYTES, 10 * MB); // dup f("explicit/d", MAPPED, BYTES, 499 * KB); // omitted f("explicit/e", MAPPED, BYTES, 100 * KB); // omitted f("explicit/f/g/h/i", HEAP, BYTES, 20 * MB); @@ -108,6 +112,17 @@ mgr.registerMultiReporter(fakeMultiReporters[i]); } + // mgr.explicit sums "heap-used" and all the appropriate MAPPED ones: + // - "explicit/c", "explicit/cc" x 2, "explicit/d", "explicit/e" + // - but *not* "explicit/c/d" x 2 + // Check explicit now before we add the fake reporters for the fake 2nd + // and subsequent processes. + is(mgr.explicit, 500*MB + (100 + 13 + 10)*MB + 599*KB, "mgr.explicit"); + + // Access mgr.resident just to make sure it doesn't crash. We can't check + // its actual value because it's non-deterministic. + dummy = mgr.resident; + var fakeReporters2 = [ f("2nd", "heap-used", OTHER, 1000 * MB), f("2nd", "heap-unused", OTHER, 100 * MB), @@ -157,7 +172,10 @@ Explicit Allocations\n\ │ ├──70.00 MB (11.23%) -- a\n\ │ └───2.00 MB (00.32%) -- (1 omitted)\n\ ├──222.00 MB (35.60%) -- a\n\ -├──123.00 MB (19.72%) -- c\n\ +├──100.00 MB (16.04%) -- c\n\ +│ ├───77.00 MB (12.35%) -- other\n\ +│ └───23.00 MB (03.69%) -- d\n\ +├───23.00 MB (03.69%) -- cc\n\ ├───20.00 MB (03.21%) -- f\n\ │ └──20.00 MB (03.21%) -- g\n\ │ └──20.00 MB (03.21%) -- h\n\ @@ -224,7 +242,10 @@ Explicit Allocations\n\ │ ├──73,400,320 B (11.23%) -- a\n\ │ └───2,097,152 B (00.32%) -- b\n\ ├──232,783,872 B (35.60%) -- a\n\ -├──128,974,848 B (19.72%) -- c\n\ +├──104,857,600 B (16.04%) -- c\n\ +│ ├───80,740,352 B (12.35%) -- other\n\ +│ └───24,117,248 B (03.69%) -- d\n\ +├───24,117,248 B (03.69%) -- cc\n\ ├───20,971,520 B (03.21%) -- f\n\ │ └──20,971,520 B (03.21%) -- g\n\ │ └──20,971,520 B (03.21%) -- h\n\ diff --git a/toolkit/components/telemetry/TelemetryHistograms.h b/toolkit/components/telemetry/TelemetryHistograms.h index bb01f5d8ad26..65e5e572a43d 100644 --- a/toolkit/components/telemetry/TelemetryHistograms.h +++ b/toolkit/components/telemetry/TelemetryHistograms.h @@ -55,8 +55,7 @@ HISTOGRAM(MEMORY_RESIDENT, 32 * 1024, 1024 * 1024, 10, EXPONENTIAL, "Resident me HISTOGRAM(MEMORY_LAYOUT_ALL, 1024, 64 * 1024, 10, EXPONENTIAL, "Memory used by layout (KB)") HISTOGRAM(MEMORY_IMAGES_CONTENT_USED_UNCOMPRESSED, 1024, 1024 * 1024, 10, EXPONENTIAL, "Memory used for uncompressed, in-use content images (KB)") HISTOGRAM(MEMORY_HEAP_USED, 1024, 1024 * 1024, 10, EXPONENTIAL, "Heap memory used (KB)") -// XXX: bug 660731 will enable this -//HISTOGRAM(MEMORY_EXPLICIT, 1024, 1024 * 1024, 10, EXPONENTIAL, "Explicit memory allocations (KB)") +HISTOGRAM(MEMORY_EXPLICIT, 1024, 1024 * 1024, 10, EXPONENTIAL, "Explicit memory allocations (KB)") #if defined(XP_WIN) HISTOGRAM(EARLY_GLUESTARTUP_READ_OPS, 1, 100, 12, LINEAR, "ProcessIoCounters.ReadOperationCount before glue startup") HISTOGRAM(EARLY_GLUESTARTUP_READ_TRANSFER, 1, 50 * 1024, 12, EXPONENTIAL, "ProcessIoCounters.ReadTransferCount before glue startup (KB)") diff --git a/toolkit/components/telemetry/TelemetryPing.js b/toolkit/components/telemetry/TelemetryPing.js index db9c73e0dc3b..b7e95a407a14 100644 --- a/toolkit/components/telemetry/TelemetryPing.js +++ b/toolkit/components/telemetry/TelemetryPing.js @@ -251,9 +251,11 @@ TelemetryPing.prototype = { } this.addValue(mr.path, id, val); } - // XXX: bug 660731 will enable this // "explicit" is found differently. - //this.addValue("explicit", "MEMORY_EXPLICIT", Math.floor(mgr.explicit / 1024)); + let explicit = mgr.explicit; // Get it only once, it's reasonably expensive + if (explicit != -1) { + this.addValue("explicit", "MEMORY_EXPLICIT", Math.floor(explicit / 1024)); + } }, /** diff --git a/xpcom/base/nsIMemoryReporter.idl b/xpcom/base/nsIMemoryReporter.idl index 13f7bc4e1a87..831b69f6496e 100644 --- a/xpcom/base/nsIMemoryReporter.idl +++ b/xpcom/base/nsIMemoryReporter.idl @@ -141,7 +141,8 @@ interface nsIMemoryReporter : nsISupports readonly attribute PRInt32 units; /* - * The numeric value reported by this memory reporter. + * The numeric value reported by this memory reporter. -1 means "unknown", + * ie. something went wrong when getting the amount. */ readonly attribute PRInt64 amount; @@ -178,7 +179,7 @@ interface nsIMemoryMultiReporter : nsISupports in nsISupports closure); }; -[scriptable, uuid(80a93b4c-6fff-4acd-8598-3891074a30ab)] +[scriptable, uuid(84ba9c85-3372-4423-b7ab-74708b9269a6)] interface nsIMemoryReporterManager : nsISupports { /* @@ -221,6 +222,24 @@ interface nsIMemoryReporterManager : nsISupports * Initialize. */ void init (); + + /* + * Get the resident size (aka. RSS, physical memory used). This reporter + * is special-cased because it's interesting, is available on all + * platforms, and returns a meaningful result on all common platforms. + * -1 means unknown. + */ + readonly attribute PRInt64 resident; + + /* + * Get the total size of explicit memory allocations, both at the OS-level + * (eg. via mmap, VirtualAlloc) and at the heap level (eg. via malloc, + * calloc, operator new). (Nb: it covers all heap allocations, but will + * miss any OS-level ones not covered by memory reporters.) This reporter + * is special-cased because it's interesting, and is moderately difficult + * to compute in JS. -1 means unknown. + */ + readonly attribute PRInt64 explicit; }; %{C++ diff --git a/xpcom/base/nsMemoryReporterManager.cpp b/xpcom/base/nsMemoryReporterManager.cpp index c29bb82d0c39..f6754e08b25d 100644 --- a/xpcom/base/nsMemoryReporterManager.cpp +++ b/xpcom/base/nsMemoryReporterManager.cpp @@ -36,10 +36,12 @@ * * ***** END LICENSE BLOCK ***** */ +#include "nsAutoPtr.h" #include "nsCOMPtr.h" #include "nsServiceManagerUtils.h" #include "nsMemoryReporterManager.h" #include "nsArrayEnumerator.h" +#include "nsISimpleEnumerator.h" #if defined(XP_LINUX) || defined(XP_MACOSX) @@ -507,6 +509,164 @@ nsMemoryReporterManager::UnregisterMultiReporter(nsIMemoryMultiReporter *reporte return NS_OK; } +NS_IMETHODIMP +nsMemoryReporterManager::GetResident(PRInt64 *aResident) +{ + *aResident = ::GetResident(); + return NS_OK; +} + +struct MemoryReport { + MemoryReport(const nsACString &path, PRInt64 amount) + : path(path), amount(amount) + { + MOZ_COUNT_CTOR(MemoryReport); + } + ~MemoryReport() + { + MOZ_COUNT_DTOR(MemoryReport); + } + const nsCString path; + PRInt64 amount; +}; + +// This is just a wrapper for InfallibleTArray that implements +// nsISupports, so it can be passed to nsIMemoryMultiReporter::CollectReports. +class MemoryReportsWrapper : public nsISupports { +public: + NS_DECL_ISUPPORTS + MemoryReportsWrapper(InfallibleTArray *r) : mReports(r) { } + InfallibleTArray *mReports; +}; +NS_IMPL_ISUPPORTS0(MemoryReportsWrapper) + +class MemoryReportCallback : public nsIMemoryMultiReporterCallback +{ +public: + NS_DECL_ISUPPORTS + + NS_IMETHOD Callback(const nsACString &aProcess, const nsACString &aPath, + PRInt32 aKind, PRInt32 aUnits, PRInt64 aAmount, + const nsACString &aDescription, + nsISupports *aWrappedMRs) + { + if (aKind == nsIMemoryReporter::KIND_MAPPED && aAmount != PRInt64(-1)) { + MemoryReportsWrapper *wrappedMRs = + static_cast(aWrappedMRs); + MemoryReport mr(aPath, aAmount); + wrappedMRs->mReports->AppendElement(mr); + } + return NS_OK; + } +}; +NS_IMPL_ISUPPORTS1( + MemoryReportCallback +, nsIMemoryMultiReporterCallback +) + +// Is path1 a prefix, and thus a parent, of path2? Eg. "a/b" is a parent of +// "a/b/c", but "a/bb" is not. +static bool +isParent(const nsACString &path1, const nsACString &path2) +{ + if (path1.Length() >= path2.Length()) + return false; + + const nsACString& subStr = Substring(path2, 0, path1.Length()); + return subStr.Equals(path1) && path2[path1.Length()] == '/'; +} + +NS_IMETHODIMP +nsMemoryReporterManager::GetExplicit(PRInt64 *aExplicit) +{ + InfallibleTArray mapped; + PRInt64 heapUsed = PRInt64(-1); + + // Get "heap-used" and all the KIND_MAPPED measurements from vanilla + // reporters. + nsCOMPtr e; + EnumerateReporters(getter_AddRefs(e)); + + PRBool more; + while (NS_SUCCEEDED(e->HasMoreElements(&more)) && more) { + nsCOMPtr r; + e->GetNext(getter_AddRefs(r)); + + PRInt32 kind; + nsresult rv = r->GetKind(&kind); + NS_ENSURE_SUCCESS(rv, rv); + + if (kind == nsIMemoryReporter::KIND_MAPPED) { + nsCString path; + rv = r->GetPath(getter_Copies(path)); + NS_ENSURE_SUCCESS(rv, rv); + + PRInt64 amount; + rv = r->GetAmount(&amount); + NS_ENSURE_SUCCESS(rv, rv); + + // Just skip any MAPPED reporters that fail, because "heap-used" is + // the most important one. + if (amount != PRInt64(-1)) { + MemoryReport mr(path, amount); + mapped.AppendElement(mr); + } + } else { + nsCString path; + rv = r->GetPath(getter_Copies(path)); + NS_ENSURE_SUCCESS(rv, rv); + + if (path.Equals("heap-used")) { + rv = r->GetAmount(&heapUsed); + NS_ENSURE_SUCCESS(rv, rv); + // If "heap-used" fails, we give up, because the result would be + // horribly inaccurate. + if (heapUsed == PRInt64(-1)) { + *aExplicit = PRInt64(-1); + return NS_OK; + } + } + } + } + + // Get KIND_MAPPED measurements from multi-reporters, too. + nsCOMPtr e2; + EnumerateMultiReporters(getter_AddRefs(e2)); + nsRefPtr wrappedMRs = + new MemoryReportsWrapper(&mapped); + nsRefPtr cb = new MemoryReportCallback(); + + while (NS_SUCCEEDED(e2->HasMoreElements(&more)) && more) { + nsCOMPtr r; + e2->GetNext(getter_AddRefs(r)); + r->CollectReports(cb, wrappedMRs); + } + + // Ignore (by zeroing its amount) any reporter that is a child of another + // reporter. Eg. if we have "explicit/a" and "explicit/a/b", zero the + // latter. This is quadratic in the number of MAPPED reporters, but there + // shouldn't be many. + for (PRUint32 i = 0; i < mapped.Length(); i++) { + const nsCString &iPath = mapped[i].path; + for (PRUint32 j = i + 1; j < mapped.Length(); j++) { + const nsCString &jPath = mapped[j].path; + if (isParent(iPath, jPath)) { + mapped[j].amount = 0; + } else if (isParent(jPath, iPath)) { + mapped[i].amount = 0; + } + } + } + + // Sum all the mapped reporters and heapUsed. + *aExplicit = heapUsed; + for (PRUint32 i = 0; i < mapped.Length(); i++) { + *aExplicit += mapped[i].amount; + } + + return NS_OK; +} + NS_IMPL_ISUPPORTS1(nsMemoryReporter, nsIMemoryReporter) nsMemoryReporter::nsMemoryReporter(nsCString& process, From 71ea7f9c8f7494f46225f6b13fbd1195876cecee Mon Sep 17 00:00:00 2001 From: Patrick McManus Date: Mon, 4 Jul 2011 23:12:30 -0700 Subject: [PATCH 03/13] bug 655389 - CRLF Injection and the parsing of HTTP headers. r=bz --- js/src/xpconnect/src/xpc.msg | 4 + .../test/unit/test_double_content_length.js | 43 --- netwerk/test/unit/test_duplicate_headers.js | 363 ++++++++++++++++++ netwerk/test/unit/xpcshell.ini | 2 +- .../unit_ipc/test_duplicate_headers_wrap.js | 7 + netwerk/test/unit_ipc/xpcshell.ini | 1 + 6 files changed, 376 insertions(+), 44 deletions(-) delete mode 100644 netwerk/test/unit/test_double_content_length.js create mode 100644 netwerk/test/unit/test_duplicate_headers.js create mode 100644 netwerk/test/unit_ipc/test_duplicate_headers_wrap.js diff --git a/js/src/xpconnect/src/xpc.msg b/js/src/xpconnect/src/xpc.msg index 103c50a1e0f3..b41a9d0bbcae 100644 --- a/js/src/xpconnect/src/xpc.msg +++ b/js/src/xpconnect/src/xpc.msg @@ -174,6 +174,7 @@ XPC_MSG_DEF(NS_ERROR_NO_CONTENT , "Channel opened successful XPC_MSG_DEF(NS_ERROR_IN_PROGRESS , "The requested action could not be completed while the object is busy") XPC_MSG_DEF(NS_ERROR_ALREADY_OPENED , "Channel is already open") XPC_MSG_DEF(NS_ERROR_INVALID_CONTENT_ENCODING , "The content encoding of the source document is incorrect") +XPC_MSG_DEF(NS_ERROR_CORRUPTED_CONTENT , "Corrupted content was received from server") XPC_MSG_DEF(NS_ERROR_ALREADY_CONNECTED , "The connection is already established") XPC_MSG_DEF(NS_ERROR_NOT_CONNECTED , "The connection does not exist") XPC_MSG_DEF(NS_ERROR_CONNECTION_REFUSED , "The connection was refused") @@ -187,12 +188,15 @@ XPC_MSG_DEF(NS_ERROR_NOT_RESUMABLE , "This request is not resum XPC_MSG_DEF(NS_ERROR_ENTITY_CHANGED , "It was attempted to resume the request, but the entity has changed in the meantime") XPC_MSG_DEF(NS_ERROR_REDIRECT_LOOP , "The request failed as a result of a detected redirection loop") XPC_MSG_DEF(NS_ERROR_UNSAFE_CONTENT_TYPE , "The request failed because the content type returned by the server was not a type expected by the channel") +XPC_MSG_DEF(NS_ERROR_REMOTE_XUL , "Attempt to access remote XUL document that is not in website's whitelist") + XPC_MSG_DEF(NS_ERROR_FTP_LOGIN , "FTP error while logging in") XPC_MSG_DEF(NS_ERROR_FTP_CWD , "FTP error while changing directory") XPC_MSG_DEF(NS_ERROR_FTP_PASV , "FTP error while changing to passive mode") XPC_MSG_DEF(NS_ERROR_FTP_PWD , "FTP error while retrieving current directory") XPC_MSG_DEF(NS_ERROR_FTP_LIST , "FTP error while retrieving a directory listing") XPC_MSG_DEF(NS_ERROR_UNKNOWN_HOST , "The lookup of the hostname failed") +XPC_MSG_DEF(NS_ERROR_DNS_LOOKUP_QUEUE_FULL , "The DNS lookup queue is full") XPC_MSG_DEF(NS_ERROR_UNKNOWN_PROXY_HOST , "The lookup of the proxy hostname failed") XPC_MSG_DEF(NS_ERROR_UNKNOWN_SOCKET_TYPE , "The specified socket type does not exist") XPC_MSG_DEF(NS_ERROR_SOCKET_CREATE_FAILED , "The specified socket type could not be created") diff --git a/netwerk/test/unit/test_double_content_length.js b/netwerk/test/unit/test_double_content_length.js deleted file mode 100644 index 33ba2f260647..000000000000 --- a/netwerk/test/unit/test_double_content_length.js +++ /dev/null @@ -1,43 +0,0 @@ -do_load_httpd_js(); - -var httpserver = new nsHttpServer(); -var index = 0; - -function setupChannel(url) -{ - var ios = Components.classes["@mozilla.org/network/io-service;1"]. - getService(Ci.nsIIOService); - var chan = ios.newChannel("http://localhost:4444" + url, "", null); - var httpChan = chan.QueryInterface(Components.interfaces.nsIHttpChannel); - return httpChan; -} - -function completeTest1(request, data, ctx) -{ - httpserver.stop(do_test_finished); -} - -function run_test() -{ - httpserver.registerPathHandler("/2xcl", handler); - httpserver.start(4444); - - var channel = setupChannel("/2xcl"); - channel.asyncOpen(new ChannelListener(completeTest1, - channel, CL_EXPECT_FAILURE), null); - do_test_pending(); -} - -function handler(metadata, response) -{ - var body = "012345678901234567890123456789"; - response.seizePower(); - response.write("HTTP/1.0 200 OK\r\n"); - response.write("Content-Type: text/plain\r\n"); - response.write("Content-Length: 20\r\n"); - response.write("Content-Length: 30\r\n"); - response.write("\r\n"); - response.write(body); - response.finish(); -} - diff --git a/netwerk/test/unit/test_duplicate_headers.js b/netwerk/test/unit/test_duplicate_headers.js new file mode 100644 index 000000000000..8b5f04f20c7e --- /dev/null +++ b/netwerk/test/unit/test_duplicate_headers.js @@ -0,0 +1,363 @@ +/* + * Tests bugs 597706, 655389: prevent duplicate headers with differing values + * for some headers like Content-Length, Location, etc. + */ + +//////////////////////////////////////////////////////////////////////////////// +// Test infrastructure + +do_load_httpd_js(); + +var httpserver = new nsHttpServer(); +var index = 0; +var test_flags = new Array(); +var testPathBase = "/dupe_hdrs"; + +function run_test() +{ + httpserver.start(4444); + + do_test_pending(); + run_test_number(1); +} + +function run_test_number(num) +{ + testPath = testPathBase + num; + httpserver.registerPathHandler(testPath, eval("handler" + num)); + + var channel = setupChannel(testPath); + flags = test_flags[num]; // OK if flags undefined for test + channel.asyncOpen(new ChannelListener(eval("completeTest" + num), + channel, flags), null); +} + +function setupChannel(url) +{ + var ios = Components.classes["@mozilla.org/network/io-service;1"]. + getService(Ci.nsIIOService); + var chan = ios.newChannel("http://localhost:4444" + url, "", null); + var httpChan = chan.QueryInterface(Components.interfaces.nsIHttpChannel); + return httpChan; +} + +function endTests() +{ + httpserver.stop(do_test_finished); +} + +//////////////////////////////////////////////////////////////////////////////// +// Test 1: FAIL because of conflicting Content-Length headers +test_flags[1] = CL_EXPECT_FAILURE; + +function handler1(metadata, response) +{ + var body = "012345678901234567890123456789"; + // Comrades! We must seize power from the petty-bourgeois running dogs of + // httpd.js in order to reply with multiple instances of the same header! + response.seizePower(); + response.write("HTTP/1.0 200 OK\r\n"); + response.write("Content-Type: text/plain\r\n"); + response.write("Content-Length: 30\r\n"); + response.write("Content-Length: 20\r\n"); + response.write("\r\n"); + response.write(body); + response.finish(); +} + + +function completeTest1(request, data, ctx) +{ + do_check_eq(request.status, Components.results.NS_ERROR_CORRUPTED_CONTENT); + + run_test_number(2); +} + +//////////////////////////////////////////////////////////////////////////////// +// Test 2: OK to have duplicate same Content-Length headers + +function handler2(metadata, response) +{ + var body = "012345678901234567890123456789"; + response.seizePower(); + response.write("HTTP/1.0 200 OK\r\n"); + response.write("Content-Type: text/plain\r\n"); + response.write("Content-Length: 30\r\n"); + response.write("Content-Length: 30\r\n"); + response.write("\r\n"); + response.write(body); + response.finish(); +} + +function completeTest2(request, data, ctx) +{ + do_check_eq(request.status, 0); + run_test_number(3); +} + +//////////////////////////////////////////////////////////////////////////////// +// Test 3: FAIL: 2nd Content-length is blank +test_flags[3] = CL_EXPECT_FAILURE; + +function handler3(metadata, response) +{ + var body = "012345678901234567890123456789"; + response.seizePower(); + response.write("HTTP/1.0 200 OK\r\n"); + response.write("Content-Type: text/plain\r\n"); + response.write("Content-Length: 30\r\n"); + response.write("Content-Length:\r\n"); + response.write("\r\n"); + response.write(body); + response.finish(); +} + +function completeTest3(request, data, ctx) +{ + do_check_eq(request.status, Components.results.NS_ERROR_CORRUPTED_CONTENT); + + run_test_number(4); +} + +//////////////////////////////////////////////////////////////////////////////// +// Test 4: ensure that blank C-len header doesn't allow attacker to reset Clen, +// then insert CRLF attack +test_flags[4] = CL_EXPECT_FAILURE; + +function handler4(metadata, response) +{ + var body = "012345678901234567890123456789"; + + response.seizePower(); + response.write("HTTP/1.0 200 OK\r\n"); + response.write("Content-Type: text/plain\r\n"); + response.write("Content-Length: 30\r\n"); + + // Bad Mr Hacker! Bad! + var evilBody = "We are the Evil bytes, Evil bytes, Evil bytes!"; + response.write("Content-Length:\r\n"); + response.write("Content-Length: %s\r\n\r\n%s" % (evilBody.length, evilBody)); + response.write("\r\n"); + response.write(body); + response.finish(); +} + +function completeTest4(request, data, ctx) +{ + do_check_eq(request.status, Components.results.NS_ERROR_CORRUPTED_CONTENT); + + run_test_number(5); +} + + +//////////////////////////////////////////////////////////////////////////////// +// Test 5: ensure that we take 1st instance of duplicate, nonmerged headers that +// are permitted : (ex: Referrer) + +function handler5(metadata, response) +{ + var body = "012345678901234567890123456789"; + response.seizePower(); + response.write("HTTP/1.0 200 OK\r\n"); + response.write("Content-Type: text/plain\r\n"); + response.write("Content-Length: 30\r\n"); + response.write("Referer: naive.org\r\n"); + response.write("Referer: evil.net\r\n"); + response.write("\r\n"); + response.write(body); + response.finish(); +} + +function completeTest5(request, data, ctx) +{ + try { + referer = request.getResponseHeader("Referer"); + do_check_eq(referer, "naive.org"); + } catch (ex) { + do_throw("Referer header should be present"); + } + + run_test_number(6); +} + +//////////////////////////////////////////////////////////////////////////////// +// Test 5: FAIL if multiple, different Location: headers present +// - needed to prevent CRLF injection attacks +test_flags[6] = CL_EXPECT_FAILURE; + +function handler6(metadata, response) +{ + var body = "012345678901234567890123456789"; + response.seizePower(); + response.write("HTTP/1.0 301 Moved\r\n"); + response.write("Content-Type: text/plain\r\n"); + response.write("Content-Length: 30\r\n"); + response.write("Location: http://localhost:4444/content\r\n"); + response.write("Location: http://www.microsoft.com/\r\n"); + response.write("Connection: close/\r\n"); + response.write("\r\n"); + response.write(body); + response.finish(); +} + +function completeTest6(request, data, ctx) +{ + do_check_eq(request.status, Components.results.NS_ERROR_CORRUPTED_CONTENT); + +// run_test_number(7); // Test 7 leaking under e10s: unrelated bug? + run_test_number(8); +} + +//////////////////////////////////////////////////////////////////////////////// +// Test 7: OK to have multiple Location: headers with same value + +function handler7(metadata, response) +{ + var body = "012345678901234567890123456789"; + response.seizePower(); + response.write("HTTP/1.0 301 Moved\r\n"); + response.write("Content-Type: text/plain\r\n"); + response.write("Content-Length: 30\r\n"); + // redirect to previous test handler that completes OK: test 5 + response.write("Location: http://localhost:4444" + testPathBase + "5\r\n"); + response.write("Location: http://localhost:4444" + testPathBase + "5\r\n"); + response.write("Connection: close/\r\n"); + response.write("\r\n"); + response.write(body); + response.finish(); +} + +function completeTest7(request, data, ctx) +{ + // for some reason need this here + request.QueryInterface(Components.interfaces.nsIHttpChannel); + + try { + referer = request.getResponseHeader("Referer"); + do_check_eq(referer, "naive.org"); + } catch (ex) { + do_throw("Referer header should be present"); + } + + run_test_number(8); +} + +//////////////////////////////////////////////////////////////////////////////// +// FAIL if 2nd Location: headers blank +test_flags[8] = CL_EXPECT_FAILURE; + +function handler8(metadata, response) +{ + var body = "012345678901234567890123456789"; + response.seizePower(); + response.write("HTTP/1.0 301 Moved\r\n"); + response.write("Content-Type: text/plain\r\n"); + response.write("Content-Length: 30\r\n"); + // redirect to previous test handler that completes OK: test 4 + response.write("Location: http://localhost:4444" + testPathBase + "4\r\n"); + response.write("Location:\r\n"); + response.write("Connection: close/\r\n"); + response.write("\r\n"); + response.write(body); + response.finish(); +} + +function completeTest8(request, data, ctx) +{ + do_check_eq(request.status, Components.results.NS_ERROR_CORRUPTED_CONTENT); + + run_test_number(9); +} + +//////////////////////////////////////////////////////////////////////////////// +// Test 9: ensure that blank Location header doesn't allow attacker to reset, +// then insert an evil one +test_flags[9] = CL_EXPECT_FAILURE; + +function handler9(metadata, response) +{ + var body = "012345678901234567890123456789"; + response.seizePower(); + response.write("HTTP/1.0 301 Moved\r\n"); + response.write("Content-Type: text/plain\r\n"); + response.write("Content-Length: 30\r\n"); + // redirect to previous test handler that completes OK: test 2 + response.write("Location: http://localhost:4444" + testPathBase + "2\r\n"); + response.write("Location:\r\n"); + // redirect to previous test handler that completes OK: test 4 + response.write("Location: http://localhost:4444" + testPathBase + "4\r\n"); + response.write("Connection: close/\r\n"); + response.write("\r\n"); + response.write(body); + response.finish(); +} + +function completeTest9(request, data, ctx) +{ + // All redirection should fail: + do_check_eq(request.status, Components.results.NS_ERROR_CORRUPTED_CONTENT); + + run_test_number(10); +} + +//////////////////////////////////////////////////////////////////////////////// +// Test 10: FAIL: if conflicting values for Content-Dispo +test_flags[10] = CL_EXPECT_FAILURE; + +function handler10(metadata, response) +{ + var body = "012345678901234567890123456789"; + response.seizePower(); + response.write("HTTP/1.0 200 OK\r\n"); + response.write("Content-Type: text/plain\r\n"); + response.write("Content-Length: 30\r\n"); + response.write("Content-Disposition: attachment; filename=foo\r\n"); + response.write("Content-Disposition: attachment; filename=bar\r\n"); + response.write("Content-Disposition: attachment; filename=baz\r\n"); + response.write("\r\n"); + response.write(body); + response.finish(); +} + + +function completeTest10(request, data, ctx) +{ + do_check_eq(request.status, Components.results.NS_ERROR_CORRUPTED_CONTENT); + + run_test_number(11); +} + +//////////////////////////////////////////////////////////////////////////////// +// Test 11: OK to have duplicate same Content-Disposition headers + +function handler11(metadata, response) +{ + var body = "012345678901234567890123456789"; + response.seizePower(); + response.write("HTTP/1.0 200 OK\r\n"); + response.write("Content-Type: text/plain\r\n"); + response.write("Content-Length: 30\r\n"); + response.write("Content-Disposition: attachment; filename=foo\r\n"); + response.write("Content-Disposition: attachment; filename=foo\r\n"); + response.write("\r\n"); + response.write(body); + response.finish(); +} + +function completeTest11(request, data, ctx) +{ + do_check_eq(request.status, 0); + + try { + // TODO when bug XXX lands, also get channel C-D properties and make sure + // they're blank + dispo = request.getResponseHeader("Content-Disposition"); + do_check_eq(dispo, "attachment; filename=foo"); + } catch (ex) { + do_throw("Content-Disposition should be present"); + } + + endTests(); +} + + diff --git a/netwerk/test/unit/xpcshell.ini b/netwerk/test/unit/xpcshell.ini index f21e46d0f118..83c8a1e0d100 100644 --- a/netwerk/test/unit/xpcshell.ini +++ b/netwerk/test/unit/xpcshell.ini @@ -74,7 +74,7 @@ tail = [test_cookie_header.js] [test_data_protocol.js] [test_dns_service.js] -[test_double_content_length.js] +[test_duplicate_headers.js] [test_event_sink.js] [test_extract_charset_from_content_type.js] [test_fallback_no-cache-entry_canceled.js] diff --git a/netwerk/test/unit_ipc/test_duplicate_headers_wrap.js b/netwerk/test/unit_ipc/test_duplicate_headers_wrap.js new file mode 100644 index 000000000000..6225d593d90f --- /dev/null +++ b/netwerk/test/unit_ipc/test_duplicate_headers_wrap.js @@ -0,0 +1,7 @@ +// +// Run test script in content process instead of chrome (xpcshell's default) +// + +function run_test() { + run_test_in_child("../unit/test_duplicate_headers.js"); +} diff --git a/netwerk/test/unit_ipc/xpcshell.ini b/netwerk/test/unit_ipc/xpcshell.ini index 91c3608aab5d..0e8058d13c63 100644 --- a/netwerk/test/unit_ipc/xpcshell.ini +++ b/netwerk/test/unit_ipc/xpcshell.ini @@ -4,6 +4,7 @@ tail = [test_channel_close_wrap.js] [test_cookie_wrap.js] +[test_duplicate_headers_wrap.js] [test_event_sink_wrap.js] [test_head_wrap.js] [test_httpcancel_wrap.js] From 28dfcfce52a5dc85cdaae9a20a1be559e5d269d4 Mon Sep 17 00:00:00 2001 From: Jason Duell Date: Mon, 4 Jul 2011 23:12:32 -0700 Subject: [PATCH 04/13] bug 655389 - CRLF Injection and the parsing of HTTP headers. r=bz --- netwerk/protocol/http/HttpChannelParent.cpp | 35 ++++-- netwerk/protocol/http/HttpChannelParent.h | 5 + netwerk/protocol/http/PHttpChannelParams.h | 34 +++--- .../protocol/http/nsHttpChunkedDecoder.cpp | 5 +- netwerk/protocol/http/nsHttpHeaderArray.cpp | 100 +++++++---------- netwerk/protocol/http/nsHttpHeaderArray.h | 102 +++++++++++++++--- netwerk/protocol/http/nsHttpRequestHead.h | 4 +- netwerk/protocol/http/nsHttpResponseHead.cpp | 1 - netwerk/protocol/http/nsHttpResponseHead.h | 3 +- 9 files changed, 180 insertions(+), 109 deletions(-) diff --git a/netwerk/protocol/http/HttpChannelParent.cpp b/netwerk/protocol/http/HttpChannelParent.cpp index 7bd32e9b03af..5291d958d115 100644 --- a/netwerk/protocol/http/HttpChannelParent.cpp +++ b/netwerk/protocol/http/HttpChannelParent.cpp @@ -66,6 +66,7 @@ HttpChannelParent::HttpChannelParent(PBrowserParent* iframeEmbedding) , mStoredStatus(0) , mStoredProgress(0) , mStoredProgressMax(0) + , mHeadersToSyncToChild(nsnull) { // Ensure gHttpHandler is initialized: we need the atom table up and running. nsIHttpProtocolHandler* handler; @@ -93,13 +94,14 @@ HttpChannelParent::ActorDestroy(ActorDestroyReason why) // HttpChannelParent::nsISupports //----------------------------------------------------------------------------- -NS_IMPL_ISUPPORTS6(HttpChannelParent, +NS_IMPL_ISUPPORTS7(HttpChannelParent, nsIInterfaceRequestor, nsIProgressEventSink, nsIRequestObserver, nsIStreamListener, nsIParentChannel, - nsIParentRedirectingChannel) + nsIParentRedirectingChannel, + nsIHttpHeaderVisitor) //----------------------------------------------------------------------------- // HttpChannelParent::nsIInterfaceRequestor @@ -425,15 +427,11 @@ HttpChannelParent::OnStartRequest(nsIRequest *aRequest, nsISupports *aContext) NS_SerializeToString(secInfoSer, secInfoSerialization); } + // sync request headers to child, in case they've changed RequestHeaderTuples headers; - nsHttpHeaderArray harray = requestHead->Headers(); - - for (PRUint32 i = 0; i < harray.Count(); i++) { - RequestHeaderTuple* tuple = headers.AppendElement(); - tuple->mHeader = harray.Headers()[i].header; - tuple->mValue = harray.Headers()[i].value; - tuple->mMerge = false; - } + mHeadersToSyncToChild = &headers; + requestHead->Headers().VisitHeaders(this); + mHeadersToSyncToChild = 0; nsHttpChannel *httpChan = static_cast(mChannel.get()); if (mIPCClosed || @@ -598,4 +596,21 @@ HttpChannelParent::CompleteRedirect(PRBool succeeded) return NS_OK; } +//----------------------------------------------------------------------------- +// HttpChannelParent::nsIHttpHeaderVisitor +//----------------------------------------------------------------------------- + +nsresult +HttpChannelParent::VisitHeader(const nsACString &header, const nsACString &value) +{ + // Will be set unless some random code QI's us to nsIHttpHeaderVisitor + NS_ENSURE_STATE(mHeadersToSyncToChild); + + RequestHeaderTuple* tuple = mHeadersToSyncToChild->AppendElement(); + tuple->mHeader = header; + tuple->mValue = value; + tuple->mMerge = false; // headers already merged: + return NS_OK; +} + }} // mozilla::net diff --git a/netwerk/protocol/http/HttpChannelParent.h b/netwerk/protocol/http/HttpChannelParent.h index 0e7278dd11fb..eecf9e9514fc 100644 --- a/netwerk/protocol/http/HttpChannelParent.h +++ b/netwerk/protocol/http/HttpChannelParent.h @@ -63,6 +63,7 @@ class HttpChannelParent : public PHttpChannelParent , public nsIParentRedirectingChannel , public nsIProgressEventSink , public nsIInterfaceRequestor + , public nsIHttpHeaderVisitor { public: NS_DECL_ISUPPORTS @@ -72,6 +73,7 @@ public: NS_DECL_NSIPARENTREDIRECTINGCHANNEL NS_DECL_NSIPROGRESSEVENTSINK NS_DECL_NSIINTERFACEREQUESTOR + NS_DECL_NSIHTTPHEADERVISITOR HttpChannelParent(PBrowserParent* iframeEmbedding); virtual ~HttpChannelParent(); @@ -130,6 +132,9 @@ private: nsresult mStoredStatus; PRUint64 mStoredProgress; PRUint64 mStoredProgressMax; + + // used while visiting headers, to send them to child: else null + RequestHeaderTuples *mHeadersToSyncToChild; }; } // namespace net diff --git a/netwerk/protocol/http/PHttpChannelParams.h b/netwerk/protocol/http/PHttpChannelParams.h index a6c170477c08..c59172219436 100644 --- a/netwerk/protocol/http/PHttpChannelParams.h +++ b/netwerk/protocol/http/PHttpChannelParams.h @@ -83,9 +83,9 @@ struct ParamTraits static bool Read(const Message* aMsg, void** aIter, paramType* aResult) { - if (!ReadParam(aMsg, aIter, &(aResult->mHeader)) || - !ReadParam(aMsg, aIter, &(aResult->mValue)) || - !ReadParam(aMsg, aIter, &(aResult->mMerge))) + if (!ReadParam(aMsg, aIter, &aResult->mHeader) || + !ReadParam(aMsg, aIter, &aResult->mValue) || + !ReadParam(aMsg, aIter, &aResult->mMerge)) return false; return true; @@ -130,8 +130,8 @@ struct ParamTraits static bool Read(const Message* aMsg, void** aIter, paramType* aResult) { - if (!ReadParam(aMsg, aIter, &(aResult->header)) || - !ReadParam(aMsg, aIter, &(aResult->value))) + if (!ReadParam(aMsg, aIter, &aResult->header) || + !ReadParam(aMsg, aIter, &aResult->value)) return false; return true; @@ -147,12 +147,12 @@ struct ParamTraits { paramType& p = const_cast(aParam); - WriteParam(aMsg, p.Headers()); + WriteParam(aMsg, p.mHeaders); } static bool Read(const Message* aMsg, void** aIter, paramType* aResult) { - if (!ReadParam(aMsg, aIter, &(aResult->Headers()))) + if (!ReadParam(aMsg, aIter, &aResult->mHeaders)) return false; return true; @@ -180,16 +180,16 @@ struct ParamTraits static bool Read(const Message* aMsg, void** aIter, paramType* aResult) { - if (!ReadParam(aMsg, aIter, &(aResult->mHeaders)) || - !ReadParam(aMsg, aIter, &(aResult->mVersion)) || - !ReadParam(aMsg, aIter, &(aResult->mStatus)) || - !ReadParam(aMsg, aIter, &(aResult->mStatusText)) || - !ReadParam(aMsg, aIter, &(aResult->mContentLength)) || - !ReadParam(aMsg, aIter, &(aResult->mContentType)) || - !ReadParam(aMsg, aIter, &(aResult->mContentCharset)) || - !ReadParam(aMsg, aIter, &(aResult->mCacheControlNoStore)) || - !ReadParam(aMsg, aIter, &(aResult->mCacheControlNoCache)) || - !ReadParam(aMsg, aIter, &(aResult->mPragmaNoCache))) + if (!ReadParam(aMsg, aIter, &aResult->mHeaders) || + !ReadParam(aMsg, aIter, &aResult->mVersion) || + !ReadParam(aMsg, aIter, &aResult->mStatus) || + !ReadParam(aMsg, aIter, &aResult->mStatusText) || + !ReadParam(aMsg, aIter, &aResult->mContentLength) || + !ReadParam(aMsg, aIter, &aResult->mContentType) || + !ReadParam(aMsg, aIter, &aResult->mContentCharset) || + !ReadParam(aMsg, aIter, &aResult->mCacheControlNoStore) || + !ReadParam(aMsg, aIter, &aResult->mCacheControlNoCache) || + !ReadParam(aMsg, aIter, &aResult->mPragmaNoCache)) return false; return true; diff --git a/netwerk/protocol/http/nsHttpChunkedDecoder.cpp b/netwerk/protocol/http/nsHttpChunkedDecoder.cpp index f339d8cb3b73..3e4f2c0e4ae0 100644 --- a/netwerk/protocol/http/nsHttpChunkedDecoder.cpp +++ b/netwerk/protocol/http/nsHttpChunkedDecoder.cpp @@ -137,10 +137,7 @@ nsHttpChunkedDecoder::ParseChunkRemaining(char *buf, LOG(("got trailer: %s\n", buf)); // allocate a header array for the trailers on demand if (!mTrailers) { - mTrailers = new nsHttpHeaderArray - (nsHttpHeaderArray::HTTP_RESPONSE_HEADERS); - if (!mTrailers) - return NS_ERROR_OUT_OF_MEMORY; + mTrailers = new nsHttpHeaderArray(); } mTrailers->ParseHeaderLine(buf); } diff --git a/netwerk/protocol/http/nsHttpHeaderArray.cpp b/netwerk/protocol/http/nsHttpHeaderArray.cpp index 183480cad720..accb4178b499 100644 --- a/netwerk/protocol/http/nsHttpHeaderArray.cpp +++ b/netwerk/protocol/http/nsHttpHeaderArray.cpp @@ -22,6 +22,8 @@ * * Contributor(s): * Darin Fisher (original author) + * Patrick McManus + * Jason Duell * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -43,7 +45,6 @@ //----------------------------------------------------------------------------- // nsHttpHeaderArray //----------------------------------------------------------------------------- - nsresult nsHttpHeaderArray::SetHeader(nsHttpAtom header, const nsACString &value, @@ -62,33 +63,50 @@ nsHttpHeaderArray::SetHeader(nsHttpAtom header, return NS_OK; } - // Create a new entry, or... if (!entry) { + entry = mHeaders.AppendElement(); // new nsEntry() + if (!entry) + return NS_ERROR_OUT_OF_MEMORY; + entry->header = header; + entry->value = value; + } else if (merge && !IsSingletonHeader(header)) { + MergeHeader(header, entry, value); + } else { + // Replace the existing string with the new value + entry->value = value; + } + + return NS_OK; +} + +nsresult +nsHttpHeaderArray::SetHeaderFromNet(nsHttpAtom header, const nsACString &value) +{ + nsEntry *entry = nsnull; + PRInt32 index; + + index = LookupEntry(header, &entry); + + if (!entry) { + if (value.IsEmpty()) + return NS_OK; // ignore empty headers entry = mHeaders.AppendElement(); //new nsEntry(header, value); if (!entry) return NS_ERROR_OUT_OF_MEMORY; entry->header = header; entry->value = value; + } else if (!IsSingletonHeader(header)) { + MergeHeader(header, entry, value); + } else { + // Multiple instances of non-mergeable header received from network + // - ignore if same value + if (!entry->value.Equals(value)) { + if (IsSuspectDuplicateHeader(header)) { + // reply may be corrupt/hacked (ex: CLRF injection attacks) + return NS_ERROR_CORRUPTED_CONTENT; + } // else silently drop value: keep value from 1st header seen + } } - // Append the new value to the existing value iff... - else if (merge && CanAppendToHeader(header)) { - if (header == nsHttp::Set_Cookie || - header == nsHttp::WWW_Authenticate || - header == nsHttp::Proxy_Authenticate) - // Special case these headers and use a newline delimiter to - // delimit the values from one another as commas may appear - // in the values of these headers contrary to what the spec says. - entry->value.Append('\n'); - else - // Delimit each value from the others using a comma (per HTTP spec) - entry->value.AppendLiteral(", "); - entry->value.Append(value); - } - // Replace the existing string with the new value - else if (CanOverwriteHeader(header)) - entry->value = value; - else if (!entry->value.Equals(value)) - return NS_ERROR_CORRUPTED_CONTENT; return NS_OK; } @@ -186,7 +204,7 @@ nsHttpHeaderArray::ParseHeaderLine(const char *line, if (val) *val = p; // assign response header - return SetHeader(atom, nsDependentCString(p, p2 - p), PR_TRUE); + return SetHeaderFromNet(atom, nsDependentCString(p, p2 - p)); } void @@ -220,41 +238,3 @@ nsHttpHeaderArray::Clear() { mHeaders.Clear(); } - -//----------------------------------------------------------------------------- -// nsHttpHeaderArray -//----------------------------------------------------------------------------- - -PRInt32 -nsHttpHeaderArray::LookupEntry(nsHttpAtom header, nsEntry **entry) -{ - PRUint32 index = mHeaders.IndexOf(header, 0, nsEntry::MatchHeader()); - if (index != PR_UINT32_MAX) - *entry = &mHeaders[index]; - return index; -} - -PRBool -nsHttpHeaderArray::CanAppendToHeader(nsHttpAtom header) -{ - return header != nsHttp::Content_Type && - header != nsHttp::Content_Length && - header != nsHttp::User_Agent && - header != nsHttp::Referer && - header != nsHttp::Host && - header != nsHttp::Authorization && - header != nsHttp::Proxy_Authorization && - header != nsHttp::If_Modified_Since && - header != nsHttp::If_Unmodified_Since && - header != nsHttp::From && - header != nsHttp::Location && - header != nsHttp::Max_Forwards; -} - -PRBool -nsHttpHeaderArray::CanOverwriteHeader(nsHttpAtom header) -{ - if (mType != HTTP_RESPONSE_HEADERS) - return PR_TRUE; - return header != nsHttp::Content_Length; -} diff --git a/netwerk/protocol/http/nsHttpHeaderArray.h b/netwerk/protocol/http/nsHttpHeaderArray.h index 219d501eb7ec..80592051657c 100644 --- a/netwerk/protocol/http/nsHttpHeaderArray.h +++ b/netwerk/protocol/http/nsHttpHeaderArray.h @@ -1,4 +1,5 @@ /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim: set sw=4 ts=8 et tw=80 : */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * @@ -49,17 +50,19 @@ class nsHttpHeaderArray { public: - enum nsHttpHeaderType { - HTTP_REQUEST_HEADERS, - HTTP_RESPONSE_HEADERS - }; - - nsHttpHeaderArray(nsHttpHeaderType headerType) : mType(headerType) {} + nsHttpHeaderArray() {} ~nsHttpHeaderArray() { Clear(); } const char *PeekHeader(nsHttpAtom header); - nsresult SetHeader(nsHttpAtom header, const nsACString &value, PRBool merge = PR_FALSE); + // Used by internal setters: to set header from network use SetHeaderFromNet + nsresult SetHeader(nsHttpAtom header, const nsACString &value, + PRBool merge = PR_FALSE); + + // Merges supported headers. For other duplicate values, determines if error + // needs to be thrown or 1st value kept. + nsresult SetHeaderFromNet(nsHttpAtom header, const nsACString &value); + nsresult GetHeader(nsHttpAtom header, nsACString &value); void ClearHeader(nsHttpAtom h); @@ -104,15 +107,90 @@ public: }; }; - nsTArray &Headers() { return mHeaders; } - private: PRInt32 LookupEntry(nsHttpAtom header, nsEntry **); - PRBool CanAppendToHeader(nsHttpAtom header); - PRBool CanOverwriteHeader(nsHttpAtom header); + void MergeHeader(nsHttpAtom header, nsEntry *entry, const nsACString &value); + + // Header cannot be merged: only one value possible + PRBool IsSingletonHeader(nsHttpAtom header); + + // Subset of singleton headers: should never see multiple, different + // instances of these, else something fishy may be going on (like CLRF + // injection) + PRBool IsSuspectDuplicateHeader(nsHttpAtom header); nsTArray mHeaders; - nsHttpHeaderType mType; + + friend struct IPC::ParamTraits; }; + +//----------------------------------------------------------------------------- +// nsHttpHeaderArray : inline functions +//----------------------------------------------------------------------------- + +inline PRInt32 +nsHttpHeaderArray::LookupEntry(nsHttpAtom header, nsEntry **entry) +{ + PRUint32 index = mHeaders.IndexOf(header, 0, nsEntry::MatchHeader()); + if (index != PR_UINT32_MAX) + *entry = &mHeaders[index]; + return index; +} + +inline PRBool +nsHttpHeaderArray::IsSingletonHeader(nsHttpAtom header) +{ + return header == nsHttp::Content_Type || + header == nsHttp::Content_Disposition || + header == nsHttp::Content_Length || + header == nsHttp::User_Agent || + header == nsHttp::Referer || + header == nsHttp::Host || + header == nsHttp::Authorization || + header == nsHttp::Proxy_Authorization || + header == nsHttp::If_Modified_Since || + header == nsHttp::If_Unmodified_Since || + header == nsHttp::From || + header == nsHttp::Location || + header == nsHttp::Max_Forwards; +} + +inline void +nsHttpHeaderArray::MergeHeader(nsHttpAtom header, + nsEntry *entry, + const nsACString &value) +{ + if (value.IsEmpty()) + return; // merge of empty header = no-op + + // Append the new value to the existing value + if (header == nsHttp::Set_Cookie || + header == nsHttp::WWW_Authenticate || + header == nsHttp::Proxy_Authenticate) + { + // Special case these headers and use a newline delimiter to + // delimit the values from one another as commas may appear + // in the values of these headers contrary to what the spec says. + entry->value.Append('\n'); + } else { + // Delimit each value from the others using a comma (per HTTP spec) + entry->value.AppendLiteral(", "); + } + entry->value.Append(value); +} + +inline PRBool +nsHttpHeaderArray::IsSuspectDuplicateHeader(nsHttpAtom header) +{ + PRBool retval = header == nsHttp::Content_Length || + header == nsHttp::Content_Disposition || + header == nsHttp::Location; + + NS_ASSERTION(!retval || IsSingletonHeader(header), + "Only non-mergeable headers should be in this list\n"); + + return retval; +} + #endif diff --git a/netwerk/protocol/http/nsHttpRequestHead.h b/netwerk/protocol/http/nsHttpRequestHead.h index 1a97ebb73b9f..168b9f314e79 100644 --- a/netwerk/protocol/http/nsHttpRequestHead.h +++ b/netwerk/protocol/http/nsHttpRequestHead.h @@ -52,9 +52,7 @@ class nsHttpRequestHead { public: - nsHttpRequestHead() : mHeaders(nsHttpHeaderArray::HTTP_REQUEST_HEADERS) - , mMethod(nsHttp::Get) - , mVersion(NS_HTTP_VERSION_1_1) {} + nsHttpRequestHead() : mMethod(nsHttp::Get), mVersion(NS_HTTP_VERSION_1_1) {} ~nsHttpRequestHead() {} void SetMethod(nsHttpAtom method) { mMethod = method; } diff --git a/netwerk/protocol/http/nsHttpResponseHead.cpp b/netwerk/protocol/http/nsHttpResponseHead.cpp index 9a25e586b035..3c6eedb0cc3d 100644 --- a/netwerk/protocol/http/nsHttpResponseHead.cpp +++ b/netwerk/protocol/http/nsHttpResponseHead.cpp @@ -445,7 +445,6 @@ nsHttpResponseHead::UpdateHeaders(nsHttpHeaderArray &headers) const char *val = headers.PeekHeaderAt(i, header); if (!val) { - NS_NOTREACHED("null header value"); continue; } diff --git a/netwerk/protocol/http/nsHttpResponseHead.h b/netwerk/protocol/http/nsHttpResponseHead.h index 3cf33de63a22..af71d9fc6c55 100644 --- a/netwerk/protocol/http/nsHttpResponseHead.h +++ b/netwerk/protocol/http/nsHttpResponseHead.h @@ -51,8 +51,7 @@ class nsHttpResponseHead { public: - nsHttpResponseHead() : mHeaders(nsHttpHeaderArray::HTTP_RESPONSE_HEADERS) - , mVersion(NS_HTTP_VERSION_1_1) + nsHttpResponseHead() : mVersion(NS_HTTP_VERSION_1_1) , mStatus(200) , mContentLength(LL_MAXUINT) , mCacheControlNoStore(PR_FALSE) From bc402f99151858043e329595ddc44c3440988344 Mon Sep 17 00:00:00 2001 From: Phil Ringnalda Date: Mon, 4 Jul 2011 23:23:53 -0700 Subject: [PATCH 05/13] Back out cceff8f75d6a (bug 610829) for orange --- widget/src/windows/nsIMM32Handler.cpp | 20 ----------- widget/src/windows/nsWindow.cpp | 51 ++++++++------------------- widget/src/windows/nsWindow.h | 16 +-------- 3 files changed, 15 insertions(+), 72 deletions(-) diff --git a/widget/src/windows/nsIMM32Handler.cpp b/widget/src/windows/nsIMM32Handler.cpp index 20c5db737f75..ca7be887cd9c 100644 --- a/widget/src/windows/nsIMM32Handler.cpp +++ b/widget/src/windows/nsIMM32Handler.cpp @@ -293,21 +293,11 @@ nsIMM32Handler::CommitComposition(nsWindow* aWindow, PRBool aForce) if (!aForce && !IsComposingWindow(aWindow)) { return; } - - PRBool associated = aWindow->AssociateDefaultIMC(PR_TRUE); - PR_LOG(gIMM32Log, PR_LOG_ALWAYS, - ("IMM32: CommitComposition, associated=%s\n", - associated ? "YES" : "NO")); - nsIMEContext IMEContext(aWindow->GetWindowHandle()); if (IMEContext.IsValid()) { ::ImmNotifyIME(IMEContext.get(), NI_COMPOSITIONSTR, CPS_COMPLETE, 0); ::ImmNotifyIME(IMEContext.get(), NI_COMPOSITIONSTR, CPS_CANCEL, 0); } - - if (associated) { - aWindow->AssociateDefaultIMC(PR_FALSE); - } } /* static */ void @@ -324,20 +314,10 @@ nsIMM32Handler::CancelComposition(nsWindow* aWindow, PRBool aForce) if (!aForce && !IsComposingWindow(aWindow)) { return; } - - PRBool associated = aWindow->AssociateDefaultIMC(PR_TRUE); - PR_LOG(gIMM32Log, PR_LOG_ALWAYS, - ("IMM32: CancelComposition, associated=%s\n", - associated ? "YES" : "NO")); - nsIMEContext IMEContext(aWindow->GetWindowHandle()); if (IMEContext.IsValid()) { ::ImmNotifyIME(IMEContext.get(), NI_COMPOSITIONSTR, CPS_CANCEL, 0); } - - if (associated) { - aWindow->AssociateDefaultIMC(PR_FALSE); - } } /* static */ PRBool diff --git a/widget/src/windows/nsWindow.cpp b/widget/src/windows/nsWindow.cpp index d7d13bf56081..b8a0a5bf7523 100644 --- a/widget/src/windows/nsWindow.cpp +++ b/widget/src/windows/nsWindow.cpp @@ -370,6 +370,7 @@ nsWindow::nsWindow() : nsBaseWidget() mWnd = nsnull; mPaintDC = nsnull; mPrevWndProc = nsnull; + mOldIMC = nsnull; mNativeDragTarget = nsnull; mInDtor = PR_FALSE; mIsVisible = PR_FALSE; @@ -6668,7 +6669,7 @@ LRESULT nsWindow::OnKeyDown(const MSG &aMsg, static PRBool sRedirectedKeyDownEventPreventedDefault = PR_FALSE; PRBool noDefault; if (aFakeCharMessage || !IsRedirectedKeyDownMessage(aMsg)) { - nsIMEContext IMEContext(mWnd); + HIMC oldIMC = mOldIMC; noDefault = DispatchKeyEvent(NS_KEY_DOWN, 0, nsnull, DOMKeyCode, &aMsg, aModKeyState); if (aEventDispatched) { @@ -6684,9 +6685,8 @@ LRESULT nsWindow::OnKeyDown(const MSG &aMsg, // application, we shouldn't redirect the message to it because the keydown // message is processed by us, so, nobody shouldn't process it. HWND focusedWnd = ::GetFocus(); - nsIMEContext newIMEContext(mWnd); - if (!noDefault && !aFakeCharMessage && focusedWnd && !PluginHasFocus() && - !IMEContext.get() && newIMEContext.get()) { + if (!noDefault && !aFakeCharMessage && oldIMC && !mOldIMC && focusedWnd && + !PluginHasFocus()) { RemoveNextCharMessage(focusedWnd); INPUT keyinput; @@ -7315,8 +7315,11 @@ void nsWindow::OnDestroy() CaptureRollupEvents(nsnull, nsnull, PR_FALSE, PR_TRUE); } - // Restore the IM context. - AssociateDefaultIMC(PR_TRUE); + // If IME is disabled, restore it. + if (mOldIMC) { + mOldIMC = ::ImmAssociateContext(mWnd, mOldIMC); + NS_ASSERTION(!mOldIMC, "Another IMC was associated"); + } // Turn off mouse trails if enabled. MouseTrailer* mtrailer = nsToolkit::gMouseTrailer; @@ -7955,7 +7958,11 @@ NS_IMETHODIMP nsWindow::SetInputMode(const IMEContext& aContext) PRBool enable = (status == nsIWidget::IME_STATUS_ENABLED || status == nsIWidget::IME_STATUS_PLUGIN); - AssociateDefaultIMC(enable); + if (!enable != !mOldIMC) + return NS_OK; + mOldIMC = ::ImmAssociateContext(mWnd, enable ? mOldIMC : NULL); + NS_ASSERTION(!enable || !mOldIMC, "Another IMC was associated"); + return NS_OK; } @@ -8018,36 +8025,6 @@ nsWindow::OnIMESelectionChange(void) } #endif //NS_ENABLE_TSF -PRBool nsWindow::AssociateDefaultIMC(PRBool aAssociate) -{ - nsIMEContext IMEContext(mWnd); - - if (aAssociate) { - BOOL ret = ::ImmAssociateContextEx(mWnd, NULL, IACE_DEFAULT); - NS_ASSERTION(ret, "ImmAssociateContextEx failed to restore default IMC"); -#ifdef DEBUG - nsIMEContext newIMEContext(mWnd); - NS_ASSERTION(!IMEContext.get() || newIMEContext.get() == IMEContext.get(), - "Unknown IMC had been associated"); -#endif - return ret && !IMEContext.get(); - } - - if (mOnDestroyCalled) { - // If OnDestroy() has been called, we shouldn't disassociate the default - // IMC at destroying the window. - return PR_FALSE; - } - - if (!IMEContext.get()) { - return PR_FALSE; // already disassociated - } - - BOOL ret = ::ImmAssociateContextEx(mWnd, NULL, 0); - NS_ASSERTION(ret, "ImmAssociateContextEx failed to disassociate the IMC"); - return ret != FALSE; -} - #ifdef ACCESSIBILITY #ifdef DEBUG_WMGETOBJECT diff --git a/widget/src/windows/nsWindow.h b/widget/src/windows/nsWindow.h index efb1f3331991..3488cf3011cb 100644 --- a/widget/src/windows/nsWindow.h +++ b/widget/src/windows/nsWindow.h @@ -262,21 +262,6 @@ public: */ static void StartAllowingD3D9(bool aReinitialize); - /** - * AssociateDefaultIMC() associates or disassociates the default IMC for - * the window. - * - * @param aAssociate TRUE, associates the default IMC with the window. - * Otherwise, disassociates the default IMC from the - * window. - * @return TRUE if this method associated the default IMC with - * disassociated window or disassociated the default IMC - * from associated window. - * Otherwise, i.e., if this method did nothing actually, - * FALSE. - */ - PRBool AssociateDefaultIMC(PRBool aAssociate); - #if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_WIN7 PRBool HasTaskbarIconBeenCreated() { return mHasTaskbarIconBeenCreated; } // Called when either the nsWindow or an nsITaskbarTabPreview receives the noticiation that this window @@ -519,6 +504,7 @@ protected: PRUint32 mBlurSuppressLevel; DWORD_PTR mOldStyle; DWORD_PTR mOldExStyle; + HIMC mOldIMC; IMEContext mIMEContext; nsNativeDragTarget* mNativeDragTarget; HKL mLastKeyboardLayout; From 0df395b2ad9840dc7b2313ebce4186337d82e7c1 Mon Sep 17 00:00:00 2001 From: Bas Schouten Date: Mon, 4 Jul 2011 16:32:36 +0000 Subject: [PATCH 06/13] Bug 668801: Backed out Bug 656844 - changeset 22ec5982eca7. --- .../canvas/src/nsCanvasRenderingContext2D.cpp | 4 ++- content/canvas/test/test_canvas.html | 27 ++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/content/canvas/src/nsCanvasRenderingContext2D.cpp b/content/canvas/src/nsCanvasRenderingContext2D.cpp index f1253cf7c5f2..421e99945467 100644 --- a/content/canvas/src/nsCanvasRenderingContext2D.cpp +++ b/content/canvas/src/nsCanvasRenderingContext2D.cpp @@ -510,9 +510,11 @@ protected: { ContextState& state = CurrentState(); + // The spec says we should not draw shadows when the alpha value is 0, + // regardless of the operator being used. return state.StyleIsColor(STYLE_SHADOW) && NS_GET_A(state.colorStyles[STYLE_SHADOW]) > 0 && - mThebes->CurrentOperator() == gfxContext::OPERATOR_OVER; + (state.shadowOffset != gfxPoint(0, 0) || state.shadowBlur != 0); } /** diff --git a/content/canvas/test/test_canvas.html b/content/canvas/test/test_canvas.html index 42fc2ee4fa29..34b0be79ecc0 100644 --- a/content/canvas/test/test_canvas.html +++ b/content/canvas/test/test_canvas.html @@ -16742,7 +16742,7 @@ ctx.shadowOffsetX = 100; ctx.fillStyle = '#0f0'; ctx.fillRect(-100, 0, 200, 50); -isPixel(ctx, 50, 25, 255, 255, 0, 255, 2); +isPixel(ctx, 50, 25, 0, 255, 0, 255, 2); } @@ -16768,7 +16768,7 @@ ctx.shadowBlur = 1; ctx.fillStyle = '#0f0'; ctx.fillRect(-10, -10, 120, 70); -isPixel(ctx, 50, 25, 255, 255, 0, 255, 2); +isPixel(ctx, 50, 25, 0, 255, 0, 255, 2); } @@ -21501,14 +21501,13 @@ function runTests() { //test_2d_composite_uncovered_pattern_source_in(); //test_2d_composite_uncovered_pattern_source_out(); - //test_2d_path_rect_zero_6(); // This test is bogus according to the spec; see bug 407107 - - // The following tests are disabled due to pending changes in the spec: - // - //test_2d_shadow_composite_3(); + //test_2d_path_rect_zero_6(); // This test is bogus according to the spec; see bug 407107 + + // These tests are bogus according to the spec: shadows should not be + // drawn if shadowBlur, shadowOffsetX, and shadowOffsetY are all zero, whic + // they are in these tests + //test_2d_shadow_composite_3(); //test_2d_shadow_composite_4(); - //test_2d_shadow_composite_1(); - //test_2d_shadow_composite_2(); try { test_2d_canvas_readonly(); } catch (e) { @@ -23894,6 +23893,16 @@ function runTests() { } catch (e) { ok(false, "unexpected exception thrown in: test_2d_shadow_clip_3"); } + try { + test_2d_shadow_composite_1(); + } catch (e) { + ok(false, "unexpected exception thrown in: test_2d_shadow_composite_1"); + } + try { + test_2d_shadow_composite_2(); + } catch (e) { + ok(false, "unexpected exception thrown in: test_2d_shadow_composite_2"); + } try { test_2d_shadow_gradient_alpha(); } catch (e) { From 6f97e9e7b9ba1c913d470de8637e85203ee3be24 Mon Sep 17 00:00:00 2001 From: Bas Schouten Date: Mon, 4 Jul 2011 16:35:50 +0000 Subject: [PATCH 07/13] Bug 668801: Backed out Bug 656844 - changeset a565838cfc3a. --- content/canvas/test/Makefile.in | 1 - .../canvas/test/test_shadow_operators.html | 91 ------------------- 2 files changed, 92 deletions(-) delete mode 100644 content/canvas/test/test_shadow_operators.html diff --git a/content/canvas/test/Makefile.in b/content/canvas/test/Makefile.in index e3fc0d4b5890..a4357e69dfa3 100644 --- a/content/canvas/test/Makefile.in +++ b/content/canvas/test/Makefile.in @@ -87,7 +87,6 @@ _TEST_FILES_0 = \ test_canvas_strokeStyle_getter.html \ test_bug613794.html \ test_drawImage_edge_cases.html \ - test_shadow_operators.html \ $(NULL) ifneq (1_Linux,$(MOZ_SUITE)_$(OS_ARCH)) diff --git a/content/canvas/test/test_shadow_operators.html b/content/canvas/test/test_shadow_operators.html deleted file mode 100644 index 8dcfdca35ae1..000000000000 --- a/content/canvas/test/test_shadow_operators.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - -

- - -

- -
-
-
- - From ab39deeadf06a25777dee7bbe2b081fae17cf108 Mon Sep 17 00:00:00 2001 From: Bas Schouten Date: Tue, 5 Jul 2011 06:28:14 +0000 Subject: [PATCH 08/13] Bug 668801 - Part 1: Adjust Azure for traditional shadow drawing style. r=jrmuizel --- .../src/nsCanvasRenderingContext2DAzure.cpp | 34 +++++++++++++------ gfx/2d/2D.h | 4 ++- gfx/2d/DrawTargetCairo.h | 3 +- gfx/2d/DrawTargetD2D.cpp | 6 ++-- gfx/2d/DrawTargetD2D.h | 3 +- 5 files changed, 34 insertions(+), 16 deletions(-) diff --git a/content/canvas/src/nsCanvasRenderingContext2DAzure.cpp b/content/canvas/src/nsCanvasRenderingContext2DAzure.cpp index bbe48ccb4890..b0deb833ecfb 100644 --- a/content/canvas/src/nsCanvasRenderingContext2DAzure.cpp +++ b/content/canvas/src/nsCanvasRenderingContext2DAzure.cpp @@ -621,7 +621,18 @@ protected: // The spec says we should not draw shadows if the operator is OVER. // If it's over and the alpha value is zero, nothing needs to be drawn. - return state.op == OP_OVER && NS_GET_A(state.shadowColor) != 0; + return NS_GET_A(state.shadowColor) != 0 && + (state.shadowBlur != 0 || state.shadowOffset.x != 0 || state.shadowOffset.y != 0); + } + + CompositionOp UsedOperation() + { + if (NeedToDrawShadow()) { + // In this case the shadow rendering will use the operator. + return OP_OVER; + } + + return CurrentState().op; } /** @@ -928,7 +939,8 @@ protected: mCtx->mTarget->DrawSurfaceWithShadow(snapshot, mSurfOffset, Color::FromABGR(mCtx->CurrentState().shadowColor), - mCtx->CurrentState().shadowOffset, mSigma); + mCtx->CurrentState().shadowOffset, mSigma, + mCtx->CurrentState().op); } DrawTarget* operator->() @@ -2136,7 +2148,7 @@ nsCanvasRenderingContext2DAzure::FillRect(float x, float y, float w, float h) AdjustedTarget(this)->FillRect(mgfx::Rect(x, y, w, h), GeneralPattern().ForStyle(this, STYLE_FILL, mTarget), - DrawOptions(state.globalAlpha, state.op)); + DrawOptions(state.globalAlpha, UsedOperation())); return RedrawUser(gfxRect(x, y, w, h)); } @@ -2165,7 +2177,7 @@ nsCanvasRenderingContext2DAzure::StrokeRect(float x, float y, float w, float h) state.dash.Length(), state.dash.Elements(), state.dashOffset), - DrawOptions(state.globalAlpha, state.op)); + DrawOptions(state.globalAlpha, UsedOperation())); return NS_OK; } else if (!w) { CapStyle cap = CAP_BUTT; @@ -2180,7 +2192,7 @@ nsCanvasRenderingContext2DAzure::StrokeRect(float x, float y, float w, float h) state.dash.Length(), state.dash.Elements(), state.dashOffset), - DrawOptions(state.globalAlpha, state.op)); + DrawOptions(state.globalAlpha, UsedOperation())); return NS_OK; } @@ -2192,7 +2204,7 @@ nsCanvasRenderingContext2DAzure::StrokeRect(float x, float y, float w, float h) state.dash.Length(), state.dash.Elements(), state.dashOffset), - DrawOptions(state.globalAlpha, state.op)); + DrawOptions(state.globalAlpha, UsedOperation())); return Redraw(); } @@ -2236,7 +2248,7 @@ nsCanvasRenderingContext2DAzure::Fill() AdjustedTarget(this)-> Fill(mPath, GeneralPattern().ForStyle(this, STYLE_FILL, mTarget), - DrawOptions(CurrentState().globalAlpha, CurrentState().op)); + DrawOptions(CurrentState().globalAlpha, UsedOperation())); return Redraw(); } @@ -2259,7 +2271,7 @@ nsCanvasRenderingContext2DAzure::Stroke() state.dash.Length(), state.dash.Elements(), state.dashOffset), - DrawOptions(state.globalAlpha, state.op)); + DrawOptions(state.globalAlpha, UsedOperation())); return Redraw(); } @@ -3133,7 +3145,7 @@ struct NS_STACK_CLASS nsCanvasBidiProcessorAzure : public nsBidiPresUtils::BidiP FillGlyphs(scaledFont, buffer, nsCanvasRenderingContext2DAzure::GeneralPattern(). ForStyle(mCtx, nsCanvasRenderingContext2DAzure::STYLE_FILL, mCtx->mTarget), - DrawOptions(mState->globalAlpha, mState->op)); + DrawOptions(mState->globalAlpha, mCtx->UsedOperation())); } else if (mOp == nsCanvasRenderingContext2DAzure::TEXT_DRAW_OPERATION_STROKE) { RefPtr path = scaledFont->GetPathForGlyphs(buffer, mCtx->mTarget); @@ -3148,7 +3160,7 @@ struct NS_STACK_CLASS nsCanvasBidiProcessorAzure : public nsBidiPresUtils::BidiP state.dash.Length(), state.dash.Elements(), state.dashOffset), - DrawOptions(state.globalAlpha, state.op)); + DrawOptions(state.globalAlpha, mCtx->UsedOperation())); } } @@ -3808,7 +3820,7 @@ nsCanvasRenderingContext2DAzure::DrawImage(nsIDOMElement *imgElt, float a1, mgfx::Rect(dx, dy, dw, dh), mgfx::Rect(sx, sy, sw, sh), DrawSurfaceOptions(filter), - DrawOptions(CurrentState().globalAlpha, CurrentState().op)); + DrawOptions(CurrentState().globalAlpha, UsedOperation())); return RedrawUser(gfxRect(dx, dy, dw, dh)); } diff --git a/gfx/2d/2D.h b/gfx/2d/2D.h index 54937afee6f7..b24d771994a7 100644 --- a/gfx/2d/2D.h +++ b/gfx/2d/2D.h @@ -483,12 +483,14 @@ public: * aColor Color of the drawn shadow * aOffset Offset of the shadow * aSigma Sigma used for the guassian filter kernel + * aOperator Composition operator used */ virtual void DrawSurfaceWithShadow(SourceSurface *aSurface, const Point &aDest, const Color &aColor, const Point &aOffset, - Float aSigma) = 0; + Float aSigma, + CompositionOp aOperator) = 0; /* * Clear a rectangle on the draw target to transparent black. This will diff --git a/gfx/2d/DrawTargetCairo.h b/gfx/2d/DrawTargetCairo.h index fbc11c9cb478..c5aa5b21cc69 100644 --- a/gfx/2d/DrawTargetCairo.h +++ b/gfx/2d/DrawTargetCairo.h @@ -63,7 +63,8 @@ public: const Point &aDest, const Color &aColor, const Point &aOffset, - Float aSigma) + Float aSigma, + CompositionOp aOperator) { } virtual void ClearRect(const Rect &aRect) diff --git a/gfx/2d/DrawTargetD2D.cpp b/gfx/2d/DrawTargetD2D.cpp index 403222eb8345..4c1f23e6b837 100644 --- a/gfx/2d/DrawTargetD2D.cpp +++ b/gfx/2d/DrawTargetD2D.cpp @@ -307,7 +307,8 @@ DrawTargetD2D::DrawSurfaceWithShadow(SourceSurface *aSurface, const Point &aDest, const Color &aColor, const Point &aOffset, - Float aSigma) + Float aSigma, + CompositionOp aOperator) { RefPtr srView = NULL; if (aSurface->GetType() != SURFACE_D2D1_DRAWTARGET) { @@ -593,6 +594,7 @@ DrawTargetD2D::DrawSurfaceWithShadow(SourceSurface *aSurface, mSize.height / Float(tmpSurfSize.height) * dsFactorY)); mPrivateData->mEffect->GetTechniqueByName("SampleTextureWithShadow")-> GetPassByIndex(1)->Apply(0); + mDevice->OMSetBlendState(GetBlendStateForOperator(aOperator), NULL, 0xffffffff); mDevice->Draw(4, 0); @@ -603,7 +605,7 @@ DrawTargetD2D::DrawSurfaceWithShadow(SourceSurface *aSurface, Float(mSize.height) / aSurface->GetSize().height)); mPrivateData->mEffect->GetTechniqueByName("SampleTexture")-> GetPassByIndex(0)->Apply(0); - mDevice->OMSetBlendState(GetBlendStateForOperator(OP_OVER), NULL, 0xffffffff); + mDevice->OMSetBlendState(GetBlendStateForOperator(aOperator), NULL, 0xffffffff); mDevice->Draw(4, 0); diff --git a/gfx/2d/DrawTargetD2D.h b/gfx/2d/DrawTargetD2D.h index 7c163298bbbd..5f21f7ddc682 100644 --- a/gfx/2d/DrawTargetD2D.h +++ b/gfx/2d/DrawTargetD2D.h @@ -79,7 +79,8 @@ public: const Point &aDest, const Color &aColor, const Point &aOffset, - Float aSigma); + Float aSigma, + CompositionOp aOperator); virtual void ClearRect(const Rect &aRect); virtual void CopySurface(SourceSurface *aSurface, From c17281a505a86a30ade27d55a363e497cf6711c7 Mon Sep 17 00:00:00 2001 From: Bas Schouten Date: Tue, 5 Jul 2011 06:28:17 +0000 Subject: [PATCH 09/13] Bug 668801 - Part 2: Fix small bug in Azure shadow drawing. r=jrmuizel --- gfx/2d/DrawTargetD2D.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gfx/2d/DrawTargetD2D.cpp b/gfx/2d/DrawTargetD2D.cpp index 4c1f23e6b837..4593cf7d7e1a 100644 --- a/gfx/2d/DrawTargetD2D.cpp +++ b/gfx/2d/DrawTargetD2D.cpp @@ -527,6 +527,10 @@ DrawTargetD2D::DrawSurfaceWithShadow(SourceSurface *aSurface, if (!needBiggerTemp) { tmpRTView = mTempRTView; tmpSRView = mSRView; + + // There could still be content here! + float color[4] = { 0, 0, 0, 0 }; + mDevice->ClearRenderTargetView(tmpRTView, color); } else { CD3D10_TEXTURE2D_DESC desc(DXGI_FORMAT_B8G8R8A8_UNORM, srcSurfSize.width, From aa0a80ced3424dd9a36e8a98e5b3835c6eaf6306 Mon Sep 17 00:00:00 2001 From: Bas Schouten Date: Tue, 5 Jul 2011 06:28:20 +0000 Subject: [PATCH 10/13] Bug 668801 - Part 3: Adjust dealing with clipped shadows to be accurate. r=jrmuizel --- gfx/2d/DrawTargetD2D.cpp | 153 +- gfx/2d/DrawTargetD2D.h | 1 + gfx/2d/ShadersD2D.fx | 55 +- gfx/2d/ShadersD2D.h | 3691 +++++++++++++++++++++++++++----------- 4 files changed, 2768 insertions(+), 1132 deletions(-) diff --git a/gfx/2d/DrawTargetD2D.cpp b/gfx/2d/DrawTargetD2D.cpp index 4593cf7d7e1a..e1e82b7dae92 100644 --- a/gfx/2d/DrawTargetD2D.cpp +++ b/gfx/2d/DrawTargetD2D.cpp @@ -122,29 +122,7 @@ public: gfxWarning() << "Failed to create shared bitmap for old surface."; } - factory()->CreatePathGeometry(byRef(mClippedArea)); - RefPtr currentSink; - mClippedArea->Open(byRef(currentSink)); - - std::vector::iterator iter = mDT->mPushedClips.begin(); - iter->mPath->GetGeometry()->Simplify(D2D1_GEOMETRY_SIMPLIFICATION_OPTION_CUBICS_AND_LINES, - iter->mTransform, currentSink); - - currentSink->Close(); - - iter++; - for (;iter != mDT->mPushedClips.end(); iter++) { - RefPtr newGeom; - factory()->CreatePathGeometry(byRef(newGeom)); - - newGeom->Open(byRef(currentSink)); - mClippedArea->CombineWithGeometry(iter->mPath->GetGeometry(), D2D1_COMBINE_MODE_INTERSECT, - iter->mTransform, currentSink); - - currentSink->Close(); - - mClippedArea = newGeom; - } + mClippedArea = mDT->GetClippedGeometry(); } ID2D1Factory *factory() { return mDT->factory(); } @@ -163,7 +141,9 @@ public: mDT->mTransformDirty = true; RefPtr rectGeom; - factory()->CreateRectangleGeometry(D2D1::InfiniteRect(), byRef(rectGeom)); + factory()->CreateRectangleGeometry( + D2D1::RectF(0, 0, float(mDT->mSize.width), float(mDT->mSize.height)), + byRef(rectGeom)); RefPtr invClippedArea; factory()->CreatePathGeometry(byRef(invClippedArea)); @@ -188,7 +168,7 @@ private: // with the old dest surface data. RefPtr mOldSurfBitmap; // This contains the area drawing is clipped to. - RefPtr mClippedArea; + RefPtr mClippedArea; }; DrawTargetD2D::DrawTargetD2D() @@ -317,6 +297,12 @@ DrawTargetD2D::DrawSurfaceWithShadow(SourceSurface *aSurface, Flush(); + AutoSaveRestoreClippedOut restoreClippedOut(this); + + if (!IsOperatorBoundByMask(aOperator)) { + restoreClippedOut.Save(); + } + srView = static_cast(aSurface)->GetSRView(); EnsureViews(); @@ -331,35 +317,36 @@ DrawTargetD2D::DrawSurfaceWithShadow(SourceSurface *aSurface, } } + RefPtr destRTView = mRTView; RefPtr destTexture; HRESULT hr; + RefPtr maskTexture; + RefPtr maskSRView; if (mPushedClips.size()) { - // We need to take clips into account, draw into a temporary surface, which - // we then blend back with the proper clips set, using D2D. - CD3D10_TEXTURE2D_DESC desc(DXGI_FORMAT_B8G8R8A8_UNORM, + CD3D10_TEXTURE2D_DESC desc(DXGI_FORMAT_A8_UNORM, mSize.width, mSize.height, 1, 1); desc.BindFlags = D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE; - hr = mDevice->CreateTexture2D(&desc, NULL, byRef(destTexture)); - if (FAILED(hr)) { - gfxWarning() << "Failure to create temporary texture. Size: " << mSize << " Code: " << hr; - return; - } + hr = mDevice->CreateTexture2D(&desc, NULL, byRef(maskTexture)); - hr = mDevice->CreateRenderTargetView(destTexture, NULL, byRef(destRTView)); - if (FAILED(hr)) { - gfxWarning() << "Failure to create RenderTargetView. Code: " << hr; - return; - } + RefPtr rt = CreateRTForTexture(maskTexture); - float color[4] = { 0, 0, 0, 0 }; - mDevice->ClearRenderTargetView(destRTView, color); + RefPtr brush; + rt->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::White), byRef(brush)); + + RefPtr geometry = GetClippedGeometry(); + + rt->BeginDraw(); + rt->Clear(D2D1::ColorF(0, 0)); + rt->FillGeometry(geometry, brush); + rt->EndDraw(); + + mDevice->CreateShaderResourceView(maskTexture, NULL, byRef(maskSRView)); } - IntSize srcSurfSize; ID3D10RenderTargetView *rtViews; D3D10_VIEWPORT viewport; @@ -596,8 +583,18 @@ DrawTargetD2D::DrawSurfaceWithShadow(SourceSurface *aSurface, SetFloatVector(ShaderConstantRectD3D10(-correctedOffset.x / Float(tmpSurfSize.width), -correctedOffset.y / Float(tmpSurfSize.height), mSize.width / Float(tmpSurfSize.width) * dsFactorX, mSize.height / Float(tmpSurfSize.height) * dsFactorY)); - mPrivateData->mEffect->GetTechniqueByName("SampleTextureWithShadow")-> - GetPassByIndex(1)->Apply(0); + + if (!mPushedClips.size()) { + mPrivateData->mEffect->GetTechniqueByName("SampleTextureWithShadow")-> + GetPassByIndex(1)->Apply(0); + } else { + mPrivateData->mEffect->GetVariableByName("mask")->AsShaderResource()->SetResource(maskSRView); + mPrivateData->mEffect->GetVariableByName("MaskTexCoords")->AsVector()-> + SetFloatVector(ShaderConstantRectD3D10(0, 0, 1.0f, 1.0f)); + mPrivateData->mEffect->GetTechniqueByName("SampleTextureWithShadow")-> + GetPassByIndex(2)->Apply(0); + } + mDevice->OMSetBlendState(GetBlendStateForOperator(aOperator), NULL, 0xffffffff); mDevice->Draw(4, 0); @@ -607,39 +604,17 @@ DrawTargetD2D::DrawSurfaceWithShadow(SourceSurface *aSurface, SetFloatVector(ShaderConstantRectD3D10(-aDest.x / aSurface->GetSize().width, -aDest.y / aSurface->GetSize().height, Float(mSize.width) / aSurface->GetSize().width, Float(mSize.height) / aSurface->GetSize().height)); - mPrivateData->mEffect->GetTechniqueByName("SampleTexture")-> - GetPassByIndex(0)->Apply(0); + if (!mPushedClips.size()) { + mPrivateData->mEffect->GetTechniqueByName("SampleTexture")-> + GetPassByIndex(0)->Apply(0); + } else { + mPrivateData->mEffect->GetTechniqueByName("SampleMaskedTexture")-> + GetPassByIndex(0)->Apply(0); + } + mDevice->OMSetBlendState(GetBlendStateForOperator(aOperator), NULL, 0xffffffff); mDevice->Draw(4, 0); - - if (mPushedClips.size()) { - // Assert destTexture - - // Blend back using the proper clips. - PrepareForDrawing(mRT); - - RefPtr surf; - hr = destTexture->QueryInterface((IDXGISurface**) byRef(surf)); - - if (FAILED(hr)) { - gfxWarning() << "Failure to QI texture to surface. Code: " << hr; - return; - } - - D2D1_BITMAP_PROPERTIES props = - D2D1::BitmapProperties(D2D1::PixelFormat(DXGIFormat(mFormat), AlphaMode(mFormat))); - RefPtr bitmap; - hr = mRT->CreateSharedBitmap(IID_IDXGISurface, surf, - &props, byRef(bitmap)); - - if (FAILED(hr)) { - gfxWarning() << "Failure to create shared bitmap for surface. Code: " << hr; - return; - } - - mRT->DrawBitmap(bitmap); - } } void @@ -1415,6 +1390,38 @@ DrawTargetD2D::FinalizeRTForOperator(CompositionOp aOperator, const Rect &aBound mDevice->Draw(4, 0); } +TemporaryRef +DrawTargetD2D::GetClippedGeometry() +{ + RefPtr currentSink; + RefPtr clippedGeometry; + + factory()->CreatePathGeometry(byRef(clippedGeometry)); + clippedGeometry->Open(byRef(currentSink)); + + std::vector::iterator iter = mPushedClips.begin(); + iter->mPath->GetGeometry()->Simplify(D2D1_GEOMETRY_SIMPLIFICATION_OPTION_CUBICS_AND_LINES, + iter->mTransform, currentSink); + + currentSink->Close(); + + iter++; + for (;iter != mPushedClips.end(); iter++) { + RefPtr newGeom; + factory()->CreatePathGeometry(byRef(newGeom)); + + newGeom->Open(byRef(currentSink)); + clippedGeometry->CombineWithGeometry(iter->mPath->GetGeometry(), D2D1_COMBINE_MODE_INTERSECT, + iter->mTransform, currentSink); + + currentSink->Close(); + + clippedGeometry = newGeom; + } + + return clippedGeometry; +} + TemporaryRef DrawTargetD2D::CreateRTForTexture(ID3D10Texture2D *aTexture) { diff --git a/gfx/2d/DrawTargetD2D.h b/gfx/2d/DrawTargetD2D.h index 5f21f7ddc682..10639f66d90f 100644 --- a/gfx/2d/DrawTargetD2D.h +++ b/gfx/2d/DrawTargetD2D.h @@ -160,6 +160,7 @@ private: void PopAllClips(); TemporaryRef CreateRTForTexture(ID3D10Texture2D *aTexture); + TemporaryRef GetClippedGeometry(); TemporaryRef CreateBrushForPattern(const Pattern &aPattern, Float aAlpha = 1.0f); TemporaryRef CreateStrokeStyleForOptions(const StrokeOptions &aStrokeOptions); diff --git a/gfx/2d/ShadersD2D.fx b/gfx/2d/ShadersD2D.fx index 736d33fac07e..6ed1857f9586 100644 --- a/gfx/2d/ShadersD2D.fx +++ b/gfx/2d/ShadersD2D.fx @@ -13,6 +13,7 @@ cbuffer cb0 { float4 QuadDesc; float4 TexCoords; + float4 MaskTexCoords; } cbuffer cb1 @@ -27,9 +28,11 @@ struct VS_OUTPUT { float4 Position : SV_Position; float2 TexCoord : TEXCOORD0; + float2 MaskTexCoord : TEXCOORD1; }; Texture2D tex; +Texture2D mask; sampler sSampler = sampler_state { Filter = MIN_MAG_MIP_LINEAR; @@ -38,6 +41,13 @@ sampler sSampler = sampler_state { AddressV = Clamp; }; +sampler sMaskSampler = sampler_state { + Filter = MIN_MAG_MIP_LINEAR; + Texture = mask; + AddressU = Clamp; + AddressV = Clamp; +}; + sampler sShadowSampler = sampler_state { Filter = MIN_MAG_MIP_LINEAR; Texture = tex; @@ -79,6 +89,8 @@ VS_OUTPUT SampleTextureVS(float3 pos : POSITION) Output.Position.z = 0; Output.TexCoord.x = pos.x * TexCoords.z + TexCoords.x; Output.TexCoord.y = pos.y * TexCoords.w + TexCoords.y; + Output.MaskTexCoord.x = pos.x * MaskTexCoords.z + MaskTexCoords.x; + Output.MaskTexCoord.y = pos.y * MaskTexCoords.w + MaskTexCoords.y; return Output; } @@ -87,6 +99,11 @@ float4 SampleTexturePS( VS_OUTPUT In) : SV_Target return tex.Sample(sSampler, In.TexCoord); }; +float4 SampleMaskTexturePS( VS_OUTPUT In) : SV_Target +{ + return tex.Sample(sSampler, In.TexCoord) * mask.Sample(sMaskSampler, In.MaskTexCoord).a; +}; + float4 SampleShadowHPS( VS_OUTPUT In) : SV_Target { float outputStrength = 0; @@ -121,6 +138,23 @@ float4 SampleShadowVPS( VS_OUTPUT In) : SV_Target return outputColor; }; +float4 SampleMaskShadowVPS( VS_OUTPUT In) : SV_Target +{ + float4 outputColor = float4(0, 0, 0, 0); + + outputColor += BlurWeights[0].x * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[0].x)); + outputColor += BlurWeights[0].y * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[0].y)); + outputColor += BlurWeights[0].z * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[0].z)); + outputColor += BlurWeights[0].w * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[0].w)); + outputColor += BlurWeights[1].x * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[1].x)); + outputColor += BlurWeights[1].y * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[1].y)); + outputColor += BlurWeights[1].z * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[1].z)); + outputColor += BlurWeights[1].w * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[1].w)); + outputColor += BlurWeights[2].x * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[2].x)); + + return outputColor * mask.Sample(sMaskSampler, In.MaskTexCoord).a; +}; + technique10 SampleTexture { pass P0 @@ -132,6 +166,16 @@ technique10 SampleTexture } } +technique10 SampleMaskedTexture +{ + pass P0 + { + SetRasterizerState(TextureRast); + SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleTextureVS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleMaskTexturePS())); + } +} technique10 SampleTextureWithShadow { @@ -153,4 +197,13 @@ technique10 SampleTextureWithShadow SetGeometryShader(NULL); SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleShadowVPS())); } -} \ No newline at end of file + // Vertical pass - used when using a mask + pass P2 + { + SetRasterizerState(TextureRast); + SetBlendState(ShadowBlendV, float4(1.0f, 1.0f, 1.0f, 1.0f), 0xffffffff); + SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleTextureVS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleMaskShadowVPS())); + } + } diff --git a/gfx/2d/ShadersD2D.h b/gfx/2d/ShadersD2D.h index 47fb5787d22c..0fb81d755c6c 100644 --- a/gfx/2d/ShadersD2D.h +++ b/gfx/2d/ShadersD2D.h @@ -9,6 +9,7 @@ cbuffer cb0 { float4 QuadDesc; // Offset: 0, size: 16 float4 TexCoords; // Offset: 16, size: 16 + float4 MaskTexCoords; // Offset: 32, size: 16 } cbuffer cb1 @@ -20,9 +21,10 @@ cbuffer cb1 } // -// 6 local object(s) +// 8 local object(s) // Texture2D tex; +Texture2D mask; SamplerState sSampler { Filter = uint(MIN_MAG_MIP_LINEAR /* 21 */); @@ -30,6 +32,13 @@ SamplerState sSampler AddressU = uint(CLAMP /* 3 */); AddressV = uint(CLAMP /* 3 */); }; +SamplerState sMaskSampler +{ + Filter = uint(MIN_MAG_MIP_LINEAR /* 21 */); + Texture = mask; + AddressU = uint(CLAMP /* 3 */); + AddressV = uint(CLAMP /* 3 */); +}; SamplerState sShadowSampler { Filter = uint(MIN_MAG_MIP_LINEAR /* 21 */); @@ -61,7 +70,7 @@ BlendState ShadowBlendV }; // -// 2 technique(s) +// 3 technique(s) // technique10 SampleTexture { @@ -80,6 +89,7 @@ technique10 SampleTexture // // float4 QuadDesc; // Offset: 0 Size: 16 // float4 TexCoords; // Offset: 16 Size: 16 + // float4 MaskTexCoords; // Offset: 32 Size: 16 // // } // @@ -105,13 +115,14 @@ technique10 SampleTexture // -------------------- ----- ------ -------- -------- ------ ------ // SV_Position 0 xyzw 0 POS float xyzw // TEXCOORD 0 xy 1 NONE float xy + // TEXCOORD 1 zw 1 NONE float zw // // // Constant buffer to DX9 shader constant mappings: // // Target Reg Buffer Start Reg # of Regs Data Conversion // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 2 ( FLT, FLT, FLT, FLT) + // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) // // // Runtime generated constant mappings: @@ -124,24 +135,27 @@ technique10 SampleTexture // Level9 shader bytecode: // vs_2_x - def c3, 0, 1, 0, 0 + def c4, 0, 1, 0, 0 dcl_texcoord v0 mad oT0.xy, v0, c2.zwzw, c2 + mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx mad r0.xy, v0, c1.zwzw, c1 add oPos.xy, r0, c0 - mov oPos.zw, c3.xyxy + mov oPos.zw, c4.xyxy - // approximately 4 instruction slots used + // approximately 5 instruction slots used vs_4_0 - dcl_constantbuffer cb0[2], immediateIndexed + dcl_constantbuffer cb0[3], immediateIndexed dcl_input v0.xy dcl_output_siv o0.xyzw, position dcl_output o1.xy + dcl_output o1.zw mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx mov o0.zw, l(0,0,0,1.000000) mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx + mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy ret - // Approximately 4 instruction slots used + // Approximately 5 instruction slots used }; GeometryShader = NULL; @@ -165,6 +179,7 @@ technique10 SampleTexture // -------------------- ----- ------ -------- -------- ------ ------ // SV_Position 0 xyzw 0 POS float // TEXCOORD 0 xy 1 NONE float xy + // TEXCOORD 1 zw 1 NONE float // // // Output signature: @@ -184,7 +199,7 @@ technique10 SampleTexture // Level9 shader bytecode: // ps_2_x - dcl t0.xy + dcl t0 dcl_2d s0 texld r0, t0, s0 mov oC0, r0 @@ -204,6 +219,166 @@ technique10 SampleTexture } +technique10 SampleMaskedTexture +{ + pass P0 + { + RasterizerState = TextureRast; + VertexShader = asm { + // + // Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 + // + // + // Buffer Definitions: + // + // cbuffer cb0 + // { + // + // float4 QuadDesc; // Offset: 0 Size: 16 + // float4 TexCoords; // Offset: 16 Size: 16 + // float4 MaskTexCoords; // Offset: 32 Size: 16 + // + // } + // + // + // Resource Bindings: + // + // Name Type Format Dim Slot Elements + // ------------------------------ ---------- ------- ----------- ---- -------- + // cb0 cbuffer NA NA 0 1 + // + // + // + // Input signature: + // + // Name Index Mask Register SysValue Format Used + // -------------------- ----- ------ -------- -------- ------ ------ + // POSITION 0 xyz 0 NONE float xy + // + // + // Output signature: + // + // Name Index Mask Register SysValue Format Used + // -------------------- ----- ------ -------- -------- ------ ------ + // SV_Position 0 xyzw 0 POS float xyzw + // TEXCOORD 0 xy 1 NONE float xy + // TEXCOORD 1 zw 1 NONE float zw + // + // + // Constant buffer to DX9 shader constant mappings: + // + // Target Reg Buffer Start Reg # of Regs Data Conversion + // ---------- ------- --------- --------- ---------------------- + // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) + // + // + // Runtime generated constant mappings: + // + // Target Reg Constant Description + // ---------- -------------------------------------------------- + // c0 Vertex Shader position offset + // + // + // Level9 shader bytecode: + // + vs_2_x + def c4, 0, 1, 0, 0 + dcl_texcoord v0 + mad oT0.xy, v0, c2.zwzw, c2 + mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx + mad r0.xy, v0, c1.zwzw, c1 + add oPos.xy, r0, c0 + mov oPos.zw, c4.xyxy + + // approximately 5 instruction slots used + vs_4_0 + dcl_constantbuffer cb0[3], immediateIndexed + dcl_input v0.xy + dcl_output_siv o0.xyzw, position + dcl_output o1.xy + dcl_output o1.zw + mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx + mov o0.zw, l(0,0,0,1.000000) + mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx + mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy + ret + // Approximately 5 instruction slots used + + }; + GeometryShader = NULL; + PixelShader = asm { + // + // Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 + // + // + // Resource Bindings: + // + // Name Type Format Dim Slot Elements + // ------------------------------ ---------- ------- ----------- ---- -------- + // sSampler sampler NA NA 0 1 + // sMaskSampler sampler NA NA 1 1 + // tex texture float4 2d 0 1 + // mask texture float4 2d 1 1 + // + // + // + // Input signature: + // + // Name Index Mask Register SysValue Format Used + // -------------------- ----- ------ -------- -------- ------ ------ + // SV_Position 0 xyzw 0 POS float + // TEXCOORD 0 xy 1 NONE float xy + // TEXCOORD 1 zw 1 NONE float zw + // + // + // Output signature: + // + // Name Index Mask Register SysValue Format Used + // -------------------- ----- ------ -------- -------- ------ ------ + // SV_Target 0 xyzw 0 TARGET float xyzw + // + // + // Sampler/Resource to DX9 shader sampler mappings: + // + // Target Sampler Source Sampler Source Resource + // -------------- --------------- ---------------- + // s0 s0 t0 + // s1 s1 t1 + // + // + // Level9 shader bytecode: + // + ps_2_x + dcl t0 + dcl_2d s0 + dcl_2d s1 + mov r0.xy, t0.wzzw + texld r1, t0, s0 + texld r0, r0, s1 + mul r0, r0.w, r1 + mov oC0, r0 + + // approximately 5 instruction slots used (2 texture, 3 arithmetic) + ps_4_0 + dcl_sampler s0, mode_default + dcl_sampler s1, mode_default + dcl_resource_texture2d (float,float,float,float) t0 + dcl_resource_texture2d (float,float,float,float) t1 + dcl_input_ps linear v1.xy + dcl_input_ps linear v1.zw + dcl_output o0.xyzw + dcl_temps 2 + sample r0.xyzw, v1.xyxx, t0.xyzw, s0 + sample r1.xyzw, v1.zwzz, t1.xyzw, s1 + mul o0.xyzw, r0.xyzw, r1.wwww + ret + // Approximately 4 instruction slots used + + }; + } + +} + technique10 SampleTextureWithShadow { pass P0 @@ -224,6 +399,7 @@ technique10 SampleTextureWithShadow // // float4 QuadDesc; // Offset: 0 Size: 16 // float4 TexCoords; // Offset: 16 Size: 16 + // float4 MaskTexCoords; // Offset: 32 Size: 16 // // } // @@ -249,13 +425,14 @@ technique10 SampleTextureWithShadow // -------------------- ----- ------ -------- -------- ------ ------ // SV_Position 0 xyzw 0 POS float xyzw // TEXCOORD 0 xy 1 NONE float xy + // TEXCOORD 1 zw 1 NONE float zw // // // Constant buffer to DX9 shader constant mappings: // // Target Reg Buffer Start Reg # of Regs Data Conversion // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 2 ( FLT, FLT, FLT, FLT) + // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) // // // Runtime generated constant mappings: @@ -268,24 +445,27 @@ technique10 SampleTextureWithShadow // Level9 shader bytecode: // vs_2_x - def c3, 0, 1, 0, 0 + def c4, 0, 1, 0, 0 dcl_texcoord v0 mad oT0.xy, v0, c2.zwzw, c2 + mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx mad r0.xy, v0, c1.zwzw, c1 add oPos.xy, r0, c0 - mov oPos.zw, c3.xyxy + mov oPos.zw, c4.xyxy - // approximately 4 instruction slots used + // approximately 5 instruction slots used vs_4_0 - dcl_constantbuffer cb0[2], immediateIndexed + dcl_constantbuffer cb0[3], immediateIndexed dcl_input v0.xy dcl_output_siv o0.xyzw, position dcl_output o1.xy + dcl_output o1.zw mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx mov o0.zw, l(0,0,0,1.000000) mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx + mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy ret - // Approximately 4 instruction slots used + // Approximately 5 instruction slots used }; GeometryShader = NULL; @@ -323,6 +503,7 @@ technique10 SampleTextureWithShadow // -------------------- ----- ------ -------- -------- ------ ------ // SV_Position 0 xyzw 0 POS float // TEXCOORD 0 xy 1 NONE float xy + // TEXCOORD 1 zw 1 NONE float // // // Output signature: @@ -350,7 +531,7 @@ technique10 SampleTextureWithShadow // Level9 shader bytecode: // ps_2_x - dcl t0.xy + dcl t0 dcl_2d s0 add r0.x, t0.x, c0.y mov r0.y, t0.y @@ -452,6 +633,7 @@ technique10 SampleTextureWithShadow // // float4 QuadDesc; // Offset: 0 Size: 16 // float4 TexCoords; // Offset: 16 Size: 16 + // float4 MaskTexCoords; // Offset: 32 Size: 16 // // } // @@ -477,13 +659,14 @@ technique10 SampleTextureWithShadow // -------------------- ----- ------ -------- -------- ------ ------ // SV_Position 0 xyzw 0 POS float xyzw // TEXCOORD 0 xy 1 NONE float xy + // TEXCOORD 1 zw 1 NONE float zw // // // Constant buffer to DX9 shader constant mappings: // // Target Reg Buffer Start Reg # of Regs Data Conversion // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 2 ( FLT, FLT, FLT, FLT) + // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) // // // Runtime generated constant mappings: @@ -496,24 +679,27 @@ technique10 SampleTextureWithShadow // Level9 shader bytecode: // vs_2_x - def c3, 0, 1, 0, 0 + def c4, 0, 1, 0, 0 dcl_texcoord v0 mad oT0.xy, v0, c2.zwzw, c2 + mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx mad r0.xy, v0, c1.zwzw, c1 add oPos.xy, r0, c0 - mov oPos.zw, c3.xyxy + mov oPos.zw, c4.xyxy - // approximately 4 instruction slots used + // approximately 5 instruction slots used vs_4_0 - dcl_constantbuffer cb0[2], immediateIndexed + dcl_constantbuffer cb0[3], immediateIndexed dcl_input v0.xy dcl_output_siv o0.xyzw, position dcl_output o1.xy + dcl_output o1.zw mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx mov o0.zw, l(0,0,0,1.000000) mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx + mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy ret - // Approximately 4 instruction slots used + // Approximately 5 instruction slots used }; GeometryShader = NULL; @@ -551,6 +737,7 @@ technique10 SampleTextureWithShadow // -------------------- ----- ------ -------- -------- ------ ------ // SV_Position 0 xyzw 0 POS float // TEXCOORD 0 xy 1 NONE float xy + // TEXCOORD 1 zw 1 NONE float // // // Output signature: @@ -577,7 +764,7 @@ technique10 SampleTextureWithShadow // Level9 shader bytecode: // ps_2_x - dcl t0.xy + dcl t0 dcl_2d s0 add r0.y, t0.y, c0.y mov r0.x, t0.x @@ -659,32 +846,275 @@ technique10 SampleTextureWithShadow }; } + pass P2 + { + RasterizerState = TextureRast; + AB_BlendFactor = float4(1, 1, 1, 1); + AB_SampleMask = uint(0xffffffff); + BlendState = ShadowBlendV; + VertexShader = asm { + // + // Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 + // + // + // Buffer Definitions: + // + // cbuffer cb0 + // { + // + // float4 QuadDesc; // Offset: 0 Size: 16 + // float4 TexCoords; // Offset: 16 Size: 16 + // float4 MaskTexCoords; // Offset: 32 Size: 16 + // + // } + // + // + // Resource Bindings: + // + // Name Type Format Dim Slot Elements + // ------------------------------ ---------- ------- ----------- ---- -------- + // cb0 cbuffer NA NA 0 1 + // + // + // + // Input signature: + // + // Name Index Mask Register SysValue Format Used + // -------------------- ----- ------ -------- -------- ------ ------ + // POSITION 0 xyz 0 NONE float xy + // + // + // Output signature: + // + // Name Index Mask Register SysValue Format Used + // -------------------- ----- ------ -------- -------- ------ ------ + // SV_Position 0 xyzw 0 POS float xyzw + // TEXCOORD 0 xy 1 NONE float xy + // TEXCOORD 1 zw 1 NONE float zw + // + // + // Constant buffer to DX9 shader constant mappings: + // + // Target Reg Buffer Start Reg # of Regs Data Conversion + // ---------- ------- --------- --------- ---------------------- + // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) + // + // + // Runtime generated constant mappings: + // + // Target Reg Constant Description + // ---------- -------------------------------------------------- + // c0 Vertex Shader position offset + // + // + // Level9 shader bytecode: + // + vs_2_x + def c4, 0, 1, 0, 0 + dcl_texcoord v0 + mad oT0.xy, v0, c2.zwzw, c2 + mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx + mad r0.xy, v0, c1.zwzw, c1 + add oPos.xy, r0, c0 + mov oPos.zw, c4.xyxy + + // approximately 5 instruction slots used + vs_4_0 + dcl_constantbuffer cb0[3], immediateIndexed + dcl_input v0.xy + dcl_output_siv o0.xyzw, position + dcl_output o1.xy + dcl_output o1.zw + mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx + mov o0.zw, l(0,0,0,1.000000) + mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx + mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy + ret + // Approximately 5 instruction slots used + + }; + GeometryShader = NULL; + PixelShader = asm { + // + // Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111 + // + // + // Buffer Definitions: + // + // cbuffer cb1 + // { + // + // float4 BlurOffsetsH[3]; // Offset: 0 Size: 48 [unused] + // float4 BlurOffsetsV[3]; // Offset: 48 Size: 48 + // float4 BlurWeights[3]; // Offset: 96 Size: 48 + // float4 ShadowColor; // Offset: 144 Size: 16 [unused] + // + // } + // + // + // Resource Bindings: + // + // Name Type Format Dim Slot Elements + // ------------------------------ ---------- ------- ----------- ---- -------- + // sMaskSampler sampler NA NA 0 1 + // sShadowSampler sampler NA NA 1 1 + // tex texture float4 2d 0 1 + // mask texture float4 2d 1 1 + // cb1 cbuffer NA NA 0 1 + // + // + // + // Input signature: + // + // Name Index Mask Register SysValue Format Used + // -------------------- ----- ------ -------- -------- ------ ------ + // SV_Position 0 xyzw 0 POS float + // TEXCOORD 0 xy 1 NONE float xy + // TEXCOORD 1 zw 1 NONE float zw + // + // + // Output signature: + // + // Name Index Mask Register SysValue Format Used + // -------------------- ----- ------ -------- -------- ------ ------ + // SV_Target 0 xyzw 0 TARGET float xyzw + // + // + // Constant buffer to DX9 shader constant mappings: + // + // Target Reg Buffer Start Reg # of Regs Data Conversion + // ---------- ------- --------- --------- ---------------------- + // c0 cb0 3 6 ( FLT, FLT, FLT, FLT) + // + // + // Sampler/Resource to DX9 shader sampler mappings: + // + // Target Sampler Source Sampler Source Resource + // -------------- --------------- ---------------- + // s0 s0 t1 + // s1 s1 t0 + // + // + // Level9 shader bytecode: + // + ps_2_x + dcl t0 + dcl_2d s0 + dcl_2d s1 + add r0.y, t0.y, c0.y + mov r0.x, t0.x + add r1.y, t0.y, c0.x + mov r1.x, t0.x + texld r0, r0, s1 + texld r1, r1, s1 + mul r0, r0, c3.y + mad r0, c3.x, r1, r0 + add r1.y, t0.y, c0.z + mov r1.x, t0.x + add r2.y, t0.y, c0.w + mov r2.x, t0.x + texld r1, r1, s1 + texld r2, r2, s1 + mad r0, c3.z, r1, r0 + mad r0, c3.w, r2, r0 + add r1.y, t0.y, c1.x + mov r1.x, t0.x + add r2.y, t0.y, c1.y + mov r2.x, t0.x + texld r1, r1, s1 + texld r2, r2, s1 + mad r0, c4.x, r1, r0 + mad r0, c4.y, r2, r0 + add r1.y, t0.y, c1.z + mov r1.x, t0.x + add r2.y, t0.y, c1.w + mov r2.x, t0.x + texld r1, r1, s1 + texld r2, r2, s1 + mad r0, c4.z, r1, r0 + mad r0, c4.w, r2, r0 + add r1.y, t0.y, c2.x + mov r1.x, t0.x + mov r2.xy, t0.wzzw + texld r1, r1, s1 + texld r2, r2, s0 + mad r0, c5.x, r1, r0 + mul r0, r2.w, r0 + mov oC0, r0 + + // approximately 40 instruction slots used (10 texture, 30 arithmetic) + ps_4_0 + dcl_constantbuffer cb0[9], immediateIndexed + dcl_sampler s0, mode_default + dcl_sampler s1, mode_default + dcl_resource_texture2d (float,float,float,float) t0 + dcl_resource_texture2d (float,float,float,float) t1 + dcl_input_ps linear v1.xy + dcl_input_ps linear v1.zw + dcl_output o0.xyzw + dcl_temps 4 + mov r0.xz, v1.xxxx + add r1.xyzw, v1.yyyy, cb0[3].xzyw + mov r0.yw, r1.xxxz + sample r2.xyzw, r0.zwzz, t0.xyzw, s1 + sample r0.xyzw, r0.xyxx, t0.xyzw, s1 + mul r2.xyzw, r2.xyzw, cb0[6].yyyy + mad r0.xyzw, cb0[6].xxxx, r0.xyzw, r2.xyzw + mov r1.xz, v1.xxxx + sample r2.xyzw, r1.xyxx, t0.xyzw, s1 + sample r1.xyzw, r1.zwzz, t0.xyzw, s1 + mad r0.xyzw, cb0[6].zzzz, r2.xyzw, r0.xyzw + mad r0.xyzw, cb0[6].wwww, r1.xyzw, r0.xyzw + mov r1.xz, v1.xxxx + add r2.xyzw, v1.yyyy, cb0[4].xzyw + mov r1.yw, r2.xxxz + sample r3.xyzw, r1.xyxx, t0.xyzw, s1 + sample r1.xyzw, r1.zwzz, t0.xyzw, s1 + mad r0.xyzw, cb0[7].xxxx, r3.xyzw, r0.xyzw + mad r0.xyzw, cb0[7].yyyy, r1.xyzw, r0.xyzw + mov r2.xz, v1.xxxx + sample r1.xyzw, r2.xyxx, t0.xyzw, s1 + sample r2.xyzw, r2.zwzz, t0.xyzw, s1 + mad r0.xyzw, cb0[7].zzzz, r1.xyzw, r0.xyzw + mad r0.xyzw, cb0[7].wwww, r2.xyzw, r0.xyzw + add r1.y, v1.y, cb0[5].x + mov r1.x, v1.x + sample r1.xyzw, r1.xyxx, t0.xyzw, s1 + mad r0.xyzw, cb0[8].xxxx, r1.xyzw, r0.xyzw + sample r1.xyzw, v1.zwzz, t1.xyzw, s0 + mul o0.xyzw, r0.xyzw, r1.wwww + ret + // Approximately 31 instruction slots used + + }; + } + } #endif const BYTE d2deffect[] = { - 68, 88, 66, 67, 245, 80, - 253, 174, 31, 0, 29, 195, - 254, 34, 10, 37, 101, 204, - 99, 74, 1, 0, 0, 0, - 216, 40, 0, 0, 1, 0, + 68, 88, 66, 67, 244, 198, + 222, 61, 43, 19, 42, 56, + 130, 197, 151, 242, 151, 57, + 208, 42, 1, 0, 0, 0, + 175, 67, 0, 0, 1, 0, 0, 0, 36, 0, 0, 0, - 70, 88, 49, 48, 172, 40, + 70, 88, 49, 48, 131, 67, 0, 0, 1, 16, 255, 254, - 2, 0, 0, 0, 6, 0, - 0, 0, 6, 0, 0, 0, + 2, 0, 0, 0, 7, 0, + 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 80, 36, + 3, 0, 0, 0, 203, 61, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 2, 0, + 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, - 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 10, 0, + 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 99, 98, 48, 0, 102, 108, 111, 97, 116, 52, 0, 8, 0, 0, @@ -695,125 +1125,443 @@ const BYTE d2deffect[] = 0, 81, 117, 97, 100, 68, 101, 115, 99, 0, 84, 101, 120, 67, 111, 111, 114, 100, - 115, 0, 99, 98, 49, 0, - 8, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 48, 0, 0, 0, 16, 0, + 115, 0, 77, 97, 115, 107, + 84, 101, 120, 67, 111, 111, + 114, 100, 115, 0, 99, 98, + 49, 0, 8, 0, 0, 0, + 1, 0, 0, 0, 3, 0, 0, 0, 48, 0, 0, 0, - 10, 33, 0, 0, 66, 108, - 117, 114, 79, 102, 102, 115, - 101, 116, 115, 72, 0, 66, - 108, 117, 114, 79, 102, 102, - 115, 101, 116, 115, 86, 0, - 66, 108, 117, 114, 87, 101, - 105, 103, 104, 116, 115, 0, - 83, 104, 97, 100, 111, 119, - 67, 111, 108, 111, 114, 0, - 84, 101, 120, 116, 117, 114, - 101, 50, 68, 0, 144, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 0, - 0, 0, 116, 101, 120, 0, - 83, 97, 109, 112, 108, 101, - 114, 83, 116, 97, 116, 101, - 0, 186, 0, 0, 0, 2, + 16, 0, 0, 0, 48, 0, + 0, 0, 10, 33, 0, 0, + 66, 108, 117, 114, 79, 102, + 102, 115, 101, 116, 115, 72, + 0, 66, 108, 117, 114, 79, + 102, 102, 115, 101, 116, 115, + 86, 0, 66, 108, 117, 114, + 87, 101, 105, 103, 104, 116, + 115, 0, 83, 104, 97, 100, + 111, 119, 67, 111, 108, 111, + 114, 0, 84, 101, 120, 116, + 117, 114, 101, 50, 68, 0, + 158, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 21, 0, 0, 0, 115, - 83, 97, 109, 112, 108, 101, - 114, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 21, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 115, 83, 104, 97, - 100, 111, 119, 83, 97, 109, - 112, 108, 101, 114, 0, 1, - 0, 0, 0, 2, 0, 0, - 0, 21, 0, 0, 0, 1, - 0, 0, 0, 2, 0, 0, - 0, 4, 0, 0, 0, 1, - 0, 0, 0, 2, 0, 0, - 0, 4, 0, 0, 0, 4, + 12, 0, 0, 0, 116, 101, + 120, 0, 109, 97, 115, 107, + 0, 83, 97, 109, 112, 108, + 101, 114, 83, 116, 97, 116, + 101, 0, 205, 0, 0, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 21, 0, 0, 0, + 115, 83, 97, 109, 112, 108, + 101, 114, 0, 1, 0, 0, + 0, 2, 0, 0, 0, 21, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, + 0, 2, 0, 0, 0, 3, + 0, 0, 0, 1, 0, 0, + 0, 2, 0, 0, 0, 3, + 0, 0, 0, 115, 77, 97, + 115, 107, 83, 97, 109, 112, + 108, 101, 114, 0, 1, 0, + 0, 0, 2, 0, 0, 0, + 21, 0, 0, 0, 1, 0, + 0, 0, 2, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 2, 0, 0, 0, + 3, 0, 0, 0, 115, 83, + 104, 97, 100, 111, 119, 83, + 97, 109, 112, 108, 101, 114, + 0, 1, 0, 0, 0, 2, + 0, 0, 0, 21, 0, 0, + 0, 1, 0, 0, 0, 2, + 0, 0, 0, 4, 0, 0, + 0, 1, 0, 0, 0, 2, + 0, 0, 0, 4, 0, 0, + 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 82, - 97, 115, 116, 101, 114, 105, - 122, 101, 114, 83, 116, 97, - 116, 101, 0, 103, 1, 0, - 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 82, 97, 115, 116, 101, + 114, 105, 122, 101, 114, 83, + 116, 97, 116, 101, 0, 171, + 1, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, + 0, 0, 0, 84, 101, 120, + 116, 117, 114, 101, 82, 97, + 115, 116, 0, 1, 0, 0, + 0, 2, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 2, 0, 0, 0, 1, + 0, 0, 0, 66, 108, 101, + 110, 100, 83, 116, 97, 116, + 101, 0, 251, 1, 0, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 83, 104, 97, 100, 111, 119, + 66, 108, 101, 110, 100, 72, + 0, 1, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 3, + 0, 0, 0, 15, 0, 0, + 0, 83, 104, 97, 100, 111, + 119, 66, 108, 101, 110, 100, + 86, 0, 1, 0, 0, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, + 2, 0, 0, 0, 2, 0, + 0, 0, 1, 0, 0, 0, + 2, 0, 0, 0, 6, 0, + 0, 0, 1, 0, 0, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, + 2, 0, 0, 0, 2, 0, + 0, 0, 1, 0, 0, 0, + 2, 0, 0, 0, 6, 0, + 0, 0, 1, 0, 0, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 15, 0, + 0, 0, 83, 97, 109, 112, + 108, 101, 84, 101, 120, 116, + 117, 114, 101, 0, 80, 48, + 0, 36, 4, 0, 0, 68, + 88, 66, 67, 116, 139, 68, + 62, 73, 113, 92, 4, 72, + 76, 225, 161, 30, 132, 222, + 233, 1, 0, 0, 0, 36, + 4, 0, 0, 6, 0, 0, + 0, 56, 0, 0, 0, 248, + 0, 0, 0, 244, 1, 0, + 0, 112, 2, 0, 0, 128, + 3, 0, 0, 180, 3, 0, + 0, 65, 111, 110, 57, 184, + 0, 0, 0, 184, 0, 0, + 0, 0, 2, 254, 255, 132, + 0, 0, 0, 52, 0, 0, + 0, 1, 0, 36, 0, 0, + 0, 48, 0, 0, 0, 48, + 0, 0, 0, 36, 0, 1, + 0, 48, 0, 0, 0, 0, + 0, 3, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 1, 2, 254, 255, 81, + 0, 0, 5, 4, 0, 15, + 160, 0, 0, 0, 0, 0, + 0, 128, 63, 0, 0, 0, + 0, 0, 0, 0, 0, 31, + 0, 0, 2, 5, 0, 0, + 128, 0, 0, 15, 144, 4, + 0, 0, 4, 0, 0, 3, + 224, 0, 0, 228, 144, 2, + 0, 238, 160, 2, 0, 228, + 160, 4, 0, 0, 4, 0, + 0, 12, 224, 0, 0, 20, + 144, 3, 0, 180, 160, 3, + 0, 20, 160, 4, 0, 0, + 4, 0, 0, 3, 128, 0, + 0, 228, 144, 1, 0, 238, + 160, 1, 0, 228, 160, 2, + 0, 0, 3, 0, 0, 3, + 192, 0, 0, 228, 128, 0, + 0, 228, 160, 1, 0, 0, + 2, 0, 0, 12, 192, 4, + 0, 68, 160, 255, 255, 0, + 0, 83, 72, 68, 82, 244, + 0, 0, 0, 64, 0, 1, + 0, 61, 0, 0, 0, 89, + 0, 0, 4, 70, 142, 32, + 0, 0, 0, 0, 0, 3, + 0, 0, 0, 95, 0, 0, + 3, 50, 16, 16, 0, 0, + 0, 0, 0, 103, 0, 0, + 4, 242, 32, 16, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 101, 0, 0, 3, 50, + 32, 16, 0, 1, 0, 0, + 0, 101, 0, 0, 3, 194, + 32, 16, 0, 1, 0, 0, + 0, 50, 0, 0, 11, 50, + 32, 16, 0, 0, 0, 0, + 0, 70, 16, 16, 0, 0, + 0, 0, 0, 230, 138, 32, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 70, 128, 32, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 54, 0, 0, + 8, 194, 32, 16, 0, 0, + 0, 0, 0, 2, 64, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 128, 63, 50, + 0, 0, 11, 50, 32, 16, + 0, 1, 0, 0, 0, 70, + 16, 16, 0, 0, 0, 0, + 0, 230, 138, 32, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 70, 128, 32, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 50, 0, 0, 11, 194, + 32, 16, 0, 1, 0, 0, + 0, 6, 20, 16, 0, 0, + 0, 0, 0, 166, 142, 32, + 0, 0, 0, 0, 0, 2, + 0, 0, 0, 6, 132, 32, + 0, 0, 0, 0, 0, 2, + 0, 0, 0, 62, 0, 0, + 1, 83, 84, 65, 84, 116, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, - 0, 84, 101, 120, 116, 117, - 114, 101, 82, 97, 115, 116, - 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 2, + 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, 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, 82, + 68, 69, 70, 8, 1, 0, + 0, 1, 0, 0, 0, 64, 0, 0, 0, 1, 0, 0, - 0, 66, 108, 101, 110, 100, - 83, 116, 97, 116, 101, 0, - 183, 1, 0, 0, 2, 0, + 0, 28, 0, 0, 0, 0, + 4, 254, 255, 0, 1, 0, + 0, 212, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 83, 104, - 97, 100, 111, 119, 66, 108, - 101, 110, 100, 72, 0, 1, - 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, + 0, 99, 98, 48, 0, 60, + 0, 0, 0, 3, 0, 0, + 0, 88, 0, 0, 0, 48, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 160, + 0, 0, 0, 0, 0, 0, + 0, 16, 0, 0, 0, 2, + 0, 0, 0, 172, 0, 0, + 0, 0, 0, 0, 0, 188, + 0, 0, 0, 16, 0, 0, + 0, 16, 0, 0, 0, 2, + 0, 0, 0, 172, 0, 0, + 0, 0, 0, 0, 0, 198, + 0, 0, 0, 32, 0, 0, + 0, 16, 0, 0, 0, 2, + 0, 0, 0, 172, 0, 0, + 0, 0, 0, 0, 0, 81, + 117, 97, 100, 68, 101, 115, + 99, 0, 171, 171, 171, 1, + 0, 3, 0, 1, 0, 4, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 84, 101, 120, + 67, 111, 111, 114, 100, 115, + 0, 77, 97, 115, 107, 84, + 101, 120, 67, 111, 111, 114, + 100, 115, 0, 77, 105, 99, + 114, 111, 115, 111, 102, 116, + 32, 40, 82, 41, 32, 72, + 76, 83, 76, 32, 83, 104, + 97, 100, 101, 114, 32, 67, + 111, 109, 112, 105, 108, 101, + 114, 32, 57, 46, 50, 57, + 46, 57, 53, 50, 46, 51, + 49, 49, 49, 0, 171, 171, + 171, 73, 83, 71, 78, 44, + 0, 0, 0, 1, 0, 0, + 0, 8, 0, 0, 0, 32, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, + 0, 7, 3, 0, 0, 80, + 79, 83, 73, 84, 73, 79, + 78, 0, 171, 171, 171, 79, + 83, 71, 78, 104, 0, 0, + 0, 3, 0, 0, 0, 8, + 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, - 0, 15, 0, 0, 0, 83, - 104, 97, 100, 111, 119, 66, - 108, 101, 110, 100, 86, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 6, 0, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 6, 0, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 15, 0, 0, 0, - 83, 97, 109, 112, 108, 101, - 84, 101, 120, 116, 117, 114, - 101, 0, 80, 48, 0, 152, - 3, 0, 0, 68, 88, 66, - 67, 219, 222, 190, 170, 104, - 118, 127, 154, 100, 214, 1, - 86, 70, 204, 61, 202, 1, - 0, 0, 0, 152, 3, 0, + 0, 0, 0, 0, 0, 15, + 0, 0, 0, 92, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 1, 0, 0, 0, 3, + 12, 0, 0, 92, 0, 0, + 0, 1, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 1, 0, 0, 0, 12, + 3, 0, 0, 83, 86, 95, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 84, 69, 88, + 67, 79, 79, 82, 68, 0, + 171, 171, 171, 197, 2, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 212, + 2, 0, 0, 68, 88, 66, + 67, 22, 206, 82, 103, 196, + 235, 84, 233, 156, 39, 210, + 152, 32, 145, 169, 162, 1, + 0, 0, 0, 212, 2, 0, 0, 6, 0, 0, 0, 56, - 0, 0, 0, 228, 0, 0, - 0, 168, 1, 0, 0, 36, - 2, 0, 0, 12, 3, 0, - 0, 64, 3, 0, 0, 65, - 111, 110, 57, 164, 0, 0, - 0, 164, 0, 0, 0, 0, - 2, 254, 255, 112, 0, 0, + 0, 0, 0, 164, 0, 0, + 0, 16, 1, 0, 0, 140, + 1, 0, 0, 48, 2, 0, + 0, 160, 2, 0, 0, 65, + 111, 110, 57, 100, 0, 0, + 0, 100, 0, 0, 0, 0, + 2, 255, 255, 60, 0, 0, + 0, 40, 0, 0, 0, 0, + 0, 40, 0, 0, 0, 40, + 0, 0, 0, 40, 0, 1, + 0, 36, 0, 0, 0, 40, + 0, 0, 0, 0, 0, 1, + 2, 255, 255, 31, 0, 0, + 2, 0, 0, 0, 128, 0, + 0, 15, 176, 31, 0, 0, + 2, 0, 0, 0, 144, 0, + 8, 15, 160, 66, 0, 0, + 3, 0, 0, 15, 128, 0, + 0, 228, 176, 0, 8, 228, + 160, 1, 0, 0, 2, 0, + 8, 15, 128, 0, 0, 228, + 128, 255, 255, 0, 0, 83, + 72, 68, 82, 100, 0, 0, + 0, 64, 0, 0, 0, 25, + 0, 0, 0, 90, 0, 0, + 3, 0, 96, 16, 0, 0, + 0, 0, 0, 88, 24, 0, + 4, 0, 112, 16, 0, 0, + 0, 0, 0, 85, 85, 0, + 0, 98, 16, 0, 3, 50, + 16, 16, 0, 1, 0, 0, + 0, 101, 0, 0, 3, 242, + 32, 16, 0, 0, 0, 0, + 0, 69, 0, 0, 9, 242, + 32, 16, 0, 0, 0, 0, + 0, 70, 16, 16, 0, 1, + 0, 0, 0, 70, 126, 16, + 0, 0, 0, 0, 0, 0, + 96, 16, 0, 0, 0, 0, + 0, 62, 0, 0, 1, 83, + 84, 65, 84, 116, 0, 0, + 0, 2, 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, 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, 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 82, 68, 69, + 70, 156, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 28, + 0, 0, 0, 0, 4, 255, + 255, 0, 1, 0, 0, 105, + 0, 0, 0, 92, 0, 0, + 0, 3, 0, 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, 101, + 0, 0, 0, 2, 0, 0, + 0, 5, 0, 0, 0, 4, + 0, 0, 0, 255, 255, 255, + 255, 0, 0, 0, 0, 1, + 0, 0, 0, 12, 0, 0, + 0, 115, 83, 97, 109, 112, + 108, 101, 114, 0, 116, 101, + 120, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 57, 46, 50, 57, 46, + 57, 53, 50, 46, 51, 49, + 49, 49, 0, 171, 171, 73, + 83, 71, 78, 104, 0, 0, + 0, 3, 0, 0, 0, 8, + 0, 0, 0, 80, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 15, + 0, 0, 0, 92, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 1, 0, 0, 0, 3, + 3, 0, 0, 92, 0, 0, + 0, 1, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 1, 0, 0, 0, 12, + 0, 0, 0, 83, 86, 95, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 84, 69, 88, + 67, 79, 79, 82, 68, 0, + 171, 171, 171, 79, 83, 71, + 78, 44, 0, 0, 0, 1, + 0, 0, 0, 8, 0, 0, + 0, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, + 0, 0, 0, 15, 0, 0, + 0, 83, 86, 95, 84, 97, + 114, 103, 101, 116, 0, 171, + 171, 1, 7, 0, 0, 0, + 0, 0, 0, 83, 97, 109, + 112, 108, 101, 77, 97, 115, + 107, 101, 100, 84, 101, 120, + 116, 117, 114, 101, 0, 36, + 4, 0, 0, 68, 88, 66, + 67, 116, 139, 68, 62, 73, + 113, 92, 4, 72, 76, 225, + 161, 30, 132, 222, 233, 1, + 0, 0, 0, 36, 4, 0, + 0, 6, 0, 0, 0, 56, + 0, 0, 0, 248, 0, 0, + 0, 244, 1, 0, 0, 112, + 2, 0, 0, 128, 3, 0, + 0, 180, 3, 0, 0, 65, + 111, 110, 57, 184, 0, 0, + 0, 184, 0, 0, 0, 0, + 2, 254, 255, 132, 0, 0, 0, 52, 0, 0, 0, 1, 0, 36, 0, 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, 36, 0, 1, 0, 48, - 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 254, 255, 81, 0, 0, - 5, 3, 0, 15, 160, 0, + 5, 4, 0, 15, 160, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, @@ -822,97 +1570,116 @@ const BYTE d2deffect[] = 4, 0, 0, 3, 224, 0, 0, 228, 144, 2, 0, 238, 160, 2, 0, 228, 160, 4, - 0, 0, 4, 0, 0, 3, - 128, 0, 0, 228, 144, 1, - 0, 238, 160, 1, 0, 228, - 160, 2, 0, 0, 3, 0, - 0, 3, 192, 0, 0, 228, - 128, 0, 0, 228, 160, 1, - 0, 0, 2, 0, 0, 12, - 192, 3, 0, 68, 160, 255, - 255, 0, 0, 83, 72, 68, - 82, 188, 0, 0, 0, 64, - 0, 1, 0, 47, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 95, - 0, 0, 3, 50, 16, 16, - 0, 0, 0, 0, 0, 103, - 0, 0, 4, 242, 32, 16, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 50, 32, 16, 0, 1, - 0, 0, 0, 50, 0, 0, - 11, 50, 32, 16, 0, 0, + 0, 0, 4, 0, 0, 12, + 224, 0, 0, 20, 144, 3, + 0, 180, 160, 3, 0, 20, + 160, 4, 0, 0, 4, 0, + 0, 3, 128, 0, 0, 228, + 144, 1, 0, 238, 160, 1, + 0, 228, 160, 2, 0, 0, + 3, 0, 0, 3, 192, 0, + 0, 228, 128, 0, 0, 228, + 160, 1, 0, 0, 2, 0, + 0, 12, 192, 4, 0, 68, + 160, 255, 255, 0, 0, 83, + 72, 68, 82, 244, 0, 0, + 0, 64, 0, 1, 0, 61, + 0, 0, 0, 89, 0, 0, + 4, 70, 142, 32, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 95, 0, 0, 3, 50, + 16, 16, 0, 0, 0, 0, + 0, 103, 0, 0, 4, 242, + 32, 16, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 101, + 0, 0, 3, 50, 32, 16, + 0, 1, 0, 0, 0, 101, + 0, 0, 3, 194, 32, 16, + 0, 1, 0, 0, 0, 50, + 0, 0, 11, 50, 32, 16, + 0, 0, 0, 0, 0, 70, + 16, 16, 0, 0, 0, 0, + 0, 230, 138, 32, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 70, 128, 32, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 54, 0, 0, 8, 194, + 32, 16, 0, 0, 0, 0, + 0, 2, 64, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 128, 63, 50, 0, 0, + 11, 50, 32, 16, 0, 1, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 70, + 0, 1, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 54, - 0, 0, 8, 194, 32, 16, - 0, 0, 0, 0, 0, 2, - 64, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, - 63, 50, 0, 0, 11, 50, - 32, 16, 0, 1, 0, 0, - 0, 70, 16, 16, 0, 0, - 0, 0, 0, 230, 138, 32, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 70, 128, 32, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 62, 0, 0, - 1, 83, 84, 65, 84, 116, - 0, 0, 0, 4, 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, 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, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 82, - 68, 69, 70, 224, 0, 0, - 0, 1, 0, 0, 0, 64, - 0, 0, 0, 1, 0, 0, - 0, 28, 0, 0, 0, 0, - 4, 254, 255, 0, 1, 0, - 0, 174, 0, 0, 0, 60, - 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, 0, 0, - 0, 99, 98, 48, 0, 60, + 0, 1, 0, 0, 0, 50, + 0, 0, 11, 194, 32, 16, + 0, 1, 0, 0, 0, 6, + 20, 16, 0, 0, 0, 0, + 0, 166, 142, 32, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 88, 0, 0, 0, 32, + 0, 6, 132, 32, 0, 0, + 0, 0, 0, 2, 0, 0, + 0, 62, 0, 0, 1, 83, + 84, 65, 84, 116, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 136, + 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 148, 0, 0, - 0, 0, 0, 0, 0, 164, - 0, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 148, 0, 0, - 0, 0, 0, 0, 0, 81, - 117, 97, 100, 68, 101, 115, - 99, 0, 171, 171, 171, 1, - 0, 3, 0, 1, 0, 4, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 84, 101, 120, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 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, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 82, 68, 69, + 70, 8, 1, 0, 0, 1, + 0, 0, 0, 64, 0, 0, + 0, 1, 0, 0, 0, 28, + 0, 0, 0, 0, 4, 254, + 255, 0, 1, 0, 0, 212, + 0, 0, 0, 60, 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, 0, 0, 0, 99, + 98, 48, 0, 60, 0, 0, + 0, 3, 0, 0, 0, 88, + 0, 0, 0, 48, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 160, 0, 0, + 0, 0, 0, 0, 0, 16, + 0, 0, 0, 2, 0, 0, + 0, 172, 0, 0, 0, 0, + 0, 0, 0, 188, 0, 0, + 0, 16, 0, 0, 0, 16, + 0, 0, 0, 2, 0, 0, + 0, 172, 0, 0, 0, 0, + 0, 0, 0, 198, 0, 0, + 0, 32, 0, 0, 0, 16, + 0, 0, 0, 2, 0, 0, + 0, 172, 0, 0, 0, 0, + 0, 0, 0, 81, 117, 97, + 100, 68, 101, 115, 99, 0, + 171, 171, 171, 1, 0, 3, + 0, 1, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 84, 101, 120, 67, 111, + 111, 114, 100, 115, 0, 77, + 97, 115, 107, 84, 101, 120, 67, 111, 111, 114, 100, 115, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, @@ -922,239 +1689,302 @@ const BYTE d2deffect[] = 112, 105, 108, 101, 114, 32, 57, 46, 50, 57, 46, 57, 53, 50, 46, 51, 49, 49, - 49, 0, 171, 73, 83, 71, - 78, 44, 0, 0, 0, 1, - 0, 0, 0, 8, 0, 0, - 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 7, 3, 0, - 0, 80, 79, 83, 73, 84, - 73, 79, 78, 0, 171, 171, - 171, 79, 83, 71, 78, 80, - 0, 0, 0, 2, 0, 0, - 0, 8, 0, 0, 0, 56, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 68, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, - 0, 3, 12, 0, 0, 83, - 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 84, - 69, 88, 67, 79, 79, 82, - 68, 0, 171, 171, 171, 129, - 2, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 188, 2, 0, 0, 68, - 88, 66, 67, 57, 173, 135, - 37, 0, 15, 237, 50, 142, - 80, 59, 160, 81, 240, 60, - 171, 1, 0, 0, 0, 188, - 2, 0, 0, 6, 0, 0, - 0, 56, 0, 0, 0, 164, - 0, 0, 0, 16, 1, 0, - 0, 140, 1, 0, 0, 48, - 2, 0, 0, 136, 2, 0, - 0, 65, 111, 110, 57, 100, - 0, 0, 0, 100, 0, 0, - 0, 0, 2, 255, 255, 60, - 0, 0, 0, 40, 0, 0, - 0, 0, 0, 40, 0, 0, - 0, 40, 0, 0, 0, 40, - 0, 1, 0, 36, 0, 0, - 0, 40, 0, 0, 0, 0, - 0, 1, 2, 255, 255, 31, - 0, 0, 2, 0, 0, 0, - 128, 0, 0, 3, 176, 31, - 0, 0, 2, 0, 0, 0, - 144, 0, 8, 15, 160, 66, - 0, 0, 3, 0, 0, 15, - 128, 0, 0, 228, 176, 0, - 8, 228, 160, 1, 0, 0, - 2, 0, 8, 15, 128, 0, - 0, 228, 128, 255, 255, 0, - 0, 83, 72, 68, 82, 100, - 0, 0, 0, 64, 0, 0, - 0, 25, 0, 0, 0, 90, - 0, 0, 3, 0, 96, 16, - 0, 0, 0, 0, 0, 88, - 24, 0, 4, 0, 112, 16, - 0, 0, 0, 0, 0, 85, - 85, 0, 0, 98, 16, 0, - 3, 50, 16, 16, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 242, 32, 16, 0, 0, - 0, 0, 0, 69, 0, 0, - 9, 242, 32, 16, 0, 0, - 0, 0, 0, 70, 16, 16, - 0, 1, 0, 0, 0, 70, - 126, 16, 0, 0, 0, 0, - 0, 0, 96, 16, 0, 0, - 0, 0, 0, 62, 0, 0, - 1, 83, 84, 65, 84, 116, - 0, 0, 0, 2, 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, 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, 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, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 82, - 68, 69, 70, 156, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 28, 0, 0, 0, 0, - 4, 255, 255, 0, 1, 0, - 0, 105, 0, 0, 0, 92, - 0, 0, 0, 3, 0, 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, 101, 0, 0, 0, 2, - 0, 0, 0, 5, 0, 0, - 0, 4, 0, 0, 0, 255, - 255, 255, 255, 0, 0, 0, - 0, 1, 0, 0, 0, 12, - 0, 0, 0, 115, 83, 97, - 109, 112, 108, 101, 114, 0, - 116, 101, 120, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 57, 46, 50, - 57, 46, 57, 53, 50, 46, - 51, 49, 49, 49, 0, 171, - 171, 73, 83, 71, 78, 80, - 0, 0, 0, 2, 0, 0, - 0, 8, 0, 0, 0, 56, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 68, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, - 0, 3, 3, 0, 0, 83, - 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 84, - 69, 88, 67, 79, 79, 82, - 68, 0, 171, 171, 171, 79, + 49, 0, 171, 171, 171, 73, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 15, - 0, 0, 0, 83, 86, 95, - 84, 97, 114, 103, 101, 116, - 0, 171, 171, 49, 6, 0, - 0, 0, 0, 0, 0, 83, - 97, 109, 112, 108, 101, 84, - 101, 120, 116, 117, 114, 101, - 87, 105, 116, 104, 83, 104, - 97, 100, 111, 119, 0, 4, + 0, 0, 0, 0, 0, 7, + 3, 0, 0, 80, 79, 83, + 73, 84, 73, 79, 78, 0, + 171, 171, 171, 79, 83, 71, + 78, 104, 0, 0, 0, 3, + 0, 0, 0, 8, 0, 0, + 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 128, 63, 1, + 0, 3, 0, 0, 0, 0, + 0, 0, 0, 15, 0, 0, + 0, 92, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 1, + 0, 0, 0, 3, 12, 0, + 0, 92, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 1, + 0, 0, 0, 12, 3, 0, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 84, 69, 88, 67, 79, + 79, 82, 68, 0, 171, 171, + 171, 245, 9, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 2, 0, 0, 0, 0, + 0, 0, 0, 208, 3, 0, + 0, 68, 88, 66, 67, 145, + 96, 208, 189, 244, 147, 57, + 205, 242, 133, 35, 176, 39, + 143, 121, 235, 1, 0, 0, + 0, 208, 3, 0, 0, 6, + 0, 0, 0, 56, 0, 0, + 0, 224, 0, 0, 0, 188, + 1, 0, 0, 56, 2, 0, + 0, 44, 3, 0, 0, 156, + 3, 0, 0, 65, 111, 110, + 57, 160, 0, 0, 0, 160, + 0, 0, 0, 0, 2, 255, + 255, 116, 0, 0, 0, 44, + 0, 0, 0, 0, 0, 44, + 0, 0, 0, 44, 0, 0, + 0, 44, 0, 2, 0, 36, + 0, 0, 0, 44, 0, 0, + 0, 0, 0, 1, 1, 1, + 0, 1, 2, 255, 255, 31, + 0, 0, 2, 0, 0, 0, + 128, 0, 0, 15, 176, 31, + 0, 0, 2, 0, 0, 0, + 144, 0, 8, 15, 160, 31, + 0, 0, 2, 0, 0, 0, + 144, 1, 8, 15, 160, 1, + 0, 0, 2, 0, 0, 3, + 128, 0, 0, 235, 176, 66, + 0, 0, 3, 1, 0, 15, + 128, 0, 0, 228, 176, 0, + 8, 228, 160, 66, 0, 0, + 3, 0, 0, 15, 128, 0, + 0, 228, 128, 1, 8, 228, + 160, 5, 0, 0, 3, 0, + 0, 15, 128, 0, 0, 255, + 128, 1, 0, 228, 128, 1, + 0, 0, 2, 0, 8, 15, + 128, 0, 0, 228, 128, 255, + 255, 0, 0, 83, 72, 68, + 82, 212, 0, 0, 0, 64, + 0, 0, 0, 53, 0, 0, + 0, 90, 0, 0, 3, 0, + 96, 16, 0, 0, 0, 0, + 0, 90, 0, 0, 3, 0, + 96, 16, 0, 1, 0, 0, + 0, 88, 24, 0, 4, 0, + 112, 16, 0, 0, 0, 0, + 0, 85, 85, 0, 0, 88, + 24, 0, 4, 0, 112, 16, + 0, 1, 0, 0, 0, 85, + 85, 0, 0, 98, 16, 0, + 3, 50, 16, 16, 0, 1, + 0, 0, 0, 98, 16, 0, + 3, 194, 16, 16, 0, 1, + 0, 0, 0, 101, 0, 0, + 3, 242, 32, 16, 0, 0, + 0, 0, 0, 104, 0, 0, + 2, 2, 0, 0, 0, 69, + 0, 0, 9, 242, 0, 16, + 0, 0, 0, 0, 0, 70, + 16, 16, 0, 1, 0, 0, + 0, 70, 126, 16, 0, 0, + 0, 0, 0, 0, 96, 16, + 0, 0, 0, 0, 0, 69, + 0, 0, 9, 242, 0, 16, + 0, 1, 0, 0, 0, 230, + 26, 16, 0, 1, 0, 0, + 0, 70, 126, 16, 0, 1, + 0, 0, 0, 0, 96, 16, + 0, 1, 0, 0, 0, 56, + 0, 0, 7, 242, 32, 16, + 0, 0, 0, 0, 0, 70, + 14, 16, 0, 0, 0, 0, + 0, 246, 15, 16, 0, 1, + 0, 0, 0, 62, 0, 0, + 1, 83, 84, 65, 84, 116, + 0, 0, 0, 4, 0, 0, + 0, 2, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 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, 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 82, + 68, 69, 70, 236, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, + 0, 28, 0, 0, 0, 0, + 4, 255, 255, 0, 1, 0, + 0, 187, 0, 0, 0, 156, + 0, 0, 0, 3, 0, 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, 165, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 0, 0, + 0, 0, 0, 178, 0, 0, + 0, 2, 0, 0, 0, 5, + 0, 0, 0, 4, 0, 0, + 0, 255, 255, 255, 255, 0, + 0, 0, 0, 1, 0, 0, + 0, 12, 0, 0, 0, 182, + 0, 0, 0, 2, 0, 0, + 0, 5, 0, 0, 0, 4, + 0, 0, 0, 255, 255, 255, + 255, 1, 0, 0, 0, 1, + 0, 0, 0, 12, 0, 0, + 0, 115, 83, 97, 109, 112, + 108, 101, 114, 0, 115, 77, + 97, 115, 107, 83, 97, 109, + 112, 108, 101, 114, 0, 116, + 101, 120, 0, 109, 97, 115, + 107, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 57, 46, 50, 57, 46, + 57, 53, 50, 46, 51, 49, + 49, 49, 0, 73, 83, 71, + 78, 104, 0, 0, 0, 3, + 0, 0, 0, 8, 0, 0, + 0, 80, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 0, 0, + 0, 0, 0, 15, 0, 0, + 0, 92, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 1, + 0, 0, 0, 3, 3, 0, + 0, 92, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 1, + 0, 0, 0, 12, 12, 0, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 84, 69, 88, 67, 79, + 79, 82, 68, 0, 171, 171, + 171, 79, 83, 71, 78, 44, + 0, 0, 0, 1, 0, 0, + 0, 8, 0, 0, 0, 32, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, + 0, 15, 0, 0, 0, 83, + 86, 95, 84, 97, 114, 103, + 101, 116, 0, 171, 171, 49, + 14, 0, 0, 0, 0, 0, + 0, 83, 97, 109, 112, 108, + 101, 84, 101, 120, 116, 117, + 114, 101, 87, 105, 116, 104, + 83, 104, 97, 100, 111, 119, + 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 128, 63, 1, 0, 0, 0, 0, 0, 128, 63, 1, 0, 0, 0, 0, 0, 128, 63, 1, - 0, 0, 0, 3, 0, 0, - 0, 255, 255, 255, 255, 152, - 3, 0, 0, 68, 88, 66, - 67, 219, 222, 190, 170, 104, - 118, 127, 154, 100, 214, 1, - 86, 70, 204, 61, 202, 1, - 0, 0, 0, 152, 3, 0, - 0, 6, 0, 0, 0, 56, - 0, 0, 0, 228, 0, 0, - 0, 168, 1, 0, 0, 36, - 2, 0, 0, 12, 3, 0, - 0, 64, 3, 0, 0, 65, - 111, 110, 57, 164, 0, 0, - 0, 164, 0, 0, 0, 0, - 2, 254, 255, 112, 0, 0, - 0, 52, 0, 0, 0, 1, - 0, 36, 0, 0, 0, 48, - 0, 0, 0, 48, 0, 0, - 0, 36, 0, 1, 0, 48, - 0, 0, 0, 0, 0, 2, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 2, 254, 255, 81, 0, 0, - 5, 3, 0, 15, 160, 0, 0, 0, 0, 0, 0, 128, - 63, 0, 0, 0, 0, 0, - 0, 0, 0, 31, 0, 0, - 2, 5, 0, 0, 128, 0, - 0, 15, 144, 4, 0, 0, - 4, 0, 0, 3, 224, 0, - 0, 228, 144, 2, 0, 238, - 160, 2, 0, 228, 160, 4, - 0, 0, 4, 0, 0, 3, - 128, 0, 0, 228, 144, 1, - 0, 238, 160, 1, 0, 228, - 160, 2, 0, 0, 3, 0, - 0, 3, 192, 0, 0, 228, - 128, 0, 0, 228, 160, 1, - 0, 0, 2, 0, 0, 12, - 192, 3, 0, 68, 160, 255, - 255, 0, 0, 83, 72, 68, - 82, 188, 0, 0, 0, 64, - 0, 1, 0, 47, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 95, - 0, 0, 3, 50, 16, 16, - 0, 0, 0, 0, 0, 103, - 0, 0, 4, 242, 32, 16, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 50, 32, 16, 0, 1, - 0, 0, 0, 50, 0, 0, - 11, 50, 32, 16, 0, 0, - 0, 0, 0, 70, 16, 16, - 0, 0, 0, 0, 0, 230, - 138, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 70, - 128, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 54, - 0, 0, 8, 194, 32, 16, - 0, 0, 0, 0, 0, 2, - 64, 0, 0, 0, 0, 0, + 63, 1, 0, 0, 0, 3, + 0, 0, 0, 255, 255, 255, + 255, 36, 4, 0, 0, 68, + 88, 66, 67, 116, 139, 68, + 62, 73, 113, 92, 4, 72, + 76, 225, 161, 30, 132, 222, + 233, 1, 0, 0, 0, 36, + 4, 0, 0, 6, 0, 0, + 0, 56, 0, 0, 0, 248, + 0, 0, 0, 244, 1, 0, + 0, 112, 2, 0, 0, 128, + 3, 0, 0, 180, 3, 0, + 0, 65, 111, 110, 57, 184, + 0, 0, 0, 184, 0, 0, + 0, 0, 2, 254, 255, 132, + 0, 0, 0, 52, 0, 0, + 0, 1, 0, 36, 0, 0, + 0, 48, 0, 0, 0, 48, + 0, 0, 0, 36, 0, 1, + 0, 48, 0, 0, 0, 0, + 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, - 63, 50, 0, 0, 11, 50, + 0, 1, 2, 254, 255, 81, + 0, 0, 5, 4, 0, 15, + 160, 0, 0, 0, 0, 0, + 0, 128, 63, 0, 0, 0, + 0, 0, 0, 0, 0, 31, + 0, 0, 2, 5, 0, 0, + 128, 0, 0, 15, 144, 4, + 0, 0, 4, 0, 0, 3, + 224, 0, 0, 228, 144, 2, + 0, 238, 160, 2, 0, 228, + 160, 4, 0, 0, 4, 0, + 0, 12, 224, 0, 0, 20, + 144, 3, 0, 180, 160, 3, + 0, 20, 160, 4, 0, 0, + 4, 0, 0, 3, 128, 0, + 0, 228, 144, 1, 0, 238, + 160, 1, 0, 228, 160, 2, + 0, 0, 3, 0, 0, 3, + 192, 0, 0, 228, 128, 0, + 0, 228, 160, 1, 0, 0, + 2, 0, 0, 12, 192, 4, + 0, 68, 160, 255, 255, 0, + 0, 83, 72, 68, 82, 244, + 0, 0, 0, 64, 0, 1, + 0, 61, 0, 0, 0, 89, + 0, 0, 4, 70, 142, 32, + 0, 0, 0, 0, 0, 3, + 0, 0, 0, 95, 0, 0, + 3, 50, 16, 16, 0, 0, + 0, 0, 0, 103, 0, 0, + 4, 242, 32, 16, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 101, 0, 0, 3, 50, 32, 16, 0, 1, 0, 0, + 0, 101, 0, 0, 3, 194, + 32, 16, 0, 1, 0, 0, + 0, 50, 0, 0, 11, 50, + 32, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, - 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 128, 32, - 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 54, 0, 0, + 8, 194, 32, 16, 0, 0, + 0, 0, 0, 2, 64, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 128, 63, 50, + 0, 0, 11, 50, 32, 16, + 0, 1, 0, 0, 0, 70, + 16, 16, 0, 0, 0, 0, + 0, 230, 138, 32, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 70, 128, 32, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 50, 0, 0, 11, 194, + 32, 16, 0, 1, 0, 0, + 0, 6, 20, 16, 0, 0, + 0, 0, 0, 166, 142, 32, + 0, 0, 0, 0, 0, 2, + 0, 0, 0, 6, 132, 32, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, - 0, 0, 0, 4, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, + 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, @@ -1172,29 +2002,33 @@ const BYTE d2deffect[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, - 68, 69, 70, 224, 0, 0, + 68, 69, 70, 8, 1, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 0, 4, 254, 255, 0, 1, 0, - 0, 174, 0, 0, 0, 60, + 0, 212, 0, 0, 0, 60, 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, 0, 0, 0, 99, 98, 48, 0, 60, - 0, 0, 0, 2, 0, 0, - 0, 88, 0, 0, 0, 32, + 0, 0, 0, 3, 0, 0, + 0, 88, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 136, + 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 2, - 0, 0, 0, 148, 0, 0, - 0, 0, 0, 0, 0, 164, + 0, 0, 0, 172, 0, 0, + 0, 0, 0, 0, 0, 188, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 2, - 0, 0, 0, 148, 0, 0, + 0, 0, 0, 172, 0, 0, + 0, 0, 0, 0, 0, 198, + 0, 0, 0, 32, 0, 0, + 0, 16, 0, 0, 0, 2, + 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 81, 117, 97, 100, 68, 101, 115, 99, 0, 171, 171, 171, 1, @@ -1202,138 +2036,102 @@ const BYTE d2deffect[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 101, 120, 67, 111, 111, 114, 100, 115, - 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, - 57, 46, 50, 57, 46, 57, - 53, 50, 46, 51, 49, 49, - 49, 0, 171, 73, 83, 71, - 78, 44, 0, 0, 0, 1, - 0, 0, 0, 8, 0, 0, - 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 7, 3, 0, - 0, 80, 79, 83, 73, 84, - 73, 79, 78, 0, 171, 171, - 171, 79, 83, 71, 78, 80, - 0, 0, 0, 2, 0, 0, - 0, 8, 0, 0, 0, 56, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 68, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, + 0, 77, 97, 115, 107, 84, + 101, 120, 67, 111, 111, 114, + 100, 115, 0, 77, 105, 99, + 114, 111, 115, 111, 102, 116, + 32, 40, 82, 41, 32, 72, + 76, 83, 76, 32, 83, 104, + 97, 100, 101, 114, 32, 67, + 111, 109, 112, 105, 108, 101, + 114, 32, 57, 46, 50, 57, + 46, 57, 53, 50, 46, 51, + 49, 49, 49, 0, 171, 171, + 171, 73, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, - 0, 3, 12, 0, 0, 83, - 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 84, - 69, 88, 67, 79, 79, 82, - 68, 0, 171, 171, 171, 65, - 9, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 2, + 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 0, 208, 9, 0, 0, 68, - 88, 66, 67, 88, 125, 98, - 31, 252, 245, 86, 128, 184, - 245, 122, 45, 178, 60, 220, - 51, 1, 0, 0, 0, 208, - 9, 0, 0, 6, 0, 0, - 0, 56, 0, 0, 0, 248, - 2, 0, 0, 8, 7, 0, - 0, 132, 7, 0, 0, 68, - 9, 0, 0, 156, 9, 0, - 0, 65, 111, 110, 57, 184, - 2, 0, 0, 184, 2, 0, - 0, 0, 2, 255, 255, 120, - 2, 0, 0, 64, 0, 0, - 0, 2, 0, 40, 0, 0, - 0, 64, 0, 0, 0, 64, - 0, 1, 0, 36, 0, 0, - 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 0, 4, - 0, 3, 0, 0, 0, 0, - 0, 1, 2, 255, 255, 31, - 0, 0, 2, 0, 0, 0, - 128, 0, 0, 3, 176, 31, - 0, 0, 2, 0, 0, 0, - 144, 0, 8, 15, 160, 2, - 0, 0, 3, 0, 0, 1, - 128, 0, 0, 0, 176, 0, - 0, 85, 160, 1, 0, 0, - 2, 0, 0, 2, 128, 0, - 0, 85, 176, 2, 0, 0, - 3, 1, 0, 1, 128, 0, - 0, 0, 176, 0, 0, 0, - 160, 1, 0, 0, 2, 1, - 0, 2, 128, 0, 0, 85, - 176, 66, 0, 0, 3, 0, - 0, 15, 128, 0, 0, 228, - 128, 0, 8, 228, 160, 66, - 0, 0, 3, 1, 0, 15, - 128, 1, 0, 228, 128, 0, - 8, 228, 160, 5, 0, 0, + 0, 7, 3, 0, 0, 80, + 79, 83, 73, 84, 73, 79, + 78, 0, 171, 171, 171, 79, + 83, 71, 78, 104, 0, 0, + 0, 3, 0, 0, 0, 8, + 0, 0, 0, 80, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 15, + 0, 0, 0, 92, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 1, 0, 0, 0, 3, + 12, 0, 0, 92, 0, 0, + 0, 1, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 1, 0, 0, 0, 12, + 3, 0, 0, 83, 86, 95, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 84, 69, 88, + 67, 79, 79, 82, 68, 0, + 171, 171, 171, 85, 18, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 232, + 9, 0, 0, 68, 88, 66, + 67, 45, 80, 33, 8, 5, + 16, 134, 134, 115, 16, 129, + 43, 103, 216, 255, 210, 1, + 0, 0, 0, 232, 9, 0, + 0, 6, 0, 0, 0, 56, + 0, 0, 0, 248, 2, 0, + 0, 8, 7, 0, 0, 132, + 7, 0, 0, 68, 9, 0, + 0, 180, 9, 0, 0, 65, + 111, 110, 57, 184, 2, 0, + 0, 184, 2, 0, 0, 0, + 2, 255, 255, 120, 2, 0, + 0, 64, 0, 0, 0, 2, + 0, 40, 0, 0, 0, 64, + 0, 0, 0, 64, 0, 1, + 0, 36, 0, 0, 0, 64, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 6, 0, 4, 0, 3, + 0, 0, 0, 0, 0, 1, + 2, 255, 255, 31, 0, 0, + 2, 0, 0, 0, 128, 0, + 0, 15, 176, 31, 0, 0, + 2, 0, 0, 0, 144, 0, + 8, 15, 160, 2, 0, 0, 3, 0, 0, 1, 128, 0, - 0, 255, 128, 3, 0, 85, - 160, 4, 0, 0, 4, 0, - 0, 1, 128, 3, 0, 0, - 160, 1, 0, 255, 128, 0, - 0, 0, 128, 2, 0, 0, - 3, 1, 0, 1, 128, 0, - 0, 0, 176, 0, 0, 170, - 160, 1, 0, 0, 2, 1, + 0, 0, 176, 0, 0, 85, + 160, 1, 0, 0, 2, 0, 0, 2, 128, 0, 0, 85, - 176, 2, 0, 0, 3, 2, + 176, 2, 0, 0, 3, 1, 0, 1, 128, 0, 0, 0, - 176, 0, 0, 255, 160, 1, - 0, 0, 2, 2, 0, 2, + 176, 0, 0, 0, 160, 1, + 0, 0, 2, 1, 0, 2, 128, 0, 0, 85, 176, 66, - 0, 0, 3, 1, 0, 15, - 128, 1, 0, 228, 128, 0, + 0, 0, 3, 0, 0, 15, + 128, 0, 0, 228, 128, 0, 8, 228, 160, 66, 0, 0, - 3, 2, 0, 15, 128, 2, + 3, 1, 0, 15, 128, 1, 0, 228, 128, 0, 8, 228, - 160, 4, 0, 0, 4, 0, - 0, 1, 128, 3, 0, 170, - 160, 1, 0, 255, 128, 0, - 0, 0, 128, 4, 0, 0, - 4, 0, 0, 1, 128, 3, - 0, 255, 160, 2, 0, 255, - 128, 0, 0, 0, 128, 2, - 0, 0, 3, 1, 0, 1, - 128, 0, 0, 0, 176, 1, - 0, 0, 160, 1, 0, 0, - 2, 1, 0, 2, 128, 0, - 0, 85, 176, 2, 0, 0, - 3, 2, 0, 1, 128, 0, - 0, 0, 176, 1, 0, 85, - 160, 1, 0, 0, 2, 2, - 0, 2, 128, 0, 0, 85, - 176, 66, 0, 0, 3, 1, - 0, 15, 128, 1, 0, 228, - 128, 0, 8, 228, 160, 66, - 0, 0, 3, 2, 0, 15, - 128, 2, 0, 228, 128, 0, - 8, 228, 160, 4, 0, 0, - 4, 0, 0, 1, 128, 4, - 0, 0, 160, 1, 0, 255, - 128, 0, 0, 0, 128, 4, + 160, 5, 0, 0, 3, 0, + 0, 1, 128, 0, 0, 255, + 128, 3, 0, 85, 160, 4, 0, 0, 4, 0, 0, 1, - 128, 4, 0, 85, 160, 2, + 128, 3, 0, 0, 160, 1, 0, 255, 128, 0, 0, 0, 128, 2, 0, 0, 3, 1, 0, 1, 128, 0, 0, 0, - 176, 1, 0, 170, 160, 1, + 176, 0, 0, 170, 160, 1, 0, 0, 2, 1, 0, 2, 128, 0, 0, 85, 176, 2, 0, 0, 3, 2, 0, 1, - 128, 0, 0, 0, 176, 1, + 128, 0, 0, 0, 176, 0, 0, 255, 160, 1, 0, 0, 2, 2, 0, 2, 128, 0, 0, 85, 176, 66, 0, 0, @@ -1343,373 +2141,423 @@ const BYTE d2deffect[] = 0, 15, 128, 2, 0, 228, 128, 0, 8, 228, 160, 4, 0, 0, 4, 0, 0, 1, - 128, 4, 0, 170, 160, 1, + 128, 3, 0, 170, 160, 1, 0, 255, 128, 0, 0, 0, 128, 4, 0, 0, 4, 0, - 0, 1, 128, 4, 0, 255, + 0, 1, 128, 3, 0, 255, 160, 2, 0, 255, 128, 0, 0, 0, 128, 2, 0, 0, 3, 1, 0, 1, 128, 0, - 0, 0, 176, 2, 0, 0, + 0, 0, 176, 1, 0, 0, 160, 1, 0, 0, 2, 1, 0, 2, 128, 0, 0, 85, + 176, 2, 0, 0, 3, 2, + 0, 1, 128, 0, 0, 0, + 176, 1, 0, 85, 160, 1, + 0, 0, 2, 2, 0, 2, + 128, 0, 0, 85, 176, 66, + 0, 0, 3, 1, 0, 15, + 128, 1, 0, 228, 128, 0, + 8, 228, 160, 66, 0, 0, + 3, 2, 0, 15, 128, 2, + 0, 228, 128, 0, 8, 228, + 160, 4, 0, 0, 4, 0, + 0, 1, 128, 4, 0, 0, + 160, 1, 0, 255, 128, 0, + 0, 0, 128, 4, 0, 0, + 4, 0, 0, 1, 128, 4, + 0, 85, 160, 2, 0, 255, + 128, 0, 0, 0, 128, 2, + 0, 0, 3, 1, 0, 1, + 128, 0, 0, 0, 176, 1, + 0, 170, 160, 1, 0, 0, + 2, 1, 0, 2, 128, 0, + 0, 85, 176, 2, 0, 0, + 3, 2, 0, 1, 128, 0, + 0, 0, 176, 1, 0, 255, + 160, 1, 0, 0, 2, 2, + 0, 2, 128, 0, 0, 85, 176, 66, 0, 0, 3, 1, 0, 15, 128, 1, 0, 228, - 128, 0, 8, 228, 160, 4, + 128, 0, 8, 228, 160, 66, + 0, 0, 3, 2, 0, 15, + 128, 2, 0, 228, 128, 0, + 8, 228, 160, 4, 0, 0, + 4, 0, 0, 1, 128, 4, + 0, 170, 160, 1, 0, 255, + 128, 0, 0, 0, 128, 4, 0, 0, 4, 0, 0, 1, - 128, 5, 0, 0, 160, 1, + 128, 4, 0, 255, 160, 2, 0, 255, 128, 0, 0, 0, - 128, 5, 0, 0, 3, 0, - 0, 15, 128, 0, 0, 0, - 128, 6, 0, 228, 160, 1, - 0, 0, 2, 0, 8, 15, - 128, 0, 0, 228, 128, 255, - 255, 0, 0, 83, 72, 68, - 82, 8, 4, 0, 0, 64, - 0, 0, 0, 2, 1, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 0, 0, 0, - 0, 10, 0, 0, 0, 90, - 0, 0, 3, 0, 96, 16, - 0, 0, 0, 0, 0, 88, - 24, 0, 4, 0, 112, 16, - 0, 0, 0, 0, 0, 85, - 85, 0, 0, 98, 16, 0, - 3, 50, 16, 16, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 242, 32, 16, 0, 0, - 0, 0, 0, 104, 0, 0, - 2, 4, 0, 0, 0, 0, - 0, 0, 8, 242, 0, 16, - 0, 0, 0, 0, 0, 6, + 128, 2, 0, 0, 3, 1, + 0, 1, 128, 0, 0, 0, + 176, 2, 0, 0, 160, 1, + 0, 0, 2, 1, 0, 2, + 128, 0, 0, 85, 176, 66, + 0, 0, 3, 1, 0, 15, + 128, 1, 0, 228, 128, 0, + 8, 228, 160, 4, 0, 0, + 4, 0, 0, 1, 128, 5, + 0, 0, 160, 1, 0, 255, + 128, 0, 0, 0, 128, 5, + 0, 0, 3, 0, 0, 15, + 128, 0, 0, 0, 128, 6, + 0, 228, 160, 1, 0, 0, + 2, 0, 8, 15, 128, 0, + 0, 228, 128, 255, 255, 0, + 0, 83, 72, 68, 82, 8, + 4, 0, 0, 64, 0, 0, + 0, 2, 1, 0, 0, 89, + 0, 0, 4, 70, 142, 32, + 0, 0, 0, 0, 0, 10, + 0, 0, 0, 90, 0, 0, + 3, 0, 96, 16, 0, 0, + 0, 0, 0, 88, 24, 0, + 4, 0, 112, 16, 0, 0, + 0, 0, 0, 85, 85, 0, + 0, 98, 16, 0, 3, 50, 16, 16, 0, 1, 0, 0, - 0, 38, 135, 32, 0, 0, + 0, 101, 0, 0, 3, 242, + 32, 16, 0, 0, 0, 0, + 0, 104, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, - 0, 54, 0, 0, 5, 82, + 8, 242, 0, 16, 0, 0, + 0, 0, 0, 6, 16, 16, + 0, 1, 0, 0, 0, 38, + 135, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 54, + 0, 0, 5, 82, 0, 16, + 0, 1, 0, 0, 0, 86, + 7, 16, 0, 0, 0, 0, + 0, 54, 0, 0, 5, 162, 0, 16, 0, 1, 0, 0, - 0, 86, 7, 16, 0, 0, + 0, 86, 21, 16, 0, 1, + 0, 0, 0, 69, 0, 0, + 9, 242, 0, 16, 0, 2, + 0, 0, 0, 230, 10, 16, + 0, 1, 0, 0, 0, 70, + 126, 16, 0, 0, 0, 0, + 0, 0, 96, 16, 0, 0, + 0, 0, 0, 69, 0, 0, + 9, 242, 0, 16, 0, 1, + 0, 0, 0, 70, 0, 16, + 0, 1, 0, 0, 0, 70, + 126, 16, 0, 0, 0, 0, + 0, 0, 96, 16, 0, 0, + 0, 0, 0, 56, 0, 0, + 8, 18, 0, 16, 0, 1, + 0, 0, 0, 58, 0, 16, + 0, 2, 0, 0, 0, 26, + 128, 32, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 50, + 0, 0, 10, 18, 0, 16, + 0, 1, 0, 0, 0, 10, + 128, 32, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 58, + 0, 16, 0, 1, 0, 0, + 0, 10, 0, 16, 0, 1, + 0, 0, 0, 54, 0, 0, + 5, 162, 0, 16, 0, 0, + 0, 0, 0, 86, 21, 16, + 0, 1, 0, 0, 0, 69, + 0, 0, 9, 242, 0, 16, + 0, 2, 0, 0, 0, 70, + 0, 16, 0, 0, 0, 0, + 0, 70, 126, 16, 0, 0, + 0, 0, 0, 0, 96, 16, + 0, 0, 0, 0, 0, 69, + 0, 0, 9, 242, 0, 16, + 0, 0, 0, 0, 0, 230, + 10, 16, 0, 0, 0, 0, + 0, 70, 126, 16, 0, 0, + 0, 0, 0, 0, 96, 16, + 0, 0, 0, 0, 0, 50, + 0, 0, 10, 18, 0, 16, + 0, 0, 0, 0, 0, 42, + 128, 32, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 58, + 0, 16, 0, 2, 0, 0, + 0, 10, 0, 16, 0, 1, + 0, 0, 0, 50, 0, 0, + 10, 18, 0, 16, 0, 0, + 0, 0, 0, 58, 128, 32, + 0, 0, 0, 0, 0, 6, + 0, 0, 0, 58, 0, 16, + 0, 0, 0, 0, 0, 10, + 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 242, + 0, 16, 0, 1, 0, 0, + 0, 6, 16, 16, 0, 1, + 0, 0, 0, 38, 135, 32, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 54, 0, 0, + 5, 82, 0, 16, 0, 2, + 0, 0, 0, 86, 7, 16, + 0, 1, 0, 0, 0, 54, + 0, 0, 5, 162, 0, 16, + 0, 2, 0, 0, 0, 86, + 21, 16, 0, 1, 0, 0, + 0, 69, 0, 0, 9, 242, + 0, 16, 0, 3, 0, 0, + 0, 70, 0, 16, 0, 2, + 0, 0, 0, 70, 126, 16, + 0, 0, 0, 0, 0, 0, + 96, 16, 0, 0, 0, 0, + 0, 69, 0, 0, 9, 242, + 0, 16, 0, 2, 0, 0, + 0, 230, 10, 16, 0, 2, + 0, 0, 0, 70, 126, 16, + 0, 0, 0, 0, 0, 0, + 96, 16, 0, 0, 0, 0, + 0, 50, 0, 0, 10, 18, + 0, 16, 0, 0, 0, 0, + 0, 10, 128, 32, 0, 0, + 0, 0, 0, 7, 0, 0, + 0, 58, 0, 16, 0, 3, + 0, 0, 0, 10, 0, 16, + 0, 0, 0, 0, 0, 50, + 0, 0, 10, 18, 0, 16, + 0, 0, 0, 0, 0, 26, + 128, 32, 0, 0, 0, 0, + 0, 7, 0, 0, 0, 58, + 0, 16, 0, 2, 0, 0, + 0, 10, 0, 16, 0, 0, 0, 0, 0, 54, 0, 0, 5, 162, 0, 16, 0, 1, 0, 0, 0, 86, 21, 16, 0, 1, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, - 0, 2, 0, 0, 0, 230, - 10, 16, 0, 1, 0, 0, + 0, 2, 0, 0, 0, 70, + 0, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, + 0, 1, 0, 0, 0, 230, + 10, 16, 0, 1, 0, 0, + 0, 70, 126, 16, 0, 0, + 0, 0, 0, 0, 96, 16, + 0, 0, 0, 0, 0, 50, + 0, 0, 10, 18, 0, 16, + 0, 0, 0, 0, 0, 42, + 128, 32, 0, 0, 0, 0, + 0, 7, 0, 0, 0, 58, + 0, 16, 0, 2, 0, 0, + 0, 10, 0, 16, 0, 0, + 0, 0, 0, 50, 0, 0, + 10, 18, 0, 16, 0, 0, + 0, 0, 0, 58, 128, 32, + 0, 0, 0, 0, 0, 7, + 0, 0, 0, 58, 0, 16, + 0, 1, 0, 0, 0, 10, + 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 18, + 0, 16, 0, 1, 0, 0, + 0, 10, 16, 16, 0, 1, + 0, 0, 0, 10, 128, 32, + 0, 0, 0, 0, 0, 2, + 0, 0, 0, 54, 0, 0, + 5, 34, 0, 16, 0, 1, + 0, 0, 0, 26, 16, 16, + 0, 1, 0, 0, 0, 69, + 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 70, 0, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, - 0, 0, 0, 0, 0, 56, - 0, 0, 8, 18, 0, 16, - 0, 1, 0, 0, 0, 58, - 0, 16, 0, 2, 0, 0, - 0, 26, 128, 32, 0, 0, - 0, 0, 0, 6, 0, 0, - 0, 50, 0, 0, 10, 18, - 0, 16, 0, 1, 0, 0, - 0, 10, 128, 32, 0, 0, - 0, 0, 0, 6, 0, 0, - 0, 58, 0, 16, 0, 1, - 0, 0, 0, 10, 0, 16, - 0, 1, 0, 0, 0, 54, - 0, 0, 5, 162, 0, 16, - 0, 0, 0, 0, 0, 86, - 21, 16, 0, 1, 0, 0, - 0, 69, 0, 0, 9, 242, - 0, 16, 0, 2, 0, 0, - 0, 70, 0, 16, 0, 0, - 0, 0, 0, 70, 126, 16, - 0, 0, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, - 0, 69, 0, 0, 9, 242, - 0, 16, 0, 0, 0, 0, - 0, 230, 10, 16, 0, 0, - 0, 0, 0, 70, 126, 16, - 0, 0, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, - 0, 50, 0, 0, 10, 18, - 0, 16, 0, 0, 0, 0, - 0, 42, 128, 32, 0, 0, - 0, 0, 0, 6, 0, 0, - 0, 58, 0, 16, 0, 2, - 0, 0, 0, 10, 0, 16, - 0, 1, 0, 0, 0, 50, - 0, 0, 10, 18, 0, 16, - 0, 0, 0, 0, 0, 58, - 128, 32, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 58, - 0, 16, 0, 0, 0, 0, - 0, 10, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 0, - 8, 242, 0, 16, 0, 1, - 0, 0, 0, 6, 16, 16, - 0, 1, 0, 0, 0, 38, - 135, 32, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 54, - 0, 0, 5, 82, 0, 16, - 0, 2, 0, 0, 0, 86, - 7, 16, 0, 1, 0, 0, - 0, 54, 0, 0, 5, 162, - 0, 16, 0, 2, 0, 0, - 0, 86, 21, 16, 0, 1, - 0, 0, 0, 69, 0, 0, - 9, 242, 0, 16, 0, 3, - 0, 0, 0, 70, 0, 16, - 0, 2, 0, 0, 0, 70, - 126, 16, 0, 0, 0, 0, - 0, 0, 96, 16, 0, 0, - 0, 0, 0, 69, 0, 0, - 9, 242, 0, 16, 0, 2, - 0, 0, 0, 230, 10, 16, - 0, 2, 0, 0, 0, 70, - 126, 16, 0, 0, 0, 0, - 0, 0, 96, 16, 0, 0, - 0, 0, 0, 50, 0, 0, - 10, 18, 0, 16, 0, 0, - 0, 0, 0, 10, 128, 32, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 58, 0, 16, - 0, 3, 0, 0, 0, 10, - 0, 16, 0, 0, 0, 0, - 0, 50, 0, 0, 10, 18, - 0, 16, 0, 0, 0, 0, - 0, 26, 128, 32, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 58, 0, 16, 0, 2, - 0, 0, 0, 10, 0, 16, - 0, 0, 0, 0, 0, 54, - 0, 0, 5, 162, 0, 16, - 0, 1, 0, 0, 0, 86, - 21, 16, 0, 1, 0, 0, - 0, 69, 0, 0, 9, 242, - 0, 16, 0, 2, 0, 0, - 0, 70, 0, 16, 0, 1, - 0, 0, 0, 70, 126, 16, - 0, 0, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, - 0, 69, 0, 0, 9, 242, - 0, 16, 0, 1, 0, 0, - 0, 230, 10, 16, 0, 1, - 0, 0, 0, 70, 126, 16, - 0, 0, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, - 0, 50, 0, 0, 10, 18, - 0, 16, 0, 0, 0, 0, - 0, 42, 128, 32, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 58, 0, 16, 0, 2, - 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 50, 0, 0, 10, 18, 0, 16, - 0, 0, 0, 0, 0, 58, + 0, 0, 0, 0, 0, 10, 128, 32, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 58, + 0, 8, 0, 0, 0, 58, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 0, - 8, 18, 0, 16, 0, 1, - 0, 0, 0, 10, 16, 16, - 0, 1, 0, 0, 0, 10, - 128, 32, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 54, - 0, 0, 5, 34, 0, 16, - 0, 1, 0, 0, 0, 26, - 16, 16, 0, 1, 0, 0, - 0, 69, 0, 0, 9, 242, - 0, 16, 0, 1, 0, 0, - 0, 70, 0, 16, 0, 1, - 0, 0, 0, 70, 126, 16, - 0, 0, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, - 0, 50, 0, 0, 10, 18, - 0, 16, 0, 0, 0, 0, - 0, 10, 128, 32, 0, 0, - 0, 0, 0, 8, 0, 0, - 0, 58, 0, 16, 0, 1, - 0, 0, 0, 10, 0, 16, - 0, 0, 0, 0, 0, 56, - 0, 0, 8, 242, 32, 16, - 0, 0, 0, 0, 0, 6, - 0, 16, 0, 0, 0, 0, - 0, 70, 142, 32, 0, 0, - 0, 0, 0, 9, 0, 0, - 0, 62, 0, 0, 1, 83, - 84, 65, 84, 116, 0, 0, - 0, 30, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 5, - 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, 9, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 68, 69, - 70, 184, 1, 0, 0, 1, - 0, 0, 0, 148, 0, 0, - 0, 3, 0, 0, 0, 28, - 0, 0, 0, 0, 4, 255, - 255, 0, 1, 0, 0, 132, - 1, 0, 0, 124, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, + 0, 0, 0, 56, 0, 0, + 8, 242, 32, 16, 0, 0, + 0, 0, 0, 6, 0, 16, + 0, 0, 0, 0, 0, 70, + 142, 32, 0, 0, 0, 0, + 0, 9, 0, 0, 0, 62, + 0, 0, 1, 83, 84, 65, + 84, 116, 0, 0, 0, 30, + 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 2, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 139, - 0, 0, 0, 2, 0, 0, - 0, 5, 0, 0, 0, 4, - 0, 0, 0, 255, 255, 255, - 255, 0, 0, 0, 0, 1, - 0, 0, 0, 12, 0, 0, - 0, 143, 0, 0, 0, 0, + 0, 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 82, 68, 69, 70, 184, + 1, 0, 0, 1, 0, 0, + 0, 148, 0, 0, 0, 3, + 0, 0, 0, 28, 0, 0, + 0, 0, 4, 255, 255, 0, + 1, 0, 0, 132, 1, 0, + 0, 124, 0, 0, 0, 3, 0, 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, 115, 83, 104, - 97, 100, 111, 119, 83, 97, - 109, 112, 108, 101, 114, 0, - 116, 101, 120, 0, 99, 98, - 49, 0, 171, 143, 0, 0, - 0, 4, 0, 0, 0, 172, - 0, 0, 0, 160, 0, 0, + 0, 0, 0, 139, 0, 0, + 0, 2, 0, 0, 0, 5, + 0, 0, 0, 4, 0, 0, + 0, 255, 255, 255, 255, 0, + 0, 0, 0, 1, 0, 0, + 0, 12, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 12, 1, 0, - 0, 0, 0, 0, 0, 48, - 0, 0, 0, 2, 0, 0, - 0, 28, 1, 0, 0, 0, - 0, 0, 0, 44, 1, 0, - 0, 48, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, - 0, 60, 1, 0, 0, 0, - 0, 0, 0, 76, 1, 0, - 0, 96, 0, 0, 0, 48, - 0, 0, 0, 2, 0, 0, - 0, 88, 1, 0, 0, 0, - 0, 0, 0, 104, 1, 0, - 0, 144, 0, 0, 0, 16, - 0, 0, 0, 2, 0, 0, - 0, 116, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, + 0, 115, 83, 104, 97, 100, + 111, 119, 83, 97, 109, 112, + 108, 101, 114, 0, 116, 101, + 120, 0, 99, 98, 49, 0, + 171, 143, 0, 0, 0, 4, + 0, 0, 0, 172, 0, 0, + 0, 160, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 12, 1, 0, 0, 0, + 0, 0, 0, 48, 0, 0, + 0, 2, 0, 0, 0, 28, + 1, 0, 0, 0, 0, 0, + 0, 44, 1, 0, 0, 48, + 0, 0, 0, 48, 0, 0, + 0, 0, 0, 0, 0, 60, + 1, 0, 0, 0, 0, 0, + 0, 76, 1, 0, 0, 96, + 0, 0, 0, 48, 0, 0, + 0, 2, 0, 0, 0, 88, + 1, 0, 0, 0, 0, 0, + 0, 104, 1, 0, 0, 144, + 0, 0, 0, 16, 0, 0, + 0, 2, 0, 0, 0, 116, + 1, 0, 0, 0, 0, 0, + 0, 66, 108, 117, 114, 79, + 102, 102, 115, 101, 116, 115, + 72, 0, 171, 171, 171, 1, + 0, 3, 0, 1, 0, 4, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 66, 108, 117, 114, 79, 102, 102, 115, 101, - 116, 115, 72, 0, 171, 171, + 116, 115, 86, 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 66, - 108, 117, 114, 79, 102, 102, - 115, 101, 116, 115, 86, 0, - 171, 171, 171, 1, 0, 3, - 0, 1, 0, 4, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 66, 108, 117, 114, 87, - 101, 105, 103, 104, 116, 115, - 0, 1, 0, 3, 0, 1, - 0, 4, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 83, - 104, 97, 100, 111, 119, 67, - 111, 108, 111, 114, 0, 1, + 108, 117, 114, 87, 101, 105, + 103, 104, 116, 115, 0, 1, 0, 3, 0, 1, 0, 4, + 0, 3, 0, 0, 0, 0, + 0, 0, 0, 83, 104, 97, + 100, 111, 119, 67, 111, 108, + 111, 114, 0, 1, 0, 3, + 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 77, 105, 99, - 114, 111, 115, 111, 102, 116, - 32, 40, 82, 41, 32, 72, - 76, 83, 76, 32, 83, 104, - 97, 100, 101, 114, 32, 67, - 111, 109, 112, 105, 108, 101, - 114, 32, 57, 46, 50, 57, - 46, 57, 53, 50, 46, 51, - 49, 49, 49, 0, 171, 171, - 171, 73, 83, 71, 78, 80, - 0, 0, 0, 2, 0, 0, - 0, 8, 0, 0, 0, 56, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 68, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, - 0, 3, 3, 0, 0, 83, - 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 84, - 69, 88, 67, 79, 79, 82, - 68, 0, 171, 171, 171, 79, - 83, 71, 78, 44, 0, 0, - 0, 1, 0, 0, 0, 8, - 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, + 0, 77, 105, 99, 114, 111, + 115, 111, 102, 116, 32, 40, + 82, 41, 32, 72, 76, 83, + 76, 32, 83, 104, 97, 100, + 101, 114, 32, 67, 111, 109, + 112, 105, 108, 101, 114, 32, + 57, 46, 50, 57, 46, 57, + 53, 50, 46, 51, 49, 49, + 49, 0, 171, 171, 171, 73, + 83, 71, 78, 104, 0, 0, + 0, 3, 0, 0, 0, 8, + 0, 0, 0, 80, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, + 0, 0, 0, 92, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 1, 0, 0, 0, 3, + 3, 0, 0, 92, 0, 0, + 0, 1, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 1, 0, 0, 0, 12, 0, 0, 0, 83, 86, 95, - 84, 97, 114, 103, 101, 116, - 0, 171, 171, 241, 12, 0, - 0, 0, 0, 0, 0, 80, - 49, 0, 4, 0, 0, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 84, 69, 88, + 67, 79, 79, 82, 68, 0, + 171, 171, 171, 79, 83, 71, + 78, 44, 0, 0, 0, 1, + 0, 0, 0, 8, 0, 0, + 0, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, + 0, 0, 0, 15, 0, 0, + 0, 83, 86, 95, 84, 97, + 114, 103, 101, 116, 0, 171, + 171, 145, 22, 0, 0, 0, + 0, 0, 0, 80, 49, 0, + 4, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 128, 63, 1, 0, 0, 0, 0, 0, 128, 63, 1, 0, 0, 0, 0, 0, 128, 63, 1, 0, 0, 0, 0, 0, 128, 63, - 1, 0, 0, 0, 0, 0, - 128, 63, 1, 0, 0, 0, - 3, 0, 0, 0, 255, 255, - 255, 255, 152, 3, 0, 0, - 68, 88, 66, 67, 219, 222, - 190, 170, 104, 118, 127, 154, - 100, 214, 1, 86, 70, 204, - 61, 202, 1, 0, 0, 0, - 152, 3, 0, 0, 6, 0, - 0, 0, 56, 0, 0, 0, - 228, 0, 0, 0, 168, 1, - 0, 0, 36, 2, 0, 0, - 12, 3, 0, 0, 64, 3, - 0, 0, 65, 111, 110, 57, - 164, 0, 0, 0, 164, 0, - 0, 0, 0, 2, 254, 255, - 112, 0, 0, 0, 52, 0, - 0, 0, 1, 0, 36, 0, - 0, 0, 48, 0, 0, 0, - 48, 0, 0, 0, 36, 0, - 1, 0, 48, 0, 0, 0, - 0, 0, 2, 0, 1, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 255, 255, 255, 255, + 36, 4, 0, 0, 68, 88, + 66, 67, 116, 139, 68, 62, + 73, 113, 92, 4, 72, 76, + 225, 161, 30, 132, 222, 233, + 1, 0, 0, 0, 36, 4, + 0, 0, 6, 0, 0, 0, + 56, 0, 0, 0, 248, 0, + 0, 0, 244, 1, 0, 0, + 112, 2, 0, 0, 128, 3, + 0, 0, 180, 3, 0, 0, + 65, 111, 110, 57, 184, 0, + 0, 0, 184, 0, 0, 0, + 0, 2, 254, 255, 132, 0, + 0, 0, 52, 0, 0, 0, + 1, 0, 36, 0, 0, 0, + 48, 0, 0, 0, 48, 0, + 0, 0, 36, 0, 1, 0, + 48, 0, 0, 0, 0, 0, + 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 254, 255, - 81, 0, 0, 5, 3, 0, - 15, 160, 0, 0, 0, 0, - 0, 0, 128, 63, 0, 0, + 1, 2, 254, 255, 81, 0, + 0, 5, 4, 0, 15, 160, 0, 0, 0, 0, 0, 0, - 31, 0, 0, 2, 5, 0, - 0, 128, 0, 0, 15, 144, + 128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 15, 144, 4, 0, + 0, 4, 0, 0, 3, 224, + 0, 0, 228, 144, 2, 0, + 238, 160, 2, 0, 228, 160, 4, 0, 0, 4, 0, 0, - 3, 224, 0, 0, 228, 144, - 2, 0, 238, 160, 2, 0, - 228, 160, 4, 0, 0, 4, + 12, 224, 0, 0, 20, 144, + 3, 0, 180, 160, 3, 0, + 20, 160, 4, 0, 0, 4, 0, 0, 3, 128, 0, 0, 228, 144, 1, 0, 238, 160, 1, 0, 228, 160, 2, 0, 0, 3, 0, 0, 3, 192, 0, 0, 228, 128, 0, 0, 228, 160, 1, 0, 0, 2, - 0, 0, 12, 192, 3, 0, + 0, 0, 12, 192, 4, 0, 68, 160, 255, 255, 0, 0, - 83, 72, 68, 82, 188, 0, + 83, 72, 68, 82, 244, 0, 0, 0, 64, 0, 1, 0, - 47, 0, 0, 0, 89, 0, + 61, 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, - 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 95, 0, 0, 3, 50, 16, 16, 0, 0, 0, 0, 0, 103, 0, 0, 4, @@ -1717,6 +2565,8 @@ const BYTE d2deffect[] = 0, 0, 1, 0, 0, 0, 101, 0, 0, 3, 50, 32, 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 194, 32, + 16, 0, 1, 0, 0, 0, 50, 0, 0, 11, 50, 32, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 0, 0, @@ -1737,13 +2587,21 @@ const BYTE d2deffect[] = 0, 0, 1, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 62, 0, 0, 1, 83, 84, - 65, 84, 116, 0, 0, 0, - 4, 0, 0, 0, 0, 0, + 50, 0, 0, 11, 194, 32, + 16, 0, 1, 0, 0, 0, + 6, 20, 16, 0, 0, 0, + 0, 0, 166, 142, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 6, 132, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 62, 0, 0, 1, + 83, 84, 65, 84, 116, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 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, @@ -1751,52 +2609,58 @@ const BYTE d2deffect[] = 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 82, 68, 69, 70, - 224, 0, 0, 0, 1, 0, - 0, 0, 64, 0, 0, 0, - 1, 0, 0, 0, 28, 0, - 0, 0, 0, 4, 254, 255, - 0, 1, 0, 0, 174, 0, - 0, 0, 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, 82, 68, + 69, 70, 8, 1, 0, 0, + 1, 0, 0, 0, 64, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 99, 98, - 48, 0, 60, 0, 0, 0, - 2, 0, 0, 0, 88, 0, + 28, 0, 0, 0, 0, 4, + 254, 255, 0, 1, 0, 0, + 212, 0, 0, 0, 60, 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, 0, 0, 0, + 99, 98, 48, 0, 60, 0, + 0, 0, 3, 0, 0, 0, + 88, 0, 0, 0, 48, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 160, 0, + 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 2, 0, + 0, 0, 172, 0, 0, 0, + 0, 0, 0, 0, 188, 0, + 0, 0, 16, 0, 0, 0, + 16, 0, 0, 0, 2, 0, + 0, 0, 172, 0, 0, 0, + 0, 0, 0, 0, 198, 0, 0, 0, 32, 0, 0, 0, + 16, 0, 0, 0, 2, 0, + 0, 0, 172, 0, 0, 0, + 0, 0, 0, 0, 81, 117, + 97, 100, 68, 101, 115, 99, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 136, 0, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 148, 0, 0, 0, 0, 0, - 0, 0, 164, 0, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 148, 0, 0, 0, 0, 0, - 0, 0, 81, 117, 97, 100, - 68, 101, 115, 99, 0, 171, - 171, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 84, 101, 120, 67, 111, 111, - 114, 100, 115, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 57, 46, 50, - 57, 46, 57, 53, 50, 46, - 51, 49, 49, 49, 0, 171, + 0, 0, 84, 101, 120, 67, + 111, 111, 114, 100, 115, 0, + 77, 97, 115, 107, 84, 101, + 120, 67, 111, 111, 114, 100, + 115, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 57, 46, 50, 57, 46, + 57, 53, 50, 46, 51, 49, + 49, 49, 0, 171, 171, 171, 73, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, @@ -1806,34 +2670,38 @@ const BYTE d2deffect[] = 7, 3, 0, 0, 80, 79, 83, 73, 84, 73, 79, 78, 0, 171, 171, 171, 79, 83, - 71, 78, 80, 0, 0, 0, - 2, 0, 0, 0, 8, 0, - 0, 0, 56, 0, 0, 0, + 71, 78, 104, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, - 0, 0, 68, 0, 0, 0, + 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 12, + 0, 0, 92, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 12, 3, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, - 171, 171, 0, 23, 0, 0, + 171, 171, 184, 32, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 148, 9, + 0, 0, 0, 0, 172, 9, 0, 0, 68, 88, 66, 67, - 85, 100, 180, 99, 66, 90, - 93, 94, 187, 62, 74, 197, - 245, 70, 87, 170, 1, 0, - 0, 0, 148, 9, 0, 0, + 110, 68, 159, 211, 251, 173, + 118, 80, 154, 213, 185, 171, + 243, 23, 113, 100, 1, 0, + 0, 0, 172, 9, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 220, 2, 0, 0, 204, 6, 0, 0, 72, 7, 0, 0, 8, 9, 0, 0, - 96, 9, 0, 0, 65, 111, + 120, 9, 0, 0, 65, 111, 110, 57, 156, 2, 0, 0, 156, 2, 0, 0, 0, 2, 255, 255, 104, 2, 0, 0, @@ -1846,7 +2714,7 @@ const BYTE d2deffect[] = 0, 0, 0, 0, 1, 2, 255, 255, 31, 0, 0, 2, 0, 0, 0, 128, 0, 0, - 3, 176, 31, 0, 0, 2, + 15, 176, 31, 0, 0, 2, 0, 0, 0, 144, 0, 8, 15, 160, 2, 0, 0, 3, 0, 0, 2, 128, 0, 0, @@ -2210,16 +3078,20 @@ const BYTE d2deffect[] = 46, 50, 57, 46, 57, 53, 50, 46, 51, 49, 49, 49, 0, 171, 171, 171, 73, 83, - 71, 78, 80, 0, 0, 0, - 2, 0, 0, 0, 8, 0, - 0, 0, 56, 0, 0, 0, + 71, 78, 104, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, - 0, 0, 68, 0, 0, 0, + 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 3, + 0, 0, 92, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 12, 0, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, @@ -2233,179 +3105,882 @@ const BYTE d2deffect[] = 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, 97, 114, 103, 101, 116, 0, 171, 171, - 176, 26, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 32, 0, 0, 0, 0, 0, + 244, 36, 0, 0, 0, 0, + 0, 0, 80, 50, 0, 4, + 0, 0, 0, 1, 0, 0, + 0, 0, 0, 128, 63, 1, + 0, 0, 0, 0, 0, 128, + 63, 1, 0, 0, 0, 0, + 0, 128, 63, 1, 0, 0, + 0, 0, 0, 128, 63, 1, + 0, 0, 0, 3, 0, 0, + 0, 255, 255, 255, 255, 36, + 4, 0, 0, 68, 88, 66, + 67, 116, 139, 68, 62, 73, + 113, 92, 4, 72, 76, 225, + 161, 30, 132, 222, 233, 1, + 0, 0, 0, 36, 4, 0, + 0, 6, 0, 0, 0, 56, + 0, 0, 0, 248, 0, 0, + 0, 244, 1, 0, 0, 112, + 2, 0, 0, 128, 3, 0, + 0, 180, 3, 0, 0, 65, + 111, 110, 57, 184, 0, 0, + 0, 184, 0, 0, 0, 0, + 2, 254, 255, 132, 0, 0, + 0, 52, 0, 0, 0, 1, + 0, 36, 0, 0, 0, 48, + 0, 0, 0, 48, 0, 0, + 0, 36, 0, 1, 0, 48, + 0, 0, 0, 0, 0, 3, + 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, + 2, 254, 255, 81, 0, 0, + 5, 4, 0, 15, 160, 0, + 0, 0, 0, 0, 0, 128, + 63, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, + 2, 5, 0, 0, 128, 0, + 0, 15, 144, 4, 0, 0, + 4, 0, 0, 3, 224, 0, + 0, 228, 144, 2, 0, 238, + 160, 2, 0, 228, 160, 4, + 0, 0, 4, 0, 0, 12, + 224, 0, 0, 20, 144, 3, + 0, 180, 160, 3, 0, 20, + 160, 4, 0, 0, 4, 0, + 0, 3, 128, 0, 0, 228, + 144, 1, 0, 238, 160, 1, + 0, 228, 160, 2, 0, 0, + 3, 0, 0, 3, 192, 0, + 0, 228, 128, 0, 0, 228, + 160, 1, 0, 0, 2, 0, + 0, 12, 192, 4, 0, 68, + 160, 255, 255, 0, 0, 83, + 72, 68, 82, 244, 0, 0, + 0, 64, 0, 1, 0, 61, + 0, 0, 0, 89, 0, 0, + 4, 70, 142, 32, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 95, 0, 0, 3, 50, + 16, 16, 0, 0, 0, 0, + 0, 103, 0, 0, 4, 242, + 32, 16, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 101, + 0, 0, 3, 50, 32, 16, + 0, 1, 0, 0, 0, 101, + 0, 0, 3, 194, 32, 16, + 0, 1, 0, 0, 0, 50, + 0, 0, 11, 50, 32, 16, + 0, 0, 0, 0, 0, 70, + 16, 16, 0, 0, 0, 0, + 0, 230, 138, 32, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 70, 128, 32, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 54, 0, 0, 8, 194, + 32, 16, 0, 0, 0, 0, + 0, 2, 64, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 128, 63, 50, 0, 0, + 11, 50, 32, 16, 0, 1, + 0, 0, 0, 70, 16, 16, + 0, 0, 0, 0, 0, 230, + 138, 32, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 70, + 128, 32, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 50, + 0, 0, 11, 194, 32, 16, + 0, 1, 0, 0, 0, 6, + 20, 16, 0, 0, 0, 0, + 0, 166, 142, 32, 0, 0, + 0, 0, 0, 2, 0, 0, + 0, 6, 132, 32, 0, 0, + 0, 0, 0, 2, 0, 0, + 0, 62, 0, 0, 1, 83, + 84, 65, 84, 116, 0, 0, + 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 4, 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, 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, 82, 68, 69, + 70, 8, 1, 0, 0, 1, + 0, 0, 0, 64, 0, 0, + 0, 1, 0, 0, 0, 28, + 0, 0, 0, 0, 4, 254, + 255, 0, 1, 0, 0, 212, + 0, 0, 0, 60, 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, 0, 0, 0, 99, + 98, 48, 0, 60, 0, 0, + 0, 3, 0, 0, 0, 88, + 0, 0, 0, 48, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 160, 0, 0, + 0, 0, 0, 0, 0, 16, + 0, 0, 0, 2, 0, 0, + 0, 172, 0, 0, 0, 0, + 0, 0, 0, 188, 0, 0, + 0, 16, 0, 0, 0, 16, + 0, 0, 0, 2, 0, 0, + 0, 172, 0, 0, 0, 0, + 0, 0, 0, 198, 0, 0, + 0, 32, 0, 0, 0, 16, + 0, 0, 0, 2, 0, 0, + 0, 172, 0, 0, 0, 0, + 0, 0, 0, 81, 117, 97, + 100, 68, 101, 115, 99, 0, + 171, 171, 171, 1, 0, 3, + 0, 1, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 84, 101, 120, 67, 111, + 111, 114, 100, 115, 0, 77, + 97, 115, 107, 84, 101, 120, + 67, 111, 111, 114, 100, 115, + 0, 77, 105, 99, 114, 111, + 115, 111, 102, 116, 32, 40, + 82, 41, 32, 72, 76, 83, + 76, 32, 83, 104, 97, 100, + 101, 114, 32, 67, 111, 109, + 112, 105, 108, 101, 114, 32, + 57, 46, 50, 57, 46, 57, + 53, 50, 46, 51, 49, 49, + 49, 0, 171, 171, 171, 73, + 83, 71, 78, 44, 0, 0, + 0, 1, 0, 0, 0, 8, + 0, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 7, + 3, 0, 0, 80, 79, 83, + 73, 84, 73, 79, 78, 0, + 171, 171, 171, 79, 83, 71, + 78, 104, 0, 0, 0, 3, + 0, 0, 0, 8, 0, 0, + 0, 80, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 0, 0, + 0, 0, 0, 15, 0, 0, + 0, 92, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 1, + 0, 0, 0, 3, 12, 0, + 0, 92, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 1, + 0, 0, 0, 12, 3, 0, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 84, 69, 88, 67, 79, + 79, 82, 68, 0, 171, 171, + 171, 223, 46, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 2, 0, 0, 0, 0, + 0, 0, 0, 164, 10, 0, + 0, 68, 88, 66, 67, 143, + 148, 190, 36, 41, 120, 46, + 207, 200, 138, 139, 29, 38, + 89, 245, 86, 1, 0, 0, + 0, 164, 10, 0, 0, 6, + 0, 0, 0, 56, 0, 0, + 0, 24, 3, 0, 0, 112, + 7, 0, 0, 236, 7, 0, + 0, 0, 10, 0, 0, 112, + 10, 0, 0, 65, 111, 110, + 57, 216, 2, 0, 0, 216, + 2, 0, 0, 0, 2, 255, + 255, 160, 2, 0, 0, 56, + 0, 0, 0, 1, 0, 44, + 0, 0, 0, 56, 0, 0, + 0, 56, 0, 2, 0, 36, + 0, 0, 0, 56, 0, 1, + 0, 0, 0, 0, 1, 1, + 0, 0, 0, 3, 0, 6, + 0, 0, 0, 0, 0, 0, + 0, 1, 2, 255, 255, 31, 0, 0, 2, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 43, 0, 0, 0, - 15, 0, 0, 0, 0, 0, + 128, 0, 0, 15, 176, 31, + 0, 0, 2, 0, 0, 0, + 144, 0, 8, 15, 160, 31, + 0, 0, 2, 0, 0, 0, + 144, 1, 8, 15, 160, 2, + 0, 0, 3, 0, 0, 2, + 128, 0, 0, 85, 176, 0, + 0, 85, 160, 1, 0, 0, + 2, 0, 0, 1, 128, 0, + 0, 0, 176, 2, 0, 0, + 3, 1, 0, 2, 128, 0, + 0, 85, 176, 0, 0, 0, + 160, 1, 0, 0, 2, 1, + 0, 1, 128, 0, 0, 0, + 176, 66, 0, 0, 3, 0, + 0, 15, 128, 0, 0, 228, + 128, 1, 8, 228, 160, 66, + 0, 0, 3, 1, 0, 15, + 128, 1, 0, 228, 128, 1, + 8, 228, 160, 5, 0, 0, + 3, 0, 0, 15, 128, 0, + 0, 228, 128, 3, 0, 85, + 160, 4, 0, 0, 4, 0, + 0, 15, 128, 3, 0, 0, + 160, 1, 0, 228, 128, 0, + 0, 228, 128, 2, 0, 0, + 3, 1, 0, 2, 128, 0, + 0, 85, 176, 0, 0, 170, + 160, 1, 0, 0, 2, 1, + 0, 1, 128, 0, 0, 0, + 176, 2, 0, 0, 3, 2, + 0, 2, 128, 0, 0, 85, + 176, 0, 0, 255, 160, 1, + 0, 0, 2, 2, 0, 1, + 128, 0, 0, 0, 176, 66, + 0, 0, 3, 1, 0, 15, + 128, 1, 0, 228, 128, 1, + 8, 228, 160, 66, 0, 0, + 3, 2, 0, 15, 128, 2, + 0, 228, 128, 1, 8, 228, + 160, 4, 0, 0, 4, 0, + 0, 15, 128, 3, 0, 170, + 160, 1, 0, 228, 128, 0, + 0, 228, 128, 4, 0, 0, + 4, 0, 0, 15, 128, 3, + 0, 255, 160, 2, 0, 228, + 128, 0, 0, 228, 128, 2, + 0, 0, 3, 1, 0, 2, + 128, 0, 0, 85, 176, 1, + 0, 0, 160, 1, 0, 0, + 2, 1, 0, 1, 128, 0, + 0, 0, 176, 2, 0, 0, + 3, 2, 0, 2, 128, 0, + 0, 85, 176, 1, 0, 85, + 160, 1, 0, 0, 2, 2, + 0, 1, 128, 0, 0, 0, + 176, 66, 0, 0, 3, 1, + 0, 15, 128, 1, 0, 228, + 128, 1, 8, 228, 160, 66, + 0, 0, 3, 2, 0, 15, + 128, 2, 0, 228, 128, 1, + 8, 228, 160, 4, 0, 0, + 4, 0, 0, 15, 128, 4, + 0, 0, 160, 1, 0, 228, + 128, 0, 0, 228, 128, 4, + 0, 0, 4, 0, 0, 15, + 128, 4, 0, 85, 160, 2, + 0, 228, 128, 0, 0, 228, + 128, 2, 0, 0, 3, 1, + 0, 2, 128, 0, 0, 85, + 176, 1, 0, 170, 160, 1, + 0, 0, 2, 1, 0, 1, + 128, 0, 0, 0, 176, 2, + 0, 0, 3, 2, 0, 2, + 128, 0, 0, 85, 176, 1, + 0, 255, 160, 1, 0, 0, + 2, 2, 0, 1, 128, 0, + 0, 0, 176, 66, 0, 0, + 3, 1, 0, 15, 128, 1, + 0, 228, 128, 1, 8, 228, + 160, 66, 0, 0, 3, 2, + 0, 15, 128, 2, 0, 228, + 128, 1, 8, 228, 160, 4, + 0, 0, 4, 0, 0, 15, + 128, 4, 0, 170, 160, 1, + 0, 228, 128, 0, 0, 228, + 128, 4, 0, 0, 4, 0, + 0, 15, 128, 4, 0, 255, + 160, 2, 0, 228, 128, 0, + 0, 228, 128, 2, 0, 0, + 3, 1, 0, 2, 128, 0, + 0, 85, 176, 2, 0, 0, + 160, 1, 0, 0, 2, 1, + 0, 1, 128, 0, 0, 0, + 176, 1, 0, 0, 2, 2, + 0, 3, 128, 0, 0, 235, + 176, 66, 0, 0, 3, 1, + 0, 15, 128, 1, 0, 228, + 128, 1, 8, 228, 160, 66, + 0, 0, 3, 2, 0, 15, + 128, 2, 0, 228, 128, 0, + 8, 228, 160, 4, 0, 0, + 4, 0, 0, 15, 128, 5, + 0, 0, 160, 1, 0, 228, + 128, 0, 0, 228, 128, 5, + 0, 0, 3, 0, 0, 15, + 128, 2, 0, 255, 128, 0, + 0, 228, 128, 1, 0, 0, + 2, 0, 8, 15, 128, 0, + 0, 228, 128, 255, 255, 0, + 0, 83, 72, 68, 82, 80, + 4, 0, 0, 64, 0, 0, + 0, 20, 1, 0, 0, 89, + 0, 0, 4, 70, 142, 32, + 0, 0, 0, 0, 0, 9, + 0, 0, 0, 90, 0, 0, + 3, 0, 96, 16, 0, 0, + 0, 0, 0, 90, 0, 0, + 3, 0, 96, 16, 0, 1, + 0, 0, 0, 88, 24, 0, + 4, 0, 112, 16, 0, 0, + 0, 0, 0, 85, 85, 0, + 0, 88, 24, 0, 4, 0, + 112, 16, 0, 1, 0, 0, + 0, 85, 85, 0, 0, 98, + 16, 0, 3, 50, 16, 16, + 0, 1, 0, 0, 0, 98, + 16, 0, 3, 194, 16, 16, + 0, 1, 0, 0, 0, 101, + 0, 0, 3, 242, 32, 16, + 0, 0, 0, 0, 0, 104, + 0, 0, 2, 4, 0, 0, + 0, 54, 0, 0, 5, 82, + 0, 16, 0, 0, 0, 0, + 0, 6, 16, 16, 0, 1, + 0, 0, 0, 0, 0, 0, + 8, 242, 0, 16, 0, 1, + 0, 0, 0, 86, 21, 16, + 0, 1, 0, 0, 0, 134, + 141, 32, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 54, + 0, 0, 5, 162, 0, 16, + 0, 0, 0, 0, 0, 6, + 8, 16, 0, 1, 0, 0, + 0, 69, 0, 0, 9, 242, + 0, 16, 0, 2, 0, 0, + 0, 230, 10, 16, 0, 0, + 0, 0, 0, 70, 126, 16, + 0, 0, 0, 0, 0, 0, + 96, 16, 0, 1, 0, 0, + 0, 69, 0, 0, 9, 242, + 0, 16, 0, 0, 0, 0, + 0, 70, 0, 16, 0, 0, + 0, 0, 0, 70, 126, 16, + 0, 0, 0, 0, 0, 0, + 96, 16, 0, 1, 0, 0, + 0, 56, 0, 0, 8, 242, + 0, 16, 0, 2, 0, 0, + 0, 70, 14, 16, 0, 2, + 0, 0, 0, 86, 133, 32, + 0, 0, 0, 0, 0, 6, + 0, 0, 0, 50, 0, 0, + 10, 242, 0, 16, 0, 0, + 0, 0, 0, 6, 128, 32, + 0, 0, 0, 0, 0, 6, + 0, 0, 0, 70, 14, 16, + 0, 0, 0, 0, 0, 70, + 14, 16, 0, 2, 0, 0, + 0, 54, 0, 0, 5, 82, + 0, 16, 0, 1, 0, 0, + 0, 6, 16, 16, 0, 1, + 0, 0, 0, 69, 0, 0, + 9, 242, 0, 16, 0, 2, + 0, 0, 0, 70, 0, 16, + 0, 1, 0, 0, 0, 70, + 126, 16, 0, 0, 0, 0, + 0, 0, 96, 16, 0, 1, + 0, 0, 0, 69, 0, 0, + 9, 242, 0, 16, 0, 1, + 0, 0, 0, 230, 10, 16, + 0, 1, 0, 0, 0, 70, + 126, 16, 0, 0, 0, 0, + 0, 0, 96, 16, 0, 1, + 0, 0, 0, 50, 0, 0, + 10, 242, 0, 16, 0, 0, + 0, 0, 0, 166, 138, 32, + 0, 0, 0, 0, 0, 6, + 0, 0, 0, 70, 14, 16, + 0, 2, 0, 0, 0, 70, + 14, 16, 0, 0, 0, 0, + 0, 50, 0, 0, 10, 242, + 0, 16, 0, 0, 0, 0, + 0, 246, 143, 32, 0, 0, + 0, 0, 0, 6, 0, 0, + 0, 70, 14, 16, 0, 1, + 0, 0, 0, 70, 14, 16, + 0, 0, 0, 0, 0, 54, + 0, 0, 5, 82, 0, 16, + 0, 1, 0, 0, 0, 6, + 16, 16, 0, 1, 0, 0, + 0, 0, 0, 0, 8, 242, + 0, 16, 0, 2, 0, 0, + 0, 86, 21, 16, 0, 1, + 0, 0, 0, 134, 141, 32, + 0, 0, 0, 0, 0, 4, + 0, 0, 0, 54, 0, 0, + 5, 162, 0, 16, 0, 1, + 0, 0, 0, 6, 8, 16, + 0, 2, 0, 0, 0, 69, + 0, 0, 9, 242, 0, 16, + 0, 3, 0, 0, 0, 70, + 0, 16, 0, 1, 0, 0, + 0, 70, 126, 16, 0, 0, + 0, 0, 0, 0, 96, 16, + 0, 1, 0, 0, 0, 69, + 0, 0, 9, 242, 0, 16, + 0, 1, 0, 0, 0, 230, + 10, 16, 0, 1, 0, 0, + 0, 70, 126, 16, 0, 0, + 0, 0, 0, 0, 96, 16, + 0, 1, 0, 0, 0, 50, + 0, 0, 10, 242, 0, 16, + 0, 0, 0, 0, 0, 6, + 128, 32, 0, 0, 0, 0, + 0, 7, 0, 0, 0, 70, + 14, 16, 0, 3, 0, 0, + 0, 70, 14, 16, 0, 0, + 0, 0, 0, 50, 0, 0, + 10, 242, 0, 16, 0, 0, + 0, 0, 0, 86, 133, 32, + 0, 0, 0, 0, 0, 7, + 0, 0, 0, 70, 14, 16, + 0, 1, 0, 0, 0, 70, + 14, 16, 0, 0, 0, 0, + 0, 54, 0, 0, 5, 82, + 0, 16, 0, 2, 0, 0, + 0, 6, 16, 16, 0, 1, + 0, 0, 0, 69, 0, 0, + 9, 242, 0, 16, 0, 1, + 0, 0, 0, 70, 0, 16, + 0, 2, 0, 0, 0, 70, + 126, 16, 0, 0, 0, 0, + 0, 0, 96, 16, 0, 1, + 0, 0, 0, 69, 0, 0, + 9, 242, 0, 16, 0, 2, + 0, 0, 0, 230, 10, 16, + 0, 2, 0, 0, 0, 70, + 126, 16, 0, 0, 0, 0, + 0, 0, 96, 16, 0, 1, + 0, 0, 0, 50, 0, 0, + 10, 242, 0, 16, 0, 0, + 0, 0, 0, 166, 138, 32, + 0, 0, 0, 0, 0, 7, + 0, 0, 0, 70, 14, 16, + 0, 1, 0, 0, 0, 70, + 14, 16, 0, 0, 0, 0, + 0, 50, 0, 0, 10, 242, + 0, 16, 0, 0, 0, 0, + 0, 246, 143, 32, 0, 0, + 0, 0, 0, 7, 0, 0, + 0, 70, 14, 16, 0, 2, + 0, 0, 0, 70, 14, 16, + 0, 0, 0, 0, 0, 0, + 0, 0, 8, 34, 0, 16, + 0, 1, 0, 0, 0, 26, + 16, 16, 0, 1, 0, 0, + 0, 10, 128, 32, 0, 0, + 0, 0, 0, 5, 0, 0, + 0, 54, 0, 0, 5, 18, + 0, 16, 0, 1, 0, 0, + 0, 10, 16, 16, 0, 1, + 0, 0, 0, 69, 0, 0, + 9, 242, 0, 16, 0, 1, + 0, 0, 0, 70, 0, 16, + 0, 1, 0, 0, 0, 70, + 126, 16, 0, 0, 0, 0, + 0, 0, 96, 16, 0, 1, + 0, 0, 0, 50, 0, 0, + 10, 242, 0, 16, 0, 0, + 0, 0, 0, 6, 128, 32, + 0, 0, 0, 0, 0, 8, + 0, 0, 0, 70, 14, 16, + 0, 1, 0, 0, 0, 70, + 14, 16, 0, 0, 0, 0, + 0, 69, 0, 0, 9, 242, + 0, 16, 0, 1, 0, 0, + 0, 230, 26, 16, 0, 1, + 0, 0, 0, 70, 126, 16, + 0, 1, 0, 0, 0, 0, + 96, 16, 0, 0, 0, 0, + 0, 56, 0, 0, 7, 242, + 32, 16, 0, 0, 0, 0, + 0, 70, 14, 16, 0, 0, + 0, 0, 0, 246, 15, 16, + 0, 1, 0, 0, 0, 62, + 0, 0, 1, 83, 84, 65, + 84, 116, 0, 0, 0, 31, + 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 3, + 0, 0, 0, 5, 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, - 52, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 0, 0, + 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 0, - 0, 0, 160, 0, 0, 0, - 0, 0, 0, 0, 4, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 94, 0, - 0, 0, 66, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 107, 0, 0, 0, - 66, 0, 0, 0, 0, 0, - 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 120, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, - 96, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 132, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 144, 0, + 0, 82, 68, 69, 70, 12, + 2, 0, 0, 1, 0, 0, + 0, 232, 0, 0, 0, 5, + 0, 0, 0, 28, 0, 0, + 0, 0, 4, 255, 255, 0, + 1, 0, 0, 216, 1, 0, + 0, 188, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 182, 0, 0, 0, - 154, 0, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 227, 0, - 0, 0, 199, 0, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 4, 0, 0, 0, - 45, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 236, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 182, 0, - 0, 0, 46, 0, 0, 0, + 0, 1, 0, 0, 0, 0, + 0, 0, 0, 201, 0, 0, + 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 216, + 0, 0, 0, 2, 0, 0, + 0, 5, 0, 0, 0, 4, + 0, 0, 0, 255, 255, 255, + 255, 0, 0, 0, 0, 1, + 0, 0, 0, 12, 0, 0, + 0, 220, 0, 0, 0, 2, + 0, 0, 0, 5, 0, 0, + 0, 4, 0, 0, 0, 255, + 255, 255, 255, 1, 0, 0, + 0, 1, 0, 0, 0, 12, + 0, 0, 0, 225, 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, 0, 0, 0, 115, + 77, 97, 115, 107, 83, 97, + 109, 112, 108, 101, 114, 0, + 115, 83, 104, 97, 100, 111, + 119, 83, 97, 109, 112, 108, + 101, 114, 0, 116, 101, 120, + 0, 109, 97, 115, 107, 0, + 99, 98, 49, 0, 171, 171, + 171, 225, 0, 0, 0, 4, 0, 0, 0, 0, 1, 0, - 0, 0, 248, 0, 0, 0, - 47, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 4, 1, 0, 0, 0, 0, - 0, 0, 16, 1, 0, 0, - 199, 0, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 5, 0, 0, 0, 45, 0, + 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 31, 1, - 0, 0, 55, 0, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 182, 0, 0, 0, - 46, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 43, 1, 0, 0, 47, 0, + 0, 96, 1, 0, 0, 0, + 0, 0, 0, 48, 0, 0, + 0, 0, 0, 0, 0, 112, + 1, 0, 0, 0, 0, 0, + 0, 128, 1, 0, 0, 48, + 0, 0, 0, 48, 0, 0, + 0, 2, 0, 0, 0, 144, + 1, 0, 0, 0, 0, 0, + 0, 160, 1, 0, 0, 96, + 0, 0, 0, 48, 0, 0, + 0, 2, 0, 0, 0, 172, + 1, 0, 0, 0, 0, 0, + 0, 188, 1, 0, 0, 144, + 0, 0, 0, 16, 0, 0, + 0, 0, 0, 0, 0, 200, + 1, 0, 0, 0, 0, 0, + 0, 66, 108, 117, 114, 79, + 102, 102, 115, 101, 116, 115, + 72, 0, 171, 171, 171, 1, + 0, 3, 0, 1, 0, 4, + 0, 3, 0, 0, 0, 0, + 0, 0, 0, 66, 108, 117, + 114, 79, 102, 102, 115, 101, + 116, 115, 86, 0, 171, 171, + 171, 1, 0, 3, 0, 1, + 0, 4, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 66, + 108, 117, 114, 87, 101, 105, + 103, 104, 116, 115, 0, 1, + 0, 3, 0, 1, 0, 4, + 0, 3, 0, 0, 0, 0, + 0, 0, 0, 83, 104, 97, + 100, 111, 119, 67, 111, 108, + 111, 114, 0, 1, 0, 3, + 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 55, 1, - 0, 0, 52, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 67, 1, 0, 0, - 0, 0, 0, 0, 147, 1, - 0, 0, 119, 1, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 2, 0, 0, 0, - 19, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 159, 1, 0, 0, 13, 0, + 0, 77, 105, 99, 114, 111, + 115, 111, 102, 116, 32, 40, + 82, 41, 32, 72, 76, 83, + 76, 32, 83, 104, 97, 100, + 101, 114, 32, 67, 111, 109, + 112, 105, 108, 101, 114, 32, + 57, 46, 50, 57, 46, 57, + 53, 50, 46, 51, 49, 49, + 49, 0, 171, 171, 171, 73, + 83, 71, 78, 104, 0, 0, + 0, 3, 0, 0, 0, 8, + 0, 0, 0, 80, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 15, + 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 171, 1, + 0, 0, 0, 3, 0, 0, + 0, 1, 0, 0, 0, 3, + 3, 0, 0, 92, 0, 0, + 0, 1, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 1, 0, 0, 0, 12, + 12, 0, 0, 83, 86, 95, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 84, 69, 88, + 67, 79, 79, 82, 68, 0, + 171, 171, 171, 79, 83, 71, + 78, 44, 0, 0, 0, 1, + 0, 0, 0, 8, 0, 0, + 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 222, 1, 0, 0, 194, 1, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 2, 0, - 0, 0, 37, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 235, 1, 0, 0, - 44, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 247, 1, 0, 0, 0, 0, - 0, 0, 3, 2, 0, 0, - 194, 1, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 8, 0, 0, 0, 37, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 16, 2, - 0, 0, 38, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 28, 2, 0, 0, - 39, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 40, 2, 0, 0, 40, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 52, 2, - 0, 0, 41, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 64, 2, 0, 0, - 42, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 76, 2, 0, 0, 43, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 88, 2, - 0, 0, 44, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 100, 2, 0, 0, - 0, 0, 0, 0, 112, 2, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 126, 2, - 0, 0, 4, 0, 0, 0, + 0, 3, 0, 0, 0, 0, + 0, 0, 0, 15, 0, 0, + 0, 83, 86, 95, 84, 97, + 114, 103, 101, 116, 0, 171, + 171, 27, 51, 0, 0, 0, + 0, 0, 0, 4, 0, 0, + 0, 48, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, + 0, 255, 255, 255, 255, 0, + 0, 0, 0, 43, 0, 0, + 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 147, 1, - 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 7, 0, - 0, 0, 29, 6, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 37, 6, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 241, 8, - 0, 0, 249, 8, 0, 0, + 0, 52, 0, 0, 0, 15, + 0, 0, 0, 0, 0, 0, + 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 62, + 0, 0, 0, 15, 0, 0, + 0, 0, 0, 0, 0, 32, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 76, 0, 0, + 0, 160, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, + 0, 255, 255, 255, 255, 0, + 0, 0, 0, 108, 0, 0, + 0, 80, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 121, 0, 0, 0, 80, + 0, 0, 0, 0, 0, 0, + 0, 48, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 134, + 0, 0, 0, 80, 0, 0, + 0, 0, 0, 0, 0, 96, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 146, 0, 0, + 0, 15, 0, 0, 0, 0, + 0, 0, 0, 144, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 196, 0, 0, 0, 168, + 0, 0, 0, 0, 0, 0, + 0, 255, 255, 255, 255, 0, + 0, 0, 0, 200, 0, 0, + 0, 168, 0, 0, 0, 0, + 0, 0, 0, 255, 255, 255, + 255, 0, 0, 0, 0, 246, + 0, 0, 0, 218, 0, 0, + 0, 0, 0, 0, 0, 255, + 255, 255, 255, 4, 0, 0, + 0, 45, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 255, 0, 0, 0, 55, + 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 196, + 0, 0, 0, 46, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 11, 1, 0, + 0, 47, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 23, 1, 0, 0, 0, + 0, 0, 0, 35, 1, 0, + 0, 218, 0, 0, 0, 0, + 0, 0, 0, 255, 255, 255, + 255, 4, 0, 0, 0, 45, + 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 48, + 1, 0, 0, 55, 0, 0, + 0, 0, 0, 0, 0, 2, + 0, 0, 0, 200, 0, 0, + 0, 46, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 60, 1, 0, 0, 47, + 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 72, + 1, 0, 0, 0, 0, 0, + 0, 84, 1, 0, 0, 218, + 0, 0, 0, 0, 0, 0, + 0, 255, 255, 255, 255, 5, + 0, 0, 0, 45, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 99, 1, 0, + 0, 55, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, + 0, 196, 0, 0, 0, 46, + 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 111, + 1, 0, 0, 47, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 123, 1, 0, + 0, 52, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 135, 1, 0, 0, 0, + 0, 0, 0, 215, 1, 0, + 0, 187, 1, 0, 0, 0, + 0, 0, 0, 255, 255, 255, + 255, 2, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 227, + 1, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 239, 1, 0, + 0, 0, 0, 0, 0, 34, + 2, 0, 0, 6, 2, 0, + 0, 0, 0, 0, 0, 255, + 255, 255, 255, 2, 0, 0, + 0, 37, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 47, 2, 0, 0, 44, + 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 59, 2, 0, 0, 0, 0, 0, - 0, 0, 126, 2, 0, 0, - 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 147, 1, 0, 0, - 10, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 17, 9, 0, 0, 11, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 53, 9, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 222, 1, 0, 0, - 6, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 221, 12, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 229, 12, - 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 7, 0, - 0, 0, 197, 22, 0, 0, - 205, 22, 0, 0, 7, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 147, 1, 0, 0, 10, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 208, 22, - 0, 0, 11, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 244, 22, 0, 0, + 0, 71, 2, 0, 0, 6, 2, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 3, 2, 0, 0, 6, 0, + 0, 255, 255, 255, 255, 8, + 0, 0, 0, 37, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 84, 2, 0, + 0, 38, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 96, 2, 0, 0, 39, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 156, 26, - 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 164, 26, 0, 0, - 7, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 72, 36, 0, 0 + 0, 1, 0, 0, 0, 108, + 2, 0, 0, 40, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 120, 2, 0, + 0, 41, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 132, 2, 0, 0, 42, + 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 144, + 2, 0, 0, 43, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 156, 2, 0, + 0, 44, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 168, 2, 0, 0, 0, + 0, 0, 0, 180, 2, 0, + 0, 1, 0, 0, 0, 0, + 0, 0, 0, 194, 2, 0, + 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, + 0, 0, 0, 215, 1, 0, + 0, 6, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, + 0, 237, 6, 0, 0, 8, + 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 245, + 6, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 7, + 0, 0, 0, 217, 9, 0, + 0, 225, 9, 0, 0, 1, + 0, 0, 0, 0, 0, 0, + 0, 194, 2, 0, 0, 4, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, + 0, 215, 1, 0, 0, 6, + 0, 0, 0, 0, 0, 0, + 0, 7, 0, 0, 0, 29, + 14, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 37, 14, 0, + 0, 7, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, + 0, 5, 18, 0, 0, 13, + 18, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 194, + 2, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 215, + 1, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 37, 18, 0, + 0, 11, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 73, 18, 0, 0, 2, + 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 34, + 2, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 7, + 0, 0, 0, 125, 22, 0, + 0, 8, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 133, 22, 0, 0, 7, + 0, 0, 0, 0, 0, 0, + 0, 7, 0, 0, 0, 125, + 32, 0, 0, 133, 32, 0, + 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, + 0, 0, 0, 215, 1, 0, + 0, 10, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, + 0, 136, 32, 0, 0, 11, + 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 172, + 32, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 2, + 0, 0, 0, 71, 2, 0, + 0, 6, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, + 0, 224, 36, 0, 0, 8, + 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 232, + 36, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 7, + 0, 0, 0, 164, 46, 0, + 0, 172, 46, 0, 0, 7, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, + 0, 215, 1, 0, 0, 10, + 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 175, + 46, 0, 0, 11, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 211, 46, 0, + 0, 2, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, + 0, 71, 2, 0, 0, 6, + 0, 0, 0, 0, 0, 0, + 0, 7, 0, 0, 0, 7, + 51, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 15, 51, 0, + 0, 7, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, + 0, 195, 61, 0, 0 }; From ef8a971b0638213ae2b7f9a9ae6e611c58190a2d Mon Sep 17 00:00:00 2001 From: Marco Bonardo Date: Tue, 5 Jul 2011 10:32:30 +0200 Subject: [PATCH 11/13] Backout changeset 30f74655c985 due to windows m-oth leak orange --- dom/ipc/ContentChild.cpp | 8 +- .../tests/chrome/test_aboutmemory.xul | 27 +-- .../telemetry/TelemetryHistograms.h | 3 +- toolkit/components/telemetry/TelemetryPing.js | 6 +- xpcom/base/nsIMemoryReporter.idl | 23 +-- xpcom/base/nsMemoryReporterManager.cpp | 160 ------------------ 6 files changed, 13 insertions(+), 214 deletions(-) diff --git a/dom/ipc/ContentChild.cpp b/dom/ipc/ContentChild.cpp index d9147bd85286..41e1c5ff89be 100644 --- a/dom/ipc/ContentChild.cpp +++ b/dom/ipc/ContentChild.cpp @@ -377,13 +377,13 @@ ContentChild::RecvPMemoryReportRequestConstructor(PMemoryReportRequestChild* chi // one, whereupon the callback will turn each measurement into a // MemoryReport. mgr->EnumerateMultiReporters(getter_AddRefs(e)); - nsRefPtr wrappedReports = - new MemoryReportsWrapper(&reports); - nsRefPtr cb = new MemoryReportCallback(process); + MemoryReportsWrapper wrappedReports(&reports); + MemoryReportCallback cb(process); while (NS_SUCCEEDED(e->HasMoreElements(&more)) && more) { nsCOMPtr r; e->GetNext(getter_AddRefs(r)); - r->CollectReports(cb, wrappedReports); + + r->CollectReports(&cb, &wrappedReports); } child->Send__delete__(child, reports); diff --git a/toolkit/components/aboutmemory/tests/chrome/test_aboutmemory.xul b/toolkit/components/aboutmemory/tests/chrome/test_aboutmemory.xul index 602032589f3a..47d85af651e2 100644 --- a/toolkit/components/aboutmemory/tests/chrome/test_aboutmemory.xul +++ b/toolkit/components/aboutmemory/tests/chrome/test_aboutmemory.xul @@ -77,8 +77,6 @@ f("", "explicit/b/b", HEAP, 75 * MB), f("", "explicit/b/c/a", HEAP, 70 * MB), f("", "explicit/b/c/b", HEAP, 2 * MB), // omitted - f("", "explicit/c", MAPPED, 100 * MB), - f("", "explicit/c/d", MAPPED, 13 * MB), // subsumed by parent f("", "explicit/g", HEAP, 1 * MB), // internal, dup: merge f("", "explicit/g/a", HEAP, 6 * MB), f("", "explicit/g/b", HEAP, 5 * MB), @@ -89,9 +87,7 @@ var fakeMultiReporters = [ { collectReports: function(cbObj, closure) { function f(p, k, u, a) { cbObj.callback("", p, k, u, a, "(desc)", closure); } - f("explicit/c/d", MAPPED, BYTES, 10 * MB), // dup, subsumed by parent - f("explicit/cc", MAPPED, BYTES, 13 * MB); - f("explicit/cc", MAPPED, BYTES, 10 * MB); // dup + f("explicit/c", MAPPED, BYTES, 123 * MB); f("explicit/d", MAPPED, BYTES, 499 * KB); // omitted f("explicit/e", MAPPED, BYTES, 100 * KB); // omitted f("explicit/f/g/h/i", HEAP, BYTES, 20 * MB); @@ -112,17 +108,6 @@ mgr.registerMultiReporter(fakeMultiReporters[i]); } - // mgr.explicit sums "heap-used" and all the appropriate MAPPED ones: - // - "explicit/c", "explicit/cc" x 2, "explicit/d", "explicit/e" - // - but *not* "explicit/c/d" x 2 - // Check explicit now before we add the fake reporters for the fake 2nd - // and subsequent processes. - is(mgr.explicit, 500*MB + (100 + 13 + 10)*MB + 599*KB, "mgr.explicit"); - - // Access mgr.resident just to make sure it doesn't crash. We can't check - // its actual value because it's non-deterministic. - dummy = mgr.resident; - var fakeReporters2 = [ f("2nd", "heap-used", OTHER, 1000 * MB), f("2nd", "heap-unused", OTHER, 100 * MB), @@ -172,10 +157,7 @@ Explicit Allocations\n\ │ ├──70.00 MB (11.23%) -- a\n\ │ └───2.00 MB (00.32%) -- (1 omitted)\n\ ├──222.00 MB (35.60%) -- a\n\ -├──100.00 MB (16.04%) -- c\n\ -│ ├───77.00 MB (12.35%) -- other\n\ -│ └───23.00 MB (03.69%) -- d\n\ -├───23.00 MB (03.69%) -- cc\n\ +├──123.00 MB (19.72%) -- c\n\ ├───20.00 MB (03.21%) -- f\n\ │ └──20.00 MB (03.21%) -- g\n\ │ └──20.00 MB (03.21%) -- h\n\ @@ -242,10 +224,7 @@ Explicit Allocations\n\ │ ├──73,400,320 B (11.23%) -- a\n\ │ └───2,097,152 B (00.32%) -- b\n\ ├──232,783,872 B (35.60%) -- a\n\ -├──104,857,600 B (16.04%) -- c\n\ -│ ├───80,740,352 B (12.35%) -- other\n\ -│ └───24,117,248 B (03.69%) -- d\n\ -├───24,117,248 B (03.69%) -- cc\n\ +├──128,974,848 B (19.72%) -- c\n\ ├───20,971,520 B (03.21%) -- f\n\ │ └──20,971,520 B (03.21%) -- g\n\ │ └──20,971,520 B (03.21%) -- h\n\ diff --git a/toolkit/components/telemetry/TelemetryHistograms.h b/toolkit/components/telemetry/TelemetryHistograms.h index 65e5e572a43d..bb01f5d8ad26 100644 --- a/toolkit/components/telemetry/TelemetryHistograms.h +++ b/toolkit/components/telemetry/TelemetryHistograms.h @@ -55,7 +55,8 @@ HISTOGRAM(MEMORY_RESIDENT, 32 * 1024, 1024 * 1024, 10, EXPONENTIAL, "Resident me HISTOGRAM(MEMORY_LAYOUT_ALL, 1024, 64 * 1024, 10, EXPONENTIAL, "Memory used by layout (KB)") HISTOGRAM(MEMORY_IMAGES_CONTENT_USED_UNCOMPRESSED, 1024, 1024 * 1024, 10, EXPONENTIAL, "Memory used for uncompressed, in-use content images (KB)") HISTOGRAM(MEMORY_HEAP_USED, 1024, 1024 * 1024, 10, EXPONENTIAL, "Heap memory used (KB)") -HISTOGRAM(MEMORY_EXPLICIT, 1024, 1024 * 1024, 10, EXPONENTIAL, "Explicit memory allocations (KB)") +// XXX: bug 660731 will enable this +//HISTOGRAM(MEMORY_EXPLICIT, 1024, 1024 * 1024, 10, EXPONENTIAL, "Explicit memory allocations (KB)") #if defined(XP_WIN) HISTOGRAM(EARLY_GLUESTARTUP_READ_OPS, 1, 100, 12, LINEAR, "ProcessIoCounters.ReadOperationCount before glue startup") HISTOGRAM(EARLY_GLUESTARTUP_READ_TRANSFER, 1, 50 * 1024, 12, EXPONENTIAL, "ProcessIoCounters.ReadTransferCount before glue startup (KB)") diff --git a/toolkit/components/telemetry/TelemetryPing.js b/toolkit/components/telemetry/TelemetryPing.js index b7e95a407a14..db9c73e0dc3b 100644 --- a/toolkit/components/telemetry/TelemetryPing.js +++ b/toolkit/components/telemetry/TelemetryPing.js @@ -251,11 +251,9 @@ TelemetryPing.prototype = { } this.addValue(mr.path, id, val); } + // XXX: bug 660731 will enable this // "explicit" is found differently. - let explicit = mgr.explicit; // Get it only once, it's reasonably expensive - if (explicit != -1) { - this.addValue("explicit", "MEMORY_EXPLICIT", Math.floor(explicit / 1024)); - } + //this.addValue("explicit", "MEMORY_EXPLICIT", Math.floor(mgr.explicit / 1024)); }, /** diff --git a/xpcom/base/nsIMemoryReporter.idl b/xpcom/base/nsIMemoryReporter.idl index 831b69f6496e..13f7bc4e1a87 100644 --- a/xpcom/base/nsIMemoryReporter.idl +++ b/xpcom/base/nsIMemoryReporter.idl @@ -141,8 +141,7 @@ interface nsIMemoryReporter : nsISupports readonly attribute PRInt32 units; /* - * The numeric value reported by this memory reporter. -1 means "unknown", - * ie. something went wrong when getting the amount. + * The numeric value reported by this memory reporter. */ readonly attribute PRInt64 amount; @@ -179,7 +178,7 @@ interface nsIMemoryMultiReporter : nsISupports in nsISupports closure); }; -[scriptable, uuid(84ba9c85-3372-4423-b7ab-74708b9269a6)] +[scriptable, uuid(80a93b4c-6fff-4acd-8598-3891074a30ab)] interface nsIMemoryReporterManager : nsISupports { /* @@ -222,24 +221,6 @@ interface nsIMemoryReporterManager : nsISupports * Initialize. */ void init (); - - /* - * Get the resident size (aka. RSS, physical memory used). This reporter - * is special-cased because it's interesting, is available on all - * platforms, and returns a meaningful result on all common platforms. - * -1 means unknown. - */ - readonly attribute PRInt64 resident; - - /* - * Get the total size of explicit memory allocations, both at the OS-level - * (eg. via mmap, VirtualAlloc) and at the heap level (eg. via malloc, - * calloc, operator new). (Nb: it covers all heap allocations, but will - * miss any OS-level ones not covered by memory reporters.) This reporter - * is special-cased because it's interesting, and is moderately difficult - * to compute in JS. -1 means unknown. - */ - readonly attribute PRInt64 explicit; }; %{C++ diff --git a/xpcom/base/nsMemoryReporterManager.cpp b/xpcom/base/nsMemoryReporterManager.cpp index f6754e08b25d..c29bb82d0c39 100644 --- a/xpcom/base/nsMemoryReporterManager.cpp +++ b/xpcom/base/nsMemoryReporterManager.cpp @@ -36,12 +36,10 @@ * * ***** END LICENSE BLOCK ***** */ -#include "nsAutoPtr.h" #include "nsCOMPtr.h" #include "nsServiceManagerUtils.h" #include "nsMemoryReporterManager.h" #include "nsArrayEnumerator.h" -#include "nsISimpleEnumerator.h" #if defined(XP_LINUX) || defined(XP_MACOSX) @@ -509,164 +507,6 @@ nsMemoryReporterManager::UnregisterMultiReporter(nsIMemoryMultiReporter *reporte return NS_OK; } -NS_IMETHODIMP -nsMemoryReporterManager::GetResident(PRInt64 *aResident) -{ - *aResident = ::GetResident(); - return NS_OK; -} - -struct MemoryReport { - MemoryReport(const nsACString &path, PRInt64 amount) - : path(path), amount(amount) - { - MOZ_COUNT_CTOR(MemoryReport); - } - ~MemoryReport() - { - MOZ_COUNT_DTOR(MemoryReport); - } - const nsCString path; - PRInt64 amount; -}; - -// This is just a wrapper for InfallibleTArray that implements -// nsISupports, so it can be passed to nsIMemoryMultiReporter::CollectReports. -class MemoryReportsWrapper : public nsISupports { -public: - NS_DECL_ISUPPORTS - MemoryReportsWrapper(InfallibleTArray *r) : mReports(r) { } - InfallibleTArray *mReports; -}; -NS_IMPL_ISUPPORTS0(MemoryReportsWrapper) - -class MemoryReportCallback : public nsIMemoryMultiReporterCallback -{ -public: - NS_DECL_ISUPPORTS - - NS_IMETHOD Callback(const nsACString &aProcess, const nsACString &aPath, - PRInt32 aKind, PRInt32 aUnits, PRInt64 aAmount, - const nsACString &aDescription, - nsISupports *aWrappedMRs) - { - if (aKind == nsIMemoryReporter::KIND_MAPPED && aAmount != PRInt64(-1)) { - MemoryReportsWrapper *wrappedMRs = - static_cast(aWrappedMRs); - MemoryReport mr(aPath, aAmount); - wrappedMRs->mReports->AppendElement(mr); - } - return NS_OK; - } -}; -NS_IMPL_ISUPPORTS1( - MemoryReportCallback -, nsIMemoryMultiReporterCallback -) - -// Is path1 a prefix, and thus a parent, of path2? Eg. "a/b" is a parent of -// "a/b/c", but "a/bb" is not. -static bool -isParent(const nsACString &path1, const nsACString &path2) -{ - if (path1.Length() >= path2.Length()) - return false; - - const nsACString& subStr = Substring(path2, 0, path1.Length()); - return subStr.Equals(path1) && path2[path1.Length()] == '/'; -} - -NS_IMETHODIMP -nsMemoryReporterManager::GetExplicit(PRInt64 *aExplicit) -{ - InfallibleTArray mapped; - PRInt64 heapUsed = PRInt64(-1); - - // Get "heap-used" and all the KIND_MAPPED measurements from vanilla - // reporters. - nsCOMPtr e; - EnumerateReporters(getter_AddRefs(e)); - - PRBool more; - while (NS_SUCCEEDED(e->HasMoreElements(&more)) && more) { - nsCOMPtr r; - e->GetNext(getter_AddRefs(r)); - - PRInt32 kind; - nsresult rv = r->GetKind(&kind); - NS_ENSURE_SUCCESS(rv, rv); - - if (kind == nsIMemoryReporter::KIND_MAPPED) { - nsCString path; - rv = r->GetPath(getter_Copies(path)); - NS_ENSURE_SUCCESS(rv, rv); - - PRInt64 amount; - rv = r->GetAmount(&amount); - NS_ENSURE_SUCCESS(rv, rv); - - // Just skip any MAPPED reporters that fail, because "heap-used" is - // the most important one. - if (amount != PRInt64(-1)) { - MemoryReport mr(path, amount); - mapped.AppendElement(mr); - } - } else { - nsCString path; - rv = r->GetPath(getter_Copies(path)); - NS_ENSURE_SUCCESS(rv, rv); - - if (path.Equals("heap-used")) { - rv = r->GetAmount(&heapUsed); - NS_ENSURE_SUCCESS(rv, rv); - // If "heap-used" fails, we give up, because the result would be - // horribly inaccurate. - if (heapUsed == PRInt64(-1)) { - *aExplicit = PRInt64(-1); - return NS_OK; - } - } - } - } - - // Get KIND_MAPPED measurements from multi-reporters, too. - nsCOMPtr e2; - EnumerateMultiReporters(getter_AddRefs(e2)); - nsRefPtr wrappedMRs = - new MemoryReportsWrapper(&mapped); - nsRefPtr cb = new MemoryReportCallback(); - - while (NS_SUCCEEDED(e2->HasMoreElements(&more)) && more) { - nsCOMPtr r; - e2->GetNext(getter_AddRefs(r)); - r->CollectReports(cb, wrappedMRs); - } - - // Ignore (by zeroing its amount) any reporter that is a child of another - // reporter. Eg. if we have "explicit/a" and "explicit/a/b", zero the - // latter. This is quadratic in the number of MAPPED reporters, but there - // shouldn't be many. - for (PRUint32 i = 0; i < mapped.Length(); i++) { - const nsCString &iPath = mapped[i].path; - for (PRUint32 j = i + 1; j < mapped.Length(); j++) { - const nsCString &jPath = mapped[j].path; - if (isParent(iPath, jPath)) { - mapped[j].amount = 0; - } else if (isParent(jPath, iPath)) { - mapped[i].amount = 0; - } - } - } - - // Sum all the mapped reporters and heapUsed. - *aExplicit = heapUsed; - for (PRUint32 i = 0; i < mapped.Length(); i++) { - *aExplicit += mapped[i].amount; - } - - return NS_OK; -} - NS_IMPL_ISUPPORTS1(nsMemoryReporter, nsIMemoryReporter) nsMemoryReporter::nsMemoryReporter(nsCString& process, From 300196ee5f7e7ca17e0d002f3403ca1f0e8dd2b9 Mon Sep 17 00:00:00 2001 From: Bas Schouten Date: Tue, 5 Jul 2011 08:52:48 +0000 Subject: [PATCH 12/13] Bug 668801 - Followup: Properly address review comments. --- gfx/2d/DrawTargetD2D.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/gfx/2d/DrawTargetD2D.cpp b/gfx/2d/DrawTargetD2D.cpp index e1e82b7dae92..acbb6a14c582 100644 --- a/gfx/2d/DrawTargetD2D.cpp +++ b/gfx/2d/DrawTargetD2D.cpp @@ -584,15 +584,15 @@ DrawTargetD2D::DrawSurfaceWithShadow(SourceSurface *aSurface, mSize.width / Float(tmpSurfSize.width) * dsFactorX, mSize.height / Float(tmpSurfSize.height) * dsFactorY)); - if (!mPushedClips.size()) { - mPrivateData->mEffect->GetTechniqueByName("SampleTextureWithShadow")-> - GetPassByIndex(1)->Apply(0); - } else { + if (mPushedClips.size()) { mPrivateData->mEffect->GetVariableByName("mask")->AsShaderResource()->SetResource(maskSRView); mPrivateData->mEffect->GetVariableByName("MaskTexCoords")->AsVector()-> SetFloatVector(ShaderConstantRectD3D10(0, 0, 1.0f, 1.0f)); mPrivateData->mEffect->GetTechniqueByName("SampleTextureWithShadow")-> GetPassByIndex(2)->Apply(0); + } else { + mPrivateData->mEffect->GetTechniqueByName("SampleTextureWithShadow")-> + GetPassByIndex(1)->Apply(0); } mDevice->OMSetBlendState(GetBlendStateForOperator(aOperator), NULL, 0xffffffff); @@ -604,11 +604,11 @@ DrawTargetD2D::DrawSurfaceWithShadow(SourceSurface *aSurface, SetFloatVector(ShaderConstantRectD3D10(-aDest.x / aSurface->GetSize().width, -aDest.y / aSurface->GetSize().height, Float(mSize.width) / aSurface->GetSize().width, Float(mSize.height) / aSurface->GetSize().height)); - if (!mPushedClips.size()) { - mPrivateData->mEffect->GetTechniqueByName("SampleTexture")-> + if (mPushedClips.size()) { + mPrivateData->mEffect->GetTechniqueByName("SampleMaskedTexture")-> GetPassByIndex(0)->Apply(0); } else { - mPrivateData->mEffect->GetTechniqueByName("SampleMaskedTexture")-> + mPrivateData->mEffect->GetTechniqueByName("SampleTexture")-> GetPassByIndex(0)->Apply(0); } From 9a97cc1996c6e1e9b9479128e2b09d2fc1fbf682 Mon Sep 17 00:00:00 2001 From: Jacob Bramley Date: Tue, 5 Jul 2011 09:48:40 +0100 Subject: [PATCH 13/13] Bug 666918: Allow some routines to omit the frame pointer even with --enable-profiling. This will break call-graphs for these functions, but an --enable-profiling build won't work without it. [r=cjones] --- gfx/ycbcr/yuv_convert_arm.cpp | 13 +++++++------ .../src/client/linux/handler/Makefile.in | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/gfx/ycbcr/yuv_convert_arm.cpp b/gfx/ycbcr/yuv_convert_arm.cpp index b14e2ba0d5a6..3c7495ef1ea6 100644 --- a/gfx/ycbcr/yuv_convert_arm.cpp +++ b/gfx/ycbcr/yuv_convert_arm.cpp @@ -16,12 +16,13 @@ namespace mozilla { namespace gfx { # if defined(MOZILLA_MAY_SUPPORT_NEON) -void __attribute((noinline)) yuv42x_to_rgb565_row_neon(uint16 *dst, - const uint8 *y, - const uint8 *u, - const uint8 *v, - int n, - int oddflag) +void __attribute((noinline,optimize("-fomit-frame-pointer"))) + yuv42x_to_rgb565_row_neon(uint16 *dst, + const uint8 *y, + const uint8 *u, + const uint8 *v, + int n, + int oddflag) { static __attribute__((aligned(16))) uint16 acc_r[8] = { 22840, 22840, 22840, 22840, 22840, 22840, 22840, 22840, diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/Makefile.in b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/Makefile.in index 140a91627d04..cee6f8608edd 100644 --- a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/Makefile.in +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/Makefile.in @@ -52,6 +52,7 @@ ifdef MOZ_THUMB2 #{ # work around it by telling gcc that the THUMB frame pointer is a # vanilla callee-save register. OS_CXXFLAGS += -fomit-frame-pointer +MOZ_OPTIMIZE_FLAGS := $(filter-out -fno-omit-frame-pointer,$(MOZ_OPTIMIZE_FLAGS)) endif #} MODULE = handler