This commit is contained in:
LastLife 2026-05-02 15:49:06 +02:00
parent c904f9e777
commit c5f56cdd6e
224 changed files with 72888 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
Client/spiderbasic.js
Client/SpiderBasic_Compilation0.html
Server/kumos.db
/Server/blobs
/Server/apps
/Server/tmp

View File

@ -0,0 +1,411 @@
DeclareModule AppManager
Declare Open()
EndDeclareModule
Module AppManager
EnableExplicit
;- Layout
#Win_W = 520
#Win_H = 380
#Toolbar_H = 40
#Statusbar_H = 26
#List_Row_H = 48
;- Colors
Global Color_Bg = RGB( 22, 22, 34)
Global Color_Row_Odd = RGB( 28, 28, 42)
Global Color_Row_Even = RGB( 22, 22, 34)
Global Color_Sel = RGB( 52, 52, 72)
Global Color_Accent = RGB(100, 120, 255)
Global Color_Text = RGB(200, 200, 215)
Global Color_Dim = RGB(110, 110, 135)
Global Color_Sep = RGB( 48, 48, 65)
Global Font_UI = LoadFont(#PB_Any, "sans-serif", 13)
Global Font_Small = LoadFont(#PB_Any, "sans-serif", 11)
;- App list
Structure InstalledApp
ID.s
Name.s
Manifest.s
Permissions.s
EndStructure
Global NewList _Apps.InstalledApp()
;- State
Global Window = 0
Global _Canvas
Global _StatusLabel
Global _InstallBtn
Global _LaunchBtn
Global _UninstallBtn
Global _Hover = -1
Global _Selected = -1
Global _PendingUninstall.s = ""
;- Install dialog
Global _InputWin = 0
Global _URLField
Global _OKBtn
Global _CancelBtn
;- Private declarations
Declare _Refresh()
Declare _DrawList()
Declare _UpdateButtons()
Declare _Status(Msg.s)
Declare _OpenInstallDialog()
Declare _CloseInstallDialog()
Declare _ListCallback(Success, DataString.s)
Declare _InstallCallback(Success, DataString.s)
Declare _UninstallCallback(Success, DataString.s)
Declare _DoUninstall(Result)
Declare Handler_Close()
Declare Handler_Canvas()
Declare Handler_Install()
Declare Handler_Launch()
Declare Handler_Uninstall()
Declare Handler_InputOK()
Declare Handler_InputCancel()
Declare Handler_Resize()
;- Public
Procedure Open()
If IsWindow(Window)
SetActiveWindow(Window) : ProcedureReturn
EndIf
Window = OpenWindow(#PB_Any, 160, 100, #Win_W, #Win_H, "App Manager",
#PB_Window_TitleBar | #PB_Window_SizeGadget | #PB_Window_SystemMenu)
SetWindowColor(Window, Color_Bg)
_InstallBtn = ButtonGadget(#PB_Any, 4, 6, 100, #Toolbar_H - 12, "+ Install")
_LaunchBtn = ButtonGadget(#PB_Any, 112, 6, 80, #Toolbar_H - 12, "Launch")
_UninstallBtn = ButtonGadget(#PB_Any, 200, 6, 90, #Toolbar_H - 12, "Uninstall")
_Canvas = CanvasGadget(#PB_Any, 0, #Toolbar_H,
#Win_W, #Win_H - #Toolbar_H - #Statusbar_H)
_StatusLabel = TextGadget(#PB_Any, 4, #Win_H - #Statusbar_H + 4,
#Win_W - 8, #Statusbar_H - 8, "")
SetGadgetColor(_StatusLabel, #PB_Gadget_FrontColor, Color_Dim)
SetGadgetColor(_StatusLabel, #PB_Gadget_BackColor, Color_Bg)
BindGadgetEvent(_InstallBtn, @Handler_Install())
BindGadgetEvent(_LaunchBtn, @Handler_Launch())
BindGadgetEvent(_UninstallBtn, @Handler_Uninstall())
BindGadgetEvent(_Canvas, @Handler_Canvas())
BindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Window)
BindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
Desktop::Register("App Manager", Window, "📦")
_UpdateButtons()
_Refresh()
EndProcedure
;- Private
Procedure _Refresh()
_Status("Loading...")
ClearList(_Apps())
_Selected = -1
_DrawList()
HTTPRequest(#PB_HTTP_Get, "/api/apps/list", "", @_ListCallback())
EndProcedure
Procedure _DrawList()
If Not IsGadget(_Canvas) : ProcedureReturn : EndIf
If Not StartDrawing(CanvasOutput(_Canvas)) : ProcedureReturn : EndIf
Protected W = OutputWidth()
Protected H = OutputHeight()
Box(0, 0, W, H, Color_Bg)
If IsFont(Font_UI) : DrawingFont(FontID(Font_UI)) : EndIf
Protected TH = TextHeight("A")
ForEach _Apps()
Protected i = ListIndex(_Apps())
Protected Y = i * #List_Row_H
If Y + #List_Row_H > H : Break : EndIf
Protected RowBg
If i = _Selected
RowBg = Color_Sel
ElseIf i = _Hover
RowBg = RGB(40, 40, 58)
ElseIf i % 2 = 0
RowBg = Color_Row_Even
Else
RowBg = Color_Row_Odd
EndIf
Box(0, Y, W, #List_Row_H, RowBg)
If i = _Selected : Box(0, Y, 3, #List_Row_H, Color_Accent) : EndIf
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(14, Y + (#List_Row_H / 2) - TH - 1, _Apps()\Name, Color_Text)
If IsFont(Font_Small) : DrawingFont(FontID(Font_Small)) : EndIf
DrawText(14, Y + (#List_Row_H / 2) + 2, _Apps()\ID, Color_Dim)
If IsFont(Font_UI) : DrawingFont(FontID(Font_UI)) : EndIf
Box(0, Y + #List_Row_H - 1, W, 1, Color_Sep)
Next
If ListSize(_Apps()) = 0
DrawingMode(#PB_2DDrawing_Transparent)
If IsFont(Font_UI) : DrawingFont(FontID(Font_UI)) : EndIf
DrawText((W - TextWidth("No apps installed")) / 2,
(H - TH) / 2, "No apps installed", Color_Dim)
EndIf
StopDrawing()
EndProcedure
Procedure _UpdateButtons()
DisableGadget(_LaunchBtn, Bool(_Selected < 0))
DisableGadget(_UninstallBtn, Bool(_Selected < 0))
EndProcedure
Procedure _Status(Msg.s)
If IsGadget(_StatusLabel) : SetGadgetText(_StatusLabel, Msg) : EndIf
EndProcedure
Procedure _OpenInstallDialog()
If IsWindow(_InputWin) : ProcedureReturn : EndIf
Protected X = WindowX(Window) + (#Win_W / 2) - 170
Protected Y = WindowY(Window) + (#Win_H / 2) - 50
_InputWin = OpenWindow(#PB_Any, X, Y, 340, 100, "Install App from URL",
#PB_Window_TitleBar | #PB_Window_SystemMenu)
TextGadget(#PB_Any, 10, 14, 320, 18, "Package URL (.zip):")
_URLField = StringGadget(#PB_Any, 10, 34, 320, 26, "")
_OKBtn = ButtonGadget(#PB_Any, 10, 68, 150, 24, "Install")
_CancelBtn = ButtonGadget(#PB_Any, 170, 68, 160, 24, "Cancel")
SetActiveGadget(_URLField)
BindGadgetEvent(_OKBtn, @Handler_InputOK())
BindGadgetEvent(_CancelBtn, @Handler_InputCancel())
BindEvent(#PB_Event_CloseWindow, @Handler_InputCancel(), _InputWin)
EndProcedure
Procedure _CloseInstallDialog()
If Not IsWindow(_InputWin) : ProcedureReturn : EndIf
UnbindGadgetEvent(_OKBtn, @Handler_InputOK())
UnbindGadgetEvent(_CancelBtn, @Handler_InputCancel())
UnbindEvent(#PB_Event_CloseWindow, @Handler_InputCancel(), _InputWin)
CloseWindow(_InputWin)
_InputWin = 0
EndProcedure
;- HTTP callbacks
Procedure _ListCallback(Success, DataString.s)
If Not IsWindow(Window) : ProcedureReturn : EndIf
ClearList(_Apps())
_Selected = -1
If Success And ParseJSON(0, DataString)
Protected Root = JSONValue(0)
Protected Total = JSONArraySize(Root)
Protected i
For i = 0 To Total - 1
Protected Item = GetJSONElement(Root, i)
Protected ManiNode = GetJSONMember(Item, "manifest")
AddElement(_Apps())
_Apps()\ID = GetJSONString(GetJSONMember(Item, "app_id"))
Protected N.s = GetJSONString(GetJSONMember(ManiNode, "name"))
If N <> ""
_Apps()\Name = N
Else
_Apps()\Name = _Apps()\ID
EndIf
; Re-serialise manifest to a JSON string
Protected Icon.s = GetJSONString(GetJSONMember(ManiNode, "icon"))
_Apps()\Manifest = "{" +
~"\"id\":\"" + GetJSONString(GetJSONMember(ManiNode, "id")) + ~"\"," +
~"\"name\":\"" + GetJSONString(GetJSONMember(ManiNode, "name")) + ~"\"," +
~"\"version\":\"" + GetJSONString(GetJSONMember(ManiNode, "version")) + ~"\"," +
~"\"icon\":\"" + ReplaceString(Icon, ~"\"", ~"\\\"") + ~"\"," +
~"\"entry\":\"" + GetJSONString(GetJSONMember(ManiNode, "entry")) + ~"\"}"
; Re-serialise permissions array to a JSON string
Protected PermNode = GetJSONMember(Item, "permissions")
Protected PermCount = JSONArraySize(PermNode)
Protected j, Perms.s = "["
For j = 0 To PermCount - 1
If j > 0 : Perms + "," : EndIf
Perms + ~"\"" + GetJSONString(GetJSONElement(PermNode, j)) + ~"\""
Next
_Apps()\Permissions = Perms + "]"
; Sync with the desktop start menu
Desktop::InstallThirdPartyApp(_Apps()\ID, _Apps()\Manifest,
_Apps()\Permissions, Icon)
Next
FreeJSON(0)
Protected Count = ListSize(_Apps())
If Count = 1
_Status("1 app installed")
Else
_Status(Str(Count) + " apps installed")
EndIf
Else
_Status("Failed to load app list.")
EndIf
_DrawList()
_UpdateButtons()
EndProcedure
Procedure _InstallCallback(Success, DataString.s)
If Not IsWindow(Window) : ProcedureReturn : EndIf
DisableGadget(_InstallBtn, #False)
If Success And ParseJSON(0, DataString)
Protected Root = JSONValue(0)
If GetJSONBoolean(GetJSONMember(Root, "success"))
Protected AppID.s = GetJSONString(GetJSONMember(Root, "app_id"))
FreeJSON(0)
Notify::Toast("Installed: " + AppID, Notify::#Success)
_Refresh()
ProcedureReturn
EndIf
Protected Err.s = GetJSONString(GetJSONMember(Root, "error"))
FreeJSON(0)
Notify::Toast(Err, Notify::#Error)
Else
Notify::Toast("Install failed.", Notify::#Error)
EndIf
_Status("Ready.")
EndProcedure
Procedure _UninstallCallback(Success, DataString.s)
If Not IsWindow(Window) : ProcedureReturn : EndIf
If Success And ParseJSON(0, DataString)
If GetJSONBoolean(GetJSONMember(JSONValue(0), "success"))
FreeJSON(0)
Notify::Toast("App uninstalled.", Notify::#Success)
Desktop::UninstallThirdPartyApp(_PendingUninstall)
_PendingUninstall = ""
_Refresh()
ProcedureReturn
EndIf
FreeJSON(0)
EndIf
Notify::Toast("Uninstall failed.", Notify::#Error)
_PendingUninstall = ""
_Status("Ready.")
EndProcedure
;- Event handlers
Procedure Handler_Canvas()
Protected EType = EventType()
Protected MY = GetGadgetAttribute(_Canvas, #PB_Canvas_MouseY)
Protected Row = MY / #List_Row_H
Select EType
Case #PB_EventType_MouseMove
If Row >= ListSize(_Apps()) : Row = -1 : EndIf
If Row <> _Hover
_Hover = Row : _DrawList()
EndIf
Case #PB_EventType_MouseLeave
If _Hover <> -1 : _Hover = -1 : _DrawList() : EndIf
Case #PB_EventType_LeftButtonUp
If Row >= 0 And Row < ListSize(_Apps())
_Selected = Row : _DrawList() : _UpdateButtons()
EndIf
Case #PB_EventType_LeftDoubleClick
If Row >= 0 And Row < ListSize(_Apps())
_Selected = Row
Handler_Launch()
EndIf
EndSelect
EndProcedure
Procedure Handler_Install()
_OpenInstallDialog()
EndProcedure
Procedure Handler_Launch()
If _Selected < 0 Or Not SelectElement(_Apps(), _Selected) : ProcedureReturn : EndIf
AppRuntime::Launch(_Apps()\ID, _Apps()\Manifest, _Apps()\Permissions)
EndProcedure
Procedure Handler_Uninstall()
If _Selected < 0 Or Not SelectElement(_Apps(), _Selected) : ProcedureReturn : EndIf
Notify::Confirm("Uninstall " + _Apps()\Name,
"Remove this app? Private storage will also be deleted.",
@_DoUninstall())
EndProcedure
Procedure _DoUninstall(Result)
If Not Result Or _Selected < 0 : ProcedureReturn : EndIf
If Not SelectElement(_Apps(), _Selected) : ProcedureReturn : EndIf
_PendingUninstall = _Apps()\ID
_Status("Uninstalling " + _Apps()\ID + "...")
HTTPRequest(#PB_HTTP_Post, "/api/apps/uninstall",
"app_id=" + URLEncoder(_Apps()\ID, #PB_UTF8) + "&keep_data=0",
@_UninstallCallback())
EndProcedure
Procedure Handler_InputOK()
Protected URL.s = Trim(GetGadgetText(_URLField))
If URL = "" : ProcedureReturn : EndIf
_CloseInstallDialog()
_Status("Installing...")
DisableGadget(_InstallBtn, #True)
HTTPRequest(#PB_HTTP_Post, "/api/apps/install",
"url=" + URLEncoder(URL, #PB_UTF8), @_InstallCallback())
EndProcedure
Procedure Handler_InputCancel()
_CloseInstallDialog()
EndProcedure
Procedure Handler_Resize()
Protected W = WindowWidth(Window)
Protected H = WindowHeight(Window)
ResizeGadget(_Canvas, 0, #Toolbar_H, W, H - #Toolbar_H - #Statusbar_H)
ResizeGadget(_StatusLabel, 4, H - #Statusbar_H + 4, W - 8, #Statusbar_H - 8)
_DrawList()
EndProcedure
Procedure Handler_Close()
_CloseInstallDialog()
UnbindGadgetEvent(_InstallBtn, @Handler_Install())
UnbindGadgetEvent(_LaunchBtn, @Handler_Launch())
UnbindGadgetEvent(_UninstallBtn, @Handler_Uninstall())
UnbindGadgetEvent(_Canvas, @Handler_Canvas())
UnbindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Window)
UnbindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
Desktop::Unregister(Window)
Window = 0
EndProcedure
EndModule
; IDE Options = SpiderBasic 3.10 (Windows - x86)
; CursorPosition = 4
; FirstLine = 30
; Folding = DAA5
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

View File

@ -0,0 +1,301 @@
DeclareModule FileExplorer
Declare Open()
EndDeclareModule
Module FileExplorer
EnableExplicit
; Layout constants
#Toolbar_Height = 35
#Statusbar_Height = 24
#Window_W = 480
#Window_H = 400
#Max_Entries = 512
; Gadgets
Global Window
Global UpButton
Global PathLabel
Global NewFolderButton
Global NewFileButton
Global ListView
Global StatusLabel
; Navigation state
Global CurrentPath.s = "/"
Global Dim PathStack.s(64)
Global StackDepth = 0
; Entry cache (populated on each listing)
Global Dim EntryIDs.s(#Max_Entries)
Global Dim EntryNames.s(#Max_Entries)
Global Dim EntryIsDir(#Max_Entries)
Global EntryCount = 0
; Input window state
Global InputWindow = 0
Global InputField
Global InputMode ; 0 = new folder, 1 = new file
Global ButtonNew
Global CancelBtn
; Private declarations
Declare _Load(Path.s)
Declare _ListCallback(Success.i, DataString.s)
Declare _MkdirCallback(Success.i, DataString.s)
Declare _CreateFileCallback(Success.i, DataString.s)
Declare _OpenInputWindow(Mode.i)
Declare _CloseInputWindow()
Declare Handler_Resize()
Declare Handler_Up()
Declare Handler_NewFolder()
Declare Handler_NewFile()
Declare Handler_ListView()
Declare Handler_Close()
Declare Handler_InputConfirm()
Declare Handler_InputCancel()
; Public procedures
Procedure Open()
If IsWindow(Window)
SetActiveWindow(Window)
ProcedureReturn
EndIf
Window = OpenWindow(#PB_Any, 150, 80, #Window_W, #Window_H, "File Explorer",
#PB_Window_TitleBar | #PB_Window_SizeGadget | #PB_Window_SystemMenu)
; Toolbar
UpButton = ButtonGadget(#PB_Any, 2, 4, 30, #Toolbar_Height - 8, "↑")
PathLabel = TextGadget (#PB_Any, 36, 4, #Window_W - 200, #Toolbar_Height - 8, "/")
NewFolderButton= ButtonGadget(#PB_Any, #Window_W - 162, 4, 80, #Toolbar_Height - 8, "+ Folder")
NewFileButton = ButtonGadget(#PB_Any, #Window_W - 78, 4, 74, #Toolbar_Height - 8, "+ File")
; File list
ListView = ListViewGadget(#PB_Any, 0, #Toolbar_Height,
#Window_W, #Window_H - #Toolbar_Height - #Statusbar_Height)
; Status bar
StatusLabel = TextGadget(#PB_Any, 4, #Window_H - #Statusbar_Height + 4,
#Window_W - 8, #Statusbar_Height - 8, "")
BindGadgetEvent(UpButton, @Handler_Up())
BindGadgetEvent(NewFolderButton, @Handler_NewFolder())
BindGadgetEvent(NewFileButton, @Handler_NewFile())
BindGadgetEvent(ListView, @Handler_ListView())
BindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Window)
BindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
Desktop::Register("File Explorer", Window, "📁")
CurrentPath = "/"
StackDepth = 0
_Load("/")
EndProcedure
; Private procedures
Procedure _Load(Path.s)
CurrentPath = Path
SetGadgetText(PathLabel, Path)
SetGadgetText(StatusLabel, "Loading...")
ClearGadgetItems(ListView)
EntryCount = 0
FS::List(Path, @_ListCallback())
EndProcedure
Procedure _ListCallback(Success.i, DataString.s)
If Not Success Or Not IsWindow(Window)
Notify::Toast("Failed to load directory.", Notify::#Error)
ProcedureReturn
EndIf
If Not ParseJSON(0, DataString)
Notify::Toast("Could not read directory.", Notify::#Error)
ProcedureReturn
EndIf
Protected Root.i = JSONValue(0)
Protected Count.i = JSONArraySize(Root)
Protected i.i, Item.i
ClearGadgetItems(ListView)
EntryCount = 0
For i = 0 To Count - 1
If EntryCount >= #Max_Entries : Break : EndIf
Item = GetJSONElement(Root, i)
EntryIDs(EntryCount) = Str(GetJSONInteger(GetJSONMember(Item, "id")))
EntryNames(EntryCount) = GetJSONString(GetJSONMember(Item, "name"))
EntryIsDir(EntryCount) = GetJSONInteger(GetJSONMember(Item, "is_dir"))
Protected Prefix.s = "[F] "
If EntryIsDir(EntryCount) : Prefix = "[D] " : EndIf
AddGadgetItem(ListView, -1, Prefix + EntryNames(EntryCount))
EntryCount + 1
Next
FreeJSON(0)
Protected Status.s = Str(EntryCount) + " item"
If EntryCount <> 1 : Status + "s" : EndIf
SetGadgetText(StatusLabel, Status)
EndProcedure
Procedure _MkdirCallback(Success.i, DataString.s)
If Not IsWindow(Window) : ProcedureReturn : EndIf
_Load(CurrentPath) ; refresh regardless — server may have created it
EndProcedure
Procedure _CreateFileCallback(Success.i, DataString.s)
If Not IsWindow(Window) : ProcedureReturn : EndIf
If Success And ParseJSON(0, DataString)
Protected Root.i = JSONValue(0)
If GetJSONBoolean(GetJSONMember(Root, "success"))
Protected ID.s = Str(GetJSONInteger(GetJSONMember(Root, "id")))
Protected Path.s = CurrentPath
If Right(Path, 1) <> "/" : Path + "/" : EndIf
Path + EntryNames(0) ; name was stored in EntryNames(0) temporarily
FreeJSON(0)
_Load(CurrentPath)
TextEditor::Open(ID, Path)
ProcedureReturn
EndIf
FreeJSON(0)
EndIf
_Load(CurrentPath)
EndProcedure
Procedure _OpenInputWindow(Mode.i)
If IsWindow(InputWindow) : ProcedureReturn : EndIf
InputMode = Mode
Protected Title.s = "New Folder"
If Mode = 1 : Title = "New File" : EndIf
Protected X.i = WindowX(Window) + (#Window_W / 2) - 150
Protected Y.i = WindowY(Window) + (#Window_H / 2) - 45
InputWindow = OpenWindow(#PB_Any, X, Y, 300, 90, Title,
#PB_Window_TitleBar | #PB_Window_SystemMenu)
TextGadget (#PB_Any, 10, 12, 280, 20, "Name:")
InputField = StringGadget(#PB_Any, 10, 32, 280, 24, "")
ButtonNew = ButtonGadget(#PB_Any, 10, 62, 130, 24, "OK") ; EventGadget index 2
CancelBtn = ButtonGadget(#PB_Any, 150, 62, 140, 24, "Cancel")
SetActiveGadget(InputField)
BindGadgetEvent(ButtonNew, @Handler_InputConfirm())
BindGadgetEvent(CancelBtn, @Handler_InputCancel())
BindEvent(#PB_Event_CloseWindow, @Handler_InputCancel(), InputWindow)
EndProcedure
Procedure _CloseInputWindow()
If IsWindow(InputWindow)
CloseWindow(InputWindow)
EndIf
EndProcedure
; Event handlers
Procedure Handler_Resize()
Protected W.i = WindowWidth(Window)
Protected H.i = WindowHeight(Window)
ResizeGadget(PathLabel, 36, 4, W - 200, #Toolbar_Height - 8)
ResizeGadget(NewFolderButton, W - 162, 4, 80, #Toolbar_Height - 8)
ResizeGadget(NewFileButton, W - 78, 4, 74, #Toolbar_Height - 8)
ResizeGadget(ListView, 0, #Toolbar_Height, W, H - #Toolbar_Height - #Statusbar_Height)
ResizeGadget(StatusLabel, 4, H - #Statusbar_Height + 4, W - 8, #Statusbar_Height - 8)
EndProcedure
Procedure Handler_Up()
If StackDepth > 0
StackDepth - 1
_Load(PathStack(StackDepth))
EndIf
EndProcedure
Procedure Handler_NewFolder()
_OpenInputWindow(0)
EndProcedure
Procedure Handler_NewFile()
_OpenInputWindow(1)
EndProcedure
Procedure Handler_ListView()
If EventType() <> #PB_EventType_LeftDoubleClick : ProcedureReturn : EndIf
Protected Index.i = GetGadgetState(ListView)
If Index < 0 Or Index >= EntryCount : ProcedureReturn : EndIf
If EntryIsDir(Index)
; Push current path, navigate in
PathStack(StackDepth) = CurrentPath
StackDepth + 1
Protected NewPath.s = CurrentPath
If Right(NewPath, 1) <> "/" : NewPath + "/" : EndIf
NewPath + EntryNames(Index)
_Load(NewPath)
Else
; Open in text editor
Protected Path.s = CurrentPath
If Right(Path, 1) <> "/" : Path + "/" : EndIf
Path + EntryNames(Index)
TextEditor::Open(EntryIDs(Index), Path)
EndIf
EndProcedure
Procedure Handler_Close()
If IsWindow(InputWindow)
UnbindEvent(#PB_Event_CloseWindow, @Handler_InputCancel(), InputWindow)
UnbindGadgetEvent(ButtonNew, @Handler_InputConfirm())
UnbindGadgetEvent(CancelBtn, @Handler_InputCancel())
_CloseInputWindow()
EndIf
UnbindGadgetEvent(UpButton, @Handler_Up())
UnbindGadgetEvent(NewFolderButton, @Handler_NewFolder())
UnbindGadgetEvent(NewFileButton, @Handler_NewFile())
UnbindGadgetEvent(ListView, @Handler_ListView())
UnbindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Window)
UnbindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
Desktop::Unregister(Window)
InputWindow = 0
Window = 0
EndProcedure
Procedure Handler_InputConfirm()
Protected Name.s = Trim(GetGadgetText(InputField))
If Name = "" : ProcedureReturn : EndIf
Protected Path.s = CurrentPath
If Right(Path, 1) <> "/" : Path + "/" : EndIf
Path + Name
_CloseInputWindow()
If InputMode = 0
FS::Mkdir(Path, @_MkdirCallback())
Else
; Stash name temporarily for the callback to build the full path
EntryNames(0) = Name
FS::Write("", Path, "", @_CreateFileCallback())
EndIf
EndProcedure
Procedure Handler_InputCancel()
_CloseInputWindow()
EndProcedure
EndModule
; IDE Options = SpiderBasic 3.10 (Windows - x86)
; CursorPosition = 96
; Folding = CAg
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

View File

@ -0,0 +1,256 @@
DeclareModule Settings
Declare Open()
EndDeclareModule
Module Settings
EnableExplicit
#Win_W = 500
#Win_H = 290
#Panel_W = 140
#Row_H = 44
#Pad = 20
Global Color_Panel_Bg = RGB( 22, 22, 34)
Global Color_Sel = RGB( 52, 52, 72)
Global Color_Hover = RGB( 40, 40, 58)
Global Color_Accent = RGB(100, 120, 255)
Global Color_Content_Bg = RGB( 36, 36, 52)
Global Color_Sep = RGB( 48, 48, 65)
Global Color_Text = RGB(200, 200, 215)
Global Color_Dim = RGB(110, 110, 135)
Global PanelFont = LoadFont(#PB_Any, "sans-serif", 13)
; To add a section: add its name below, create its gadgets in Open(), And add a Case to _ShowSection() / _HideSection().
Enumeration
#Section_Account
; #Section_Appearance
; #Section_About
#Section_Count ; keep in last place
EndEnumeration
Global Dim _SectionNames.s(#Section_Count)
; State
Global Window
Global _PanelCanvas
Global _CurrentSection
Global _PanelHover = -1
; Account section gadgets
Global _LblCurrent, _InCurrent
Global _LblNew, _InNew
Global _LblConfirm, _InConfirm
Global _BtnSave
; Private declarations
Declare _DrawPanel()
Declare _HideSection(Section)
Declare _ShowSection(Section)
Declare Handler_Close()
Declare Handler_PanelCanvas()
Declare Handler_Save()
Declare _SaveCallback(Success, DataString.s)
; Public procedures
Procedure Open()
If IsWindow(Window)
SetActiveWindow(Window)
ProcedureReturn
EndIf
_SectionNames(#Section_Account) = "Account"
Window = OpenWindow(#PB_Any, 200, 150, #Win_W, #Win_H, "Settings",
#PB_Window_TitleBar | #PB_Window_SystemMenu)
SetWindowColor(Window, Color_Content_Bg)
_PanelCanvas = CanvasGadget(#PB_Any, 0, 0, #Panel_W, #Win_H)
; Account section gadgets
Protected CX = #Panel_W + 1 + #Pad
Protected CW = #Win_W - #Panel_W - 1 - #Pad * 2
Protected Y = 20
_LblCurrent = TextGadget (#PB_Any, CX, Y, CW, 18, "Current password")
_InCurrent = StringGadget(#PB_Any, CX, Y + 22, CW, 26, "", #PB_String_Password)
Y + 66
_LblNew = TextGadget (#PB_Any, CX, Y, CW, 18, "New password")
_InNew = StringGadget(#PB_Any, CX, Y + 22, CW, 26, "", #PB_String_Password)
Y + 66
_LblConfirm = TextGadget (#PB_Any, CX, Y, CW, 18, "Confirm new password")
_InConfirm = StringGadget(#PB_Any, CX, Y + 22, CW, 26, "", #PB_String_Password)
Y + 58
_BtnSave = ButtonGadget(#PB_Any, CX, Y, CW, 30, "Change password")
; Label colors
SetGadgetColor(_LblCurrent, #PB_Gadget_FrontColor, Color_Text)
SetGadgetColor(_LblNew, #PB_Gadget_FrontColor, Color_Text)
SetGadgetColor(_LblConfirm, #PB_Gadget_FrontColor, Color_Text)
SetGadgetColor(_LblCurrent, #PB_Gadget_BackColor, Color_Content_Bg)
SetGadgetColor(_LblNew, #PB_Gadget_BackColor, Color_Content_Bg)
SetGadgetColor(_LblConfirm, #PB_Gadget_BackColor, Color_Content_Bg)
BindGadgetEvent(_BtnSave, @Handler_Save())
BindGadgetEvent(_PanelCanvas, @Handler_PanelCanvas())
BindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
Desktop::Register("Settings", Window, "⚙")
_DrawPanel()
EndProcedure
; Private procedures
Procedure _DrawPanel()
If Not IsGadget(_PanelCanvas) : ProcedureReturn : EndIf
If Not StartDrawing(CanvasOutput(_PanelCanvas)) : ProcedureReturn : EndIf
Protected W = OutputWidth()
Protected H = OutputHeight()
Protected i, Y, TH
Box(0, 0, W, H, Color_Panel_Bg)
Box(W - 1, 0, 1, H, Color_Sep) ; right-edge separator
If IsFont(PanelFont) : DrawingFont(FontID(PanelFont)) : EndIf
TH = TextHeight("A")
For i = 0 To #Section_Count - 1
Y = i * #Row_H
If i = _CurrentSection
Box(0, Y, W - 1, #Row_H, Color_Sel)
Box(0, Y, 3, #Row_H, Color_Accent)
ElseIf i = _PanelHover
Box(0, Y, W - 1, #Row_H, Color_Hover)
EndIf
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(14, Y + (#Row_H - TH) / 2, _SectionNames(i), Color_Text)
Next
StopDrawing()
EndProcedure
Procedure _HideSection(Section)
Select Section
Case #Section_Account
HideGadget(_LblCurrent, #True)
HideGadget(_InCurrent, #True)
HideGadget(_LblNew, #True)
HideGadget(_InNew, #True)
HideGadget(_LblConfirm, #True)
HideGadget(_InConfirm, #True)
HideGadget(_BtnSave, #True)
EndSelect
EndProcedure
Procedure _ShowSection(Section)
_HideSection(_CurrentSection)
_CurrentSection = Section
Select Section
Case #Section_Account
HideGadget(_LblCurrent, #False)
HideGadget(_InCurrent, #False)
HideGadget(_LblNew, #False)
HideGadget(_InNew, #False)
HideGadget(_LblConfirm, #False)
HideGadget(_InConfirm, #False)
HideGadget(_BtnSave, #False)
EndSelect
_DrawPanel()
EndProcedure
; Event handlers
Procedure Handler_PanelCanvas()
Protected EType = EventType()
Protected MY = GetGadgetAttribute(_PanelCanvas, #PB_Canvas_MouseY)
Protected Row = MY / #Row_H
Select EType
Case #PB_EventType_MouseMove
If Row < #Section_Count And Row <> _PanelHover
_PanelHover = Row
_DrawPanel()
EndIf
Case #PB_EventType_MouseLeave
_PanelHover = -1
_DrawPanel()
Case #PB_EventType_LeftButtonUp
If Row >= 0 And Row < #Section_Count And Row <> _CurrentSection
_ShowSection(Row)
EndIf
EndSelect
EndProcedure
Procedure Handler_Save()
Protected Current.s = GetGadgetText(_InCurrent)
Protected New_.s = GetGadgetText(_InNew)
Protected Confirm.s = GetGadgetText(_InConfirm)
If Current = "" Or New_ = "" Or Confirm = ""
Notify::Toast("Please fill in all fields.", Notify::#Warning)
ProcedureReturn
EndIf
If New_ <> Confirm
Notify::Toast("New passwords do not match.", Notify::#Warning)
ProcedureReturn
EndIf
If Len(New_) < 8
Notify::Toast("Password must be at least 8 characters.", Notify::#Warning)
ProcedureReturn
EndIf
DisableGadget(_BtnSave, #True)
HTTPRequest(#PB_HTTP_Post, "/api/auth/password",
"current_password=" + URLEncoder(Current, #PB_UTF8) +
"&new_password=" + URLEncoder(New_, #PB_UTF8),
@_SaveCallback())
EndProcedure
Procedure _SaveCallback(Success, DataString.s)
DisableGadget(_BtnSave, #False)
If Not Success
Notify::Toast("Connection error.", Notify::#Error)
ProcedureReturn
EndIf
If ParseJSON(0, DataString)
Protected Root = JSONValue(0)
If GetJSONBoolean(GetJSONMember(Root, "success"))
SetGadgetText(_InCurrent, "")
SetGadgetText(_InNew, "")
SetGadgetText(_InConfirm, "")
Notify::Toast("Password changed successfully.", Notify::#Success)
Else
Notify::Toast(GetJSONString(GetJSONMember(Root, "error")), Notify::#Error)
EndIf
FreeJSON(0)
Else
Notify::Toast("Unexpected server response.", Notify::#Error)
EndIf
EndProcedure
Procedure Handler_Close()
UnbindGadgetEvent(_PanelCanvas, @Handler_PanelCanvas())
UnbindGadgetEvent(_BtnSave, @Handler_Save())
UnbindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
Desktop::Unregister(Window)
Window = 0
EndProcedure
EndModule
; IDE Options = SpiderBasic 3.10 (Windows - x86)
; CursorPosition = 10
; Folding = Dw
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

View File

@ -0,0 +1,217 @@
DeclareModule TextEditor
Declare Open(FileID.s, Path.s)
EndDeclareModule
Module TextEditor
EnableExplicit
#MaxEditors = 16
#ToolbarHeight = 35
Global Dim _Windows.i(#MaxEditors)
Global Dim _Editors.i(#MaxEditors)
Global Dim _SaveBtns.i(#MaxEditors)
Global Dim _FileIDs.s(#MaxEditors)
Global Dim _Paths.s(#MaxEditors)
Global Dim _Dirty.i(#MaxEditors)
Global Dim _Saving.i(#MaxEditors)
Global _Count.i = 0
Global _Loading_Slot.i = -1
Global _ClosingSlot.i = -1 ; slot awaiting confirm-close callback
Declare _FindByWindow(Window.i)
Declare _FindByEditor(Editor.i)
Declare _SetDirty(Slot.i, Dirty.i)
Declare _Save(Slot.i)
Declare _Remove(Slot.i)
Declare _ConfirmCloseCallback(Result.i)
Declare _ReadCallback(Success.i, DataString.s)
Declare _SaveCallback(Success.i, DataString.s)
Declare Handler_Resize()
Declare Handler_Save()
Declare Handler_Change()
Declare Handler_Close()
Procedure Open(FileID.s, Path.s)
If _Count >= #MaxEditors
Notify::Toast("Too many editors open.", Notify::#Warning)
ProcedureReturn
EndIf
Protected Slot.i = _Count
Protected W.i = 600
Protected H.i = 400
Protected Win.i = OpenWindow(#PB_Any, 120 + Slot * 20, 60 + Slot * 20, W, H,
FS::GetFilePart(Path),
#PB_Window_TitleBar | #PB_Window_SizeGadget | #PB_Window_SystemMenu)
Protected SaveBtn.i = ButtonGadget(#PB_Any, 5, 3, 80, #ToolbarHeight - 6, "Save")
Protected Editor.i = EditorGadget(#PB_Any, 0, #ToolbarHeight, W, H - #ToolbarHeight)
_Windows(Slot) = Win
_Editors(Slot) = Editor
_SaveBtns(Slot) = SaveBtn
_FileIDs(Slot) = FileID
_Paths(Slot) = Path
_Dirty(Slot) = #False
_Count + 1
BindGadgetEvent(SaveBtn, @Handler_Save())
BindGadgetEvent(Editor, @Handler_Change())
BindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Win)
BindEvent(#PB_Event_CloseWindow, @Handler_Close(), Win)
Desktop::Register(FS::GetFilePart(Path), Win, "📄")
_Loading_Slot = Slot
FS::Read_(FileID, Path, @_ReadCallback())
EndProcedure
; Private procedures
Procedure.i _FindByWindow(Window.i)
Protected i.i
For i = 0 To _Count - 1
If _Windows(i) = Window : ProcedureReturn i : EndIf
Next
ProcedureReturn -1
EndProcedure
Procedure.i _FindByEditor(Editor.i)
Protected i.i
For i = 0 To _Count - 1
If _Editors(i) = Editor : ProcedureReturn i : EndIf
Next
ProcedureReturn -1
EndProcedure
Procedure _SetDirty(Slot.i, Dirty.i)
_Dirty(Slot) = Dirty
Protected Title.s = FS::GetFilePart(_Paths(Slot))
If Dirty : Title = "* " + Title : EndIf
SetWindowTitle(_Windows(Slot), Title)
EndProcedure
Procedure _Save(Slot.i)
If Not IsWindow(_Windows(Slot)) : ProcedureReturn : EndIf
If _Saving(Slot) : ProcedureReturn : EndIf
Protected Content.s = GetGadgetText(_Editors(Slot))
_Saving(Slot) = #True
DisableGadget(_SaveBtns(Slot), #True)
FS::Write(_FileIDs(Slot), _Paths(Slot), Content, @_SaveCallback())
EndProcedure
Procedure _Remove(Slot.i)
UnbindGadgetEvent(_SaveBtns(Slot), @Handler_Save())
UnbindGadgetEvent(_Editors(Slot), @Handler_Change())
UnbindEvent(#PB_Event_SizeWindow, @Handler_Resize(), _Windows(Slot))
UnbindEvent(#PB_Event_CloseWindow, @Handler_Close(), _Windows(Slot))
Desktop::Unregister(_Windows(Slot))
Protected i.i
For i = Slot To _Count - 2
_Windows(i) = _Windows(i + 1)
_Editors(i) = _Editors(i + 1)
_SaveBtns(i) = _SaveBtns(i + 1)
_FileIDs(i) = _FileIDs(i + 1)
_Paths(i) = _Paths(i + 1)
_Dirty(i) = _Dirty(i + 1)
_Saving(i) = _Saving(i + 1)
Next
_Windows(_Count - 1) = 0
_Editors(_Count - 1) = 0
_SaveBtns(_Count - 1) = 0
_FileIDs(_Count - 1) = ""
_Paths(_Count - 1) = ""
_Dirty(_Count - 1) = #False
_Saving(_Count - 1) = #False
_Count - 1
If _Loading_Slot = Slot : _Loading_Slot = -1 : EndIf
If _ClosingSlot = Slot : _ClosingSlot = -1 : EndIf
EndProcedure
; Called by Notify::Confirm — Result=1 means discard and close, 0 means cancel.
Procedure _ConfirmCloseCallback(Result.i)
If Result And _ClosingSlot >= 0
_Remove(_ClosingSlot)
EndIf
_ClosingSlot = -1
EndProcedure
; Callbacks
Procedure _ReadCallback(Success.i, DataString.s)
If _Loading_Slot < 0 : ProcedureReturn : EndIf
Protected Slot.i = _Loading_Slot
_Loading_Slot = -1
If Not IsWindow(_Windows(Slot)) : ProcedureReturn : EndIf
If Success
SetGadgetText(_Editors(Slot), DataString)
_SetDirty(Slot, #False)
Else
SetGadgetText(_Editors(Slot), "")
_SetDirty(Slot, #True)
EndIf
EndProcedure
Procedure _SaveCallback(Success.i, DataString.s)
Protected i.i
For i = 0 To _Count - 1
If _Saving(i)
_Saving(i) = #False
DisableGadget(_SaveBtns(i), #False)
If Success
_SetDirty(i, #False)
Else
Notify::Toast("Save failed — " + FS::GetFilePart(_Paths(i)), Notify::#Error)
EndIf
Break
EndIf
Next
EndProcedure
; Event handlers
Procedure Handler_Resize()
Protected Win.i = EventWindow()
Protected Slot.i = _FindByWindow(Win)
If Slot < 0 : ProcedureReturn : EndIf
ResizeGadget(_Editors(Slot), 0, #ToolbarHeight,
WindowWidth(Win), WindowHeight(Win) - #ToolbarHeight)
EndProcedure
Procedure Handler_Save()
Protected Slot.i = _FindByWindow(EventWindow())
If Slot >= 0 : _Save(Slot) : EndIf
EndProcedure
Procedure Handler_Change()
Protected Slot.i = _FindByEditor(EventGadget())
If Slot >= 0 And Not _Dirty(Slot)
_SetDirty(Slot, #True)
EndIf
EndProcedure
Procedure Handler_Close()
Protected Win.i = EventWindow()
Protected Slot.i = _FindByWindow(Win)
If Slot < 0 : ProcedureReturn : EndIf
If _Dirty(Slot)
_ClosingSlot = Slot
Notify::Confirm("Unsaved changes",
"Close " + Chr(34) + FS::GetFilePart(_Paths(Slot)) + Chr(34) + " without saving?",
@_ConfirmCloseCallback())
Else
_Remove(Slot)
EndIf
EndProcedure
EndModule
; IDE Options = SpiderBasic 3.10 (Windows - x86)
; CursorPosition = 69
; Folding = DA5
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

View File

@ -0,0 +1,73 @@
DeclareModule WebBrowser
Declare Open()
EndDeclareModule
Module WebBrowser
EnableExplicit
#Toolbar_Height = 35
#Window_W = 800
#Window_H = 600
Global Window.i = 0
Global UrlBar.i
Global WebView.i
Declare Handler_Resize()
Declare Handler_Navigate()
Declare Handler_Close()
Procedure Open()
If IsWindow(Window)
SetActiveWindow(Window)
ProcedureReturn
EndIf
Window = OpenWindow(#PB_Any, 100, 60, #Window_W, #Window_H, "Web Browser",
#PB_Window_TitleBar | #PB_Window_SizeGadget | #PB_Window_SystemMenu)
UrlBar = StringGadget(#PB_Any, 4, 5, #Window_W - 8, #Toolbar_Height - 10, "https://lastlife.net")
WebView = WebGadget(#PB_Any, 0, #Toolbar_Height, #Window_W, #Window_H - #Toolbar_Height, "https://lastlife.net")
BindGadgetEvent(UrlBar, @Handler_Navigate())
BindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Window)
BindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
Desktop::Register("Web Browser", Window, "🌐")
EndProcedure
Procedure Handler_Navigate()
; Protected URL.s = Trim(GetGadgetText(UrlBar))
; If URL = "" : ProcedureReturn : EndIf
; If Left(URL, 4) <> "http"
; URL = "https://" + URL
; SetGadgetText(UrlBar, URL)
; EndIf
; SetGadgetAttribute(WebView, #PB_Web_URL, URL)
EndProcedure
Procedure Handler_Resize()
Protected W.i = WindowWidth(Window)
Protected H.i = WindowHeight(Window)
ResizeGadget(UrlBar, 4, 5, W - 8, #Toolbar_Height - 10)
ResizeGadget(WebView, 0, #Toolbar_Height, W, H - #Toolbar_Height)
EndProcedure
Procedure Handler_Close()
UnbindGadgetEvent(UrlBar, @Handler_Navigate())
UnbindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Window)
UnbindEvent(#PB_Event_CloseWindow, @Handler_Close(), Window)
Desktop::Unregister(Window)
Window = 0
EndProcedure
EndModule
; IDE Options = SpiderBasic 3.10 (Windows - x86)
; CursorPosition = 29
; Folding = --
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

View File

@ -0,0 +1,409 @@
Module AppRuntime
EnableExplicit
;- Instance structure
Structure Instance
InstanceID.i ; stable unique ID — used as the JS↔SB bridge key
Window.i
View.i
AppID.s
Perms.s
EndStructure
Global NewList Instances.Instance()
Global _NextID = 1 ; auto-incrementing ID counter
;- Pending async operations
; One pending op of each type at a time (JS is single-threaded).
Global _PL_ID = -1 : Global _PL_KMID.s = "" ; list
Global _PS_ID = -1 : Global _PS_KMID.s = "" ; stat (standalone)
Global _PSR_ID = -1 : Global _PSR_KMID.s = "" ; stat-before-read/delete
Global _PR_ID = -1 : Global _PR_KMID.s = "" ; read
Global _PW_ID = -1 : Global _PW_KMID.s = "" ; write / mkdir / delete
Global _PC_ID = -1 : Global _PC_KMID.s = "" ; confirm dialog
;- Private declarations
Declare _FindByID(ID)
Declare _FindByWindow(Win)
Declare _HasPerm(ID, Token.s)
Declare _SendResponse(ID, KMID.s, Success, DataString.s)
Declare.s _StoragePath(ID, RelPath.s)
Declare _Remove(ID)
Declare _CloseByID(ID)
Declare _Dispatch(ID, RawMsg.s)
Declare _DoList(ID, KMID.s, Path.s)
Declare _DoStat(ID, KMID.s, Path.s)
Declare _DoStatForRead(ID, KMID.s, Path.s)
Declare _DoRead(ID, KMID.s, FileID)
Declare _DoWrite(ID, KMID.s, Path.s, Content.s)
Declare _DoMkdir(ID, KMID.s, Path.s)
Declare _DoDelete(ID, KMID.s, Path.s)
Declare _ListCallback(Success, DataString.s)
Declare _StatCallback(Success, DataString.s)
Declare _StatForReadCallback(Success, DataString.s)
Declare _ReadCallback(Success, DataString.s)
Declare _WriteCallback(Success, DataString.s)
Declare _ConfirmCallback(Result)
Declare Handler_Resize()
Declare Handler_Close()
;- Public procedures
; Call once from Desktop::Open.
Procedure Init()
!window._kumos_rt = { instances: {} };
!window.addEventListener('message', function(e) {
! var inst;
! for (var id in window._kumos_rt.instances) {
! inst = window._kumos_rt.instances[id];
! if (inst && inst.frameEl && inst.frameEl.contentWindow === e.source) {
! if (typeof e.data === 'string') {
! appruntime$f__dispatch(inst.id, e.data);
! }
! return;
! }
! }
!});
EndProcedure
; Open a new sandboxed app window.
Procedure Launch(AppID.s, ManifestJSON.s, Permissions.s)
Protected Count, W, H, Win, View, ID
Protected AppName.s, N.s, Src.s
AppName = AppID
If ParseJSON(0, ManifestJSON)
N = GetJSONString(GetJSONMember(JSONValue(0), "name"))
If N <> "" : AppName = N : EndIf
FreeJSON(0)
EndIf
Count = ListSize(Instances())
W = 640
H = 480
Win = OpenWindow(#PB_Any, 80 + (Count % 8) * 24, 80 + (Count % 8) * 24, W, H, AppName, #PB_Window_TitleBar | #PB_Window_SizeGadget | #PB_Window_SystemMenu)
View = WebGadget(#PB_Any, 0, 0, W, H, "about:blank")
Src = "/api/apps/" + AppID + "/index.html"
ID = _NextID
_NextID + 1
!(function(){
! var frames = document.querySelectorAll('iframe[src="about:blank"]:not([data-kumos-instance])');
! var f = frames[frames.length - 1];
! if (!f) return;
! f.setAttribute('data-kumos-instance', String(v_id));
! // No allow-same-origin -> cross-origin isolation even from same host.
! f.setAttribute('sandbox', 'allow-scripts allow-forms allow-modals allow-downloads allow-pointer-lock');
! window._kumos_rt.instances[v_id] = { id: v_id, frameEl: f, appId: v_appid };
! f.src = v_src;
!})();
AddElement(Instances())
Instances()\InstanceID = ID
Instances()\Window = Win
Instances()\View = View
Instances()\AppID = AppID
Instances()\Perms = Permissions
BindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Win)
BindEvent(#PB_Event_CloseWindow, @Handler_Close(), Win)
Desktop::Register(AppName, Win, "📦")
EndProcedure
;- Private procedures
; Leaves list cursor on the found element. Returns #True if found.
Procedure _FindByID(ID)
ForEach Instances()
If Instances()\InstanceID = ID : ProcedureReturn #True : EndIf
Next
ProcedureReturn #False
EndProcedure
Procedure _FindByWindow(Win)
ForEach Instances()
If Instances()\Window = Win : ProcedureReturn #True : EndIf
Next
ProcedureReturn #False
EndProcedure
Procedure _HasPerm(ID, Token.s)
If Not _FindByID(ID) : ProcedureReturn #False : EndIf
ProcedureReturn Bool(FindString(Instances()\Perms, ~"\"" + Token + ~"\"") > 0)
EndProcedure
Procedure _SendResponse(ID, KMID.s, Success, DataString.s)
!var inst = window._kumos_rt.instances[v_id];
!if (!inst || !inst.frameEl) return;
!var resp = { kmid: v_kmid, success: !!v_success };
!if (v_success) {
! try { resp.data = JSON.parse(v_datastring); }
! catch(e) { resp.data = v_datastring || null; }
!} else {
! resp.error = v_datastring || 'Error';
!}
!try { inst.frameEl.contentWindow.postMessage(JSON.stringify(resp), '*'); } catch(e) {}
EndProcedure
Procedure.s _StoragePath(ID, RelPath.s)
Protected Base.s
If Not _FindByID(ID) : ProcedureReturn "" : EndIf
Base = "/.apps/" + Instances()\AppID + "/"
If RelPath = "" Or RelPath = "/" : ProcedureReturn Base : EndIf
If Left(RelPath, 1) = "/" : RelPath = Mid(RelPath, 2) : EndIf
ProcedureReturn Base + RelPath
EndProcedure
Procedure _Remove(ID)
If Not _FindByID(ID) : ProcedureReturn : EndIf
!delete window._kumos_rt.instances[v_id];
UnbindEvent(#PB_Event_SizeWindow, @Handler_Resize(), Instances()\Window)
UnbindEvent(#PB_Event_CloseWindow, @Handler_Close(), Instances()\Window)
Desktop::Unregister(Instances()\Window)
DeleteElement(Instances())
EndProcedure
Procedure _CloseByID(ID)
_Remove(ID)
EndProcedure
;- Message dispatcher
Procedure _Dispatch(ID, RawMsg.s)
Protected Root, Args, TType
Protected KMID.s, Action.s, Path.s, Content.s, Title_.s, Msg.s, MsgType.s
If Not _FindByID(ID) : ProcedureReturn : EndIf
If Not ParseJSON(0, RawMsg) : ProcedureReturn : EndIf
Root = JSONValue(0)
KMID = GetJSONString(GetJSONMember(Root, "kmid"))
Action = GetJSONString(GetJSONMember(Root, "action"))
Args = GetJSONMember(Root, "args")
If KMID = "" : FreeJSON(0) : ProcedureReturn : EndIf
Path = GetJSONString(GetJSONMember(Args, "path"))
Content = GetJSONString(GetJSONMember(Args, "content"))
Title_ = GetJSONString(GetJSONMember(Args, "title"))
Msg = GetJSONString(GetJSONMember(Args, "message"))
MsgType = GetJSONString(GetJSONMember(Args, "type"))
FreeJSON(0)
Select Action
Case "window.ready"
_FindByID(ID)
_SendResponse(ID, KMID, #True, ~"{\"app_id\":\"" + ReplaceString(Instances()\AppID, ~"\"", ~"\\\"") + ~"\"}")
Case "window.setTitle"
_FindByID(ID)
SetWindowTitle(Instances()\Window, Title_)
_SendResponse(ID, KMID, #True, "")
Case "window.close"
_SendResponse(ID, KMID, #True, "")
!setTimeout(function(){ appruntime$f__closebyid(v_id); }, 50);
Case "notify.toast"
If Not _HasPerm(ID, "notify") : _SendResponse(ID, KMID, #False, "Permission denied: notify") : ProcedureReturn : EndIf
TType = Notify::#Info
If MsgType = "success" : TType = Notify::#Success
ElseIf MsgType = "warning" : TType = Notify::#Warning
ElseIf MsgType = "error" : TType = Notify::#Error
EndIf
Notify::Toast(Msg, TType)
_SendResponse(ID, KMID, #True, "")
Case "notify.confirm"
If Not _HasPerm(ID, "notify") : _SendResponse(ID, KMID, #False, "Permission denied: notify") : ProcedureReturn : EndIf
If _PC_ID >= 0 : _SendResponse(ID, KMID, #False, "A dialog is already open") : ProcedureReturn : EndIf
_PC_ID = ID : _PC_KMID = KMID
Notify::Confirm(Title_, Msg, @_ConfirmCallback())
Case "storage.list" : _DoList(ID, KMID, _StoragePath(ID, Path))
Case "storage.stat" : _DoStat(ID, KMID, _StoragePath(ID, Path))
Case "storage.read" : _DoStatForRead(ID, KMID, _StoragePath(ID, Path))
Case "storage.write" : _DoWrite(ID, KMID, _StoragePath(ID, Path), Content)
Case "storage.mkdir" : _DoMkdir(ID, KMID, _StoragePath(ID, Path))
Case "storage.delete" : _DoDelete(ID, KMID, _StoragePath(ID, Path))
Case "fs.list"
If Not _HasPerm(ID, "fs.read") : _SendResponse(ID, KMID, #False, "Permission denied: fs.read") : ProcedureReturn : EndIf
_DoList(ID, KMID, Path)
Case "fs.stat"
If Not _HasPerm(ID, "fs.read") : _SendResponse(ID, KMID, #False, "Permission denied: fs.read") : ProcedureReturn : EndIf
_DoStat(ID, KMID, Path)
Case "fs.read"
If Not _HasPerm(ID, "fs.read") : _SendResponse(ID, KMID, #False, "Permission denied: fs.read") : ProcedureReturn : EndIf
_DoStatForRead(ID, KMID, Path)
Case "fs.write"
If Not _HasPerm(ID, "fs.write") : _SendResponse(ID, KMID, #False, "Permission denied: fs.write") : ProcedureReturn : EndIf
_DoWrite(ID, KMID, Path, Content)
Default
_SendResponse(ID, KMID, #False, "Unknown action: " + Action)
EndSelect
EndProcedure
;- Async FS helpers
Procedure _DoList(ID, KMID.s, Path.s)
If _PL_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
_PL_ID = ID : _PL_KMID = KMID
HTTPRequest(#PB_HTTP_Get, "/api/fs/list?path=" + URLEncoder(Path, #PB_UTF8), "", @_ListCallback())
EndProcedure
Procedure _DoStat(ID, KMID.s, Path.s)
If _PS_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
_PS_ID = ID : _PS_KMID = KMID
HTTPRequest(#PB_HTTP_Get, "/api/fs/stat?path=" + URLEncoder(Path, #PB_UTF8), "", @_StatCallback())
EndProcedure
Procedure _DoStatForRead(ID, KMID.s, Path.s)
If _PSR_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
_PSR_ID = ID : _PSR_KMID = KMID
HTTPRequest(#PB_HTTP_Get, "/api/fs/stat?path=" + URLEncoder(Path, #PB_UTF8), "", @_StatForReadCallback())
EndProcedure
Procedure _DoRead(ID, KMID.s, FileID)
If _PR_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
_PR_ID = ID : _PR_KMID = KMID
HTTPRequest(#PB_HTTP_Get, "/api/fs/read?id=" + FileID, "", @_ReadCallback())
EndProcedure
Procedure _DoWrite(ID, KMID.s, Path.s, Content.s)
If _PW_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
_PW_ID = ID : _PW_KMID = KMID
HTTPRequest(#PB_HTTP_Post, "/api/fs/write", "path=" + URLEncoder(Path, #PB_UTF8) + "&content=" + URLEncoder(Content, #PB_UTF8), @_WriteCallback())
EndProcedure
Procedure _DoMkdir(ID, KMID.s, Path.s)
If _PW_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
_PW_ID = ID : _PW_KMID = KMID
HTTPRequest(#PB_HTTP_Post, "/api/fs/mkdir", "path=" + URLEncoder(Path, #PB_UTF8), @_WriteCallback())
EndProcedure
Procedure _DoDelete(ID, KMID.s, Path.s)
If _PSR_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
_PSR_ID = ID : _PSR_KMID = "DEL:" + KMID
HTTPRequest(#PB_HTTP_Get, "/api/fs/stat?path=" + URLEncoder(Path, #PB_UTF8), "", @_StatForReadCallback())
EndProcedure
;- Callbacks
Procedure _ListCallback(Success, DataString.s)
Protected ID
Protected KMID.s
If _PL_ID < 0 : ProcedureReturn : EndIf
ID = _PL_ID : KMID = _PL_KMID
_PL_ID = -1 : _PL_KMID = ""
_SendResponse(ID, KMID, Success, DataString)
EndProcedure
Procedure _StatCallback(Success, DataString.s)
Protected ID
Protected KMID.s
If _PS_ID < 0 : ProcedureReturn : EndIf
ID = _PS_ID : KMID = _PS_KMID
_PS_ID = -1 : _PS_KMID = ""
_SendResponse(ID, KMID, Success, DataString)
EndProcedure
Procedure _StatForReadCallback(Success, DataString.s)
Protected ID, IsDelete, IsDir, FileID, Root
Protected Tag.s, KMID.s
If _PSR_ID < 0 : ProcedureReturn : EndIf
ID = _PSR_ID
Tag = _PSR_KMID
_PSR_ID = -1 : _PSR_KMID = ""
IsDelete = Bool(Left(Tag, 4) = "DEL:")
If IsDelete : KMID = Mid(Tag, 5) : Else : KMID = Tag : EndIf
If Not Success : _SendResponse(ID, KMID, #False, "Not found") : ProcedureReturn : EndIf
If Not ParseJSON(0, DataString) : _SendResponse(ID, KMID, #False, "Bad stat response") : ProcedureReturn : EndIf
Root = JSONValue(0)
IsDir = GetJSONInteger(GetJSONMember(Root, "is_dir"))
FileID = GetJSONInteger(GetJSONMember(Root, "id"))
FreeJSON(0)
If FileID <= 0 : _SendResponse(ID, KMID, #False, "Not found") : ProcedureReturn : EndIf
If IsDelete
If _PW_ID >= 0 : _SendResponse(ID, KMID, #False, "Busy") : ProcedureReturn : EndIf
_PW_ID = ID : _PW_KMID = KMID
HTTPRequest(#PB_HTTP_Post, "/api/fs/delete", "id=" + FileID, @_WriteCallback())
Else
If IsDir : _SendResponse(ID, KMID, #False, "Is a directory") : ProcedureReturn : EndIf
_DoRead(ID, KMID, FileID)
EndIf
EndProcedure
Procedure _ReadCallback(Success, DataString.s)
Protected ID
Protected KMID.s
If _PR_ID < 0 : ProcedureReturn : EndIf
ID = _PR_ID : KMID = _PR_KMID
_PR_ID = -1 : _PR_KMID = ""
_SendResponse(ID, KMID, Success, DataString)
EndProcedure
Procedure _WriteCallback(Success, DataString.s)
Protected ID, OK
Protected KMID.s
If _PW_ID < 0 : ProcedureReturn : EndIf
ID = _PW_ID : KMID = _PW_KMID
_PW_ID = -1 : _PW_KMID = ""
If Not Success : _SendResponse(ID, KMID, #False, "Request failed") : ProcedureReturn : EndIf
If ParseJSON(0, DataString)
OK = GetJSONBoolean(GetJSONMember(JSONValue(0), "success"))
FreeJSON(0)
_SendResponse(ID, KMID, OK, "")
Else
_SendResponse(ID, KMID, #False, "Bad server response")
EndIf
EndProcedure
Procedure _ConfirmCallback(Result)
Protected ID
Protected KMID.s, BoolStr.s
If _PC_ID < 0 : ProcedureReturn : EndIf
ID = _PC_ID : KMID = _PC_KMID
_PC_ID = -1 : _PC_KMID = ""
BoolStr = "false"
If Result : BoolStr = "true" : EndIf
_SendResponse(ID, KMID, #True, BoolStr)
EndProcedure
;- Window event handlers
Procedure Handler_Resize()
If Not _FindByWindow(EventWindow()) : ProcedureReturn : EndIf
ResizeGadget(Instances()\View, 0, 0, WindowWidth(Instances()\Window), WindowHeight(Instances()\Window))
EndProcedure
Procedure Handler_Close()
If Not _FindByWindow(EventWindow()) : ProcedureReturn : EndIf
_Remove(Instances()\InstanceID)
EndProcedure
EndModule
; IDE Options = SpiderBasic 3.20 (Windows - x86)
; CursorPosition = 2
; Folding = BAAA9
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

603
Client/Includes/Desktop.sbi Normal file
View File

@ -0,0 +1,603 @@
Module Desktop
EnableExplicit
;- Constants
#Timer_Clock = 0
#Taskbar_Width = 72
#Taskbar_ItemHeight = 40
#Icon_Size = 28
#Menu_W = 240
#Menu_Rail_W = 52
#Menu_Header_H = 32
#Menu_Row_H = 44
#Menu_Icon_Size = 22
; Hit-test return values for the start menu
Enumeration
#Hit_None = -1
#Hit_Settings = -2
#Hit_Logout = -3
EndEnumeration
;- Globals
; Colors
Global Color_Bar_Bg = RGB( 28, 28, 40)
Global Color_Bar_Active = RGB( 52, 52, 72)
Global Color_Accent = RGB(100, 120, 255)
Global Color_Icon = RGBA(220, 220, 220, 255)
Global Color_Menu_Bg = RGB( 36, 36, 52)
Global Color_Menu_Rail = RGB( 22, 22, 34)
Global Color_Menu_Header = RGB( 22, 22, 34)
Global Color_Menu_Hover = RGB( 55, 55, 78)
Global Color_Menu_Sep = RGB( 48, 48, 65)
Global Color_Menu_Text = RGB(200, 200, 215)
Global Color_Menu_Dim = RGB(110, 110, 135)
Global Color_Logout_Hover = RGB( 65, 30, 35)
Global Color_Logout_Icon = RGBA(200, 90, 90, 255)
Global IconFont = LoadFont(#PB_Any, "sans-serif", 18)
Global MenuFont = LoadFont(#PB_Any, "sans-serif", 13)
; Desktop windows
Global TaskBarWindow
Global ClockLabel
Global StartButton
Global StartMenuWindow
; App registry
Structure App
Name.s
IconImg.i
Proc.i
ID.s
EndStructure
#MaxInstalledApps = 32
Global Dim AppRegistry.App(#MaxInstalledApps)
Global _AppCount
Global _MenuCanvas
Global _MenuHover = #Hit_None
; System shortcut icons (created in Open)
Global _IconSettings
Global _IconLogout
; Window manager state
Structure Window
Window.i
Button.i
Name.s
Icon.i
EndStructure
Global _ActiveWindow
Global NewList WindowManager.Window()
;- Private declarations
Declare _MakeIconImage(Label.s, Size = #Icon_Size, Color = 0)
Declare _MenuHeight()
Declare _HitTest(MX, MY)
Declare _RebuildMenu()
Declare _DrawMenu()
Declare _CloseMenu()
Declare _FindByWindow(Win)
Declare _FindByButton(Btn)
Declare _DrawButton()
Declare _SetActiveButton()
Declare _RebuildButtons()
Declare _LoadInstalledAppsCallback(Success, DataString.s)
Declare Handler_Logout()
Declare LogoutCallback(Success, Response.s)
Declare Handler_Resize()
Declare Handler_Clock()
Declare Handler_StartButton()
Declare Handler_StartMenu_Focus()
Declare Handler_MenuCanvas()
Declare Handler_TaskbarButton()
Declare Handler_AppClose()
Declare Handler_AppActivate()
;- Public procedures
Procedure Open(Username.s)
Protected Width, Height
Protected *AppProc
Width = DesktopWidth(0)
Height = DesktopHeight(0)
; System shortcut icons — pass explicit colors at creation time
_IconSettings = _MakeIconImage("⚙", #Menu_Icon_Size, Color_Logout_Icon)
_IconLogout = _MakeIconImage("⏻", #Menu_Icon_Size, Color_Logout_Icon)
TaskBarWindow = OpenWindow(#PB_Any, 0, 0, #Taskbar_Width, Height, "", #PB_Window_BorderLess)
BindEvent(#PB_Event_ActivateWindow, @Handler_AppActivate(), TaskBarWindow)
StickyWindow(TaskBarWindow, #True)
SetWindowColor(TaskBarWindow, Color_Bar_Bg)
StartButton = ButtonGadget(#PB_Any, 0, 0, #Taskbar_Width, #Taskbar_ItemHeight, "≡")
BindGadgetEvent(StartButton, @Handler_StartButton())
ClockLabel = TextGadget(#PB_Any, 0, Height - #Taskbar_ItemHeight, #Taskbar_Width, #Taskbar_ItemHeight, "", #PB_Text_Center | #PB_Text_VerticalCenter)
SetGadgetColor(ClockLabel, #PB_Gadget_FrontColor, Color_Menu_Text)
Handler_Clock()
AddWindowTimer(TaskBarWindow, #Timer_Clock, 1000)
BindEvent(#PB_Event_Timer, @Handler_Clock(), TaskBarWindow)
StartMenuWindow = OpenWindow(#PB_Any, #Taskbar_Width + 4, 0, #Menu_W, 100, "", #PB_Window_BorderLess | #PB_Window_Invisible)
StickyWindow(StartMenuWindow, #True)
_MenuCanvas = CanvasGadget(#PB_Any, 0, 0, #Menu_W, 100)
BindGadgetEvent(_MenuCanvas, @Handler_MenuCanvas())
BindEvent(#PB_Event_SizeDesktop, @Handler_Resize())
BindEvent(#PB_Event_DeactivateWindow, @Handler_StartMenu_Focus(), StartMenuWindow)
AppRuntime::Init()
!p_appproc = fileexplorer$f_open;
InstallApp("File Explorer", *AppProc, "📁")
!p_appproc = webbrowser$f_open;
InstallApp("Web Browser", *AppProc, "🌐")
!p_appproc = appmanager$f_open;
InstallApp("App Manager", *AppProc, "📦")
Handler_Resize()
HTTPRequest(#PB_HTTP_Get, "/api/apps/list", "", @_LoadInstalledAppsCallback())
EndProcedure
Procedure InstallApp(AppName.s, *LaunchProc, Icon.s = "")
Protected Slot
Protected Label.s
If _AppCount >= #MaxInstalledApps : ProcedureReturn : EndIf
Slot = _AppCount
Label = Icon
If Label = "" : Label = Left(AppName, 2) : EndIf
AppRegistry(Slot)\Name = AppName
AppRegistry(Slot)\Proc = *LaunchProc
AppRegistry(Slot)\IconImg = _MakeIconImage(Label, #Menu_Icon_Size)
_AppCount + 1
_RebuildMenu()
EndProcedure
Procedure Register(AppName.s, Win, Icon.s = "")
Protected Y, GadgetList, Btn
Protected Label.s
AddElement(WindowManager())
WindowManager()\Window = Win
WindowManager()\Name = AppName
Label = Icon
If Label = "" : Label = Left(AppName, 2) : EndIf
WindowManager()\Icon = _MakeIconImage(Label)
Y = #Taskbar_ItemHeight + (ListIndex(WindowManager()) * #Taskbar_ItemHeight)
GadgetList = UseGadgetList(WindowID(TaskBarWindow))
Btn = CanvasGadget(#PB_Any, 0, Y, #Taskbar_Width, #Taskbar_ItemHeight)
UseGadgetList(GadgetList)
WindowManager()\Button = Btn
SetGadgetData(Btn, Win)
SetWindowData(Win, Btn)
BindGadgetEvent(Btn, @Handler_TaskbarButton())
BindEvent(#PB_Event_CloseWindow, @Handler_AppClose(), Win)
BindEvent(#PB_Event_ActivateWindow, @Handler_AppActivate(), Win)
_ActiveWindow = Win
_SetActiveButton()
EndProcedure
Procedure Unregister(Win)
If Not _FindByWindow(Win) : ProcedureReturn : EndIf
UnbindEvent(#PB_Event_CloseWindow, @Handler_AppClose(), Win)
UnbindEvent(#PB_Event_ActivateWindow, @Handler_AppActivate(), Win)
UnbindGadgetEvent(WindowManager()\Button, @Handler_TaskbarButton())
FreeGadget(WindowManager()\Button)
CloseWindow(Win)
DeleteElement(WindowManager())
If _ActiveWindow = Win : _ActiveWindow = GetActiveWindow() : EndIf
_RebuildButtons()
EndProcedure
Procedure InstallThirdPartyApp(AppID.s, ManifestJSON.s, Permissions.s, Icon.s = "")
Protected Slot, i
Protected AppName.s, Label.s, N.s
Slot = -1
For i = 0 To _AppCount - 1
If AppRegistry(i)\ID = AppID : Slot = i : Break : EndIf
Next
If Slot < 0
If _AppCount >= #MaxInstalledApps : ProcedureReturn : EndIf
Slot = _AppCount
_AppCount + 1
Else
If IsImage(AppRegistry(Slot)\IconImg) : FreeImage(AppRegistry(Slot)\IconImg) : EndIf
EndIf
AppName = AppID
If ParseJSON(0, ManifestJSON)
N = GetJSONString(GetJSONMember(JSONValue(0), "name"))
If N <> "" : AppName = N : EndIf
FreeJSON(0)
EndIf
AppRegistry(Slot)\Name = AppName
AppRegistry(Slot)\ID = AppID
!(function() {
! var _id = v_appid, _m = v_manifestjson, _p = v_permissions;
! desktop$a_AppRegistry.array[v_slot]._Proc = function() {
! appruntime$f_launch(_id, _m, _p);
! };
!})();
Label = Icon
If Label = "" : Label = "📦" : EndIf
AppRegistry(Slot)\IconImg = _MakeIconImage(Label, #Menu_Icon_Size)
_RebuildMenu()
EndProcedure
Procedure UninstallThirdPartyApp(AppID.s)
Protected i, j
For i = 0 To _AppCount - 1
If AppRegistry(i)\ID = AppID
If IsImage(AppRegistry(i)\IconImg) : FreeImage(AppRegistry(i)\IconImg) : EndIf
; Compact the registry
For j = i To _AppCount - 2
AppRegistry(j)\Name = AppRegistry(j + 1)\Name
AppRegistry(j)\ID = AppRegistry(j + 1)\ID
AppRegistry(j)\IconImg = AppRegistry(j + 1)\IconImg
AppRegistry(j)\Proc = AppRegistry(j + 1)\Proc
!desktop$a_AppRegistry.array[v_j]._Proc = desktop$a_AppRegistry.array[v_j + 1]._Proc;
Next
AppRegistry(_AppCount - 1)\Name = ""
AppRegistry(_AppCount - 1)\ID = ""
AppRegistry(_AppCount - 1)\IconImg = 0
AppRegistry(_AppCount - 1)\Proc = 0
!desktop$a_AppRegistry.array[desktop$g__appcount]._Proc = 0;
_AppCount - 1
_RebuildMenu()
ProcedureReturn
EndIf
Next
EndProcedure
;- Private procedures
Procedure _MakeIconImage(Label.s, Size = #Icon_Size, Color = 0)
Protected Img
Img = CreateImage(#PB_Any, Size, Size, 32, RGBA(0, 0, 0, 0))
If Not IsImage(Img) : ProcedureReturn 0 : EndIf
If StartVectorDrawing(ImageVectorOutput(Img))
VectorFont(IconFont, Size * 0.65)
If Color = 0
VectorSourceColor(Color_Icon)
Else
VectorSourceColor(Color)
EndIf
;MovePathCursor((Size - VectorTextWidth(Label)) / 2, (Size - VectorTextHeight(Label)) / 2)
;In 3.20 DrawVectorText() draws vertically centered?
MovePathCursor((Size - VectorTextWidth(Label)) / 2, Size - (VectorTextHeight(Label) / 2))
DrawVectorText(Label)
StopVectorDrawing()
EndIf
ProcedureReturn Img
EndProcedure
Procedure _MenuHeight()
Protected RightH = #Menu_Header_H + _AppCount * #Menu_Row_H + 8
Protected MinH = 2 * #Menu_Row_H + 16 ; always room for both rail shortcuts
If RightH < MinH : ProcedureReturn MinH : EndIf
ProcedureReturn RightH
EndProcedure
; Returns app index (>=0), #Hit_Settings, #Hit_Logout, or #Hit_None.
Procedure _HitTest(MX, MY)
Protected H, LogoutY, SettingsY, RY
H = _MenuHeight()
If MX < #Menu_Rail_W
; Left rail — system shortcuts are bottom-anchored
LogoutY = H - #Menu_Row_H
SettingsY = H - 2 * #Menu_Row_H
If MY >= SettingsY And MY < LogoutY
ProcedureReturn #Hit_Settings
ElseIf MY >= LogoutY And MY < H
ProcedureReturn #Hit_Logout
EndIf
Else
; Right panel — app rows below header
RY = MY - #Menu_Header_H
If RY >= 0 And RY < _AppCount * #Menu_Row_H
ProcedureReturn RY / #Menu_Row_H
EndIf
EndIf
ProcedureReturn #Hit_None
EndProcedure
Procedure _RebuildMenu()
Protected H = _MenuHeight()
If IsWindow(StartMenuWindow) : ResizeWindow(StartMenuWindow, #PB_Ignore, #PB_Ignore, #Menu_W, H) : EndIf
If IsGadget(_MenuCanvas) : ResizeGadget(_MenuCanvas, 0, 0, #Menu_W, H) : EndIf
_DrawMenu()
EndProcedure
Procedure _DrawMenu()
If Not IsGadget(_MenuCanvas) : ProcedureReturn : EndIf
If Not StartDrawing(CanvasOutput(_MenuCanvas)) : ProcedureReturn : EndIf
Protected W = OutputWidth()
Protected H = OutputHeight()
Protected TH, IX, IY, i, Y
; ── Left rail ────────────────────────────────────────────────────────
Box(0, 0, #Menu_Rail_W, H, Color_Menu_Rail)
Protected SettingsY = H - 2 * #Menu_Row_H
Protected LogoutY = H - #Menu_Row_H
If _MenuHover = #Hit_Settings
Box(0, SettingsY, #Menu_Rail_W, #Menu_Row_H, Color_Menu_Hover)
EndIf
If _MenuHover = #Hit_Logout
Box(0, LogoutY, #Menu_Rail_W, #Menu_Row_H, Color_Logout_Hover)
EndIf
If IsImage(_IconSettings)
IX = (#Menu_Rail_W - #Menu_Icon_Size) / 2
IY = SettingsY + (#Menu_Row_H - #Menu_Icon_Size) / 2
DrawAlphaImage(ImageID(_IconSettings), IX, IY)
EndIf
If IsImage(_IconLogout)
IX = (#Menu_Rail_W - #Menu_Icon_Size) / 2
IY = LogoutY + (#Menu_Row_H - #Menu_Icon_Size) / 2
DrawAlphaImage(ImageID(_IconLogout), IX, IY)
EndIf
; Separator between rail and right panel
Box(#Menu_Rail_W, 0, 1, H, Color_Menu_Sep)
; ── Right panel ──────────────────────────────────────────────────────
Box(#Menu_Rail_W + 1, 0, W - #Menu_Rail_W - 1, H, Color_Menu_Bg)
; Header
Box(#Menu_Rail_W + 1, 0, W - #Menu_Rail_W - 1, #Menu_Header_H, Color_Menu_Header)
DrawingMode(#PB_2DDrawing_Transparent)
If IsFont(MenuFont) : DrawingFont(FontID(MenuFont)) : EndIf
TH = TextHeight("A")
DrawText(#Menu_Rail_W + 14, (#Menu_Header_H - TH) / 2, "Apps", Color_Menu_Dim)
; App rows
Y = #Menu_Header_H
For i = 0 To _AppCount - 1
If _MenuHover = i
DrawingMode(#PB_2DDrawing_Default)
Box(#Menu_Rail_W + 1, Y, W - #Menu_Rail_W - 1, #Menu_Row_H, Color_Menu_Hover)
EndIf
If IsImage(AppRegistry(i)\IconImg)
IX = #Menu_Rail_W + 12
IY = Y + (#Menu_Row_H - #Menu_Icon_Size) / 2
DrawAlphaImage(ImageID(AppRegistry(i)\IconImg), IX, IY)
EndIf
DrawingMode(#PB_2DDrawing_Transparent)
TH = TextHeight("A")
DrawText(#Menu_Rail_W + 12 + #Menu_Icon_Size + 8,
Y + (#Menu_Row_H - TH) / 2,
AppRegistry(i)\Name, Color_Menu_Text)
Y + #Menu_Row_H
Next
StopDrawing()
EndProcedure
Procedure _CloseMenu()
HideWindow(StartMenuWindow, #True)
_MenuHover = #Hit_None
_DrawMenu()
EndProcedure
Procedure _FindByWindow(Win)
ForEach WindowManager()
If WindowManager()\Window = Win : ProcedureReturn #True : EndIf
Next
EndProcedure
Procedure _FindByButton(Btn)
ForEach WindowManager()
If WindowManager()\Button = Btn : ProcedureReturn #True : EndIf
Next
EndProcedure
Procedure _DrawButton()
Protected Active, W, H
Active = Bool(WindowManager()\Window = _ActiveWindow And _ActiveWindow <> 0)
If Not IsGadget(WindowManager()\Button) : ProcedureReturn : EndIf
If StartDrawing(CanvasOutput(WindowManager()\Button))
W = OutputWidth()
H = OutputHeight()
If Active
Box(0, 0, W, H, Color_Bar_Active)
Box(0, H / 4, 3, H / 2, Color_Accent)
Else
Box(0, 0, W, H, Color_Bar_Bg)
EndIf
If IsImage(WindowManager()\Icon)
DrawAlphaImage(ImageID(WindowManager()\Icon), (W - #Icon_Size) / 2, (H - #Icon_Size) / 2)
EndIf
StopDrawing()
EndIf
EndProcedure
Procedure _SetActiveButton()
ForEach WindowManager()
_DrawButton()
Next
EndProcedure
Procedure _RebuildButtons()
ForEach WindowManager()
ResizeGadget(WindowManager()\Button, 0, #Taskbar_ItemHeight + (ListIndex(WindowManager()) * #Taskbar_ItemHeight), #Taskbar_Width, #Taskbar_ItemHeight)
_DrawButton()
Next
EndProcedure
Procedure _LoadInstalledAppsCallback(Success, DataString.s)
Protected Root, Total, Item, ManiNode, PermNode, PermCount, i, j
Protected AppID.s, Icon.s, Perms.s, ManiStr.s
If Not Success Or Not ParseJSON(0, DataString) : ProcedureReturn : EndIf
Root = JSONValue(0)
Total = JSONArraySize(Root)
For i = 0 To Total - 1
Item = GetJSONElement(Root, i)
ManiNode = GetJSONMember(Item, "manifest")
AppID = GetJSONString(GetJSONMember(Item, "app_id"))
Icon = GetJSONString(GetJSONMember(ManiNode, "icon"))
PermNode = GetJSONMember(Item, "permissions")
PermCount = JSONArraySize(PermNode)
Perms = "["
For j = 0 To PermCount - 1
If j > 0 : Perms + "," : EndIf
Perms + ~"\"" + GetJSONString(GetJSONElement(PermNode, j)) + ~"\""
Next
Perms + "]"
; Re-serialise the manifest object to a JSON string for InstallThirdPartyApp
ManiStr = "{" +
~"\"id\":\"" + GetJSONString(GetJSONMember(ManiNode, "id")) + ~"\"," +
~"\"name\":\"" + GetJSONString(GetJSONMember(ManiNode, "name")) + ~"\"," +
~"\"version\":\"" + GetJSONString(GetJSONMember(ManiNode, "version")) + ~"\"," +
~"\"icon\":\"" + ReplaceString(Icon, ~"\"", ~"\\\"") + ~"\"," +
~"\"entry\":\"" + GetJSONString(GetJSONMember(ManiNode, "entry")) + ~"\"}"
InstallThirdPartyApp(AppID, ManiStr, Perms, Icon)
Next
FreeJSON(0)
EndProcedure
;- Event handlers
Procedure Handler_Resize()
Protected Width = DesktopWidth(0)
Protected Height = DesktopHeight(0)
ResizeWindow(TaskBarWindow, 0, 0, #Taskbar_Width, Height)
ResizeGadget(ClockLabel, 0, Height - #Taskbar_ItemHeight, #Taskbar_Width, #Taskbar_ItemHeight)
EndProcedure
Procedure Handler_Clock()
SetGadgetText(ClockLabel, FormatDate("%hh:%ii:%ss", Date()))
EndProcedure
Procedure Handler_StartButton()
HideWindow(StartMenuWindow, #False)
SetActiveWindow(StartMenuWindow)
EndProcedure
Procedure Handler_StartMenu_Focus()
_CloseMenu()
EndProcedure
Procedure Handler_Logout()
HTTPRequest(#PB_HTTP_Post, "/api/auth/logout", "", @LogoutCallback())
EndProcedure
Procedure LogoutCallback(Success, Response.s)
!location.reload()
EndProcedure
Procedure Handler_MenuCanvas()
Protected EType, MX, MY, Hit
EType = EventType()
MX = GetGadgetAttribute(_MenuCanvas, #PB_Canvas_MouseX)
MY = GetGadgetAttribute(_MenuCanvas, #PB_Canvas_MouseY)
Hit = _HitTest(MX, MY)
Select EType
Case #PB_EventType_MouseMove
If Hit <> _MenuHover
_MenuHover = Hit
_DrawMenu()
EndIf
Case #PB_EventType_MouseLeave
If _MenuHover <> #Hit_None
_MenuHover = #Hit_None
_DrawMenu()
EndIf
Case #PB_EventType_LeftButtonUp
Select Hit
Case #Hit_Settings
_CloseMenu()
!settings$f_open();
Case #Hit_Logout
_CloseMenu()
Handler_Logout()
Default
If Hit >= 0 And Hit < _AppCount And AppRegistry(Hit)\Proc <> 0
_CloseMenu()
!desktop$a_AppRegistry.array[v_hit]._Proc();
EndIf
EndSelect
EndSelect
EndProcedure
Procedure Handler_TaskbarButton()
Protected Btn, Win
If EventType() <> #PB_EventType_LeftButtonUp : ProcedureReturn : EndIf
Btn = EventGadget()
Win = GetGadgetData(Btn)
If Not IsWindow(Win) : ProcedureReturn : EndIf
If _ActiveWindow = Win
HideWindow(Win, #True)
_ActiveWindow = 0
Else
HideWindow(Win, #False)
SetActiveWindow(Win)
_ActiveWindow = Win
EndIf
_SetActiveButton()
EndProcedure
Procedure Handler_AppClose()
Protected Win = EventWindow()
If Not _FindByWindow(Win) : ProcedureReturn : EndIf
UnbindEvent(#PB_Event_CloseWindow, @Handler_AppClose(), Win)
UnbindEvent(#PB_Event_ActivateWindow, @Handler_AppActivate(), Win)
UnbindGadgetEvent(WindowManager()\Button, @Handler_TaskbarButton())
FreeGadget(WindowManager()\Button)
DeleteElement(WindowManager())
If _ActiveWindow = Win : _ActiveWindow = GetActiveWindow() : EndIf
_RebuildButtons()
CloseWindow(Win)
EndProcedure
Procedure Handler_AppActivate()
Protected Win = EventWindow()
If Win = TaskBarWindow : ProcedureReturn : EndIf
_ActiveWindow = Win
_SetActiveButton()
EndProcedure
EndModule
; IDE Options = SpiderBasic 3.20 (Windows - x86)
; CursorPosition = 95
; FirstLine = 82
; Folding = BAAAg
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

251
Client/Includes/FS.sbi Normal file
View File

@ -0,0 +1,251 @@
Module FS
EnableExplicit
;- Globals
; Pending operation state
; Safe because JS is single-threaded — one Read_ and one Write in flight at most.
Global _R_ID.s, _R_Path.s, _R_Content.s, *_R_Cb
Global _W_ID.s, _W_Path.s, _W_Content.s, *_W_Cb
;- Private declarations
Declare _FindLastSlash(Path.s)
Declare _ReadExistsCallback(Success, DataString.s)
Declare _ReadCachedCallback(Success, DataString.s)
Declare _ReadServerCallback(Success, DataString.s)
Declare _ReadCacheStoreCallback(Success, DataString.s)
Declare _WriteCacheCallback(Success, DataString.s)
Declare _WriteServerCallback(Success, DataString.s)
;- Public procedures
; List directory contents.
; DataString = JSON array of {id, name, is_dir, mime_type, size, modified_at}
Procedure List(Path.s, *Callback)
HTTPRequest(#PB_HTTP_Get, "/api/fs/list?path=" + URLEncoder(Path, #PB_UTF8), "", *Callback)
EndProcedure
; Stat a single node.
; DataString = JSON object with id, name, is_dir, size, etc. or error.
Procedure Stat(Path.s, *Callback)
HTTPRequest(#PB_HTTP_Get, "/api/fs/stat?path=" + URLEncoder(Path, #PB_UTF8), "", *Callback)
EndProcedure
; Read file content. Cache-first: if the file is in IndexedDB, returns it
; immediately without a server round-trip. Otherwise fetches from server
; and populates the cache for next time.
; FileID = string form of the numeric node id (from Stat or List).
; Path = virtual path, stored in cache meta for Sync to use later.
Procedure Read_(FileID.s, Path.s, *Callback)
_R_ID = FileID
_R_Path = Path
*_R_Cb = *Callback
FileCache::Exists(FileID, @_ReadExistsCallback())
EndProcedure
; Write content. Hits the cache immediately (dirty), fires the callback,
; then syncs to the server best-effort in the background.
; If the server write fails the file stays dirty — Sync() will retry it.
Procedure Write(FileID.s, Path.s, Content.s, *Callback)
_W_ID = FileID
_W_Path = Path
_W_Content = Content
*_W_Cb = *Callback
FileCache::Write(FileID, Content, @_WriteCacheCallback())
EndProcedure
; Create a directory.
; DataString = JSON {success:true, id:N} or error.
Procedure Mkdir(Path.s, *Callback)
HTTPRequest(#PB_HTTP_Post, "/api/fs/mkdir", "path=" + URLEncoder(Path, #PB_UTF8), *Callback)
EndProcedure
; Delete a node by ID. Evicts from cache too.
; DataString = JSON {success:true} or error.
Procedure Delete_(FileID.s, *Callback)
FileCache::Evict(FileID, #Null) ; best-effort, don't wait
HTTPRequest(#PB_HTTP_Post, "/api/fs/delete", "id=" + FileID, *Callback)
EndProcedure
; Move/rename a node by ID.
; DataString = JSON {success:true} or error.
Procedure Move(FileID.s, NewParentID.s, NewName.s, *Callback)
HTTPRequest(#PB_HTTP_Post, "/api/fs/move", "id=" + FileID + "&to_parent_id=" + NewParentID + "&name=" + URLEncoder(NewName, #PB_UTF8), *Callback)
EndProcedure
; Push all dirty cached files to the server sequentially.
Procedure Sync(*Callback)
!var _cb = p_callback;
!var _db = window._kumos_idb;
!if (!_db) { if (_cb) _cb(0, 'IDB not open'); return; }
!
!// Collect dirty entries from file_meta
!var tx = _db.transaction(['file_meta'], 'readonly');
!var store = tx.objectStore('file_meta');
!var req = store.openCursor();
!var dirty = [];
!
!req.onsuccess = function(ev) {
! var cursor = ev.target.result;
! if (cursor) {
! try {
! var meta = JSON.parse(cursor.value);
! if (meta.dirty) dirty.push({ id: String(cursor.key), path: meta.path });
! } catch(e) {}
! cursor.continue();
! }
!};
!
!tx.oncomplete = function() {
! if (dirty.length === 0) {
! if (_cb) _cb(1, JSON.stringify({ synced: 0, failed: 0 }));
! return;
! }
!
! var synced = 0, failed = 0, total = dirty.length;
!
! function markClean(id, onDone) {
! var wtx = _db.transaction(['file_meta'], 'readwrite');
! var ws = wtx.objectStore('file_meta');
! var gr = ws.get(id);
! gr.onsuccess = function(ev) {
! var m = {};
! try { m = JSON.parse(ev.target.result || '{}'); } catch(e) {}
! m.dirty = false;
! ws.put(JSON.stringify(m), id);
! };
! wtx.oncomplete = onDone;
! wtx.onerror = onDone;
! }
!
! function syncNext(i) {
! if (i >= total) {
! if (_cb) _cb(failed === 0 ? 1 : 0,
! JSON.stringify({ synced: synced, failed: failed }));
! return;
! }
! var entry = dirty[i];
!
! // Read content from IDB
! var rtx = _db.transaction(['file_content'], 'readonly');
! var rreq = rtx.objectStore('file_content').get(entry.id);
!
! rreq.onsuccess = function(ev) {
! var content = ev.target.result !== undefined ? String(ev.target.result) : '';
!
! // POST to server
! fetch('/api/fs/write', {
! method: 'POST',
! headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
! body: 'path=' + encodeURIComponent(entry.path) +
! '&content=' + encodeURIComponent(content)
! })
! .then(function(r) { return r.json(); })
! .then(function(json) {
! if (json.success) {
! markClean(entry.id, function() { synced++; syncNext(i + 1); });
! } else {
! failed++; syncNext(i + 1);
! }
! })
! .catch(function() { failed++; syncNext(i + 1); });
! };
!
! rreq.onerror = function() { failed++; syncNext(i + 1); };
! }
!
! syncNext(0);
!};
!
!tx.onerror = function(e) {
! if (_cb) _cb(0, e.target.error ? e.target.error.message : 'sync scan failed');
!};
EndProcedure
Procedure.s GetFilePart(Path.s)
Protected Last = _FindLastSlash(Path)
If Last = 0 : ProcedureReturn Path : EndIf
ProcedureReturn Mid(Path, Last + 1)
EndProcedure
Procedure.s GetPathPart(Path.s)
Protected Last = _FindLastSlash(Path)
If Last = 0 : ProcedureReturn "/" : EndIf ; no slash — return root
ProcedureReturn Left(Path, Last) ; includes the trailing slash
EndProcedure
;- Private procedures
Procedure _FindLastSlash(Path.s)
Protected Pos, Last
Pos = FindString(Path, "/")
While Pos > 0
Last = Pos
Pos = FindString(Path, "/", Pos + 1)
Wend
ProcedureReturn Last
EndProcedure
Procedure _ReadExistsCallback(Success, DataString.s)
Debug "Exists → Success=" + Success + " Data=" + DataString
If Success And DataString = "1"
; Cache hit — return directly
FileCache::Read_(_R_ID, @_ReadCachedCallback())
Else
; Cache miss — fetch from server
HTTPRequest(#PB_HTTP_Get, "/api/fs/read?id=" + _R_ID, "", @_ReadServerCallback())
EndIf
EndProcedure
Procedure _ReadCachedCallback(Success, DataString.s)
If *_R_Cb
!fs$g__r_cb(v_success, v_datastring);
EndIf
EndProcedure
Procedure _ReadServerCallback(Success, DataString.s)
If Success
_R_Content = DataString
FileCache::Cache(_R_ID, _R_Path, DataString, @_ReadCacheStoreCallback())
Else
!fs$g__r_cb(0, v_datastring);
EndIf
EndProcedure
Procedure _ReadCacheStoreCallback(Success, DataString.s)
Protected Content.s = _R_Content
If *_R_Cb
!fs$g__r_cb(1, v_content);
EndIf
EndProcedure
Procedure _WriteCacheCallback(Success, DataString.s)
If *_W_Cb
!fs$g__w_cb(v_success, v_datastring);
EndIf
If Success
HTTPRequest(#PB_HTTP_Post, "/api/fs/write", "path=" + URLEncoder(_W_Path, #PB_UTF8) + "&content=" + URLEncoder(_W_Content, #PB_UTF8), @_WriteServerCallback())
EndIf
EndProcedure
Procedure _WriteServerCallback(Success, DataString.s)
If Success
If ParseJSON(0, DataString)
If GetJSONBoolean(GetJSONMember(JSONValue(0), "success"))
FileCache::MarkClean(_W_ID, #Null)
EndIf
FreeJSON(0)
EndIf
EndIf
EndProcedure
EndModule
; IDE Options = SpiderBasic 3.20 (Windows - x86)
; CursorPosition = 21
; Folding = BAA-
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

View File

@ -0,0 +1,166 @@
Module FileCache
EnableExplicit
;- Constants
; Store names (also used in IDB::Init in General.sbi)
#Store_Content = "file_content"
#Store_Meta = "file_meta"
; Metadata JSON shape:
; { "path": "/home/alice/doc.txt", "dirty": false, "cached_at": 1234567890, "size": 42 }
;- Public procedures
; Store a file fetched from the server into the cache.
; Writes content and meta atomically in one transaction.
Procedure Cache(FileID.s, Path.s, Content.s, *Callback)
!var _cb = p_callback;
!var _id = v_fileid;
!var _path = v_path;
!var _content = v_content;
!var _db = window._kumos_idb;
!if (!_db) { if (_cb) _cb(0, 'IDB not open'); return; }
!
!var tx = _db.transaction(['file_content','file_meta'], 'readwrite');
!var contentStore = tx.objectStore('file_content');
!var metaStore = tx.objectStore('file_meta');
!
!var meta = JSON.stringify({
! path: _path,
! dirty: false,
! cached_at: Date.now(),
! size: _content.length
!});
!
!contentStore.put(_content, _id).onerror = function(e) { tx.abort(); };
!metaStore.put(meta, _id).onerror = function(e) { tx.abort(); };
!
!tx.oncomplete = function() { if (_cb) _cb(1, ''); };
!tx.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'cache failed'); };
!tx.onabort = function(e) { if (_cb) _cb(0, 'cache aborted'); };
EndProcedure
; Read cached content. Data = raw file content string.
; Data = "" if file is not in cache (Success is still #True).
Procedure Read_(FileID.s, *Callback)
IDB::Get(#Store_Content, FileID, *Callback)
EndProcedure
; Write updated content to the cache and mark the file dirty.
; Patches meta without replacing path or other fields.
Procedure Write(FileID.s, Content.s, *Callback)
!var _cb = p_callback;
!var _id = v_fileid;
!var _content = v_content;
!var _db = window._kumos_idb;
!if (!_db) { if (_cb) _cb(0, 'IDB not open'); return; }
!
!var tx = _db.transaction(['file_content','file_meta'], 'readwrite');
!var contentStore = tx.objectStore('file_content');
!var metaStore = tx.objectStore('file_meta');
!
!contentStore.put(_content, _id);
!
!var getReq = metaStore.get(_id);
!getReq.onsuccess = function(ev) {
! var meta = {};
! try { meta = JSON.parse(ev.target.result || '{}'); } catch(e) {}
! meta.dirty = true;
! meta.size = _content.length;
! meta.cached_at = Date.now();
! metaStore.put(JSON.stringify(meta), _id);
!};
!
!tx.oncomplete = function() { if (_cb) _cb(1, ''); };
!tx.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'write failed'); };
EndProcedure
; Get the metadata JSON string for a cached file.
Procedure GetMeta(FileID.s, *Callback)
IDB::Get(#Store_Meta, FileID, *Callback)
EndProcedure
; Mark a cached file as clean after a successful sync to the server.
Procedure MarkClean(FileID.s, *Callback)
!var _cb = p_callback;
!var _id = v_fileid;
!var _db = window._kumos_idb;
!if (!_db) { if (_cb) _cb(0, 'IDB not open'); return; }
!
!var tx = _db.transaction(['file_meta'], 'readwrite');
!var store = tx.objectStore('file_meta');
!var req = store.get(_id);
!req.onsuccess = function(ev) {
! var meta = {};
! try { meta = JSON.parse(ev.target.result || '{}'); } catch(e) {}
! meta.dirty = false;
! store.put(JSON.stringify(meta), _id);
!};
!
!tx.oncomplete = function() { if (_cb) _cb(1, ''); };
!tx.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'markclean failed'); };
EndProcedure
; Remove a file from the cache entirely (both content and meta).
Procedure Evict(FileID.s, *Callback)
!var _cb = p_callback;
!var _id = v_fileid;
!var _db = window._kumos_idb;
!if (!_db) { if (_cb) _cb(0, 'IDB not open'); return; }
!
!var tx = _db.transaction(['file_content','file_meta'], 'readwrite');
!tx.objectStore('file_content').delete(_id);
!tx.objectStore('file_meta').delete(_id);
!
!tx.oncomplete = function() { if (_cb) _cb(1, ''); };
!tx.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'evict failed'); };
EndProcedure
; Return all cached file IDs as a JSON array.
Procedure ListCached(*Callback)
IDB::GetAllKeys(#Store_Meta, *Callback)
EndProcedure
; Return only the dirty file IDs as a JSON array.
; These are files that have been written locally but not yet synced.
Procedure ListDirty(*Callback)
!var _cb = p_callback;
!var _db = window._kumos_idb;
!if (!_db) { if (_cb) _cb(0, 'IDB not open'); return; }
!
!var tx = _db.transaction(['file_meta'], 'readonly');
!var store = tx.objectStore('file_meta');
!var req = store.openCursor();
!var dirty = [];
!
!req.onsuccess = function(ev) {
! var cursor = ev.target.result;
! if (cursor) {
! try {
! var meta = JSON.parse(cursor.value);
! if (meta.dirty) dirty.push(String(cursor.key));
! } catch(e) {}
! cursor.continue();
! }
!};
!
!tx.oncomplete = function() { if (_cb) _cb(1, JSON.stringify(dirty)); };
!tx.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'listdirty failed'); };
EndProcedure
; Returns "1" if the file is in the cache, "0" if not.
Procedure Exists(FileID.s, *Callback)
IDB::Exists(#Store_Meta, FileID, *Callback)
EndProcedure
EndModule
; IDE Options = SpiderBasic 3.20 (Windows - x86)
; CursorPosition = 156
; Folding = Bw
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

View File

@ -0,0 +1,48 @@
Module General
EnableExplicit
Procedure CheckCallback(Success, Response.s)
Protected Authenticated, Root
Protected Username.s
If Success
If ParseJSON(0, Response)
Root = JSONValue(0)
Authenticated = GetJSONBoolean(GetJSONMember(Root, "authenticated"))
If Authenticated
Username = GetJSONString(GetJSONMember(Root, "username"))
EndIf
FreeJSON(0)
EndIf
EndIf
If Authenticated And Username <> ""
Desktop::Open(Username)
Else
Login::Open()
EndIf
EndProcedure
Procedure IDBCallback(Success, DataString.s)
If Success
HTTPRequest(#PB_HTTP_Get, "/api/auth/check", "", @CheckCallback())
Else
Debug "IDB Init failed: " + DataString
EndIf
EndProcedure
Procedure Init()
IDB::Init("kumos", 1, "file_content,file_meta", @IDBCallback())
EndProcedure
EndModule
; IDE Options = SpiderBasic 3.20 (Windows - x86)
; CursorPosition = 38
; Folding = -
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

85
Client/Includes/Login.sbi Normal file
View File

@ -0,0 +1,85 @@
Module Login
EnableExplicit
;- Private constants
#Window_Width = 400
#Window_Height = 165
;- Private variables
Global Window
Global UsernameLabel, UsernameInput, PasswordLabel, PasswordInput, ConnectButton
;- Private declarations
Declare Handler_BrowserResize()
Declare Handler_ConnectButton()
Declare Handler_Login(Success, Result.s, UserData)
;- Public procedures
Procedure Open()
Window = OpenWindow(#PB_Any, 0, 0, #Window_Width, #Window_Height, "", #PB_Window_ScreenCentered | #PB_Window_BorderLess)
UsernameLabel = TextGadget(#PB_Any, 30, 33, 100, 20, "Username: ")
UsernameInput = StringGadget(#PB_Any, 120, 30, 250, 20, "")
PasswordLabel = TextGadget(#PB_Any, 30, 73, 100, 20, "Password: ")
PasswordInput = StringGadget(#PB_Any, 120, 70, 250, 20, "", #PB_String_Password)
ConnectButton = ButtonGadget(#PB_Any, 30, 110, #Window_Width - 60, 25, "Connect")
SetActiveGadget(UsernameInput)
BindGadgetEvent(ConnectButton, @Handler_ConnectButton())
BindEvent(#PB_Event_SizeDesktop, @Handler_BrowserResize())
EndProcedure
;- Private procedures
Procedure Handler_BrowserResize()
Protected _Width = DesktopWidth(0)
Protected _Height = DesktopHeight(0)
ResizeWindow(Window, (_Width - #Window_Width) * 0.5, (_Height - #Window_Height) * 0.5, #PB_Ignore, #PB_Ignore)
EndProcedure
Procedure Handler_ConnectButton()
Protected Username.s = GetGadgetText(UsernameInput)
Protected Password.s = GetGadgetText(PasswordInput)
If Username = "" Or Password = ""
Notify::Toast("Invalid username or password.", Notify::#Error)
ProcedureReturn
EndIf
HTTPRequest(#PB_HTTP_Post, "/api/auth/login", "username=" + URLEncoder(Username, #PB_UTF8) + "&password=" + URLEncoder(Password, #PB_UTF8), @Handler_Login())
EndProcedure
Procedure Handler_Login(Success, Result.s, UserData)
Protected Root, OK
Protected Username.s
If Success
If ParseJSON(0, Result)
Root = JSONValue(0)
OK = GetJSONBoolean(GetJSONMember(Root, "success"))
If OK
Username = GetJSONString(GetJSONMember(Root, "username"))
UnbindGadgetEvent(ConnectButton, @Handler_ConnectButton())
UnbindEvent(#PB_Event_SizeDesktop, @Handler_BrowserResize())
CloseWindow(Window)
Desktop::Open(Username)
Else
Notify::Toast("Invalid username or password.", Notify::#Error)
EndIf
FreeJSON(0)
EndIf
Else
Notify::Toast("Connection failed. Try again.", Notify::#Error)
EndIf
EndProcedure
EndModule
; IDE Options = SpiderBasic 3.20 (Windows - x86)
; CursorPosition = 51
; Folding = h
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

View File

@ -0,0 +1,69 @@
DeclareModule General
Declare Init()
EndDeclareModule
DeclareModule FileCache
Declare Cache(FileID.s, Path.s, Content.s, *Callback)
Declare Read_(FileID.s, *Callback)
Declare Write(FileID.s, Content.s, *Callback)
Declare GetMeta(FileID.s, *Callback)
Declare MarkClean(FileID.s, *Callback)
Declare Evict(FileID.s, *Callback)
Declare ListCached(*Callback)
Declare ListDirty(*Callback)
Declare Exists(FileID.s, *Callback)
EndDeclareModule
DeclareModule FS
Declare List(Path.s, *Callback)
Declare Stat(Path.s, *Callback)
Declare Read_(FileID.s, Path.s, *Callback)
Declare Write(FileID.s, Path.s, Content.s, *Callback)
Declare Mkdir(Path.s, *Callback)
Declare Delete_(FileID.s, *Callback)
Declare Move(FileID.s, NewParentID.s, NewName.s, *Callback)
Declare Sync(*Callback)
Declare.s GetFilePart(Path.s)
Declare.s GetPathPart(Path.s)
EndDeclareModule
DeclareModule Login
Declare Open()
EndDeclareModule
DeclareModule Desktop
Declare Open(Username.s)
Declare InstallApp(AppName.s, *LaunchProc, Icon.s = "")
Declare Register(AppName.s, Win, Icon.s = "")
Declare Unregister(Win)
Declare InstallThirdPartyApp(AppID.s, ManifestJSON.s, Permissions.s, Icon.s = "")
Declare UninstallThirdPartyApp(AppID.s)
EndDeclareModule
DeclareModule Notify
Enumeration
#Info
#Success
#Warning
#Error
EndEnumeration
Declare Toast(Message.s, Type = #Info, Duration = 4000)
Declare Confirm(Title.s, Message.s, *Callback)
EndDeclareModule
DeclareModule AppRuntime
Declare Init()
Declare Launch(AppID.s, ManifestJSON.s, Permissions.s)
EndDeclareModule
; IDE Options = SpiderBasic 3.20 (Windows - x86)
; CursorPosition = 59
; Folding = --
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

241
Client/Includes/Notify.sbi Normal file
View File

@ -0,0 +1,241 @@
Module Notify
EnableExplicit
;- Toast constants
#Toast_W = 300
#Toast_H = 60
#Toast_Margin = 10
#Accent_W = 4
#Toast_Timer = 0
#MaxToasts = 5
;- Globals
Global _Font = LoadFont(#PB_Any, "sans-serif", 12)
; Toast state
Global Dim _Wins.i(#MaxToasts)
Global Dim _Canvases.i(#MaxToasts)
Global Dim _Types.i(#MaxToasts)
Global Dim _Messages.s(#MaxToasts)
Global _Count
; Confirm state
Global _ConfirmWin
Global _ConfirmOkBtn
Global _ConfirmCancelBtn
Global *_ConfirmCb
;- Private declarations
Declare _TypeColor(Type)
Declare _DrawToast(Slot)
Declare _Dismiss(Slot)
Declare _Reposition()
Declare _FindByWindow(Win)
Declare _FindByCanvas(Canvas)
Declare _CloseConfirm()
Declare _FireConfirm(Result)
Declare Handler_ToastTimer()
Declare Handler_ToastClick()
Declare Handler_ConfirmOK()
Declare Handler_ConfirmCancel()
Declare Handler_ConfirmClose()
;- Public procedures
; Show a toast in the bottom-right corner. Dismisses after Duration ms or on click.
Procedure Toast(Message.s, Type = #Info, Duration = 4000)
Protected Slot, DW, DH, X, Y, Win, Canvas
If _Count >= #MaxToasts : ProcedureReturn : EndIf
Slot = _Count
DW = DesktopWidth(0)
DH = DesktopHeight(0)
X = DW - #Toast_W - #Toast_Margin
Y = DH - (Slot + 1) * (#Toast_H + #Toast_Margin)
Win = OpenWindow(#PB_Any, X, Y, #Toast_W, #Toast_H, "", #PB_Window_BorderLess)
StickyWindow(Win, #True)
Canvas = CanvasGadget(#PB_Any, 0, 0, #Toast_W, #Toast_H)
_Wins(Slot) = Win
_Canvases(Slot) = Canvas
_Types(Slot) = Type
_Messages(Slot) = Message
_Count + 1
_DrawToast(Slot)
BindGadgetEvent(Canvas, @Handler_ToastClick())
AddWindowTimer(Win, #Toast_Timer, Duration)
BindEvent(#PB_Event_Timer, @Handler_ToastTimer(), Win)
EndProcedure
; Show a modal confirm dialog. *Callback(Result) is called with 1 for OK, 0 for Cancel.
; Only one confirm can be open at a time — subsequent calls are ignored.
Procedure Confirm(Title.s, Message.s, *Callback)
Protected W, H, DW, DH
If IsWindow(_ConfirmWin) : ProcedureReturn : EndIf
W = 340
H = 130
DW = DesktopWidth(0)
DH = DesktopHeight(0)
_ConfirmWin = OpenWindow(#PB_Any, (DW - W) / 2, (DH - H) / 2, W, H, Title, #PB_Window_TitleBar | #PB_Window_SystemMenu)
StickyWindow(_ConfirmWin, #True)
*_ConfirmCb = *Callback
TextGadget(#PB_Any, 20, 20, W - 40, 50, Message)
_ConfirmOkBtn = ButtonGadget(#PB_Any, W - 190, H - 45, 80, 30, "OK")
_ConfirmCancelBtn = ButtonGadget(#PB_Any, W - 100, H - 45, 80, 30, "Cancel")
BindGadgetEvent(_ConfirmOkBtn, @Handler_ConfirmOK())
BindGadgetEvent(_ConfirmCancelBtn, @Handler_ConfirmCancel())
BindEvent(#PB_Event_CloseWindow, @Handler_ConfirmClose(), _ConfirmWin)
EndProcedure
;- Private procedures
Procedure _TypeColor(Type)
Select Type
Case #Success : ProcedureReturn RGB( 60, 180, 100)
Case #Warning : ProcedureReturn RGB(220, 160, 40)
Case #Error : ProcedureReturn RGB(210, 65, 65)
Default : ProcedureReturn RGB( 50, 130, 220) ; #Info
EndSelect
EndProcedure
Procedure _DrawToast(Slot)
Protected W, H, MaxW
Protected Msg.s
If Not IsGadget(_Canvases(Slot)) : ProcedureReturn : EndIf
If Not StartDrawing(CanvasOutput(_Canvases(Slot))) : ProcedureReturn : EndIf
W = OutputWidth()
H = OutputHeight()
; Background
Box(0, 0, W, H, RGB(38, 38, 54))
; Accent bar
Box(0, 0, #Accent_W, H, _TypeColor(_Types(Slot)))
; Message — truncate with ellipsis if too wide
DrawingMode(#PB_2DDrawing_Transparent)
If IsFont(_Font) : DrawingFont(FontID(_Font)) : EndIf
Msg = _Messages(Slot)
MaxW = W - #Accent_W - 24
While Len(Msg) > 3 And TextWidth(Msg) > MaxW
Msg = Left(Msg, Len(Msg) - 4) + "..."
Wend
DrawText(#Accent_W + 14, (H - TextHeight("A")) / 2, Msg, RGB(220, 220, 220))
StopDrawing()
EndProcedure
Procedure _Dismiss(Slot)
Protected i
If Not IsWindow(_Wins(Slot)) : ProcedureReturn : EndIf
UnbindEvent(#PB_Event_Timer, @Handler_ToastTimer(), _Wins(Slot))
UnbindGadgetEvent(_Canvases(Slot), @Handler_ToastClick())
CloseWindow(_Wins(Slot))
For i = Slot To _Count - 2
_Wins(i) = _Wins(i + 1)
_Canvases(i) = _Canvases(i + 1)
_Types(i) = _Types(i + 1)
_Messages(i) = _Messages(i + 1)
Next
_Wins(_Count - 1) = 0
_Canvases(_Count - 1) = 0
_Types(_Count - 1) = 0
_Messages(_Count - 1) = ""
_Count - 1
_Reposition()
EndProcedure
Procedure _Reposition()
Protected DW, DH, i
DW = DesktopWidth(0)
DH = DesktopHeight(0)
For i = 0 To _Count - 1
ResizeWindow(_Wins(i), DW - #Toast_W - #Toast_Margin, DH - (i + 1) * (#Toast_H + #Toast_Margin), #PB_Ignore, #PB_Ignore)
Next
EndProcedure
Procedure _FindByWindow(Win)
Protected i
For i = 0 To _Count - 1
If _Wins(i) = Win : ProcedureReturn i : EndIf
Next
ProcedureReturn -1
EndProcedure
Procedure _FindByCanvas(Canvas)
Protected i
For i = 0 To _Count - 1
If _Canvases(i) = Canvas : ProcedureReturn i : EndIf
Next
ProcedureReturn -1
EndProcedure
Procedure _CloseConfirm()
UnbindGadgetEvent(_ConfirmOkBtn, @Handler_ConfirmOK())
UnbindGadgetEvent(_ConfirmCancelBtn, @Handler_ConfirmCancel())
UnbindEvent(#PB_Event_CloseWindow, @Handler_ConfirmClose(), _ConfirmWin)
CloseWindow(_ConfirmWin)
_ConfirmWin = 0
EndProcedure
Procedure _FireConfirm(Result)
_CloseConfirm()
If *_ConfirmCb
!notify$g__confirmcb(v_result);
*_ConfirmCb = 0
EndIf
EndProcedure
;- Event handlers
Procedure Handler_ToastTimer()
Protected Slot = _FindByWindow(EventWindow())
If Slot >= 0 : _Dismiss(Slot) : EndIf
EndProcedure
Procedure Handler_ToastClick()
Protected Slot
If EventType() <> #PB_EventType_LeftButtonUp : ProcedureReturn : EndIf
Slot = _FindByCanvas(EventGadget())
If Slot >= 0 : _Dismiss(Slot) : EndIf
EndProcedure
Procedure Handler_ConfirmOK()
_FireConfirm(1)
EndProcedure
Procedure Handler_ConfirmCancel()
_FireConfirm(0)
EndProcedure
Procedure Handler_ConfirmClose()
_FireConfirm(0)
EndProcedure
EndModule
; IDE Options = SpiderBasic 3.20 (Windows - x86)
; CursorPosition = 13
; Folding = BAw
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

85
Client/KUMOS.sbp Normal file
View File

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.purebasic.com/namespace" version="1.0" creator="SpiderBasic 3.20 (Windows - x86)">
<section name="config">
<options closefiles="1" openmode="0" name="KUMO.S."/>
<buildwindow autoclose="1"/>
</section>
<section name="data">
<explorer view="C:\ProgramData\SpiderBasic\Examples\" pattern="0"/>
<log show="1"/>
<lastopen date="2026-05-02 15:30" user="lastlife" host="MONSTRO"/>
</section>
<section name="files">
<file name="Main.sb">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="1" panelstate="+"/>
<fingerprint md5="f576326de07e513ea6b6dd258de683db"/>
</file>
<file name="Includes\Modules.sbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="2" panelstate="++"/>
<fingerprint md5="6f79aa6329eb128a2d2e21f5062b9b9b"/>
</file>
<file name="Includes\General.sbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="3" panelstate="++"/>
<fingerprint md5="4cab2d068c6f4e72cf4361759741a68c"/>
</file>
<file name="Includes\Desktop.sbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="4" panelstate="++"/>
<fingerprint md5="92bb58b90c2dd5a2872735abd0500ebb"/>
</file>
<file name="Includes\Login.sbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="5" panelstate="++"/>
<fingerprint md5="b3942f9366ffaeac322ae97ad4f2969a"/>
</file>
<file name="Libraries\IDB.sbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="6" panelstate="++"/>
<fingerprint md5="8085cb3ee9b94f70e3f0da0dd5d65679"/>
</file>
<file name="Default Apps\TextEditor.sbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="7" panelstate="++"/>
<fingerprint md5="e0071b1247a3875af38cd7b382a669ce"/>
</file>
<file name="Default Apps\FileExplorer.sbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="8" panelstate="++"/>
<fingerprint md5="321c1adf362c4e923aa8e465c914c390"/>
</file>
<file name="Includes\FS.sbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="9" panelstate="++"/>
<fingerprint md5="a8c2e345dd28cd04cb1e945419703bba"/>
</file>
<file name="Includes\Notify.sbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="10" panelstate="++"/>
<fingerprint md5="e272ce4395832d217a09c71a876a5215"/>
</file>
<file name="Default Apps\Settings.sbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="11" panelstate="++"/>
<fingerprint md5="ccff0474adda20d60eb50dccbcbb7847"/>
</file>
<file name="Default Apps\WebBrowser.sbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="12" panelstate="++"/>
<fingerprint md5="11654dcbaa001b6b16829aa89b1b6b86"/>
</file>
<file name="Default Apps\AppManager.sbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="13" panelstate="++"/>
<fingerprint md5="f2489b3a56beb00a2eb92678572d435b"/>
</file>
<file name="Includes\AppRuntime.sbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="14" panelstate="++"/>
<fingerprint md5="f2e5bc16d9b734775ee703a28ad08a2b"/>
</file>
<file name="Includes\FileCache.sbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="0" sortindex="999" panelstate="++"/>
<fingerprint md5="623097fdb15cb37d746eef1293c04f8e"/>
</file>
</section>
<section name="targets">
<target name="Default Target" enabled="1" default="1">
<inputfile value="Main.sb"/>
<outputfile value=""/>
<executable value="..\Server\www\index.html"/>
<options xpskin="1" dpiaware="1" debug="1" optimizer="0" webserveraddress="" windowtheme="flat" gadgettheme="flat"/>
<export webappname="KUMO.S." webappicon="" htmlfilename="../Server/www/index.html" javascriptfilename="js.js" javascriptpath="" copyjavascriptlibrary="1" exportcommandline="" exportarguments="" enableresourcedirectory="0" resourcedirectory="" webappenabledebugger="1" iosappname="" iosappicon="" iosappversion="" iosapppackageid="" iosappstartupimage="" iosapporientation="0" iosappfullscreen="0" iosappoutput="" iosappautoupload="0" iosappenableresourcedirectory="0" iosappresourcedirectory="" iosappenabledebugger="0" iosappkeepappdirectory="0" androidappname="" androidappicon="" androidappversion="" androidappcode="1" androidapppackageid="" androidappiapkey="" androidappstartupimage="" androidappstartupcolor="" androidapporientation="0" androidappfullscreen="0" androidappoutput="" androidappautoupload="0" androidappenableresourcedirectory="0" androidappresourcedirectory="" androidappenabledebugger="0" androidappkeepappdirectory="0" androidappinsecurefilemode="0"/>
<temporaryexe value="source"/>
</target>
</section>
</project>

165
Client/Libraries/IDB.sbi Normal file
View File

@ -0,0 +1,165 @@
DeclareModule IDB
Declare Init(DBName.s, Version.i, Stores.s, *Callback)
Declare Put(Store.s, Key.s, Value.s, *Callback)
Declare Get(Store.s, Key.s, *Callback)
Declare Exists(Store.s, Key.s, *Callback)
Declare Delete(Store.s, Key.s, *Callback)
Declare GetAllKeys(Store.s, *Callback)
Declare GetAll(Store.s, *Callback)
Declare Clear(Store.s, *Callback)
Declare Count(Store.s, *Callback)
EndDeclareModule
Module IDB
EnableExplicit
!window._kumos_idb = null;
Procedure Init(DBName.s, Version.i, Stores.s, *Callback)
!var _cb = p_callback;
!var _dbname = v_dbname;
!var _ver = v_version;
!var _stores = v_stores;
!
!var req = indexedDB.open(_dbname, _ver);
!
!req.onupgradeneeded = function(ev) {
! var db = ev.target.result;
! _stores.split(',').forEach(function(name) {
! name = name.trim();
! if (name && !db.objectStoreNames.contains(name)) {
! db.createObjectStore(name);
! }
! });
!};
!req.onsuccess = function(ev) {
! window._kumos_idb = ev.target.result;
! if (_cb) _cb(1, '');
!};
!req.onerror = function(ev) {
! var msg = ev.target.error ? ev.target.error.message : 'open failed';
! if (_cb) _cb(0, msg);
!};
!req.onblocked = function() {
! if (_cb) _cb(0, 'IDB blocked - close other tabs using this app');
!};
EndProcedure
Procedure Put(Store.s, Key.s, Value.s, *Callback)
!var _cb = p_callback;
!var _store = v_store;
!var _key = v_key;
!var _val = v_value;
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
!var tx = window._kumos_idb.transaction([_store], 'readwrite');
!var st = tx.objectStore(_store);
!var req = st.put(_val, _key);
!req.onsuccess = function() { if (_cb) _cb(1, ''); };
!req.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'put failed'); };
EndProcedure
Procedure Get(Store.s, Key.s, *Callback)
!var _cb = p_callback;
!var _store = v_store;
!var _key = v_key;
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
!var tx = window._kumos_idb.transaction([_store], 'readonly');
!var st = tx.objectStore(_store);
!var req = st.get(_key);
!req.onsuccess = function(ev) {
! var v = ev.target.result;
! if (_cb) _cb(1, v !== undefined ? String(v) : '');
!};
!req.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'get failed'); };
EndProcedure
Procedure Exists(Store.s, Key.s, *Callback)
!var _cb = p_callback;
!var _store = v_store;
!var _key = v_key;
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
!var tx = window._kumos_idb.transaction([_store], 'readonly');
!var st = tx.objectStore(_store);
!var req = st.getKey(_key);
!req.onsuccess = function(ev) {
! if (_cb) _cb(1, ev.target.result !== undefined ? '1' : '0');
!};
!req.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'exists failed'); };
EndProcedure
Procedure Delete(Store.s, Key.s, *Callback)
!var _cb = p_callback;
!var _store = v_store;
!var _key = v_key;
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
!var tx = window._kumos_idb.transaction([_store], 'readwrite');
!var st = tx.objectStore(_store);
!var req = st.delete(_key);
!req.onsuccess = function() { if (_cb) _cb(1, ''); };
!req.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'delete failed'); };
EndProcedure
Procedure GetAllKeys(Store.s, *Callback)
!var _cb = p_callback;
!var _store = v_store;
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
!var tx = window._kumos_idb.transaction([_store], 'readonly');
!var st = tx.objectStore(_store);
!var req = st.getAllKeys();
!req.onsuccess = function(ev) { if (_cb) _cb(1, JSON.stringify(ev.target.result || [])); };
!req.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'getAllKeys failed'); };
EndProcedure
Procedure GetAll(Store.s, *Callback)
!var _cb = p_callback;
!var _store = v_store;
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
!var tx = window._kumos_idb.transaction([_store], 'readonly');
!var st = tx.objectStore(_store);
!var keysReq = st.getAllKeys();
!keysReq.onsuccess = function(ev) {
! var keys = ev.target.result;
! var valsReq = st.getAll();
! valsReq.onsuccess = function(ev2) {
! var vals = ev2.target.result;
! var out = {};
! for (var i = 0; i < keys.length; i++) out[String(keys[i])] = String(vals[i]);
! if (_cb) _cb(1, JSON.stringify(out));
! };
! valsReq.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'getAll/vals failed'); };
!};
!keysReq.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'getAll/keys failed'); };
EndProcedure
Procedure Clear(Store.s, *Callback)
!var _cb = p_callback;
!var _store = v_store;
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
!var tx = window._kumos_idb.transaction([_store], 'readwrite');
!var st = tx.objectStore(_store);
!var req = st.clear();
!req.onsuccess = function() { if (_cb) _cb(1, ''); };
!req.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'clear failed'); };
EndProcedure
Procedure Count(Store.s, *Callback)
!var _cb = p_callback;
!var _store = v_store;
!if (!window._kumos_idb) { if (_cb) _cb(0, 'IDB not open'); return; }
!var tx = window._kumos_idb.transaction([_store], 'readonly');
!var st = tx.objectStore(_store);
!var req = st.count();
!req.onsuccess = function(ev) { if (_cb) _cb(1, String(ev.target.result)); };
!req.onerror = function(e) { if (_cb) _cb(0, e.target.error ? e.target.error.message : 'count failed'); };
EndProcedure
EndModule
; IDE Options = SpiderBasic 3.10 (Windows - x86)
; CursorPosition = 15
; Folding = Dg
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

37
Client/Main.sb Normal file
View File

@ -0,0 +1,37 @@
IncludePath "Libraries"
IncludeFile "IDB.sbi"
IncludePath "Includes"
IncludeFile "Modules.sbi"
IncludeFile "General.sbi"
; System
IncludeFile "FileCache.sbi"
IncludeFile "FS.sbi"
; UI
IncludeFile "Notify.sbi"
IncludeFile "Desktop.sbi"
IncludeFile "Login.sbi"
; Appstore
IncludeFile "AppRuntime.sbi"
IncludePath "Default Apps"
IncludeFile "TextEditor.sbi"
IncludeFile "FileExplorer.sbi"
IncludeFile "Settings.sbi"
IncludeFile "WebBrowser.sbi"
IncludeFile "AppManager.sbi"
General::Init()
; IDE Options = SpiderBasic 3.10 (Windows - x86)
; CursorPosition = 25
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

124
Client/kumos.js Normal file
View File

@ -0,0 +1,124 @@
/**
* KUMO.S App SDK include in your app with:
* <script src="/kumos.js"></script>
*
* All methods return Promises. Call KUMOS.ready() first.
*
* Permissions required per namespace:
* storage.* always available (private app namespace)
* fs.* requires "fs.read" or "fs.write" grant
* notify.* requires "notify" grant
* window.* always available
*/
(function (global) {
'use strict';
var _pending = {}; // kmid → { resolve, reject, timer }
// ── Internal helpers ──────────────────────────────────────────────────────
function _uuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0;
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
}
function _send(action, args) {
return new Promise(function (resolve, reject) {
var kmid = _uuid();
var timer = setTimeout(function () {
if (_pending[kmid]) {
delete _pending[kmid];
reject(new Error('KUMOS timeout: ' + action));
}
}, 15000);
_pending[kmid] = { resolve: resolve, reject: reject, timer: timer };
window.parent.postMessage(
JSON.stringify({ kmid: kmid, action: action, args: args || {} }),
'*'
);
});
}
// Incoming responses from the shell
window.addEventListener('message', function (e) {
if (e.source !== window.parent) return;
var msg;
try { msg = JSON.parse(e.data); } catch (err) { return; }
if (!msg || !msg.kmid) return;
var p = _pending[msg.kmid];
if (!p) return;
clearTimeout(p.timer);
delete _pending[msg.kmid];
if (msg.success) {
p.resolve(msg.data !== undefined ? msg.data : null);
} else {
p.reject(new Error(msg.error || 'Unknown error'));
}
});
// ── Public API ────────────────────────────────────────────────────────────
var KUMOS = {
/**
* Handshake with the shell. Resolves with { app_id }.
* Always call this first and await it before using any other APIs.
*/
ready: function () {
return _send('window.ready', {});
},
// ── Private app storage (no extra permission required) ───────────────
storage: {
/** Read a file. Resolves with the content string. */
read: function (path) { return _send('storage.read', { path: path }); },
/** Write content to a file. Creates it if it does not exist. */
write: function (path, content) { return _send('storage.write', { path: path, content: content }); },
/** List a directory. Resolves with an array of entry objects. */
list: function (path) { return _send('storage.list', { path: path || '/' }); },
/** Stat a path. */
stat: function (path) { return _send('storage.stat', { path: path }); },
/** Create a directory. */
mkdir: function (path) { return _send('storage.mkdir', { path: path }); },
/** Delete a file. */
delete: function (path) { return _send('storage.delete', { path: path }); }
},
// ── User filesystem (requires fs.read / fs.write permission) ─────────
fs: {
/** Read a file from the user's filesystem. */
read: function (path) { return _send('fs.read', { path: path }); },
/** Write content to a file in the user's filesystem. */
write: function (path, content) { return _send('fs.write', { path: path, content: content }); },
/** List a directory. */
list: function (path) { return _send('fs.list', { path: path || '/' }); },
/** Stat a path. */
stat: function (path) { return _send('fs.stat', { path: path }); }
},
// ── Notifications (requires notify permission) ────────────────────────
notify: {
/** Show a toast. type: 'info' | 'success' | 'warning' | 'error' */
toast: function (message, type) { return _send('notify.toast', { message: message, type: type || 'info' }); },
/** Show a confirm dialog. Resolves with true (OK) or false (Cancel). */
confirm: function (title, message) { return _send('notify.confirm', { title: title, message: message }); }
},
// ── Window control ────────────────────────────────────────────────────
window: {
/** Update the host window title. */
setTitle: function (title) { return _send('window.setTitle', { title: title }); },
/** Close this app instance. */
close: function () { return _send('window.close', {}); }
}
};
global.KUMOS = KUMOS;
}(window));

BIN
SDK/JS/helloworld.zip Normal file

Binary file not shown.

124
SDK/JS/kumos.js Normal file
View File

@ -0,0 +1,124 @@
/**
* KUMO.S App SDK include in your app with:
* <script src="/kumos.js"></script>
*
* All methods return Promises. Call KUMOS.ready() first.
*
* Permissions required per namespace:
* storage.* always available (private app namespace)
* fs.* requires "fs.read" or "fs.write" grant
* notify.* requires "notify" grant
* window.* always available
*/
(function (global) {
'use strict';
var _pending = {}; // kmid → { resolve, reject, timer }
// ── Internal helpers ──────────────────────────────────────────────────────
function _uuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0;
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
}
function _send(action, args) {
return new Promise(function (resolve, reject) {
var kmid = _uuid();
var timer = setTimeout(function () {
if (_pending[kmid]) {
delete _pending[kmid];
reject(new Error('KUMOS timeout: ' + action));
}
}, 15000);
_pending[kmid] = { resolve: resolve, reject: reject, timer: timer };
window.parent.postMessage(
JSON.stringify({ kmid: kmid, action: action, args: args || {} }),
'*'
);
});
}
// Incoming responses from the shell
window.addEventListener('message', function (e) {
if (e.source !== window.parent) return;
var msg;
try { msg = JSON.parse(e.data); } catch (err) { return; }
if (!msg || !msg.kmid) return;
var p = _pending[msg.kmid];
if (!p) return;
clearTimeout(p.timer);
delete _pending[msg.kmid];
if (msg.success) {
p.resolve(msg.data !== undefined ? msg.data : null);
} else {
p.reject(new Error(msg.error || 'Unknown error'));
}
});
// ── Public API ────────────────────────────────────────────────────────────
var KUMOS = {
/**
* Handshake with the shell. Resolves with { app_id }.
* Always call this first and await it before using any other APIs.
*/
ready: function () {
return _send('window.ready', {});
},
// ── Private app storage (no extra permission required) ───────────────
storage: {
/** Read a file. Resolves with the content string. */
read: function (path) { return _send('storage.read', { path: path }); },
/** Write content to a file. Creates it if it does not exist. */
write: function (path, content) { return _send('storage.write', { path: path, content: content }); },
/** List a directory. Resolves with an array of entry objects. */
list: function (path) { return _send('storage.list', { path: path || '/' }); },
/** Stat a path. */
stat: function (path) { return _send('storage.stat', { path: path }); },
/** Create a directory. */
mkdir: function (path) { return _send('storage.mkdir', { path: path }); },
/** Delete a file. */
delete: function (path) { return _send('storage.delete', { path: path }); }
},
// ── User filesystem (requires fs.read / fs.write permission) ─────────
fs: {
/** Read a file from the user's filesystem. */
read: function (path) { return _send('fs.read', { path: path }); },
/** Write content to a file in the user's filesystem. */
write: function (path, content) { return _send('fs.write', { path: path, content: content }); },
/** List a directory. */
list: function (path) { return _send('fs.list', { path: path || '/' }); },
/** Stat a path. */
stat: function (path) { return _send('fs.stat', { path: path }); }
},
// ── Notifications (requires notify permission) ────────────────────────
notify: {
/** Show a toast. type: 'info' | 'success' | 'warning' | 'error' */
toast: function (message, type) { return _send('notify.toast', { message: message, type: type || 'info' }); },
/** Show a confirm dialog. Resolves with true (OK) or false (Cancel). */
confirm: function (title, message) { return _send('notify.confirm', { title: title, message: message }); }
},
// ── Window control ────────────────────────────────────────────────────
window: {
/** Update the host window title. */
setTitle: function (title) { return _send('window.setTitle', { title: title }); },
/** Close this app instance. */
close: function () { return _send('window.close', {}); }
}
};
global.KUMOS = KUMOS;
}(window));

229
SDK/SpiderBasic/KUMOS.sbi Normal file
View File

@ -0,0 +1,229 @@
; ════════════════════════════════════════════════════════════════════════════
; KUMOS.sbi — SpiderBasic SDK for KUMOS third-party apps
;
; Usage:
; IncludeFile "KUMOS.sbi"
; KUMOS::Init() ; call once at startup, before anything else
;
; All async procedures accept a *Callback procedure pointer.
; Callbacks always have the signature: Procedure Cb(Success.i, Data.s)
; Exception: KUMOS::Notify_Confirm uses: Procedure Cb(Result.i)
;
; The "storage.*" namespace is always available.
; "fs.*" requires the "fs.read" / "fs.write" permission in manifest.json.
; "notify.*" requires the "notify" permission in manifest.json.
; ════════════════════════════════════════════════════════════════════════════
DeclareModule KUMOS
; Toast types — pass to Notify_Toast()
Enumeration
#Info
#Success
#Warning
#Error
EndEnumeration
; ── Lifecycle ──────────────────────────────────────────────────────────
Declare Init()
Declare Ready(*Callback) ; Cb(Success, Data) — Data: '{"app_id":"..."}'
Declare Window_SetTitle(Title.s)
Declare Window_Close()
; ── Private storage (always available) ────────────────────────────────
Declare Storage_Read (Path.s, *Callback) ; Cb(Success, Content.s)
Declare Storage_Write (Path.s, Content.s, *Callback); Cb(Success, "")
Declare Storage_List (Path.s, *Callback) ; Cb(Success, JSON array)
Declare Storage_Stat (Path.s, *Callback) ; Cb(Success, JSON object)
Declare Storage_Mkdir (Path.s, *Callback) ; Cb(Success, "")
Declare Storage_Delete(Path.s, *Callback) ; Cb(Success, "")
; ── User filesystem (requires fs.read / fs.write) ─────────────────────
Declare FS_Read (Path.s, *Callback) ; Cb(Success, Content.s)
Declare FS_Write (Path.s, Content.s, *Callback) ; Cb(Success, "")
Declare FS_List (Path.s, *Callback) ; Cb(Success, JSON array)
Declare FS_Stat (Path.s, *Callback) ; Cb(Success, JSON object)
; ── Notifications (requires notify) ───────────────────────────────────
Declare Notify_Toast (Message.s, Type.i = #Info) ; fire-and-forget
Declare Notify_Confirm (Title_.s, Message.s, *Callback) ; Cb(Result.i)
EndDeclareModule
Module KUMOS
EnableExplicit
; Inject the JS runtime once, guarded so multiple IncludeFile calls are safe.
Procedure Init()
!if (window._kumos_sb) { return; }
!window._kumos_sb = {
! pending: {},
! uuid: function() {
! return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
! var r = Math.random() * 16 | 0;
! return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
! });
! },
! send: function(action, args, onSuccess, onError) {
! var kmid = window._kumos_sb.uuid();
! var timer = setTimeout(function() {
! var p = window._kumos_sb.pending[kmid];
! if (p) { delete window._kumos_sb.pending[kmid]; p.onError('Timeout: ' + action); }
! }, 15000);
! window._kumos_sb.pending[kmid] = { onSuccess: onSuccess, onError: onError, timer: timer };
! window.parent.postMessage(
! JSON.stringify({ kmid: kmid, action: action, args: args || {} }), '*'
! );
! }
!};
!window.addEventListener('message', function(e) {
! if (e.source !== window.parent) { return; }
! var msg;
! try { msg = JSON.parse(e.data); } catch(ex) { return; }
! if (!msg || !msg.kmid) { return; }
! var p = window._kumos_sb.pending[msg.kmid];
! if (!p) { return; }
! clearTimeout(p.timer);
! delete window._kumos_sb.pending[msg.kmid];
! if (msg.success) {
! var data = msg.data;
! if (data === null || data === undefined) { data = ''; }
! else if (typeof data === 'object') { data = JSON.stringify(data); }
! else if (typeof data === 'boolean') { data = data ? 'true' : 'false'; }
! else { data = String(data); }
! p.onSuccess(data);
! } else {
! p.onError(msg.error || 'Error');
! }
!});
EndProcedure
; ── Internal send helper ──────────────────────────────────────────────────
; *Callback must be Procedure Cb(Success.i, Data.s)
; *ConfirmCallback must be Procedure Cb(Result.i) [used only for confirm]
Procedure _Send(Action.s, ArgsJSON.s, *Callback)
! var cb = p_callback;
!window._kumos_sb.send(
! v_action,
! (v_argsjson ? JSON.parse(v_argsjson) : {}),
! function(data) { cb(1, data); },
! function(err) { cb(0, err); }
!);
EndProcedure
; ── Args builders ─────────────────────────────────────────────────────────
Procedure.s _PathArgs(Path.s)
ProcedureReturn ~"{\"path\":\"" + ReplaceString(Path, ~"\"", ~"\\\"") + ~"\"}"
EndProcedure
Procedure.s _PathContentArgs(Path.s, Content.s)
ProcedureReturn ~"{\"path\":\"" + ReplaceString(Path, ~"\"", ~"\\\"") + ~"\"," +
~"\"content\":\"" + ReplaceString(Content, ~"\"", ~"\\\"") + ~"\"}"
EndProcedure
Procedure.s _TitleMsgArgs(Title_.s, Message.s)
ProcedureReturn ~"{\"title\":\"" + ReplaceString(Title_, ~"\"", ~"\\\"") + ~"\"," +
~"\"message\":\"" + ReplaceString(Message, ~"\"", ~"\\\"") + ~"\"}"
EndProcedure
Procedure.s _TypeStr(Type.i)
Select Type
Case #Success : ProcedureReturn "success"
Case #Warning : ProcedureReturn "warning"
Case #Error : ProcedureReturn "error"
Default : ProcedureReturn "info"
EndSelect
EndProcedure
; ── Lifecycle ─────────────────────────────────────────────────────────────
Procedure Ready(*Callback)
_Send("window.ready", "{}", *Callback)
EndProcedure
Procedure Window_SetTitle(Title.s)
; Fire-and-forget — no callback needed
! window._kumos_sb.send('window.setTitle',
! { title: v_title }, function(){}, function(){});
EndProcedure
Procedure Window_Close()
! window._kumos_sb.send('window.close', {}, function(){}, function(){});
EndProcedure
; ── Storage ───────────────────────────────────────────────────────────────
Procedure Storage_Read(Path.s, *Callback)
_Send("storage.read", _PathArgs(Path), *Callback)
EndProcedure
Procedure Storage_Write(Path.s, Content.s, *Callback)
_Send("storage.write", _PathContentArgs(Path, Content), *Callback)
EndProcedure
Procedure Storage_List(Path.s, *Callback)
_Send("storage.list", _PathArgs(Path), *Callback)
EndProcedure
Procedure Storage_Stat(Path.s, *Callback)
_Send("storage.stat", _PathArgs(Path), *Callback)
EndProcedure
Procedure Storage_Mkdir(Path.s, *Callback)
_Send("storage.mkdir", _PathArgs(Path), *Callback)
EndProcedure
Procedure Storage_Delete(Path.s, *Callback)
_Send("storage.delete", _PathArgs(Path), *Callback)
EndProcedure
; ── User filesystem ───────────────────────────────────────────────────────
Procedure FS_Read(Path.s, *Callback)
_Send("fs.read", _PathArgs(Path), *Callback)
EndProcedure
Procedure FS_Write(Path.s, Content.s, *Callback)
_Send("fs.write", _PathContentArgs(Path, Content), *Callback)
EndProcedure
Procedure FS_List(Path.s, *Callback)
_Send("fs.list", _PathArgs(Path), *Callback)
EndProcedure
Procedure FS_Stat(Path.s, *Callback)
_Send("fs.stat", _PathArgs(Path), *Callback)
EndProcedure
; ── Notifications ─────────────────────────────────────────────────────────
Procedure Notify_Toast(Message.s, Type.i = #Info)
Protected Args.s = ~"{\"message\":\"" + ReplaceString(Message, ~"\"", ~"\\\"") + ~"\"," +
~"\"type\":\"" + _TypeStr(Type) + ~"\"}"
! window._kumos_sb.send('notify.toast',
! JSON.parse(v_args), function(){}, function(){});
EndProcedure
; *Callback must be Procedure Cb(Result.i) — 1 = OK, 0 = Cancel
Procedure Notify_Confirm(Title_.s, Message.s, *Callback)
Protected Args.s = _TitleMsgArgs(Title_, Message)
! var cb = p_callback;
!window._kumos_sb.send(
! 'notify.confirm',
! JSON.parse(v_args),
! function(data) { cb(data === 'true' ? 1 : 0); },
! function() { cb(0); }
!);
EndProcedure
EndModule
; IDE Options = SpiderBasic 3.20 (Windows - x86)
; CursorPosition = 1
; Folding = ----
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

123
SDK/SpiderBasic/Template.sb Normal file
View File

@ -0,0 +1,123 @@
; ════════════════════════════════════════════════════════════════════════════
; KUMOS App Template
;
; 1. Copy this file and KUMOS.sbi into a new folder.
; 2. Edit manifest.json (also in this folder) with your app's details.
; 3. Compile with SpiderBasic — output: index.html
; 4. Zip index.html + manifest.json → yourapp.zip
; 5. Install via App Manager.
;
; Checklist before shipping:
; ☐ Unique reverse-domain id in manifest.json e.g. com.yourname.yourapp
; ☐ Only request permissions you actually use
; ☐ Call KUMOS::Init() before KUMOS::Ready()
; ☐ All KUMOS calls must happen AFTER Ready() resolves
; ════════════════════════════════════════════════════════════════════════════
IncludeFile "KUMOS.sbi"
; ── State (your app's data goes here) ────────────────────────────────────────
Global Count.i = 0
; ── UI ───────────────────────────────────────────────────────────────────────
OpenWindow(0, 0, 0, 400, 300, "Loading…",
#PB_Window_BorderLess | #PB_Window_ScreenCentered)
SetWindowColor(0, RGB(22, 22, 34))
Global Label_Count.i = TextGadget(#PB_Any,
0, 100, 400, 40, "…",
#PB_Text_Center | #PB_Text_Border)
SetGadgetColor(Label_Count, #PB_Gadget_FrontColor, RGB(100, 120, 255))
SetGadgetColor(Label_Count, #PB_Gadget_BackColor, RGB(22, 22, 34))
SetGadgetFont(Label_Count, LoadFont(#PB_Any, "sans-serif", 28))
Global Btn_Click.i = ButtonGadget(#PB_Any, 150, 160, 100, 32, "Click me")
Global Btn_Toast.i = ButtonGadget(#PB_Any, 50, 210, 130, 28, "Toast")
Global Btn_Confirm.i= ButtonGadget(#PB_Any, 220, 210, 130, 28, "Confirm")
; ── Helpers ───────────────────────────────────────────────────────────────────
Procedure UpdateUI()
SetGadgetText(Label_Count, Str(Count))
EndProcedure
; ── Storage callbacks ─────────────────────────────────────────────────────────
Procedure OnSaved(Success.i, Data.s)
If Not Success
KUMOS::Notify_Toast("Save failed: " + Data, KUMOS::#Warning)
EndIf
EndProcedure
Procedure OnLoaded(Success.i, Data.s)
If Success
Protected N.i = Val(Data)
If N > 0 : Count = N : UpdateUI() : EndIf
EndIf
; File missing on first launch is normal — just start from zero.
EndProcedure
Procedure SaveCount()
KUMOS::Storage_Write("/count.txt", Str(Count), @OnSaved())
EndProcedure
; ── Button events ─────────────────────────────────────────────────────────────
Procedure OnConfirmResult(Result.i)
If Result
KUMOS::Notify_Toast("You clicked OK!", KUMOS::#Success)
Else
KUMOS::Notify_Toast("You clicked Cancel.", KUMOS::#Info)
EndIf
EndProcedure
BindGadgetEvent(Btn_Click, @Clicked())
Procedure Clicked()
Count + 1
UpdateUI()
SaveCount()
EndProcedure
BindGadgetEvent(Btn_Toast, @ToastClicked())
Procedure ToastClicked()
KUMOS::Notify_Toast("Hello from SpiderBasic!", KUMOS::#Success)
EndProcedure
BindGadgetEvent(Btn_Confirm, @ConfirmClicked())
Procedure ConfirmClicked()
KUMOS::Notify_Confirm("Are you sure?", "This is a confirm dialog.", @OnConfirmResult())
EndProcedure
; ── Boot: always KUMOS::Init() then KUMOS::Ready() ────────────────────────────
Procedure OnReady(Success.i, Data.s)
If Not Success
; Running outside KUMO.S — useful for testing in a plain browser
SetWindowTitle(0, "Template App (standalone)")
UpdateUI()
ProcedureReturn
EndIf
; Set the window title via the shell
KUMOS::Window_SetTitle("Template App")
; Load persisted state
KUMOS::Storage_Read("/count.txt", @OnLoaded())
UpdateUI()
EndProcedure
KUMOS::Init()
KUMOS::Ready(@OnReady())
; IDE Options = SpiderBasic 3.20 (Windows - x86)
; CursorPosition = 1
; Folding = --
; iOSAppOrientation = 0
; AndroidAppCode = 0
; AndroidAppOrientation = 0
; EnableXP
; DPIAware
; CompileSourceDirectory

View File

@ -0,0 +1,408 @@
Module AppStore
EnableExplicit
; Constants
#AppsDir = "apps/"
#TempDir = "tmp/"
#ValidPermCount = 4
; Variables
Global Dim _ValidPerms.s(#ValidPermCount - 1)
_ValidPerms(0) = "storage"
_ValidPerms(1) = "fs.read"
_ValidPerms(2) = "fs.write"
_ValidPerms(3) = "notify"
;- Private declarations
Declare _IsValidAppID(AppID.s)
Declare _IsValidPermission(Perm.s)
Declare _IsValidFilePath(Path.s)
Declare.s _BundleDir(UserID, AppID.s)
Declare _EnsureDir(Path.s)
Declare _DeleteDirRecursive(Path.s)
Declare _WipeBundle(UserID, AppID.s)
Declare _WipeStorage(UserID, AppID.s)
Declare _ExtractZip(ZipFile.s, DestDir.s)
Declare.s _ReadManifestFromZip(ZipFile.s)
Declare.s _ValidateManifest(JSON.s, *OutAppID.String, *OutPerms.String)
;- Public procedures
Procedure Init()
If FileSize(#AppsDir) <> -2 : CreateDirectory(#AppsDir) : EndIf
If FileSize(#TempDir) <> -2 : CreateDirectory(#TempDir) : EndIf
EndProcedure
; GET /api/apps/list
Procedure HandleList(*Request)
Protected Username.s = Auth::GetSessionUser(*Request)
If Username = ""
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
ProcedureReturn
EndIf
General::RespondJSON(*Request, Database::AppList(Database::FindUser(Username)))
EndProcedure
; POST /api/apps/install body: url=<zip url>
Procedure HandleInstall(*Request)
Protected UserID, HiddenDir, Home, AppsRoot
Protected Username.s, URL.s, TempZip.s, ManifestJSON.s, ErrMsg.s, AppID.s, BundleDir.s, Perms.s
Protected OutAppID.String, OutPerms.String
Username = Auth::GetSessionUser(*Request)
If Username = ""
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
ProcedureReturn
EndIf
UserID = Database::FindUser(Username)
URL = General::GetPostField(*Request, "url")
If URL = ""
General::RespondJSON(*Request, ~"{\"error\":\"Missing url\"}")
ProcedureReturn
EndIf
If Left(URL, 7) <> "http://" And Left(URL, 8) <> "https://"
General::RespondJSON(*Request, ~"{\"error\":\"URL must begin with http:// or https://\"}")
ProcedureReturn
EndIf
TempZip = #TempDir + "pkg_" + UserID + "_" + ElapsedMilliseconds() + ".zip"
If Not ReceiveHTTPFile(URL, TempZip)
General::RespondJSON(*Request, ~"{\"error\":\"Failed to download package from URL\"}")
ProcedureReturn
EndIf
; Read and validate manifest before touching anything
ManifestJSON = _ReadManifestFromZip(TempZip)
If ManifestJSON = ""
DeleteFile(TempZip)
General::RespondJSON(*Request, ~"{\"error\":\"manifest.json not found or unreadable in package\"}")
ProcedureReturn
EndIf
ErrMsg = _ValidateManifest(ManifestJSON, @OutAppID, @OutPerms)
If ErrMsg <> ""
DeleteFile(TempZip)
General::RespondJSON(*Request, ~"{\"error\":\"" + ReplaceString(ErrMsg, ~"\"", ~"\\\"") + ~"\"}")
ProcedureReturn
EndIf
AppID = OutAppID\s
Perms = OutPerms\s
If Database::AppExists(UserID, AppID)
_WipeBundle(UserID, AppID)
Database::AppUninstall(UserID, AppID)
EndIf
BundleDir = _BundleDir(UserID, AppID)
If Not _EnsureDir(BundleDir)
DeleteFile(TempZip)
General::RespondJSON(*Request, ~"{\"error\":\"Could not create app directory\"}")
ProcedureReturn
EndIf
If Not _ExtractZip(TempZip, BundleDir)
DeleteFile(TempZip)
_WipeBundle(UserID, AppID)
General::RespondJSON(*Request, ~"{\"error\":\"Failed to extract package\"}")
ProcedureReturn
EndIf
DeleteFile(TempZip)
If Not Database::AppInstall(UserID, AppID, ManifestJSON, Perms)
_WipeBundle(UserID, AppID)
General::RespondJSON(*Request, ~"{\"error\":\"Failed to register app in database\"}")
ProcedureReturn
EndIf
HiddenDir = Database::FSResolve(UserID, "/.apps/" + AppID)
If HiddenDir = 0
AppsRoot = Database::FSResolve(UserID, "/.apps")
If AppsRoot = 0
Home = Database::FSGetOrCreateHome(UserID)
AppsRoot = Database::FSMkdir(UserID, Home, ".apps")
EndIf
If AppsRoot > 0
Database::FSMkdir(UserID, AppsRoot, AppID)
EndIf
EndIf
General::RespondJSON(*Request, ~"{\"success\":true,\"app_id\":\"" + ReplaceString(AppID, ~"\"", ~"\\\"") + ~"\"}")
EndProcedure
; POST /api/apps/uninstall body: app_id=... [&keep_data=1]
Procedure HandleUninstall(*Request)
Protected UserID, KeepData
Protected Username.s, AppID.s
Username = Auth::GetSessionUser(*Request)
If Username = ""
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
ProcedureReturn
EndIf
UserID = Database::FindUser(Username)
AppID = General::GetPostField(*Request, "app_id")
KeepData = Val(General::GetPostField(*Request, "keep_data"))
If AppID = "" Or Not _IsValidAppID(AppID)
General::RespondJSON(*Request, ~"{\"error\":\"Invalid or missing app_id\"}")
ProcedureReturn
EndIf
If Not Database::AppExists(UserID, AppID)
General::RespondJSON(*Request, ~"{\"error\":\"App not installed\"}", "404 Not Found")
ProcedureReturn
EndIf
Database::AppUninstall(UserID, AppID)
_WipeBundle(UserID, AppID)
If Not KeepData : _WipeStorage(UserID, AppID) : EndIf
General::RespondJSON(*Request, ~"{\"success\":true}")
EndProcedure
; GET /api/apps/{app_id}/{filepath}
Procedure HandleServeFile(*Request, AppID.s, FilePath.s)
Protected UserID
Protected Username.s, FullPath.s
Username = Auth::GetSessionUser(*Request)
If Username = ""
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
ProcedureReturn
EndIf
If Not _IsValidAppID(AppID)
General::RespondJSON(*Request, ~"{\"error\":\"Bad Request\"}", "400 Bad Request")
ProcedureReturn
EndIf
If Not _IsValidFilePath(FilePath)
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
ProcedureReturn
EndIf
UserID = Database::FindUser(Username)
If Not Database::AppExists(UserID, AppID)
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
ProcedureReturn
EndIf
FullPath = _BundleDir(UserID, AppID) + FilePath
If FileSize(FullPath) < 0
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
ProcedureReturn
EndIf
If Not FastCGI::RespondFile(*Request, FullPath)
General::RespondJSON(*Request, ~"{\"error\":\"Read error\"}", "500 Internal Server Error")
EndIf
EndProcedure
;- Private procedures
Procedure _IsValidAppID(AppID.s)
Protected Length, i
Protected c.s
Length = Len(AppID)
If Length = 0 Or Length > 64 : ProcedureReturn #False : EndIf
For i = 1 To Length
c = Mid(AppID, i, 1)
If Not ((c >= "a" And c <= "z") Or (c >= "A" And c <= "Z") Or (c >= "0" And c <= "9") Or c = "." Or c = "-" Or c = "_")
ProcedureReturn #False
EndIf
Next
ProcedureReturn #True
EndProcedure
Procedure _IsValidPermission(Perm.s)
Protected i
For i = 0 To #ValidPermCount - 1
If _ValidPerms(i) = Perm : ProcedureReturn #True : EndIf
Next
ProcedureReturn #False
EndProcedure
Procedure _IsValidFilePath(Path.s)
If Path = "" : ProcedureReturn #False : EndIf
If Left(Path, 1) = "/" Or Left(Path, 1) = "\" : ProcedureReturn #False : EndIf
If FindString(Path, "..") : ProcedureReturn #False : EndIf
If FindString(Path, "//") Or FindString(Path, "\\") : ProcedureReturn #False : EndIf
ProcedureReturn #True
EndProcedure
Procedure.s _BundleDir(UserID, AppID.s)
ProcedureReturn #AppsDir + UserID + "/" + AppID + "/"
EndProcedure
Procedure _EnsureDir(Path.s)
Protected Parts, i
Protected Current.s, Seg.s, Probe.s
Path = ReplaceString(Path, "\", "/")
If Right(Path, 1) <> "/" : Path + "/" : EndIf
Parts = CountString(Path, "/")
For i = 1 To Parts
Seg = StringField(Path, i, "/")
If Seg = "" : Continue : EndIf
Current + Seg + "/"
Probe = Left(Current, Len(Current) - 1)
If FileSize(Probe) <> -2
If Not CreateDirectory(Probe) : ProcedureReturn #False : EndIf
EndIf
Next
ProcedureReturn #True
EndProcedure
; Built-in DeleteDirectory with #PB_FileSystem_Recursive handles the walk for us
Procedure _DeleteDirRecursive(Path.s)
If Right(Path, 1) = "/" : Path = Left(Path, Len(Path) - 1) : EndIf
DeleteDirectory(Path, "", #PB_FileSystem_Recursive)
EndProcedure
Procedure _WipeBundle(UserID, AppID.s)
_DeleteDirRecursive(_BundleDir(UserID, AppID))
EndProcedure
Procedure _WipeStorage(UserID, AppID.s)
Protected NodeID
Protected VPath.s = "/.apps/" + AppID
NodeID = Database::FSResolve(UserID, VPath)
If NodeID > 0 : Database::FSDelete(NodeID) : EndIf
EndProcedure
Procedure _ExtractZip(ZipFile.s, DestDir.s)
Protected OK, LastSlash, Pos
Protected EntryName.s
If Not OpenPack(0, ZipFile, #PB_PackerPlugin_Zip) : ProcedureReturn #False : EndIf
If Not ExaminePack(0) : ClosePack(0) : ProcedureReturn #False : EndIf
OK = #True
While NextPackEntry(0)
EntryName = PackEntryName(0)
If Not _IsValidFilePath(EntryName) : OK = #False : Break : EndIf
; Directory entry — just ensure it exists
If Right(EntryName, 1) = "/"
_EnsureDir(DestDir + EntryName)
Continue
EndIf
; Ensure parent directory exists
LastSlash = 0
Pos = FindString(EntryName, "/")
While Pos > 0
LastSlash = Pos
Pos = FindString(EntryName, "/", Pos + 1)
Wend
If LastSlash > 0 : _EnsureDir(DestDir + Left(EntryName, LastSlash)) : EndIf
If Not UncompressPackFile(0, DestDir + EntryName, EntryName)
OK = #False : Break
EndIf
Wend
ClosePack(0)
ProcedureReturn OK
EndProcedure
Procedure.s _ReadManifestFromZip(ZipFile.s)
Protected Found, Size, FileID, *Buf
Protected TempPath.s, Result.s
If Not OpenPack(0, ZipFile, #PB_PackerPlugin_Zip) : ProcedureReturn "" : EndIf
TempPath = #TempDir + "manifest_" + ElapsedMilliseconds() + ".json"
If ExaminePack(0)
While NextPackEntry(0)
If PackEntryName(0) = "manifest.json"
Found = Bool(UncompressPackFile(0, TempPath, "manifest.json"))
Break
EndIf
Wend
EndIf
ClosePack(0)
If Not Found : ProcedureReturn "" : EndIf
Size = FileSize(TempPath)
If Size > 0 And Size < 65536 ; sanity cap: 64 KB
FileID = ReadFile(#PB_Any, TempPath, #PB_File_SharedRead)
If FileID
*Buf = AllocateMemory(Size + 1)
If *Buf
ReadData(FileID, *Buf, Size)
PokeB(*Buf + Size, 0)
Result = PeekS(*Buf, -1, #PB_UTF8)
FreeMemory(*Buf)
EndIf
CloseFile(FileID)
EndIf
EndIf
DeleteFile(TempPath)
ProcedureReturn Result
EndProcedure
Procedure.s _ValidateManifest(JSON.s, *OutAppID.String, *OutPerms.String)
Protected Root, PermsNode, PermCount, i
Protected AppID.s, Name_.s, Entry.s, PermsJSON.s, Perm.s
If Not ParseJSON(0, JSON) : ProcedureReturn "Invalid JSON in manifest" : EndIf
Root = JSONValue(0)
AppID = GetJSONString(GetJSONMember(Root, "id"))
Name_ = GetJSONString(GetJSONMember(Root, "name"))
Entry = GetJSONString(GetJSONMember(Root, "entry"))
If AppID = "" Or Name_ = "" Or Entry = ""
FreeJSON(0)
ProcedureReturn "manifest.json missing required field(s): id, name, entry"
EndIf
If Not _IsValidAppID(AppID)
FreeJSON(0)
ProcedureReturn "Invalid app id '" + AppID + "' (use reverse-domain format)"
EndIf
If Not _IsValidFilePath(Entry)
FreeJSON(0)
ProcedureReturn "Invalid entry path"
EndIf
PermsNode = GetJSONMember(Root, "permissions")
PermCount = JSONArraySize(PermsNode)
PermsJSON = ~"[\"storage\""
For i = 0 To PermCount - 1
Perm = GetJSONString(GetJSONElement(PermsNode, i))
If Perm = "" Or Perm = "storage" : Continue : EndIf
If Not _IsValidPermission(Perm)
FreeJSON(0)
ProcedureReturn "Unknown permission '" + Perm + "'"
EndIf
PermsJSON + ~",\"" + Perm + ~"\""
Next
PermsJSON + "]"
*OutAppID\s = AppID
*OutPerms\s = PermsJSON
FreeJSON(0)
ProcedureReturn ""
EndProcedure
EndModule
; IDE Options = PureBasic 6.30 (Windows - x64)
; CursorPosition = 402
; Folding = BAg
; EnableXP
; DPIAware

121
Server/Includes/Auth.pbi Normal file
View File

@ -0,0 +1,121 @@
Module Auth
EnableExplicit
;- Private helpers
Procedure.s GetFormField(PostData.s, Field.s)
; Parse a single field from application/x-www-form-urlencoded body
Protected Count = CountString(PostData, "&") + 1, i
Protected Pair.s, Key.s
For i = 1 To Count
Pair = StringField(PostData, i, "&")
Key = StringField(Pair, 1, "=")
If Key = Field
ProcedureReturn URLDecoder(StringField(Pair, 2, "="))
EndIf
Next
ProcedureReturn ""
EndProcedure
Procedure SetSessionCookie(*Request, Token.s)
FastCGI::WriteResponseHeader(*Request, "Set-Cookie",
#SESSION_COOKIE + "=" + Token +
"; Path=/; HttpOnly; SameSite=Strict; Max-Age=" + #SESSION_MAX_AGE)
EndProcedure
Procedure ClearSessionCookie(*Request)
FastCGI::WriteResponseHeader(*Request, "Set-Cookie",
#SESSION_COOKIE + "=; Path=/; HttpOnly; SameSite=Strict; Max-Age=0")
EndProcedure
;- Public handlers
Procedure HandleLogin(*Request)
Protected PostData.s = FastCGI::GetPostData(*Request)
Protected Username.s = GetFormField(PostData, "username")
Protected Password.s = GetFormField(PostData, "password")
If Username = "" Or Password = ""
General::RespondJSON(*Request, ~"{\"success\":false,\"error\":\"Missing credentials\"}")
ProcedureReturn
EndIf
Protected ValidUser.s = Database::ValidateCredentials(Username, Password)
If ValidUser <> ""
Protected UserID.i = Database::FindUser(ValidUser)
Protected Token.s = Database::CreateSession(UserID, ValidUser)
SetSessionCookie(*Request, Token)
FastCGI::WriteResponseHeader(*Request, "Content-Type", "application/json; charset=utf-8")
FastCGI::WriteResponseHeader(*Request, "Cache-Control", "no-cache, no-store")
FastCGI::WriteResponseString(*Request, ~"{\"success\":true,\"username\":\"" + ValidUser + ~"\"}")
FastCGI::FinishResponse(*Request)
Else
; Uniform error - don't reveal which field was wrong
General::RespondJSON(*Request, ~"{\"success\":false,\"error\":\"Invalid username or password\"}")
EndIf
EndProcedure
Procedure HandleLogout(*Request)
Protected Token.s = FastCGI::GetCookie(*Request, #SESSION_COOKIE)
If Token <> ""
Database::DeleteSession(Token)
EndIf
ClearSessionCookie(*Request)
General::RespondJSON(*Request, ~"{\"success\":true}")
EndProcedure
Procedure HandleCheck(*Request)
Protected Token.s = FastCGI::GetCookie(*Request, #SESSION_COOKIE)
Protected Username.s = ""
If Token <> ""
Username = Database::ValidateSession(Token)
EndIf
If Username <> ""
General::RespondJSON(*Request, ~"{\"authenticated\":true,\"username\":\"" + Username + ~"\"}")
Else
General::RespondJSON(*Request, ~"{\"authenticated\":false}")
EndIf
EndProcedure
Procedure.s GetSessionUser(*Request)
Protected Token.s = FastCGI::GetCookie(*Request, #SESSION_COOKIE)
If Token <> ""
ProcedureReturn Database::ValidateSession(Token)
EndIf
ProcedureReturn ""
EndProcedure
Procedure HandleChangePassword(*Request)
Protected Username.s = GetSessionUser(*Request)
If Username = ""
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
ProcedureReturn
EndIf
Protected CurrentPwd.s = General::GetPostField(*Request, "current_password")
Protected NewPwd.s = General::GetPostField(*Request, "new_password")
If CurrentPwd = "" Or NewPwd = ""
General::RespondJSON(*Request, ~"{\"error\":\"Missing fields\"}")
ProcedureReturn
EndIf
If Database::ValidateCredentials(Username, CurrentPwd) = ""
General::RespondJSON(*Request, ~"{\"error\":\"Current password is incorrect\"}")
ProcedureReturn
EndIf
Protected UserID.i = Database::FindUser(Username)
Database::ChangePassword(UserID, NewPwd)
General::RespondJSON(*Request, ~"{\"success\":true}")
EndProcedure
EndModule
; IDE Options = PureBasic 6.30 (Windows - x64)
; CursorPosition = 29
; Folding = B5
; EnableXP
; DPIAware

View File

@ -0,0 +1,420 @@
Module Database
EnableExplicit
UseSQLiteDatabase()
; Private constants
#DB = 0
; Private procedures
Procedure.s SHA256(text.s)
Protected *Buf, Len.i, Hash.s
Len = StringByteLength(text, #PB_UTF8)
If Len = 0 : ProcedureReturn "" : EndIf
*Buf = AllocateMemory(Len)
If *Buf
PokeS(*Buf, text, -1, #PB_UTF8 | #PB_String_NoZero)
Hash = LCase(Fingerprint(*Buf, Len, #PB_Cipher_SHA2, 256))
FreeMemory(*Buf)
EndIf
ProcedureReturn Hash
EndProcedure
Procedure.s GenerateHex(Bytes.i)
Protected Token.s, i
For i = 1 To Bytes
Token + RSet(Hex(Random(255)), 2, "0")
Next
ProcedureReturn LCase(Token)
EndProcedure
Procedure.s JSONEscape(s.s)
s = ReplaceString(s, "\", "\\")
s = ReplaceString(s, ~"\"", ~"\\\"")
s = ReplaceString(s, ~"\n", ~"\\n")
s = ReplaceString(s, ~"\r", ~"\\r")
s = ReplaceString(s, ~"\t", ~"\\t")
ProcedureReturn s
EndProcedure
;- Public procedures
Procedure Init(Path.s)
Protected TempFile.i
If FileSize(Path) = -1
TempFile = CreateFile(#PB_Any, Path)
CloseFile(TempFile)
EndIf
If Not OpenDatabase(#DB, Path, "", "", #PB_Database_SQLite)
ProcedureReturn #False
EndIf
DatabaseUpdate(#DB, "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL COLLATE NOCASE, password_hash TEXT NOT NULL, salt TEXT NOT NULL, created_at INTEGER NOT NULL)")
DatabaseUpdate(#DB, "CREATE TABLE IF NOT EXISTS sessions (token TEXT PRIMARY KEY, user_id INTEGER NOT NULL, username TEXT NOT NULL, created_at INTEGER NOT NULL, expires_at INTEGER NOT NULL)")
DatabaseUpdate(#DB, "CREATE TABLE IF NOT EXISTS installed_apps (id INTEGER PRIMARY KEY, user_id INTEGER NOT NULL, app_id TEXT NOT NULL, manifest TEXT NOT NULL, permissions TEXT NOT NULL, installed_at INTEGER NOT NULL, UNIQUE(user_id, app_id))")
ProcedureReturn #True
EndProcedure
Procedure Close()
If IsDatabase(#DB)
CloseDatabase(#DB)
EndIf
EndProcedure
; User management
Procedure UserCount()
Protected Count = 0
If DatabaseQuery(#DB, "SELECT COUNT(*) FROM users")
If NextDatabaseRow(#DB) : Count = GetDatabaseLong(#DB, 0) : EndIf
FinishDatabaseQuery(#DB)
EndIf
ProcedureReturn Count
EndProcedure
Procedure FindUser(Username.s)
Protected ID = 0
SetDatabaseString(#DB, 0, Username)
If DatabaseQuery(#DB, "SELECT id FROM users WHERE username = ? COLLATE NOCASE")
If NextDatabaseRow(#DB) : ID = GetDatabaseLong(#DB, 0) : EndIf
FinishDatabaseQuery(#DB)
EndIf
ProcedureReturn ID
EndProcedure
Procedure CreateUser(Username.s, Password.s)
Protected Salt.s = GenerateHex(16)
Protected Hash.s = SHA256(Password + Salt)
SetDatabaseString(#DB, 0, Username)
SetDatabaseString(#DB, 1, Hash)
SetDatabaseString(#DB, 2, Salt)
SetDatabaseLong(#DB, 3, Date())
ProcedureReturn DatabaseUpdate(#DB, "INSERT INTO users (username, password_hash, salt, created_at) VALUES (?, ?, ?, ?)")
EndProcedure
Procedure ChangePassword(UserID.i, NewPassword.s)
Protected Salt.s = GenerateHex(16)
Protected Hash.s = SHA256(NewPassword + Salt)
SetDatabaseString(#DB, 0, Hash)
SetDatabaseString(#DB, 1, Salt)
SetDatabaseLong(#DB, 2, UserID)
DatabaseUpdate(#DB, "UPDATE users SET password_hash = ?, salt = ? WHERE id = ?")
EndProcedure
Procedure.s ValidateCredentials(Username.s, Password.s)
Protected StoredUser.s, Hash.s, Salt.s
SetDatabaseString(#DB, 0, Username)
If DatabaseQuery(#DB, "SELECT username, password_hash, salt FROM users WHERE username = ? COLLATE NOCASE")
If NextDatabaseRow(#DB)
StoredUser = GetDatabaseString(#DB, 0)
Hash = GetDatabaseString(#DB, 1)
Salt = GetDatabaseString(#DB, 2)
EndIf
FinishDatabaseQuery(#DB)
EndIf
If StoredUser = "" : ProcedureReturn "" : EndIf
If SHA256(Password + Salt) = Hash : ProcedureReturn StoredUser : EndIf
ProcedureReturn ""
EndProcedure
Procedure.s CreateSession(UserID.i, Username.s)
Protected Token.s = GenerateHex(32)
Protected Now.i = Date()
SetDatabaseString(#DB, 0, Token)
SetDatabaseLong(#DB, 1, UserID)
SetDatabaseString(#DB, 2, Username)
SetDatabaseLong(#DB, 3, Now)
SetDatabaseLong(#DB, 4, Now + #SESSION_DURATION)
DatabaseUpdate(#DB, "INSERT OR REPLACE INTO sessions (token, user_id, username, created_at, expires_at) VALUES (?, ?, ?, ?, ?)")
ProcedureReturn Token
EndProcedure
Procedure.s ValidateSession(Token.s)
Protected Username.s = ""
If Len(Token) <> 64 : ProcedureReturn "" : EndIf
SetDatabaseString(#DB, 0, Token)
SetDatabaseLong(#DB, 1, Date())
If DatabaseQuery(#DB, "SELECT username FROM sessions WHERE token = ? AND expires_at > ?")
If NextDatabaseRow(#DB) : Username = GetDatabaseString(#DB, 0) : EndIf
FinishDatabaseQuery(#DB)
EndIf
ProcedureReturn Username
EndProcedure
Procedure DeleteSession(Token.s)
SetDatabaseString(#DB, 0, Token)
DatabaseUpdate(#DB, "DELETE FROM sessions WHERE token = ?")
EndProcedure
Procedure CleanExpiredSessions()
SetDatabaseLong(#DB, 0, Date())
DatabaseUpdate(#DB, "DELETE FROM sessions WHERE expires_at <= ?")
EndProcedure
;- File system
Procedure.i FSInit()
Protected Now.i = Date()
DatabaseUpdate(#DB, "CREATE TABLE IF NOT EXISTS fs_nodes (id INTEGER PRIMARY KEY AUTOINCREMENT, owner_id INTEGER NOT NULL, parent_id INTEGER, name TEXT NOT NULL COLLATE NOCASE, is_dir INTEGER NOT NULL DEFAULT 0, mime_type TEXT NOT NULL DEFAULT 'application/octet-stream', size INTEGER NOT NULL DEFAULT 0, created_at INTEGER NOT NULL, modified_at INTEGER NOT NULL)")
DatabaseUpdate(#DB, "CREATE UNIQUE INDEX IF NOT EXISTS idx_fs_unique ON fs_nodes(parent_id, name)")
DatabaseUpdate(#DB, "CREATE INDEX IF NOT EXISTS idx_fs_owner ON fs_nodes(owner_id)")
; Shared root - owner_id 0, one row, idempotent
SetDatabaseLong(#DB, 0, Now)
SetDatabaseLong(#DB, 1, Now)
DatabaseUpdate(#DB, "INSERT OR IGNORE INTO fs_nodes (owner_id, parent_id, name, is_dir, created_at, modified_at) VALUES (0, NULL, 'shared', 1, ?, ?)")
ProcedureReturn #True
EndProcedure
Procedure.i FSGetOrCreateHome(UserID.i)
Protected ID.i = 0, Now.i
SetDatabaseLong(#DB, 0, UserID)
If DatabaseQuery(#DB, "SELECT id FROM fs_nodes WHERE owner_id = ? AND parent_id IS NULL")
If NextDatabaseRow(#DB) : ID = GetDatabaseLong(#DB, 0) : EndIf
FinishDatabaseQuery(#DB)
EndIf
If ID = 0
Now = Date()
SetDatabaseLong(#DB, 0, UserID)
SetDatabaseLong(#DB, 1, Now)
SetDatabaseLong(#DB, 2, Now)
DatabaseUpdate(#DB, "INSERT INTO fs_nodes (owner_id, parent_id, name, is_dir, created_at, modified_at) VALUES (?, NULL, 'home', 1, ?, ?)")
If DatabaseQuery(#DB, "SELECT last_insert_rowid()")
If NextDatabaseRow(#DB) : ID = GetDatabaseLong(#DB, 0) : EndIf
FinishDatabaseQuery(#DB)
EndIf
EndIf
ProcedureReturn ID
EndProcedure
Procedure.i FSResolve(UserID.i, Path.s)
Protected CurrentID.i, SegCount.i, i.i, Seg.s, CandID.i
While Left(Path, 1) = "/" : Path = Mid(Path, 2) : Wend
While Right(Path, 1) = "/" : Path = Left(Path, Len(Path) - 1) : Wend
If Path = "shared" Or Left(Path, 7) = "shared/"
If DatabaseQuery(#DB, "SELECT id FROM fs_nodes WHERE owner_id = 0 AND parent_id IS NULL")
If NextDatabaseRow(#DB) : CurrentID = GetDatabaseLong(#DB, 0) : EndIf
FinishDatabaseQuery(#DB)
EndIf
If Path = "shared" : ProcedureReturn CurrentID : EndIf
Path = Mid(Path, 8) ; strip "shared/"
Else
CurrentID = FSGetOrCreateHome(UserID)
If Path = "" : ProcedureReturn CurrentID : EndIf
EndIf
If CurrentID = 0 : ProcedureReturn 0 : EndIf
SegCount = CountString(Path, "/") + 1
For i = 1 To SegCount
Seg = StringField(Path, i, "/")
If Seg = "" : Continue : EndIf
CandID = 0
SetDatabaseLong(#DB, 0, CurrentID)
SetDatabaseString(#DB, 1, Seg)
If DatabaseQuery(#DB, "SELECT id FROM fs_nodes WHERE parent_id = ? AND name = ?")
If NextDatabaseRow(#DB) : CandID = GetDatabaseLong(#DB, 0) : EndIf
FinishDatabaseQuery(#DB)
EndIf
If CandID = 0 : ProcedureReturn 0 : EndIf
CurrentID = CandID
Next
ProcedureReturn CurrentID
EndProcedure
Procedure.s FSList(NodeID.i)
Protected JSON.s = "[", First.i = #True
SetDatabaseLong(#DB, 0, NodeID)
If DatabaseQuery(#DB, "SELECT id, name, is_dir, mime_type, size, modified_at FROM fs_nodes WHERE parent_id = ? ORDER BY is_dir DESC, name")
While NextDatabaseRow(#DB)
If Not First : JSON + "," : EndIf
JSON + ~"{\"id\":" + GetDatabaseLong(#DB, 0) +
~",\"name\":\"" + JSONEscape(GetDatabaseString(#DB, 1)) + ~"\"" +
~",\"is_dir\":" + GetDatabaseLong(#DB, 2) +
~",\"mime_type\":\"" + JSONEscape(GetDatabaseString(#DB, 3)) + ~"\"" +
~",\"size\":" + GetDatabaseLong(#DB, 4) +
~",\"modified_at\":" + GetDatabaseLong(#DB, 5) + "}"
First = #False
Wend
FinishDatabaseQuery(#DB)
EndIf
ProcedureReturn JSON + "]"
EndProcedure
Procedure.s FSStat(NodeID.i)
Protected JSON.s = ""
SetDatabaseLong(#DB, 0, NodeID)
If DatabaseQuery(#DB, "SELECT id, owner_id, parent_id, name, is_dir, mime_type, size, created_at, modified_at FROM fs_nodes WHERE id = ?")
If NextDatabaseRow(#DB)
JSON = ~"{\"id\":" + GetDatabaseLong(#DB, 0) +
~",\"owner_id\":" + GetDatabaseLong(#DB, 1) +
~",\"parent_id\":" + GetDatabaseLong(#DB, 2) +
~",\"name\":\"" + JSONEscape(GetDatabaseString(#DB, 3)) + ~"\"" +
~",\"is_dir\":" + GetDatabaseLong(#DB, 4) +
~",\"mime_type\":\"" + JSONEscape(GetDatabaseString(#DB, 5)) + ~"\"" +
~",\"size\":" + GetDatabaseLong(#DB, 6) +
~",\"created_at\":" + GetDatabaseLong(#DB, 7) +
~",\"modified_at\":" + GetDatabaseLong(#DB, 8) + "}"
EndIf
FinishDatabaseQuery(#DB)
EndIf
ProcedureReturn JSON
EndProcedure
Procedure.i FSGetOwner(NodeID.i, *IsDir.Integer = 0)
Protected OwnerID.i = -1
SetDatabaseLong(#DB, 0, NodeID)
If DatabaseQuery(#DB, "SELECT owner_id, is_dir FROM fs_nodes WHERE id = ?")
If NextDatabaseRow(#DB)
OwnerID = GetDatabaseLong(#DB, 0)
If *IsDir : *IsDir\i = GetDatabaseLong(#DB, 1) : EndIf
EndIf
FinishDatabaseQuery(#DB)
EndIf
ProcedureReturn OwnerID
EndProcedure
Procedure.i FSMkdir(UserID.i, ParentID.i, Name.s)
Protected Now.i = Date(), ID.i = 0
SetDatabaseLong(#DB, 0, UserID)
SetDatabaseLong(#DB, 1, ParentID)
SetDatabaseString(#DB, 2, Name)
SetDatabaseLong(#DB, 3, Now)
SetDatabaseLong(#DB, 4, Now)
DatabaseUpdate(#DB, "INSERT OR IGNORE INTO fs_nodes (owner_id, parent_id, name, is_dir, created_at, modified_at) VALUES (?, ?, ?, 1, ?, ?)")
SetDatabaseLong(#DB, 0, ParentID)
SetDatabaseString(#DB, 1, Name)
If DatabaseQuery(#DB, "SELECT id FROM fs_nodes WHERE parent_id = ? AND name = ?")
If NextDatabaseRow(#DB) : ID = GetDatabaseLong(#DB, 0) : EndIf
FinishDatabaseQuery(#DB)
EndIf
ProcedureReturn ID
EndProcedure
Procedure.i FSCreateFile(UserID.i, ParentID.i, Name.s, MimeType.s)
Protected Now.i = Date(), ID.i = 0
SetDatabaseLong(#DB, 0, UserID)
SetDatabaseLong(#DB, 1, ParentID)
SetDatabaseString(#DB, 2, Name)
SetDatabaseString(#DB, 3, MimeType)
SetDatabaseLong(#DB, 4, Now)
SetDatabaseLong(#DB, 5, Now)
DatabaseUpdate(#DB, "INSERT OR IGNORE INTO fs_nodes (owner_id, parent_id, name, is_dir, mime_type, created_at, modified_at) VALUES (?, ?, ?, 0, ?, ?, ?)")
SetDatabaseLong(#DB, 0, ParentID)
SetDatabaseString(#DB, 1, Name)
If DatabaseQuery(#DB, "SELECT id FROM fs_nodes WHERE parent_id = ? AND name = ?")
If NextDatabaseRow(#DB) : ID = GetDatabaseLong(#DB, 0) : EndIf
FinishDatabaseQuery(#DB)
EndIf
ProcedureReturn ID
EndProcedure
Procedure FSUpdateFile(NodeID.i, Size.i)
SetDatabaseLong(#DB, 0, Size)
SetDatabaseLong(#DB, 1, Date())
SetDatabaseLong(#DB, 2, NodeID)
DatabaseUpdate(#DB, "UPDATE fs_nodes SET size = ?, modified_at = ? WHERE id = ?")
EndProcedure
Procedure FSDelete(NodeID.i)
Protected NewList ChildIDs.i()
SetDatabaseLong(#DB, 0, NodeID)
If DatabaseQuery(#DB, "SELECT id FROM fs_nodes WHERE parent_id = ?")
While NextDatabaseRow(#DB)
AddElement(ChildIDs()) : ChildIDs() = GetDatabaseLong(#DB, 0)
Wend
FinishDatabaseQuery(#DB)
EndIf
ForEach ChildIDs()
FSDelete(ChildIDs())
Next
SetDatabaseLong(#DB, 0, NodeID)
DatabaseUpdate(#DB, "DELETE FROM fs_nodes WHERE id = ?")
EndProcedure
Procedure FSMove(NodeID.i, NewParentID.i, NewName.s)
SetDatabaseLong(#DB, 0, NewParentID)
SetDatabaseString(#DB, 1, NewName)
SetDatabaseLong(#DB, 2, Date())
SetDatabaseLong(#DB, 3, NodeID)
DatabaseUpdate(#DB, "UPDATE fs_nodes SET parent_id = ?, name = ?, modified_at = ? WHERE id = ?")
EndProcedure
;- Applications
Procedure.i AppInstall(UserID.i, AppID.s, Manifest.s, Permissions.s)
SetDatabaseLong(#DB, 0, UserID)
SetDatabaseString(#DB, 1, AppID)
SetDatabaseString(#DB, 2, Manifest)
SetDatabaseString(#DB, 3, Permissions)
SetDatabaseLong(#DB, 4, Date())
ProcedureReturn DatabaseUpdate(#DB, "INSERT OR REPLACE INTO installed_apps (user_id, app_id, manifest, permissions, installed_at) VALUES (?, ?, ?, ?, ?)")
EndProcedure
Procedure AppUninstall(UserID.i, AppID.s)
SetDatabaseLong(#DB, 0, UserID)
SetDatabaseString(#DB, 1, AppID)
DatabaseUpdate(#DB, "DELETE FROM installed_apps WHERE user_id = ? AND app_id = ?")
EndProcedure
Procedure.i AppExists(UserID.i, AppID.s)
Protected Exists.i = #False
SetDatabaseLong(#DB, 0, UserID)
SetDatabaseString(#DB, 1, AppID)
If DatabaseQuery(#DB, "SELECT id FROM installed_apps WHERE user_id = ? AND app_id = ?")
Exists = Bool(NextDatabaseRow(#DB))
FinishDatabaseQuery(#DB)
EndIf
ProcedureReturn Exists
EndProcedure
Procedure.s AppGetPermissions(UserID.i, AppID.s)
Protected Result.s = ""
SetDatabaseLong(#DB, 0, UserID)
SetDatabaseString(#DB, 1, AppID)
If DatabaseQuery(#DB, "SELECT permissions FROM installed_apps WHERE user_id = ? AND app_id = ?")
If NextDatabaseRow(#DB) : Result = GetDatabaseString(#DB, 0) : EndIf
FinishDatabaseQuery(#DB)
EndIf
ProcedureReturn Result
EndProcedure
Procedure.s AppList(UserID.i)
Protected JSON.s = "[", First.i = #True
Protected AppID.s, Manifest.s, Perms.s, InstalledAt.i
SetDatabaseLong(#DB, 0, UserID)
If Not DatabaseQuery(#DB, "SELECT app_id, manifest, permissions, installed_at FROM installed_apps WHERE user_id = ? ORDER BY installed_at ASC")
ProcedureReturn "[]"
EndIf
While NextDatabaseRow(#DB)
AppID = GetDatabaseString(#DB, 0)
Manifest = GetDatabaseString(#DB, 1)
Perms = GetDatabaseString(#DB, 2)
InstalledAt = GetDatabaseLong(#DB, 3)
If Not First : JSON + "," : EndIf
First = #False
; Manifest and permissions are inlined as-is (already valid JSON)
JSON + ~"{\"app_id\":\"" + JSONEscape(AppID) + ~"\"" +
~",\"manifest\":" + Manifest +
~",\"permissions\":" + Perms +
~",\"installed_at\":" + InstalledAt + "}"
Wend
FinishDatabaseQuery(#DB)
ProcedureReturn JSON + "]"
EndProcedure
EndModule
; IDE Options = PureBasic 6.30 (Windows - x64)
; CursorPosition = 37
; Folding = BAAAA+
; EnableXP
; DPIAware

View File

@ -0,0 +1,299 @@
Module FileSystem
EnableExplicit
; Private constants
#BlobsDir = "blobs/"
;- Helpers
Procedure CanAccess(UserID, NodeID)
Protected OwnerID = Database::FSGetOwner(NodeID)
ProcedureReturn Bool(OwnerID = UserID Or OwnerID = 0)
EndProcedure
Procedure ResolveFromQuery(*Request, UserID)
Protected IDStr.s = General::GetQueryField(*Request, "id")
If IDStr <> "" : ProcedureReturn Val(IDStr) : EndIf
ProcedureReturn Database::FSResolve(UserID, General::GetQueryField(*Request, "path"))
EndProcedure
Procedure ResolveFromPost(*Request, UserID)
Protected IDStr.s = General::GetPostField(*Request, "id")
If IDStr <> "" : ProcedureReturn Val(IDStr) : EndIf
ProcedureReturn Database::FSResolve(UserID, General::GetPostField(*Request, "path"))
EndProcedure
Procedure ResolveParent(UserID, Path.s)
While Right(Path, 1) = "/" : Path = Left(Path, Len(Path) - 1) : Wend
ProcedureReturn Database::FSResolve(UserID, Path)
EndProcedure
;- Public procedures
; GET /api/fs/list?path=... or ?id=...
Procedure HandleList(*Request)
Protected UserID, NodeID
Protected Username.s
Username = Auth::GetSessionUser(*Request)
If Username = ""
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
ProcedureReturn
EndIf
UserID = Database::FindUser(Username)
NodeID = ResolveFromQuery(*Request, UserID)
If NodeID = 0
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
ProcedureReturn
EndIf
If Not CanAccess(UserID, NodeID)
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
ProcedureReturn
EndIf
General::RespondJSON(*Request, Database::FSList(NodeID))
EndProcedure
; GET /api/fs/stat?path=... or ?id=...
Procedure HandleStat(*Request)
Protected UserID, NodeID
Protected Username.s, Stat.s
Username = Auth::GetSessionUser(*Request)
If Username = ""
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
ProcedureReturn
EndIf
UserID = Database::FindUser(Username)
NodeID = ResolveFromQuery(*Request, UserID)
If NodeID = 0
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
ProcedureReturn
EndIf
If Not CanAccess(UserID, NodeID)
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
ProcedureReturn
EndIf
Stat = Database::FSStat(NodeID)
If Stat = ""
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
Else
General::RespondJSON(*Request, Stat)
EndIf
EndProcedure
; GET /api/fs/read?path=... or ?id=...
Procedure HandleRead(*Request)
Protected UserID, NodeID
Protected IsDir.Integer
Protected Username.s
Username = Auth::GetSessionUser(*Request)
If Username = ""
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
ProcedureReturn
EndIf
UserID = Database::FindUser(Username)
NodeID = ResolveFromQuery(*Request, UserID)
If NodeID = 0
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
ProcedureReturn
EndIf
If Not CanAccess(UserID, NodeID)
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
ProcedureReturn
EndIf
Database::FSGetOwner(NodeID, @IsDir)
If IsDir\i
General::RespondJSON(*Request, ~"{\"error\":\"Is a directory\"}", "400 Bad Request")
ProcedureReturn
EndIf
If Not FastCGI::RespondFile(*Request, #BlobsDir + NodeID)
General::RespondJSON(*Request, ~"{\"error\":\"Blob missing\"}", "404 Not Found")
EndIf
EndProcedure
; POST /api/fs/write body: path=...&content=... [&mime_type=...]
Procedure HandleWrite(*Request)
Protected UserID, ParentID, NodeID, FileID, BufLen, Size, *Buf
Protected Username.s, Path.s, Content.s, MimeType.s
Username = Auth::GetSessionUser(*Request)
If Username = ""
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
ProcedureReturn
EndIf
UserID = Database::FindUser(Username)
Path = General::GetPostField(*Request, "path")
Content = General::GetPostField(*Request, "content")
MimeType = General::GetPostField(*Request, "mime_type")
If Path = ""
General::RespondJSON(*Request, ~"{\"error\":\"Missing path\"}")
ProcedureReturn
EndIf
If MimeType = "" : MimeType = "text/plain" : EndIf
ParentID = ResolveParent(UserID, GetPathPart(Path))
If ParentID = 0
General::RespondJSON(*Request, ~"{\"error\":\"Parent directory not found\"}", "404 Not Found")
ProcedureReturn
EndIf
If Not CanAccess(UserID, ParentID)
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
ProcedureReturn
EndIf
NodeID = Database::FSResolve(UserID, Path)
If NodeID = 0
NodeID = Database::FSCreateFile(UserID, ParentID, GetFilePart(Path), MimeType)
EndIf
If NodeID = 0
General::RespondJSON(*Request, ~"{\"error\":\"Could not create node\"}", "500 Internal Server Error")
ProcedureReturn
EndIf
FileID = CreateFile(#PB_Any, #BlobsDir + NodeID)
If FileID
BufLen = StringByteLength(Content, #PB_UTF8)
If BufLen > 0
*Buf = AllocateMemory(BufLen)
If *Buf
PokeS(*Buf, Content, -1, #PB_UTF8 | #PB_String_NoZero)
WriteData(FileID, *Buf, BufLen)
FreeMemory(*Buf)
EndIf
EndIf
Size = Lof(FileID)
CloseFile(FileID)
Database::FSUpdateFile(NodeID, Size)
General::RespondJSON(*Request, ~"{\"success\":true,\"id\":" + NodeID + "}")
Else
General::RespondJSON(*Request, ~"{\"error\":\"Could not write blob\"}", "500 Internal Server Error")
EndIf
EndProcedure
; POST /api/fs/mkdir body: path=...
Procedure HandleMkdir(*Request)
Protected UserID, ParentID, DirID
Protected Username.s, Path.s
Username = Auth::GetSessionUser(*Request)
If Username = ""
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
ProcedureReturn
EndIf
UserID = Database::FindUser(Username)
Path = General::GetPostField(*Request, "path")
If Path = ""
General::RespondJSON(*Request, ~"{\"error\":\"Missing path\"}")
ProcedureReturn
EndIf
ParentID = ResolveParent(UserID, GetPathPart(Path))
If ParentID = 0
General::RespondJSON(*Request, ~"{\"error\":\"Parent not found\"}", "404 Not Found")
ProcedureReturn
EndIf
If Not CanAccess(UserID, ParentID)
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
ProcedureReturn
EndIf
DirID = Database::FSMkdir(UserID, ParentID, GetFilePart(Path))
If DirID = 0
General::RespondJSON(*Request, ~"{\"error\":\"Already exists or could not create\"}", "409 Conflict")
Else
General::RespondJSON(*Request, ~"{\"success\":true,\"id\":" + DirID + "}")
EndIf
EndProcedure
; POST /api/fs/delete body: path=... or id=...
Procedure HandleDelete(*Request)
Protected UserID, NodeID, OwnerID
Protected IsDir.Integer
Protected Username.s
Username = Auth::GetSessionUser(*Request)
If Username = ""
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
ProcedureReturn
EndIf
UserID = Database::FindUser(Username)
NodeID = ResolveFromPost(*Request, UserID)
If NodeID = 0
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
ProcedureReturn
EndIf
OwnerID = Database::FSGetOwner(NodeID, @IsDir)
If OwnerID <> UserID
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
ProcedureReturn
EndIf
If Not IsDir\i : DeleteFile(#BlobsDir + NodeID) : EndIf
Database::FSDelete(NodeID)
General::RespondJSON(*Request, ~"{\"success\":true}")
EndProcedure
; POST /api/fs/move body: path=...&to=... or id=...&to_parent_id=...&name=...
Procedure HandleMove(*Request)
Protected UserID, NodeID, NewParentID, OwnerID
Protected IsDir.Integer
Protected Username.s, IDStr.s, NewName.s, FromPath.s, ToPath.s
Username = Auth::GetSessionUser(*Request)
If Username = ""
General::RespondJSON(*Request, ~"{\"error\":\"Unauthorized\"}", "401 Unauthorized")
ProcedureReturn
EndIf
UserID = Database::FindUser(Username)
IDStr = General::GetPostField(*Request, "id")
If IDStr <> ""
NodeID = Val(IDStr)
NewParentID = Val(General::GetPostField(*Request, "to_parent_id"))
NewName = General::GetPostField(*Request, "name")
Else
FromPath = General::GetPostField(*Request, "path")
ToPath = General::GetPostField(*Request, "to")
NodeID = Database::FSResolve(UserID, FromPath)
NewParentID = ResolveParent(UserID, GetPathPart(ToPath))
NewName = GetFilePart(ToPath)
EndIf
If NodeID = 0 Or NewParentID = 0 Or NewName = ""
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
ProcedureReturn
EndIf
OwnerID = Database::FSGetOwner(NodeID, @IsDir)
If OwnerID <> UserID
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
ProcedureReturn
EndIf
If Not CanAccess(UserID, NewParentID)
General::RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
ProcedureReturn
EndIf
Database::FSMove(NodeID, NewParentID, NewName)
General::RespondJSON(*Request, ~"{\"success\":true}")
EndProcedure
EndModule
; IDE Options = PureBasic 6.30 (Windows - x64)
; CursorPosition = 2
; Folding = BA-
; EnableXP
; DPIAware

View File

@ -0,0 +1,68 @@
Module General
EnableExplicit
Procedure RespondJSON(*Request, JSON.s, Status.s = "200 OK")
FastCGI::WriteResponseHeader(*Request, "Status", Status)
FastCGI::WriteResponseHeader(*Request, "Content-Type", "application/json; charset=utf-8")
FastCGI::WriteResponseHeader(*Request, "Cache-Control", "no-cache, no-store, must-revalidate")
FastCGI::WriteResponseString(*Request, JSON)
FastCGI::FinishResponse(*Request)
EndProcedure
Procedure.s GetPostField(*Request, Field.s)
Protected PostData.s = FastCGI::GetPostData(*Request)
Protected Count.i = CountString(PostData, "&") + 1
Protected i.i, Pair.s, Key.s
For i = 1 To Count
Pair = StringField(PostData, i, "&")
Key = StringField(Pair, 1, "=")
If Key = Field
ProcedureReturn URLDecoder(StringField(Pair, 2, "="))
EndIf
Next
ProcedureReturn ""
EndProcedure
Procedure.s GetQueryField(*Request, Field.s)
Protected QS.s = FastCGI::GetParameter(*Request, "QUERY_STRING")
Protected Count.i = CountString(QS, "&") + 1
Protected i.i, Pair.s, Key.s
For i = 1 To Count
Pair = StringField(QS, i, "&")
Key = StringField(Pair, 1, "=")
If Key = Field
ProcedureReturn URLDecoder(StringField(Pair, 2, "="))
EndIf
Next
ProcedureReturn ""
EndProcedure
Procedure ServeStatic(*Request, URI.s)
Protected File.s
If FindString(URI, "..") Or FindString(URI, "//")
RespondJSON(*Request, ~"{\"error\":\"Forbidden\"}", "403 Forbidden")
ProcedureReturn
EndIf
If URI = "/" Or URI = ""
File = "www/index.html"
Else
File = "www" + URI
EndIf
If FileSize(File) >= 0
If Not FastCGI::RespondFile(*Request, File)
RespondJSON(*Request, ~"{\"error\":\"Read error\"}", "500 Internal Server Error")
EndIf
Else
RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
EndIf
EndProcedure
EndModule
; IDE Options = PureBasic 6.30 (Windows - x64)
; CursorPosition = 24
; Folding = h
; EnableXP
; DPIAware

View File

@ -0,0 +1,87 @@
DeclareModule Database
; Public Constants
#SESSION_DURATION = 86400 ; 24 hours
; Public procedure declarations
Declare.i Init(Path.s)
Declare Close()
Declare.i UserCount()
Declare.i FindUser(Username.s)
Declare.i CreateUser(Username.s, Password.s)
Declare ChangePassword(UserID.i, NewPassword.s)
Declare.s ValidateCredentials(Username.s, Password.s)
Declare.s CreateSession(UserID.i, Username.s)
Declare.s ValidateSession(Token.s)
Declare DeleteSession(Token.s)
Declare CleanExpiredSessions()
Declare.i FSInit()
Declare.i FSGetOrCreateHome(UserID.i)
Declare.i FSResolve(UserID.i, Path.s)
Declare.s FSList(NodeID.i)
Declare.s FSStat(NodeID.i)
Declare.i FSGetOwner(NodeID.i, *IsDir.Integer = 0)
Declare.i FSMkdir(UserID.i, ParentID.i, Name.s)
Declare.i FSCreateFile(UserID.i, ParentID.i, Name.s, MimeType.s)
Declare FSUpdateFile(NodeID.i, Size.i)
Declare FSDelete(NodeID.i)
Declare FSMove(NodeID.i, NewParentID.i, NewName.s)
Declare.i AppInstall(UserID.i, AppID.s, Manifest.s, Permissions.s)
Declare AppUninstall(UserID.i, AppID.s)
Declare.i AppExists(UserID.i, AppID.s)
Declare.s AppGetPermissions(UserID.i, AppID.s)
Declare.s AppList(UserID.i)
EndDeclareModule
DeclareModule General
; Public procedure declarations
Declare RespondJSON(*Request, JSON.s, Status.s = "200 OK")
Declare ServeStatic(*Request, URI.s)
Declare.s GetPostField(*Request, Field.s)
Declare.s GetQueryField(*Request, Field.s)
EndDeclareModule
DeclareModule Auth
; Public Constants
#SESSION_COOKIE = "kumos_session"
#SESSION_MAX_AGE = "86400"
; Public procedure declarations
Declare HandleLogin(*Request)
Declare HandleLogout(*Request)
Declare HandleCheck(*Request)
Declare.s GetSessionUser(*Request)
Declare HandleChangePassword(*Request)
EndDeclareModule
DeclareModule Router
; Public procedure declarations
Declare Route(*Request)
EndDeclareModule
DeclareModule FileSystem
; Public procedure declarations
Declare HandleList(*Request)
Declare HandleStat(*Request)
Declare HandleRead(*Request)
Declare HandleWrite(*Request)
Declare HandleMkdir(*Request)
Declare HandleDelete(*Request)
Declare HandleMove(*Request)
EndDeclareModule
DeclareModule AppStore
; Public procedure declarations
Declare Init()
Declare HandleList(*Request)
Declare HandleInstall(*Request)
Declare HandleUninstall(*Request)
Declare HandleServeFile(*Request, AppID.s, FilePath.s)
EndDeclareModule
; IDE Options = PureBasic 6.30 (Windows - x64)
; CursorPosition = 23
; FirstLine = 4
; Folding = --
; EnableXP
; DPIAware

117
Server/Includes/Router.pbi Normal file
View File

@ -0,0 +1,117 @@
Module Router
EnableExplicit
Procedure _MethodNotAllowed(*Request)
General::RespondJSON(*Request, ~"{\"error\":\"Method not allowed\"}", "405 Method Not Allowed")
EndProcedure
Procedure Route(*Request)
Protected URI.s = FastCGI::GetParameter(*Request, "REQUEST_URI")
Protected Method.s = FastCGI::GetParameter(*Request, "REQUEST_METHOD")
Protected QPos.i = FindString(URI, "?")
If QPos > 0 : URI = Left(URI, QPos - 1) : EndIf
If Left(URI, 5) <> "/api/"
General::ServeStatic(*Request, URI)
ProcedureReturn
EndIf
If Left(URI, 10) = "/api/apps/" And
URI <> "/api/apps/list" And
URI <> "/api/apps/install" And
URI <> "/api/apps/uninstall"
; URI looks like /api/apps/<app_id>/<filepath>
Protected AppSegment.s = Mid(URI, 11)
Protected SlashPos.i = FindString(AppSegment, "/")
If SlashPos > 1
Protected AppID.s = Left(AppSegment, SlashPos - 1)
Protected FilePath.s = Mid(AppSegment, SlashPos + 1)
If FilePath <> "" And Method = "GET"
AppStore::HandleServeFile(*Request, AppID, FilePath)
Else
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
EndIf
Else
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
EndIf
ProcedureReturn
EndIf
Select URI
; Auth
Case "/api/auth/login"
If Method = "POST" : Auth::HandleLogin(*Request)
Else : _MethodNotAllowed(*Request) : EndIf
Case "/api/auth/logout"
If Method = "POST" : Auth::HandleLogout(*Request)
Else : _MethodNotAllowed(*Request) : EndIf
Case "/api/auth/check"
Auth::HandleCheck(*Request)
Case "/api/auth/password"
If Method = "POST" : Auth::HandleChangePassword(*Request)
Else : _MethodNotAllowed(*Request) : EndIf
; Filesystem
Case "/api/fs/list"
If Method = "GET" : FileSystem::HandleList(*Request)
Else : _MethodNotAllowed(*Request) : EndIf
Case "/api/fs/stat"
If Method = "GET" : FileSystem::HandleStat(*Request)
Else : _MethodNotAllowed(*Request) : EndIf
Case "/api/fs/read"
If Method = "GET" : FileSystem::HandleRead(*Request)
Else : _MethodNotAllowed(*Request) : EndIf
Case "/api/fs/write"
If Method = "POST" : FileSystem::HandleWrite(*Request)
Else : _MethodNotAllowed(*Request) : EndIf
Case "/api/fs/mkdir"
If Method = "POST" : FileSystem::HandleMkdir(*Request)
Else : _MethodNotAllowed(*Request) : EndIf
Case "/api/fs/delete"
If Method = "POST" : FileSystem::HandleDelete(*Request)
Else : _MethodNotAllowed(*Request) : EndIf
Case "/api/fs/move"
If Method = "POST" : FileSystem::HandleMove(*Request)
Else : _MethodNotAllowed(*Request) : EndIf
; App store
Case "/api/apps/list"
If Method = "GET" : AppStore::HandleList(*Request)
Else : _MethodNotAllowed(*Request) : EndIf
Case "/api/apps/install"
If Method = "POST" : AppStore::HandleInstall(*Request)
Else : _MethodNotAllowed(*Request) : EndIf
Case "/api/apps/uninstall"
If Method = "POST" : AppStore::HandleUninstall(*Request)
Else : _MethodNotAllowed(*Request) : EndIf
Default
General::RespondJSON(*Request, ~"{\"error\":\"Not found\"}", "404 Not Found")
EndSelect
EndProcedure
EndModule
; IDE Options = PureBasic 6.30 (Windows - x64)
; CursorPosition = 111
; Folding = 6
; EnableXP
; DPIAware

63
Server/KUMOS Server.pbp Normal file
View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.purebasic.com/namespace" version="1.0" creator="PureBasic 6.40 (Windows - x64)">
<section name="config">
<options closefiles="1" openmode="0" name="KUMO.S."/>
</section>
<section name="data">
<explorer view="C:\ProgramData\PureBasic\Examples\" pattern="0"/>
<log show="1"/>
<lastopen date="2026-05-02 15:30" user="lastlife" host="MONSTRO"/>
</section>
<section name="files">
<file name="Main.pb">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="1" panelstate="+"/>
<fingerprint md5="975dfae8e3c64a16d232169cf2193281"/>
</file>
<file name="Includes\Modules.pbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="2" panelstate="++"/>
<fingerprint md5="487cd50ff8f1a3f457dd926f0b8c4e68"/>
</file>
<file name="Includes\General.pbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="3" panelstate="++"/>
<fingerprint md5="9eb4031eca84eb662a4cfd8826aafd74"/>
</file>
<file name="Libraries\FastCGI.pbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="4" panelstate="++"/>
<fingerprint md5="05d4dd22a81fa4856c5be7bd86e370bf"/>
</file>
<file name="Includes\Auth.pbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="5" panelstate="++"/>
<fingerprint md5="6446d7086b781e80c18a93646d3f139f"/>
</file>
<file name="Includes\Database.pbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="6" panelstate="++"/>
<fingerprint md5="2c1ef002bd45374258448a15dcfbf731"/>
</file>
<file name="Includes\FileSystem.pbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="7" panelstate="++"/>
<fingerprint md5="c5baea3bafe788bdd294651e05068200"/>
</file>
<file name="Includes\Router.pbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="8" panelstate="++"/>
<fingerprint md5="3ca46048fb204ffdf8684982c2f41fa5"/>
</file>
<file name="Includes\AppStore.pbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="9" panelstate="++"/>
<fingerprint md5="7506c15984978194ae3efba97801934f"/>
</file>
<file name="Libraries\WebServer.pbi">
<config load="0" scan="1" panel="1" warn="1" lastopen="1" sortindex="10" panelstate="++"/>
<fingerprint md5="e667cb278be1a440284d137bd6502403"/>
</file>
</section>
<section name="targets">
<target name="Default Target" enabled="1" default="1">
<inputfile value="Main.pb"/>
<outputfile value="KUMOS"/>
<executable value="KUMOS"/>
<options thread="1" debug="1" optimizer="0"/>
<format exe="console" cpu="5"/>
</target>
</section>
</project>

View File

@ -0,0 +1,793 @@
DeclareModule FastCGI
; Server
Declare Open(Port, *Callback, BindedIP.s = "") ; Create a FCGI Application on the given port. Return a Server object if succeed or 0 otherwise. Callback format : Callback(Request)
Declare Close(*Server) ; Close the given Server.
; Request
Declare FinishResponse(*Request) ; Send the response and close connection
Declare.s GetCookie(*Request, Cookie.s) ; Return the value of the given cookie
Declare.s GetParameter(*Request, Parameter.s) ; Return the value of the given parameter if it exists.
Declare.s GetPostData(*Request) ; Return raw POST data
Declare WriteResponseHeader(*Request, Header.s, Value.s) ; Write a header to the response
Declare WriteResponseData(*Request, *Buffer, Length) ; Add data to the response
Declare WriteResponseString(*Request, String.s, Format = #PB_UTF8) ; Add a string to the response
Declare WriteResponseContentType(*Request, File.s) ; Write the MIME type based on file extension
Declare RespondFile(*Request, File.s) ; Automatically send a file as a response
EndDeclareModule
Module FastCGI
EnableExplicit
Global NewMap MIMETypes.s()
;{ Constants
#FCGI_VERSION = 1
; Record types
#FCGI_BEGIN_REQUEST = 1
#FCGI_ABORT_REQUEST = 2
#FCGI_END_REQUEST = 3
#FCGI_PARAMS = 4
#FCGI_STDIN = 5
#FCGI_STDOUT = 6
#FCGI_STDERR = 7
#FCGI_DATA = 8
#FCGI_GET_VALUES = 9
#FCGI_GET_VALUES_RESULT = 10
#FCGI_UNKNOWN_TYPE = 11
; Roles
#FCGI_RESPONDER = 1
#FCGI_AUTHORIZER = 2
#FCGI_FILTER = 3
; Flags
#FCGI_KEEP_CONN = 1
; Protocol status
#FCGI_REQUEST_COMPLETE = 0
#FCGI_CANT_MPX_CONN = 1
#FCGI_OVERLOADED = 2
#FCGI_UNKNOWN_ROLE = 3
#HEADER_SIZE = 8
#MAX_CONTENT_LENGTH = 65535
#MAX_RECORD_SIZE = 65528 ; 65535 - 8 (aligned to 8 bytes)
;}
;{ Structures
Structure FCGI_Header
version.a
type.a
requestIdB1.a
requestIdB0.a
contentLengthB1.a
contentLengthB0.a
paddingLength.a
reserved.a
EndStructure
Structure FCGI_BeginRequestBody
roleB1.a
roleB0.a
flags.a
reserved.a[5]
EndStructure
Structure FCGI_EndRequestBody
appStatusB3.a
appStatusB2.a
appStatusB1.a
appStatusB0.a
protocolStatus.a
reserved.a[3]
EndStructure
Structure Server
ServerID.i
Thread.i
Stop.i
*Callback
Mutex.i
EndStructure
Structure Request
ClientID.i
RequestID.u
KeepConnection.a
Role.u
ParamsComplete.a
StdinComplete.a
Map Parameters.s()
Map ResponseHeaders.s()
List Cookies.s()
List ResponseData.i()
PostData.s
*PostDataBuffer
PostDataLength.i
EndStructure
;}
;{ Private procedure declarations
Declare ServerThread(*Server)
Declare ProcessNameValuePairs(*Data, *Request.Request, Length)
Declare ReceiveAllData(ClientID, *Buffer, Length)
Declare SendAllData(ClientID, *Buffer, Length)
Declare BuildHeader(*Header.FCGI_Header, Type.a, RequestID.u, ContentLength.u, PaddingLength.a)
Declare SendRecord(ClientID, Type.a, RequestID.u, *Content, ContentLength)
Declare SendEndRequest(ClientID, RequestID.u, AppStatus.l, ProtocolStatus.a)
;}
;{ Helper procedures
; Receive exactly 'Length' bytes, blocking until complete or error
Procedure ReceiveAllData(ClientID, *Buffer, Length)
Protected Received = 0, Result
While Received < Length
Result = ReceiveNetworkData(ClientID, *Buffer + Received, Length - Received)
If Result <= 0
ProcedureReturn -1 ; Connection closed or error
EndIf
Received + Result
Wend
ProcedureReturn Received
EndProcedure
; Send all data, blocking until complete
Procedure SendAllData(ClientID, *Buffer, Length)
Protected Sent = 0, Result
While Sent < Length
Result = SendNetworkData(ClientID, *Buffer + Sent, Length - Sent)
If Result <= 0
ProcedureReturn -1
EndIf
Sent + Result
Wend
ProcedureReturn Sent
EndProcedure
; Build a FastCGI header
Procedure BuildHeader(*Header.FCGI_Header, Type.a, RequestID.u, ContentLength.u, PaddingLength.a)
*Header\version = #FCGI_VERSION
*Header\type = Type
*Header\requestIdB1 = (RequestID >> 8) & $FF
*Header\requestIdB0 = RequestID & $FF
*Header\contentLengthB1 = (ContentLength >> 8) & $FF
*Header\contentLengthB0 = ContentLength & $FF
*Header\paddingLength = PaddingLength
*Header\reserved = 0
EndProcedure
; Send a complete FastCGI record
Procedure SendRecord(ClientID, Type.a, RequestID.u, *Content, ContentLength)
Protected *Packet, PacketSize, PaddingLength.a, Result
; Calculate padding to align to 8 bytes
PaddingLength = (8 - (ContentLength % 8)) % 8
PacketSize = #HEADER_SIZE + ContentLength + PaddingLength
*Packet = AllocateMemory(PacketSize, #PB_Memory_NoClear)
If Not *Packet
ProcedureReturn #False
EndIf
; Build header
BuildHeader(*Packet, Type, RequestID, ContentLength, PaddingLength)
; Copy content if any
If *Content And ContentLength > 0
CopyMemory(*Content, *Packet + #HEADER_SIZE, ContentLength)
EndIf
; Zero padding
If PaddingLength > 0
FillMemory(*Packet + #HEADER_SIZE + ContentLength, PaddingLength, 0)
EndIf
; Send
Result = SendAllData(ClientID, *Packet, PacketSize)
FreeMemory(*Packet)
ProcedureReturn Bool(Result > 0)
EndProcedure
; Send FCGI_END_REQUEST record
Procedure SendEndRequest(ClientID, RequestID.u, AppStatus.l, ProtocolStatus.a)
Protected Body.FCGI_EndRequestBody
Body\appStatusB3 = (AppStatus >> 24) & $FF
Body\appStatusB2 = (AppStatus >> 16) & $FF
Body\appStatusB1 = (AppStatus >> 8) & $FF
Body\appStatusB0 = AppStatus & $FF
Body\protocolStatus = ProtocolStatus
ProcedureReturn SendRecord(ClientID, #FCGI_END_REQUEST, RequestID, @Body, SizeOf(FCGI_EndRequestBody))
EndProcedure
; Parse name-value pairs from FCGI_PARAMS
Procedure ProcessNameValuePairs(*Data, *Request.Request, Length)
Protected Offset = 0
Protected NameLength.l, ValueLength.l
Protected Name.s, Value.s
While Offset < Length
; Read name length
NameLength = PeekA(*Data + Offset)
If NameLength & $80 ; High bit set = 4-byte length
If Offset + 4 > Length : Break : EndIf
NameLength = ((PeekA(*Data + Offset) & $7F) << 24) |
(PeekA(*Data + Offset + 1) << 16) |
(PeekA(*Data + Offset + 2) << 8) |
PeekA(*Data + Offset + 3)
Offset + 4
Else
Offset + 1
EndIf
; Read value length
If Offset >= Length : Break : EndIf
ValueLength = PeekA(*Data + Offset)
If ValueLength & $80 ; High bit set = 4-byte length
If Offset + 4 > Length : Break : EndIf
ValueLength = ((PeekA(*Data + Offset) & $7F) << 24) |
(PeekA(*Data + Offset + 1) << 16) |
(PeekA(*Data + Offset + 2) << 8) |
PeekA(*Data + Offset + 3)
Offset + 4
Else
Offset + 1
EndIf
; Bounds check
If Offset + NameLength + ValueLength > Length
Break
EndIf
; Read name and value
If NameLength > 0
Name = PeekS(*Data + Offset, NameLength, #PB_Ascii)
Offset + NameLength
If ValueLength > 0
Value = PeekS(*Data + Offset, ValueLength, #PB_Ascii)
Offset + ValueLength
Else
Value = ""
EndIf
*Request\Parameters(Name) = Value
Else
Offset + ValueLength
EndIf
Wend
EndProcedure
;}
;{ Public procedures - Server
Procedure Close(*Server.Server)
If *Server
*Server\Stop = #True
; Wait for thread to finish
If IsThread(*Server\Thread)
WaitThread(*Server\Thread, 5000)
If IsThread(*Server\Thread)
KillThread(*Server\Thread)
EndIf
EndIf
If *Server\Mutex
FreeMutex(*Server\Mutex)
EndIf
FreeMemory(*Server)
EndIf
EndProcedure
Procedure Open(Port, *Callback, BindedIP.s = "")
Protected ServerID, *Server.Server
If Not *Callback
ProcedureReturn #Null
EndIf
ServerID = CreateNetworkServer(#PB_Any, Port, #PB_Network_TCP, BindedIP)
If ServerID
*Server = AllocateMemory(SizeOf(Server))
If *Server
*Server\ServerID = ServerID
*Server\Callback = *Callback
*Server\Mutex = CreateMutex()
*Server\Thread = CreateThread(@ServerThread(), *Server)
If Not *Server\Thread
CloseNetworkServer(ServerID)
If *Server\Mutex : FreeMutex(*Server\Mutex) : EndIf
FreeMemory(*Server)
*Server = #Null
EndIf
Else
CloseNetworkServer(ServerID)
EndIf
EndIf
ProcedureReturn *Server
EndProcedure
;}
;{ Public procedures - Request
Procedure FinishResponse(*Request.Request)
Protected HeaderString.s, *HeaderData, HeaderLength
Protected *ContentData, ContentLength, TotalLength
Protected Offset, ChunkSize, Result
If Not *Request
ProcedureReturn
EndIf
; Build HTTP headers string
ForEach *Request\ResponseHeaders()
HeaderString + MapKey(*Request\ResponseHeaders()) + ": " + *Request\ResponseHeaders() + #CRLF$
Next
ForEach *Request\Cookies()
HeaderString + "Set-Cookie: " + *Request\Cookies() + #CRLF$
Next
HeaderString + #CRLF$ ; End of headers
; Calculate total response size
HeaderLength = StringByteLength(HeaderString, #PB_Ascii)
ContentLength = 0
ForEach *Request\ResponseData()
ContentLength + MemorySize(*Request\ResponseData())
Next
TotalLength = HeaderLength + ContentLength
; Allocate combined buffer
*ContentData = AllocateMemory(TotalLength, #PB_Memory_NoClear)
If Not *ContentData
ProcedureReturn
EndIf
; Copy headers
PokeS(*ContentData, HeaderString, -1, #PB_Ascii | #PB_String_NoZero)
Offset = HeaderLength
; Copy response data
ForEach *Request\ResponseData()
CopyMemory(*Request\ResponseData(), *ContentData + Offset, MemorySize(*Request\ResponseData()))
Offset + MemorySize(*Request\ResponseData())
FreeMemory(*Request\ResponseData())
Next
ClearList(*Request\ResponseData())
; Send STDOUT records (split if necessary)
Offset = 0
While Offset < TotalLength
ChunkSize = TotalLength - Offset
If ChunkSize > #MAX_RECORD_SIZE
ChunkSize = #MAX_RECORD_SIZE
EndIf
Result = SendRecord(*Request\ClientID, #FCGI_STDOUT, *Request\RequestID, *ContentData + Offset, ChunkSize)
If Not Result
Break
EndIf
Offset + ChunkSize
Wend
FreeMemory(*ContentData)
; Send empty STDOUT to signal end of output
SendRecord(*Request\ClientID, #FCGI_STDOUT, *Request\RequestID, #Null, 0)
; Send END_REQUEST
SendEndRequest(*Request\ClientID, *Request\RequestID, 0, #FCGI_REQUEST_COMPLETE)
; Close connection if not keep-alive
If Not *Request\KeepConnection
CloseNetworkConnection(*Request\ClientID)
EndIf
; Clean up POST data buffer if allocated
If *Request\PostDataBuffer
FreeMemory(*Request\PostDataBuffer)
*Request\PostDataBuffer = #Null
EndIf
EndProcedure
Procedure.s GetCookie(*Request.Request, Cookie.s)
Protected CookieHeader.s, Result.s
Protected SearchStr.s, StartPos, EndPos
If Not *Request
ProcedureReturn ""
EndIf
CookieHeader = *Request\Parameters("HTTP_COOKIE")
If CookieHeader = ""
ProcedureReturn ""
EndIf
SearchStr = Cookie + "="
StartPos = FindString(CookieHeader, SearchStr)
If StartPos
StartPos + Len(SearchStr)
EndPos = FindString(CookieHeader, ";", StartPos)
If EndPos = 0
EndPos = Len(CookieHeader) + 1
EndIf
Result = Trim(Mid(CookieHeader, StartPos, EndPos - StartPos))
EndIf
ProcedureReturn Result
EndProcedure
Procedure.s GetParameter(*Request.Request, Parameter.s)
If *Request
ProcedureReturn *Request\Parameters(Parameter)
EndIf
ProcedureReturn ""
EndProcedure
Procedure.s GetPostData(*Request.Request)
If *Request
ProcedureReturn *Request\PostData
EndIf
ProcedureReturn ""
EndProcedure
Procedure WriteResponseHeader(*Request.Request, Header.s, Value.s)
If *Request
If LCase(Header) = "set-cookie" Or Header = #PB_CGI_HeaderSetCookie
AddElement(*Request\Cookies())
*Request\Cookies() = Value
Else
*Request\ResponseHeaders(Header) = Value
EndIf
EndIf
EndProcedure
Procedure WriteResponseString(*Request.Request, String.s, Format = #PB_UTF8)
Protected *Buffer, Length
If *Request And String <> ""
Length = StringByteLength(String, Format)
*Buffer = AllocateMemory(Length, #PB_Memory_NoClear)
If *Buffer
PokeS(*Buffer, String, -1, Format | #PB_String_NoZero)
AddElement(*Request\ResponseData())
*Request\ResponseData() = *Buffer
EndIf
EndIf
EndProcedure
Procedure WriteResponseData(*Request.Request, *Buffer, Length)
Protected *Copy
If *Request And *Buffer And Length > 0
*Copy = AllocateMemory(Length, #PB_Memory_NoClear)
If *Copy
CopyMemory(*Buffer, *Copy, Length)
AddElement(*Request\ResponseData())
*Request\ResponseData() = *Copy
EndIf
EndIf
EndProcedure
Procedure WriteResponseContentType(*Request.Request, File.s)
Protected Extension.s, MIMEType.s
If *Request
Extension = LCase(GetExtensionPart(File))
If FindMapElement(MIMETypes(), Extension)
MIMEType = MIMETypes()
Else
MIMEType = "application/octet-stream"
EndIf
*Request\ResponseHeaders("Content-Type") = MIMEType
EndIf
EndProcedure
Procedure RespondFile(*Request.Request, File.s)
Protected Result = #False
Protected FileID, FileSize, *FileData
If Not *Request
ProcedureReturn #False
EndIf
FileID = ReadFile(#PB_Any, File, #PB_File_SharedRead)
If FileID
FileSize = Lof(FileID)
If FileSize > 0
*FileData = AllocateMemory(FileSize, #PB_Memory_NoClear)
If *FileData
ReadData(FileID, *FileData, FileSize)
WriteResponseContentType(*Request, File)
WriteResponseData(*Request, *FileData, FileSize)
FreeMemory(*FileData)
Result = #True
EndIf
EndIf
CloseFile(FileID)
If Result
FinishResponse(*Request)
EndIf
EndIf
ProcedureReturn Result
EndProcedure
;}
;{ Server thread
Procedure ServerThread(*Server.Server)
Protected Header.FCGI_Header
Protected BeginBody.FCGI_BeginRequestBody
Protected ContentLength, PaddingLength
Protected *ContentBuffer, *PaddingBuffer
Protected Event, ClientID
Protected NewMap Requests.Request()
Protected *Request.Request
Protected RequestKey.s
*ContentBuffer = AllocateMemory(#MAX_CONTENT_LENGTH)
*PaddingBuffer = AllocateMemory(256)
If Not *ContentBuffer Or Not *PaddingBuffer
If *ContentBuffer : FreeMemory(*ContentBuffer) : EndIf
If *PaddingBuffer : FreeMemory(*PaddingBuffer) : EndIf
ProcedureReturn
EndIf
Repeat
Event = NetworkServerEvent(*Server\ServerID)
Select Event
Case #PB_NetworkEvent_None
Delay(1)
Case #PB_NetworkEvent_Connect
ClientID = EventClient()
; New connection - request will be created on BEGIN_REQUEST
Case #PB_NetworkEvent_Data
ClientID = EventClient()
RequestKey = Str(ClientID)
; Read header
If ReceiveAllData(ClientID, @Header, #HEADER_SIZE) = #HEADER_SIZE
ContentLength = (Header\contentLengthB1 << 8) | Header\contentLengthB0
PaddingLength = Header\paddingLength
; Read content
If ContentLength > 0
If ReceiveAllData(ClientID, *ContentBuffer, ContentLength) <> ContentLength
Continue
EndIf
EndIf
; Read padding
If PaddingLength > 0
ReceiveAllData(ClientID, *PaddingBuffer, PaddingLength)
EndIf
; Process based on record type
Select Header\type
Case #FCGI_BEGIN_REQUEST
; Create new request
*Request = AddMapElement(Requests(), RequestKey)
If *Request
*Request\ClientID = ClientID
*Request\RequestID = (Header\requestIdB1 << 8) | Header\requestIdB0
If ContentLength >= SizeOf(FCGI_BeginRequestBody)
CopyMemory(*ContentBuffer, @BeginBody, SizeOf(FCGI_BeginRequestBody))
*Request\Role = (BeginBody\roleB1 << 8) | BeginBody\roleB0
*Request\KeepConnection = Bool(BeginBody\flags & #FCGI_KEEP_CONN)
EndIf
EndIf
Case #FCGI_PARAMS
*Request = FindMapElement(Requests(), RequestKey)
If *Request
If ContentLength > 0
ProcessNameValuePairs(*ContentBuffer, *Request, ContentLength)
Else
; Empty PARAMS record signals end of parameters
*Request\ParamsComplete = #True
EndIf
EndIf
Case #FCGI_STDIN
*Request = FindMapElement(Requests(), RequestKey)
If *Request
If ContentLength > 0
; Accumulate POST data
Protected *NewBuffer, NewLength
NewLength = *Request\PostDataLength + ContentLength
*NewBuffer = AllocateMemory(NewLength)
If *NewBuffer
If *Request\PostDataBuffer
CopyMemory(*Request\PostDataBuffer, *NewBuffer, *Request\PostDataLength)
FreeMemory(*Request\PostDataBuffer)
EndIf
CopyMemory(*ContentBuffer, *NewBuffer + *Request\PostDataLength, ContentLength)
*Request\PostDataBuffer = *NewBuffer
*Request\PostDataLength = NewLength
EndIf
Else
; Empty STDIN record signals end of input
*Request\StdinComplete = #True
; Convert POST data to string
If *Request\PostDataBuffer And *Request\PostDataLength > 0
*Request\PostData = PeekS(*Request\PostDataBuffer, *Request\PostDataLength, #PB_UTF8 | #PB_ByteLength)
EndIf
; Request is complete - call handler
If *Request\ParamsComplete
Protected Callback.i = *Server\Callback
If Callback
CallFunctionFast(Callback, *Request)
EndIf
; Clean up request from map after response
DeleteMapElement(Requests(), RequestKey)
EndIf
EndIf
EndIf
Case #FCGI_ABORT_REQUEST
*Request = FindMapElement(Requests(), RequestKey)
If *Request
If *Request\PostDataBuffer
FreeMemory(*Request\PostDataBuffer)
EndIf
ForEach *Request\ResponseData()
FreeMemory(*Request\ResponseData())
Next
DeleteMapElement(Requests(), RequestKey)
EndIf
EndSelect
EndIf
Case #PB_NetworkEvent_Disconnect
ClientID = EventClient()
RequestKey = Str(ClientID)
; Clean up any pending request
*Request = FindMapElement(Requests(), RequestKey)
If *Request
If *Request\PostDataBuffer
FreeMemory(*Request\PostDataBuffer)
EndIf
ForEach *Request\ResponseData()
FreeMemory(*Request\ResponseData())
Next
DeleteMapElement(Requests(), RequestKey)
EndIf
EndSelect
Until *Server\Stop
; Cleanup
FreeMemory(*ContentBuffer)
FreeMemory(*PaddingBuffer)
; Clean up remaining requests
ForEach Requests()
If Requests()\PostDataBuffer
FreeMemory(Requests()\PostDataBuffer)
EndIf
ForEach Requests()\ResponseData()
FreeMemory(Requests()\ResponseData())
Next
Next
CloseNetworkServer(*Server\ServerID)
EndProcedure
;}
;{ MIME Types
Procedure LoadMimeTypes()
Protected.s Ext, Type
Restore MimeData
Read.s Ext
While Ext <> "END"
Read.s Type
MIMETypes(Ext) = Type
Read.s Ext
Wend
EndProcedure
LoadMimeTypes()
DataSection
MimeData:
Data.s "aac", "audio/aac", "abw", "application/x-abiword", "apng", "image/apng", "avi", "video/x-msvideo", "bin", "application/octet-stream", "bmp", "image/bmp"
Data.s "css", "text/css", "csv", "text/csv", "doc", "application/msword", "gif", "image/gif", "htm", "text/html", "html", "text/html", "ico", "image/x-icon"
Data.s "jpeg", "image/jpeg", "jpg", "image/jpeg", "js", "text/javascript", "json", "application/json", "mp3", "audio/mpeg", "mp4", "video/mp4", "mpeg", "video/mpeg"
Data.s "otf", "font/otf", "png", "image/png", "pdf", "application/pdf", "php", "application/x-httpd-php", "svg", "image/svg+xml", "txt", "text/plain"
Data.s "wav", "audio/wav", "webm", "video/webm", "webp", "image/webp", "woff", "font/woff", "woff2", "font/woff2", "xml", "application/xml", "zip", "application/zip"
Data.s "END"
EndDataSection
;}
EndModule
;{ Test/Demo code
CompilerIf #PB_Compiler_IsMainFile
Global *ImageData
Global ImageSize
; Load test image
If ReadFile(0, #PB_Compiler_Home + "examples/sources/Data/Map.bmp")
ImageSize = Lof(0)
*ImageData = AllocateMemory(ImageSize)
ReadData(0, *ImageData, ImageSize)
CloseFile(0)
Else
; Create a simple test response if image not found
*ImageData = #Null
ImageSize = 0
EndIf
Procedure RequestHandler(*Request)
Protected URI.s
URI = FastCGI::GetParameter(*Request, "REQUEST_URI")
Debug "Request received: " + URI
Debug "Method: " + FastCGI::GetParameter(*Request, "REQUEST_METHOD")
Debug "Query: " + FastCGI::GetParameter(*Request, "QUERY_STRING")
If *ImageData And ImageSize > 0
FastCGI::WriteResponseContentType(*Request, "test.bmp")
FastCGI::WriteResponseData(*Request, *ImageData, ImageSize)
Else
FastCGI::WriteResponseHeader(*Request, "Content-Type", "text/html")
FastCGI::WriteResponseString(*Request, "<html><body><h1>FastCGI Test</h1><p>Request URI: " + URI + "</p></body></html>")
EndIf
FastCGI::FinishResponse(*Request)
EndProcedure
OpenConsole("FastCGI Demo")
PrintN("Starting FastCGI server on port 5600...")
PrintN("Press Enter to stop")
Global Server = FastCGI::Open(5600, @RequestHandler())
If Server
PrintN("Server started successfully")
Input()
FastCGI::Close(Server)
PrintN("Server closed")
Else
PrintN("Failed to start server!")
EndIf
If *ImageData
FreeMemory(*ImageData)
EndIf
PrintN("Press Enter to exit")
Input()
CompilerEndIf
;}
; IDE Options = PureBasic 6.30 (Windows - x64)
; ExecutableFormat = Console
; CursorPosition = 55
; Folding = GAAAA9
; EnableXP
; DPIAware

View File

@ -0,0 +1,734 @@
; ============================================================
; WebServer.pbi: Simple HTTP / FastCGI gateway for services
; development.
;
; Routing:
; - Path matching a registered FCGI prefix -> forward to FCGI
; - Otherwise: try local file, fall back to FCGI on miss
; ============================================================
DeclareModule WebServer
Declare Open(Port, WebRoot.s, FcgiHost.s = "127.0.0.1", FcgiPort = 5600)
Declare Close(*Server)
Declare AddFcgiPrefix(*Server, Prefix.s)
EndDeclareModule
Module WebServer
EnableExplicit
;{ Structures
Structure Server
ServerID.i
Thread.i
Stop.i
Port.i
WebRoot.s
FcgiHost.s
FcgiPort.l
List Prefixes.s()
EndStructure
Structure HttpConn
*Buffer
AllocSize.i
Received.i
HeadersEnd.i ; byte AFTER \r\n\r\n; 0 means not yet found
ContentLength.i ; -1 = not yet parsed
EndStructure
Structure FCGI_Header
version.a
type.a
requestIdB1.a
requestIdB0.a
contentLengthB1.a
contentLengthB0.a
paddingLength.a
reserved.a
EndStructure
Structure FCGI_BeginRequestBody
roleB1.a
roleB0.a
flags.a
reserved.a[5]
EndStructure
;}
;{ Constants
#FCGI_VERSION = 1
#FCGI_BEGIN_REQUEST = 1
#FCGI_END_REQUEST = 3
#FCGI_PARAMS = 4
#FCGI_STDIN = 5
#FCGI_STDOUT = 6
#FCGI_RESPONDER = 1
#FCGI_HEADER_SIZE = 8
#FCGI_MAX_RECORD = 65528
;}
;{ MIME Types
Global NewMap MIMETypes.s()
Procedure LoadMimeTypes()
Protected.s Ext, Type
Restore MimeData
Read.s Ext
While Ext <> "END"
Read.s Type
MIMETypes(Ext) = Type
Read.s Ext
Wend
EndProcedure
LoadMimeTypes()
DataSection
MimeData:
Data.s "aac", "audio/aac", "abw", "application/x-abiword", "apng", "image/apng", "avi", "video/x-msvideo", "bin", "application/octet-stream", "bmp", "image/bmp"
Data.s "css", "text/css", "csv", "text/csv", "doc", "application/msword", "gif", "image/gif", "htm", "text/html", "html", "text/html", "ico", "image/x-icon"
Data.s "jpeg", "image/jpeg", "jpg", "image/jpeg", "js", "text/javascript", "json", "application/json", "mp3", "audio/mpeg", "mp4", "video/mp4", "mpeg", "video/mpeg"
Data.s "otf", "font/otf", "png", "image/png", "pdf", "application/pdf", "php", "application/x-httpd-php", "svg", "image/svg+xml", "txt", "text/plain"
Data.s "wav", "audio/wav", "webm", "video/webm", "webp", "image/webp", "woff", "font/woff", "woff2", "font/woff2", "xml", "application/xml", "zip", "application/zip"
Data.s "END"
EndDataSection
;}
;- Private declarations
Declare ServerThread(*Server.Server)
Declare HandleRequest(*Server.Server, ClientID, *Data, DataLen)
Declare ForwardToFcgi(*Server.Server, ClientID, Method.s, FullURI.s, Path.s, QueryString.s, Map ReqHdrs.s(), *Body, BodyLen)
Declare FcgiBuildAndSendParams(FcgiConn, *Server.Server, ReqID.u, Method.s, FullURI.s, Path.s, QueryString.s, Map ReqHdrs.s(), BodyLen)
Declare FcgiSendBody(FcgiConn, ReqID.u, *Body, BodyLen)
Declare FcgiReadResponse(FcgiConn, *OutLen)
Declare FcgiSendHttpResponse(ClientID, *RespBuf, RespLen)
Declare ServeStaticFile(ClientID, FilePath.s)
Declare SendErrorResponse(ClientID, Code, Reason.s)
Declare SendRawHttpResponse(ClientID, StatusLine.s, Headers.s, *Body, BodyLen)
Declare ReceiveAll(ConnID, *Buffer, Length)
Declare SendAll(ConnID, *Buffer, Length)
Declare SendFcgiRecord(ConnID, Type.a, RequestID.u, *Content, ContentLen)
Declare AppendNVP(*Buffer, Offset, Name.s, Value.s)
Declare.s GetMime(FilePath.s)
Declare.s GetHeaderCI(Map H.s(), Name.s)
;- Public API
Procedure Open(Port, WebRoot.s, FcgiHost.s = "127.0.0.1", FcgiPort = 5600)
Protected ServerID = CreateNetworkServer(#PB_Any, Port, #PB_Network_TCP, "")
Protected *Server.Server
If Not ServerID : ProcedureReturn #Null : EndIf
*Server = AllocateMemory(SizeOf(Server))
If *Server
InitializeStructure(*Server, Server)
*Server\ServerID = ServerID
*Server\Port = Port
*Server\WebRoot = WebRoot
*Server\FcgiHost = FcgiHost
*Server\FcgiPort = FcgiPort
*Server\Thread = CreateThread(@ServerThread(), *Server)
If Not *Server\Thread
CloseNetworkServer(ServerID)
FreeStructure(*Server)
*Server = #Null
EndIf
Else
CloseNetworkServer(ServerID)
EndIf
ProcedureReturn *Server
EndProcedure
Procedure Close(*Server.Server)
If *Server
*Server\Stop = #True
If IsThread(*Server\Thread)
WaitThread(*Server\Thread, 5000)
If IsThread(*Server\Thread) : KillThread(*Server\Thread) : EndIf
EndIf
FreeMemory(*Server)
EndIf
EndProcedure
Procedure AddFcgiPrefix(*Server.Server, Prefix.s)
If *Server
AddElement(*Server\Prefixes())
*Server\Prefixes() = Prefix
EndIf
EndProcedure
;- Private procedures
; Helpers
Procedure.s GetHeaderCI(Map H.s(), Name.s)
; Case-insensitive header lookup so we don't depend on which capitalisation
; the browser used (Chrome and Firefox usually send "Content-Type:" but
; HTTP/2 frontends and some proxies will lowercase headers).
Protected Lower.s = LCase(Name)
ForEach H()
If LCase(MapKey(H())) = Lower
ProcedureReturn H()
EndIf
Next
ProcedureReturn ""
EndProcedure
Procedure.s GetMime(FilePath.s)
If FindMapElement(MimeTypes(), LCase(GetExtensionPart(FilePath)))
ProcedureReturn MimeTypes()
EndIf
ProcedureReturn "application/octet-stream"
EndProcedure
; Network helpers
Procedure ReceiveAll(ConnID, *Buffer, Length)
Protected Received = 0, Got
While Received < Length
Got = ReceiveNetworkData(ConnID, *Buffer + Received, Length - Received)
If Got <= 0
Received = -1
Break
EndIf
Received + Got
Wend
ProcedureReturn Received
EndProcedure
Procedure SendAll(ConnID, *Buffer, Length)
Protected Sent = 0, Chunk
While Sent < Length
Chunk = SendNetworkData(ConnID, *Buffer + Sent, Length - Sent)
If Chunk <= 0
Sent = -1
Break
EndIf
Sent + Chunk
Wend
ProcedureReturn Sent
EndProcedure
; FCGI helpers
Procedure SendFcgiRecord(ConnID, Type.a, RequestID.u, *Content, ContentLen)
Protected Result = #False
Protected Padding = (8 - (ContentLen % 8)) % 8
Protected PktSize = #FCGI_HEADER_SIZE + ContentLen + Padding
Protected *Pkt = AllocateMemory(PktSize, #PB_Memory_NoClear)
If *Pkt
PokeA(*Pkt, #FCGI_VERSION)
PokeA(*Pkt + 1, Type)
PokeA(*Pkt + 2, (RequestID >> 8) & $FF)
PokeA(*Pkt + 3, RequestID & $FF)
PokeA(*Pkt + 4, (ContentLen >> 8) & $FF)
PokeA(*Pkt + 5, ContentLen & $FF)
PokeA(*Pkt + 6, Padding)
PokeA(*Pkt + 7, 0)
If *Content And ContentLen > 0
CopyMemory(*Content, *Pkt + #FCGI_HEADER_SIZE, ContentLen)
EndIf
If Padding > 0
FillMemory(*Pkt + #FCGI_HEADER_SIZE + ContentLen, Padding, 0)
EndIf
Result = Bool(SendAll(ConnID, *Pkt, PktSize) > 0)
FreeMemory(*Pkt)
EndIf
ProcedureReturn Result
EndProcedure
Procedure AppendNVP(*Buffer, Offset, Name.s, Value.s)
Protected NameLen = StringByteLength(Name, #PB_Ascii)
Protected ValueLen = StringByteLength(Value, #PB_UTF8)
If NameLen < 128
PokeA(*Buffer + Offset, NameLen) : Offset + 1
Else
PokeA(*Buffer + Offset, ((NameLen >> 24) & $7F) | $80)
PokeA(*Buffer + Offset + 1, (NameLen >> 16) & $FF)
PokeA(*Buffer + Offset + 2, (NameLen >> 8) & $FF)
PokeA(*Buffer + Offset + 3, NameLen & $FF)
Offset + 4
EndIf
If ValueLen < 128
PokeA(*Buffer + Offset, ValueLen) : Offset + 1
Else
PokeA(*Buffer + Offset, ((ValueLen >> 24) & $7F) | $80)
PokeA(*Buffer + Offset + 1, (ValueLen >> 16) & $FF)
PokeA(*Buffer + Offset + 2, (ValueLen >> 8) & $FF)
PokeA(*Buffer + Offset + 3, ValueLen & $FF)
Offset + 4
EndIf
If NameLen > 0
PokeS(*Buffer + Offset, Name, -1, #PB_Ascii | #PB_String_NoZero)
Offset + NameLen
EndIf
If ValueLen > 0
PokeS(*Buffer + Offset, Value, -1, #PB_UTF8 | #PB_String_NoZero)
Offset + ValueLen
EndIf
ProcedureReturn Offset
EndProcedure
; HTTP response helpers
Procedure SendRawHttpResponse(ClientID, StatusLine.s, Headers.s, *Body, BodyLen)
; FIX: ensure Headers ends with CRLF so the appended CRLF below produces
; the CRLFCRLF that terminates the header block. Without this, FCGI-forwarded
; responses (whose CgiHdrs has no trailing CRLF after PeekS) produced output
; with only one CRLF between headers and body - some browsers (notably Chrome
; on POST) refused to display the result.
If Headers <> "" And Right(Headers, 2) <> #CRLF$
Headers + #CRLF$
EndIf
Protected Hdr.s = StatusLine + #CRLF$ + "Connection: close" + #CRLF$ + Headers + #CRLF$
Protected HdrLen = StringByteLength(Hdr, #PB_Ascii)
Protected *HdrBuf = AllocateMemory(HdrLen, #PB_Memory_NoClear)
If *HdrBuf
PokeS(*HdrBuf, Hdr, -1, #PB_Ascii | #PB_String_NoZero)
SendAll(ClientID, *HdrBuf, HdrLen)
FreeMemory(*HdrBuf)
EndIf
If *Body And BodyLen > 0
SendAll(ClientID, *Body, BodyLen)
EndIf
CloseNetworkConnection(ClientID)
EndProcedure
Procedure SendErrorResponse(ClientID, Code, Reason.s)
Protected Body.s = "<h1>" + Str(Code) + " " + Reason + "</h1>"
Protected BodyLen = StringByteLength(Body, #PB_Ascii)
Protected *B = AllocateMemory(BodyLen, #PB_Memory_NoClear)
If *B
PokeS(*B, Body, -1, #PB_Ascii | #PB_String_NoZero)
SendRawHttpResponse(ClientID, "HTTP/1.1 " + Str(Code) + " " + Reason,
"Content-Type: text/html" + #CRLF$ + "Content-Length: " + Str(BodyLen) + #CRLF$,
*B, BodyLen)
FreeMemory(*B)
EndIf
EndProcedure
Procedure ServeStaticFile(ClientID, FilePath.s)
Protected Result, FileSize, FileID = ReadFile(#PB_Any, FilePath, #PB_File_SharedRead)
Protected *FileData
If FileID
FileSize = Lof(FileID)
*FileData = AllocateMemory(FileSize, #PB_Memory_NoClear)
If *FileData
ReadData(FileID, *FileData, FileSize)
SendRawHttpResponse(ClientID, "HTTP/1.1 200 OK",
"Content-Type: " + GetMime(FilePath) + #CRLF$ + "Content-Length: " + Str(FileSize) + #CRLF$,
*FileData, FileSize)
FreeMemory(*FileData)
EndIf
Result = #True
CloseFile(FileID)
EndIf
ProcedureReturn Result
EndProcedure
; FCGI gateway
Procedure FcgiBuildAndSendParams(FcgiConn, *Server.Server, ReqID.u, Method.s, FullURI.s, Path.s, QueryString.s, Map ReqHdrs.s(), BodyLen)
Protected *Params, PO, PSent, PChunk, Result
Protected HName.s, HLower.s, CType.s
*Params = AllocateMemory(65536)
If Not *Params : ProcedureReturn #False : EndIf
PO = AppendNVP(*Params, PO, "GATEWAY_INTERFACE", "CGI/1.1")
PO = AppendNVP(*Params, PO, "SERVER_PROTOCOL", "HTTP/1.1")
PO = AppendNVP(*Params, PO, "SERVER_SOFTWARE", "KUMO.S/1.0")
PO = AppendNVP(*Params, PO, "SERVER_NAME", "localhost")
PO = AppendNVP(*Params, PO, "SERVER_PORT", Str(*Server\Port))
PO = AppendNVP(*Params, PO, "REQUEST_METHOD", Method)
PO = AppendNVP(*Params, PO, "REQUEST_URI", FullURI)
PO = AppendNVP(*Params, PO, "SCRIPT_NAME", Path)
PO = AppendNVP(*Params, PO, "PATH_INFO", Path)
PO = AppendNVP(*Params, PO, "QUERY_STRING", QueryString)
PO = AppendNVP(*Params, PO, "DOCUMENT_ROOT", *Server\WebRoot)
PO = AppendNVP(*Params, PO, "SCRIPT_FILENAME", *Server\WebRoot + Path)
PO = AppendNVP(*Params, PO, "CONTENT_LENGTH", Str(BodyLen))
PO = AppendNVP(*Params, PO, "REMOTE_ADDR", "127.0.0.1")
PO = AppendNVP(*Params, PO, "REMOTE_PORT", "0")
; FIX: case-insensitive lookup
CType = GetHeaderCI(ReqHdrs(), "Content-Type")
If CType <> ""
PO = AppendNVP(*Params, PO, "CONTENT_TYPE", CType)
EndIf
ForEach ReqHdrs()
HName = MapKey(ReqHdrs())
HLower = LCase(HName)
If HLower <> "content-type" And HLower <> "content-length"
PO = AppendNVP(*Params, PO, "HTTP_" + UCase(ReplaceString(HName, "-", "_")), ReqHdrs())
EndIf
Next
While PSent < PO
PChunk = PO - PSent
If PChunk > #FCGI_MAX_RECORD : PChunk = #FCGI_MAX_RECORD : EndIf
If Not SendFcgiRecord(FcgiConn, #FCGI_PARAMS, ReqID, *Params + PSent, PChunk) : Break : EndIf
PSent + PChunk
Wend
FreeMemory(*Params)
Result = Bool(Bool(PSent >= PO) And SendFcgiRecord(FcgiConn, #FCGI_PARAMS, ReqID, #Null, 0))
ProcedureReturn Result
EndProcedure
Procedure FcgiSendBody(FcgiConn, ReqID.u, *Body, BodyLen)
Protected SSent, SChunk, Result = #True
If *Body And BodyLen > 0
While SSent < BodyLen And Result
SChunk = BodyLen - SSent
If SChunk > #FCGI_MAX_RECORD : SChunk = #FCGI_MAX_RECORD : EndIf
Result = SendFcgiRecord(FcgiConn, #FCGI_STDIN, ReqID, *Body + SSent, SChunk)
SSent + SChunk
Wend
EndIf
If Result
Result = SendFcgiRecord(FcgiConn, #FCGI_STDIN, ReqID, #Null, 0)
EndIf
ProcedureReturn Result
EndProcedure
Procedure FcgiReadResponse(FcgiConn, *OutLen)
Protected FcgiHdr.FCGI_Header, PadBuf.q
Protected *RecBuf, *RespBuf, *Grown
Protected RecLen, RecPad, RespLen, RespAlloced = 65536
*RespBuf = AllocateMemory(RespAlloced)
*RecBuf = AllocateMemory(65536)
If Not *RespBuf Or Not *RecBuf
If *RespBuf : FreeMemory(*RespBuf) : EndIf
If *RecBuf : FreeMemory(*RecBuf) : EndIf
ProcedureReturn 0
EndIf
Repeat
If ReceiveAll(FcgiConn, @FcgiHdr, #FCGI_HEADER_SIZE) <> #FCGI_HEADER_SIZE : Break : EndIf
RecLen = (FcgiHdr\contentLengthB1 << 8) | FcgiHdr\contentLengthB0
RecPad = FcgiHdr\paddingLength
If RecLen > 0 And ReceiveAll(FcgiConn, *RecBuf, RecLen) <> RecLen : Break : EndIf
If RecPad > 0 : ReceiveAll(FcgiConn, @PadBuf, RecPad) : EndIf
Select FcgiHdr\type
Case #FCGI_STDOUT
If RecLen > 0
While RespLen + RecLen > RespAlloced
RespAlloced * 2
*Grown = ReAllocateMemory(*RespBuf, RespAlloced)
If Not *Grown : FreeMemory(*RespBuf) : FreeMemory(*RecBuf) : ProcedureReturn 0 : EndIf
*RespBuf = *Grown
Wend
CopyMemory(*RecBuf, *RespBuf + RespLen, RecLen)
RespLen + RecLen
EndIf
Case #FCGI_END_REQUEST
FreeMemory(*RecBuf)
PokeI(*OutLen, RespLen)
ProcedureReturn *RespBuf
EndSelect
ForEver
FreeMemory(*RecBuf)
FreeMemory(*RespBuf)
ProcedureReturn 0
EndProcedure
Procedure FcgiSendHttpResponse(ClientID, *RespBuf, RespLen)
Protected k, SepPos = -1, BodyOff, CgiBodyLen, StatusCode = 200, StatusPos, SEnd, SpPos
Protected.s CgiHdrs, ExtraHdrs, StatusText = "OK", SVal
For k = 0 To RespLen - 4
If PeekA(*RespBuf + k) = $0D And PeekA(*RespBuf + k + 1) = $0A And
PeekA(*RespBuf + k + 2) = $0D And PeekA(*RespBuf + k + 3) = $0A
SepPos = k : Break
EndIf
Next
If SepPos >= 0
CgiHdrs = PeekS(*RespBuf, SepPos, #PB_Ascii)
BodyOff = SepPos + 4
CgiBodyLen = RespLen - BodyOff
Else
BodyOff = 0 : CgiBodyLen = RespLen
EndIf
StatusPos = FindString(CgiHdrs, "Status:", 1, #PB_String_NoCase)
If StatusPos
SEnd = FindString(CgiHdrs, #CRLF$, StatusPos)
If SEnd = 0 : SEnd = Len(CgiHdrs) + 1 : EndIf
SVal = Trim(Mid(CgiHdrs, StatusPos + 7, SEnd - StatusPos - 7))
StatusCode = Val(SVal)
SpPos = FindString(SVal, " ")
If SpPos : StatusText = Trim(Mid(SVal, SpPos + 1)) : EndIf
CgiHdrs = Left(CgiHdrs, StatusPos - 1) + Mid(CgiHdrs, SEnd + 2)
EndIf
If FindString(CgiHdrs, "Content-Length:", 1, #PB_String_NoCase) = 0
ExtraHdrs = "Content-Length: " + Str(CgiBodyLen) + #CRLF$
EndIf
; CgiHdrs from PeekS does NOT end with CRLF; SendRawHttpResponse normalises that.
SendRawHttpResponse(ClientID, "HTTP/1.1 " + Str(StatusCode) + " " + StatusText,
ExtraHdrs + CgiHdrs, *RespBuf + BodyOff, CgiBodyLen)
EndProcedure
Procedure ForwardToFcgi(*Server.Server, ClientID, Method.s, FullURI.s, Path.s, QueryString.s, Map ReqHdrs.s(), *Body, BodyLen)
Protected FcgiConn, ReqID.u = 1, RespLen, *RespBuf
Protected BeginBody.FCGI_BeginRequestBody
FcgiConn = OpenNetworkConnection(*Server\FcgiHost, *Server\FcgiPort)
If Not FcgiConn
SendErrorResponse(ClientID, 502, "Bad Gateway") : ProcedureReturn
EndIf
FillMemory(@BeginBody, SizeOf(FCGI_BeginRequestBody), 0)
BeginBody\roleB0 = #FCGI_RESPONDER
; FIX: actually check that BEGIN_REQUEST went through
If Not SendFcgiRecord(FcgiConn, #FCGI_BEGIN_REQUEST, ReqID, @BeginBody, SizeOf(FCGI_BeginRequestBody))
CloseNetworkConnection(FcgiConn)
SendErrorResponse(ClientID, 502, "Bad Gateway") : ProcedureReturn
EndIf
If Not FcgiBuildAndSendParams(FcgiConn, *Server, ReqID, Method, FullURI, Path, QueryString, ReqHdrs(), BodyLen) Or
Not FcgiSendBody(FcgiConn, ReqID, *Body, BodyLen)
CloseNetworkConnection(FcgiConn)
SendErrorResponse(ClientID, 502, "Bad Gateway") : ProcedureReturn
EndIf
*RespBuf = FcgiReadResponse(FcgiConn, @RespLen)
CloseNetworkConnection(FcgiConn)
If *RespBuf
FcgiSendHttpResponse(ClientID, *RespBuf, RespLen)
FreeMemory(*RespBuf)
Else
SendErrorResponse(ClientID, 502, "Bad Gateway")
EndIf
EndProcedure
Procedure HandleRequest(*Server.Server, ClientID, *Data, DataLen)
Protected LineEnd = -1, i, Sp1, Sp2, QPos, HdrStart, HdrEnd, NLines, j, ColPos, BodyStart, BodyLen, GoFcgi
Protected *Body
Protected.s ReqLine, Method, FullURI, Path, QueryStr, HdrStr, Line, FilePath
Protected NewMap ReqHdrs.s()
For i = 0 To DataLen - 2
If PeekA(*Data + i) = $0D And PeekA(*Data + i + 1) = $0A
LineEnd = i : Break
EndIf
Next
If LineEnd < 0 : SendErrorResponse(ClientID, 400, "Bad Request") : ProcedureReturn : EndIf
ReqLine = PeekS(*Data, LineEnd, #PB_Ascii)
Sp1 = FindString(ReqLine, " ")
Sp2 = FindString(ReqLine, " ", Sp1 + 1)
If Sp1 = 0 Or Sp2 = 0 : SendErrorResponse(ClientID, 400, "Bad Request") : ProcedureReturn : EndIf
Method = Left(ReqLine, Sp1 - 1)
FullURI = Mid(ReqLine, Sp1 + 1, Sp2 - Sp1 - 1)
If Method <> "GET" And Method <> "POST"
SendErrorResponse(ClientID, 405, "Method Not Allowed") : ProcedureReturn
EndIf
QPos = FindString(FullURI, "?")
If QPos
Path = URLDecoder(Left(FullURI, QPos - 1))
QueryStr = Mid(FullURI, QPos + 1)
Else
Path = URLDecoder(FullURI)
QueryStr = ""
EndIf
If FindString(Path, "..") : Path = "/" : EndIf
HdrStart = LineEnd + 2
For i = HdrStart To DataLen - 4
If PeekA(*Data + i) = $0D And PeekA(*Data + i + 1) = $0A And
PeekA(*Data + i + 2) = $0D And PeekA(*Data + i + 3) = $0A
HdrEnd = i : Break
EndIf
Next
If HdrEnd = 0 : HdrEnd = DataLen : EndIf
HdrStr = PeekS(*Data + HdrStart, HdrEnd - HdrStart, #PB_Ascii)
NLines = CountString(HdrStr, #CRLF$) + 1
For j = 1 To NLines
Line.s = StringField(HdrStr, j, #CRLF$)
ColPos = FindString(Line, ":")
If ColPos > 1
ReqHdrs(Trim(Left(Line, ColPos - 1))) = Trim(Mid(Line, ColPos + 1))
EndIf
Next
BodyStart = HdrEnd + 4
If BodyStart < DataLen
*Body = *Data + BodyStart
BodyLen = DataLen - BodyStart
EndIf
ForEach *Server\Prefixes()
If Left(Path, Len(*Server\Prefixes())) = *Server\Prefixes()
GoFcgi = #True : Break
EndIf
Next
If GoFcgi
ForwardToFcgi(*Server, ClientID, Method, FullURI, Path, QueryStr, ReqHdrs(), *Body, BodyLen)
ProcedureReturn
EndIf
FilePath.s = *Server\WebRoot + Path
If Right(FilePath, 1) = "/" : FilePath + "index.html" : EndIf
If FileSize(FilePath) >= 0
If Not ServeStaticFile(ClientID, FilePath)
SendErrorResponse(ClientID, 500, "Internal Server Error")
EndIf
Else
ForwardToFcgi(*Server, ClientID, Method, FullURI, Path, QueryStr, ReqHdrs(), *Body, BodyLen)
EndIf
EndProcedure
Procedure ServerThread(*Server.Server)
Protected NewMap Conns.HttpConn()
Protected Got, si, CLPos, CLEnd, ReallocFailed, Event, SearchFrom, ClientID, Key.s, HBlock.s, *Grown, *Conn.HttpConn, *ChunkBuf
*ChunkBuf = AllocateMemory(8192)
If Not *ChunkBuf : ProcedureReturn : EndIf
Repeat
Event = NetworkServerEvent(*Server\ServerID)
If Event = #PB_NetworkEvent_None
Delay(1)
Else
ClientID = EventClient()
Key = Str(ClientID)
Select Event
Case #PB_NetworkEvent_Connect
*Conn = AddMapElement(Conns(), Key)
*Conn\AllocSize = 8192
*Conn\Buffer = AllocateMemory(*Conn\AllocSize)
*Conn\ContentLength = -1
If Not *Conn\Buffer
DeleteMapElement(Conns(), Key)
CloseNetworkConnection(ClientID)
EndIf
Case #PB_NetworkEvent_Data
*Conn = FindMapElement(Conns(), Key)
If Not *Conn : Continue : EndIf
Got = ReceiveNetworkData(ClientID, *ChunkBuf, 8192)
If Got <= 0 : Continue : EndIf
ReallocFailed = #False
While *Conn\Received + Got > *Conn\AllocSize
*Conn\AllocSize * 2
*Grown = ReAllocateMemory(*Conn\Buffer, *Conn\AllocSize)
If *Grown
*Conn\Buffer = *Grown
Else
FreeMemory(*Conn\Buffer)
DeleteMapElement(Conns(), Key)
CloseNetworkConnection(ClientID)
ReallocFailed = #True : Break
EndIf
Wend
If ReallocFailed : Continue : EndIf
CopyMemory(*ChunkBuf, *Conn\Buffer + *Conn\Received, Got)
*Conn\Received + Got
If *Conn\HeadersEnd = 0 And *Conn\Received >= 4
SearchFrom = *Conn\Received - Got - 3
If SearchFrom < 0 : SearchFrom = 0 : EndIf
For si = SearchFrom To *Conn\Received - 4
If PeekA(*Conn\Buffer + si) = $0D And PeekA(*Conn\Buffer + si + 1) = $0A And
PeekA(*Conn\Buffer + si + 2) = $0D And PeekA(*Conn\Buffer + si + 3) = $0A
*Conn\HeadersEnd = si + 4 : Break
EndIf
Next
EndIf
If *Conn\HeadersEnd > 0 And *Conn\ContentLength < 0
; FIX: removed duplicate PeekS call from your version
HBlock = PeekS(*Conn\Buffer, *Conn\HeadersEnd - 4, #PB_Ascii)
CLPos = FindString(HBlock, "Content-Length:", 1, #PB_String_NoCase)
If CLPos
CLEnd = FindString(HBlock, #CRLF$, CLPos)
If CLEnd = 0 : CLEnd = Len(HBlock) + 1 : EndIf
*Conn\ContentLength = Val(Trim(Mid(HBlock, CLPos + 15, CLEnd - CLPos - 15)))
Else
*Conn\ContentLength = 0
EndIf
EndIf
If *Conn\HeadersEnd > 0 And *Conn\ContentLength >= 0
If *Conn\Received >= *Conn\HeadersEnd + *Conn\ContentLength
HandleRequest(*Server, ClientID, *Conn\Buffer, *Conn\Received)
FreeMemory(*Conn\Buffer)
DeleteMapElement(Conns(), Key)
EndIf
EndIf
Case #PB_NetworkEvent_Disconnect
*Conn = FindMapElement(Conns(), Key)
If *Conn
If *Conn\Buffer : FreeMemory(*Conn\Buffer) : EndIf
DeleteMapElement(Conns(), Key)
EndIf
EndSelect
EndIf
Until *Server\Stop
FreeMemory(*ChunkBuf)
ForEach Conns()
If Conns()\Buffer : FreeMemory(Conns()\Buffer) : EndIf
Next
CloseNetworkServer(*Server\ServerID)
EndProcedure
EndModule
CompilerIf #PB_Compiler_IsMainFile
OpenConsole("KUMO.S WebServer")
Define Port = 8080
Define WebRoot.s = "C:\KUMOS\www"
Define *Srv = WebServer::Open(Port, WebRoot)
If *Srv
WebServer::AddFcgiPrefix(*Srv, "/api/")
PrintN("WebServer running on :" + Str(Port))
PrintN(" Static root : " + WebRoot)
PrintN(" FCGI backend: 127.0.0.1:5600 (prefix: /api/)")
PrintN("Press Enter to stop.")
Input()
WebServer::Close(*Srv)
PrintN("Server stopped.")
Else
PrintN("ERROR: could not bind to port " + Str(Port))
EndIf
Input()
CompilerEndIf
; IDE Options = PureBasic 6.30 (Windows - x64)
; CursorPosition = 17
; Folding = jAAA9
; EnableXP
; DPIAware

98
Server/Main.pb Normal file
View File

@ -0,0 +1,98 @@
UseZipPacker() ; must be at the top — compiler directive
IncludePath "Libraries"
IncludeFile "FastCGI.pbi"
CompilerIf #PB_Compiler_Debugger
IncludeFile "WebServer.pbi"
CompilerEndIf
IncludePath "Includes"
IncludeFile "Modules.pbi"
IncludeFile "Database.pbi"
IncludeFile "General.pbi"
IncludeFile "Auth.pbi"
IncludeFile "FileSystem.pbi"
IncludeFile "AppStore.pbi"
IncludeFile "Router.pbi"
#FCGI_PORT = 9683
#DB_PATH = "kumos.db"
Procedure RequestHandler(*Request)
Router::Route(*Request)
EndProcedure
OpenConsole("KUMO.S Server")
UseSHA2Fingerprint()
If Not Database::Init(#DB_PATH)
PrintN("[ERROR] Cannot open database: " + #DB_PATH)
Input() : End 1
EndIf
PrintN("[ OK] Database ready: " + #DB_PATH)
If Database::UserCount() = 0
Database::CreateUser("admin", "admin")
PrintN("[INFO] Created default account: admin / admin")
PrintN("[WARN] Change this password immediately after first login!")
EndIf
Database::FSInit()
PrintN("[ OK] Filesystem tables ready")
If FileSize("blobs") = -1
CreateDirectory("blobs")
PrintN("[ OK] Created blobs directory")
EndIf
AppStore::Init() ; creates apps/ and tmp/ dirs, runs AppInit() DB migration
PrintN("[ OK] App store ready")
Global *Server = FastCGI::Open(#FCGI_PORT, @RequestHandler(), "127.0.0.1")
If Not *Server
PrintN("[ERROR] Failed to start FastCGI server on port " + Str(#FCGI_PORT))
Database::Close()
Input() : End 1
EndIf
PrintN("[ OK] FastCGI listening on port " + Str(#FCGI_PORT))
CompilerIf #PB_Compiler_Debugger
PrintN("Debug mode. Start a HTTP server on port 8080")
*HTTP_Srv = WebServer::Open(8080, "./www", "127.0.0.1", 9683)
If *HTTP_Srv
WebServer::AddFcgiPrefix(*HTTP_Srv, "/api/")
PrintN("[ OK] HTTP server ready. Visit http://localhost:8080/")
Else
PrintN("[ERROR] Failed to start HTTP server. Port 8080 already in use?")
EndIf
CompilerEndIf
PrintN("")
PrintN("Press Enter to stop.")
PrintN("")
LastClean.i = Date()
Repeat
Delay(100)
If Date() - LastClean > 60
Database::CleanExpiredSessions()
LastClean = Date()
EndIf
Until Inkey() = Chr(13)
PrintN("Shutting down...")
FastCGI::Close(*Server)
Database::Close()
PrintN("Done. Press Enter to exit.")
Input()
; IDE Options = PureBasic 6.30 (Windows - x64)
; ExecutableFormat = Console
; CursorPosition = 89
; FirstLine = 14
; Folding = -
; EnableXP
; DPIAware

50
Server/www/index.html Normal file
View File

@ -0,0 +1,50 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="user-scalable=no, width=device-width, height=device-height, initial-scale=1, minimum-scale=1, maximum-scale=1, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<script type="text/javascript">var spider = {}; spider.nbModules = 1; spider.nbLoadedModules = 0;</script>
<title>KUMO.S.</title>
<script type="text/javascript">function onLoad() { spiderCheckBrowser(); }</script>
<script type="text/javascript" src="spiderbasic/platform.js"></script>
<script type="text/javascript" src="spiderbasic/init.js"></script>
<script type="text/javascript">dojoConfig.baseUrl = 'spiderbasic/'; </script>
<script type="text/javascript" src="spiderbasic/dojo/dojo.js"></script>
<script type="text/javascript" src="spiderbasic/debug.js?t=1777726808"></script>
<script type="text/javascript">
spider.debugFilename="D:\\Documents\\GitHub\\KUMOS\\Client\\Main.sb";
spider.debugSourcePath="D:\\Documents\\GitHub\\KUMOS\\Client\\";
spider.debugIncludes=[
"D:\\Documents\\GitHub\\KUMOS\\Client\\Libraries\\IDB.sbi"
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\Modules.sbi"
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\General.sbi"
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\FileCache.sbi"
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\FS.sbi"
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\Notify.sbi"
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\Desktop.sbi"
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\Login.sbi"
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Includes\\AppRuntime.sbi"
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Default Apps\\TextEditor.sbi"
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Default Apps\\FileExplorer.sbi"
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Default Apps\\Settings.sbi"
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Default Apps\\WebBrowser.sbi"
,"D:\\Documents\\GitHub\\KUMOS\\Client\\Default Apps\\AppManager.sbi"
];
if (window.spiderDebug) { window.spiderDebug( { "command": 0, "filename": spider.debugFilename, "sourcePath": spider.debugSourcePath, "includes": spider.debugIncludes } ); }
</script>
<script type="text/javascript" src="spiderbasic/main.js?t=1777726808"></script>
<link rel="stylesheet" href="spiderbasic/dojo/themes/flat/flat.css" />
<link rel="stylesheet" href="spiderbasic/dojo/dgrid/css/dgrid.css" />
<script type="text/javascript" src="spiderbasic/xdate.min.js"></script>
<link rel="stylesheet" title="Default" href="spiderbasic/themes/flat/window.css" type="text/css"/>
<script type="text/javascript" src="js.js?t=1777726808"></script>
</head>
<body oncontextmenu="return false;" class="flat" id="spiderbody" onload="onLoad()">
</body>
</html>

5803
Server/www/js.js Normal file

File diff suppressed because it is too large Load Diff

124
Server/www/kumos.js Normal file
View File

@ -0,0 +1,124 @@
/**
* KUMO.S App SDK include in your app with:
* <script src="/kumos.js"></script>
*
* All methods return Promises. Call KUMOS.ready() first.
*
* Permissions required per namespace:
* storage.* always available (private app namespace)
* fs.* requires "fs.read" or "fs.write" grant
* notify.* requires "notify" grant
* window.* always available
*/
(function (global) {
'use strict';
var _pending = {}; // kmid → { resolve, reject, timer }
// ── Internal helpers ──────────────────────────────────────────────────────
function _uuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0;
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
}
function _send(action, args) {
return new Promise(function (resolve, reject) {
var kmid = _uuid();
var timer = setTimeout(function () {
if (_pending[kmid]) {
delete _pending[kmid];
reject(new Error('KUMOS timeout: ' + action));
}
}, 15000);
_pending[kmid] = { resolve: resolve, reject: reject, timer: timer };
window.parent.postMessage(
JSON.stringify({ kmid: kmid, action: action, args: args || {} }),
'*'
);
});
}
// Incoming responses from the shell
window.addEventListener('message', function (e) {
if (e.source !== window.parent) return;
var msg;
try { msg = JSON.parse(e.data); } catch (err) { return; }
if (!msg || !msg.kmid) return;
var p = _pending[msg.kmid];
if (!p) return;
clearTimeout(p.timer);
delete _pending[msg.kmid];
if (msg.success) {
p.resolve(msg.data !== undefined ? msg.data : null);
} else {
p.reject(new Error(msg.error || 'Unknown error'));
}
});
// ── Public API ────────────────────────────────────────────────────────────
var KUMOS = {
/**
* Handshake with the shell. Resolves with { app_id }.
* Always call this first and await it before using any other APIs.
*/
ready: function () {
return _send('window.ready', {});
},
// ── Private app storage (no extra permission required) ───────────────
storage: {
/** Read a file. Resolves with the content string. */
read: function (path) { return _send('storage.read', { path: path }); },
/** Write content to a file. Creates it if it does not exist. */
write: function (path, content) { return _send('storage.write', { path: path, content: content }); },
/** List a directory. Resolves with an array of entry objects. */
list: function (path) { return _send('storage.list', { path: path || '/' }); },
/** Stat a path. */
stat: function (path) { return _send('storage.stat', { path: path }); },
/** Create a directory. */
mkdir: function (path) { return _send('storage.mkdir', { path: path }); },
/** Delete a file. */
delete: function (path) { return _send('storage.delete', { path: path }); }
},
// ── User filesystem (requires fs.read / fs.write permission) ─────────
fs: {
/** Read a file from the user's filesystem. */
read: function (path) { return _send('fs.read', { path: path }); },
/** Write content to a file in the user's filesystem. */
write: function (path, content) { return _send('fs.write', { path: path, content: content }); },
/** List a directory. */
list: function (path) { return _send('fs.list', { path: path || '/' }); },
/** Stat a path. */
stat: function (path) { return _send('fs.stat', { path: path }); }
},
// ── Notifications (requires notify permission) ────────────────────────
notify: {
/** Show a toast. type: 'info' | 'success' | 'warning' | 'error' */
toast: function (message, type) { return _send('notify.toast', { message: message, type: type || 'info' }); },
/** Show a confirm dialog. Resolves with true (OK) or false (Cancel). */
confirm: function (title, message) { return _send('notify.confirm', { title: title, message: message }); }
},
// ── Window control ────────────────────────────────────────────────────
window: {
/** Update the host window title. */
setTitle: function (title) { return _send('window.setTitle', { title: title }); },
/** Close this app instance. */
close: function () { return _send('window.close', {}); }
}
};
global.KUMOS = KUMOS;
}(window));

View File

@ -0,0 +1,3 @@
(function(a){var l=a.Uint8Array,d=(a=a.HTMLCanvasElement)&&a.prototype,t=/\s*;\s*base64\s*(?:;|$)/i,n="toDataURL",s;l&&(s=new l([62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,0,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51]));a&&!d.toBlob&&(d.toBlob=function(a,g){g||(g="image/png");if(this.mozGetAsFile)a(this.mozGetAsFile("canvas",g));else if(this.msToBlob&&/^\s*image\/png\s*(?:$|;)/i.test(g))a(this.msToBlob());
else{var e=Array.prototype.slice.call(arguments,1),b=this[n].apply(this,e),f=b.indexOf(","),e=b.substring(f+1),b=t.test(b.substring(0,f)),c;if(Blob.fake)c=new Blob,c.encoding=b?"base64":"URI",c.data=e,c.size=e.length;else if(l)if(b){c=Blob;for(var b=e.length,f=new l(b/4*3|0),d=0,p=0,h=[0,0],q=0,k=0,m,r;b--;)r=e.charCodeAt(d++),m=s[r-43],255!==m&&void 0!==m&&(h[1]=h[0],h[0]=r,k=k<<6|m,q++,4===q&&(f[p++]=k>>>16,61!==h[1]&&(f[p++]=k>>>8),61!==h[0]&&(f[p++]=k),q=0));c=new c([f],{type:g})}else c=new Blob([decodeURIComponent(e)],
{type:g});a(c)}},d.toBlobHD=d.toDataURLHD?function(){n="toDataURLHD";var a=this.toBlob();n="toDataURL";return a}:d.toBlob)})("undefined"!==typeof self&&self||"undefined"!==typeof window&&window||this.content||this);

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,109 @@
/*
* js-crc v0.1.0
* https://github.com/emn178/js-crc
*
* Copyright 2015, emn178@gmail.com
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/MIT
*/
;(function(root, undefined) {
'use strict';
var NODE_JS = typeof(module) != 'undefined';
if(NODE_JS) {
root = global;
}
var HEX_CHARS = '0123456789abcdef'.split('');
var Modules = [
{
name: 'crc32',
polynom: 0xEDB88320,
initValue: -1,
bytes: 4
},
{
name: 'crc16',
polynom: 0xA001,
initValue: 0,
bytes: 2
}
];
var i, j, k, b;
for(i = 0;i < Modules.length;++i) {
var m = Modules[i];
m.method = (function(m) {
// SpiderBasic hack
return function(message, initValue) {
return crc(message, m, initValue);
};
})(m);
m.table = [];
for(j = 0;j < 256;++j) {
b = j;
for(k = 0;k < 8;++k) {
b = b & 1 ? m.polynom ^ (b >>> 1) : b >>> 1;
}
m.table[j] = b >>> 0;
}
}
var crc = function(message, module, initValue) {
var notString = typeof(message) != 'string';
if(notString && message.constructor == ArrayBuffer) {
message = new Uint8Array(message);
}
// SpiderBasic hack
var crc = initValue ^ 0xffffffff, code, i, length = message.length, table = module.table;
if(notString) {
for(i = 0;i < length;++i) {
crc = table[(crc ^ message[i]) & 0xFF] ^ (crc >>> 8);
}
} else {
for(i = 0;i < length;++i) {
code = message.charCodeAt(i);
if (code < 0x80) {
crc = table[(crc ^ code) & 0xFF] ^ (crc >>> 8);
} else if (code < 0x800) {
crc = table[(crc ^ (0xc0 | (code >> 6))) & 0xFF] ^ (crc >>> 8);
crc = table[(crc ^ (0x80 | (code & 0x3f))) & 0xFF] ^ (crc >>> 8);
} else if (code < 0xd800 || code >= 0xe000) {
crc = table[(crc ^ (0xe0 | (code >> 12))) & 0xFF] ^ (crc >>> 8);
crc = table[(crc ^ (0x80 | ((code >> 6) & 0x3f))) & 0xFF] ^ (crc >>> 8);
crc = table[(crc ^ (0x80 | (code & 0x3f))) & 0xFF] ^ (crc >>> 8);
} else {
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++i) & 0x3ff));
crc = table[(crc ^ (0xf0 | (code >> 18))) & 0xFF] ^ (crc >>> 8);
crc = table[(crc ^ (0x80 | ((code >> 12) & 0x3f))) & 0xFF] ^ (crc >>> 8);
crc = table[(crc ^ (0x80 | ((code >> 6) & 0x3f))) & 0xFF] ^ (crc >>> 8);
crc = table[(crc ^ (0x80 | (code & 0x3f))) & 0xFF] ^ (crc >>> 8);
}
}
}
// SpiderBasic hack
crc ^= 0xffffffff;
var hex = '';
if(module.bytes > 2) {
hex += HEX_CHARS[(crc >> 28) & 0x0F] + HEX_CHARS[(crc >> 24) & 0x0F] +
HEX_CHARS[(crc >> 20) & 0x0F] + HEX_CHARS[(crc >> 16) & 0x0F];
}
hex += HEX_CHARS[(crc >> 12) & 0x0F] + HEX_CHARS[(crc >> 8) & 0x0F] +
HEX_CHARS[(crc >> 4) & 0x0F] + HEX_CHARS[crc & 0x0F];
return hex;
};
var exports;
if(!root.HI_CRC32_TEST && NODE_JS) {
exports = module.exports = {};
} else if(root) {
exports = root;
}
for(i = 0;i < Modules.length;++i) {
var m = Modules[i];
exports[m.name] = m.method;
}
}(this));

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,23 @@
/*
* js-sha3 v0.5.1
* https://github.com/emn178/js-sha3
*
* Copyright 2015, emn178@gmail.com
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/MIT
*/
(function(r,ma){function n(a,b,c){this.blocks=[];this.s=[];this.padding=b;this.outputBits=c;this.reset=!0;this.start=this.block=0;this.blockCount=1600-(a<<1)>>5;this.byteCount=this.blockCount<<2;this.outputBlocks=c>>5;this.extraBytes=(c&31)>>3;for(a=0;50>a;++a)this.s[a]=0}var ga="undefined"!=typeof module;ga&&(r=global,r.JS_SHA3_TEST&&(r.navigator={userAgent:"Chrome"}));for(var l="0123456789abcdef".split(""),p=[0,8,16,24],ha=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,
2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648],t=[224,256,384,512],w=["hex","buffer","array"],ia=function(a,b,c){return function(e){return(new n(a,b,a)).update(e)[c]()}},ja=function(a,b,c){return function(e,g){return(new n(a,b,g)).update(e)[c]()}},q=function(a,b){var c=ia(a,
b,"hex");c.create=function(){return new n(a,b,a)};c.update=function(a){return c.create().update(a)};for(var e=0;e<w.length;++e){var g=w[e];c[g]=ia(a,b,g)}return c},t=[{name:"keccak",padding:[1,256,65536,16777216],bits:t,createMethod:q},{name:"sha3",padding:[6,1536,393216,100663296],bits:t,createMethod:q},{name:"shake",padding:[31,7936,2031616,520093696],bits:[128,256],createMethod:function(a,b){var c=ja(a,b,"hex");c.create=function(c){return new n(a,b,c)};c.update=function(a,b){return c.create(b).update(a)};
for(var e=0;e<w.length;++e){var g=w[e];c[g]=ja(a,b,g)}return c}}],x={},ea=0;ea<t.length;++ea)for(var u=t[ea],fa=u.bits,q=u.createMethod,q=0;q<fa.length;++q){var la=u.createMethod(fa[q],u.padding);x[u.name+"_"+fa[q]]=la}n.prototype.update=function(a){var b="string"!=typeof a;b&&a.constructor==r.ArrayBuffer&&(a=new Uint8Array(a));for(var c=a.length,e=this.blocks,g=this.byteCount,k=this.blockCount,h=0,f=this.s,d,m;h<c;){if(this.reset)for(this.reset=!1,e[0]=this.block,d=1;d<k+1;++d)e[d]=0;if(b)for(d=
this.start;h<c&&d<g;++h)e[d>>2]|=a[h]<<p[d++&3];else for(d=this.start;h<c&&d<g;++h)m=a.charCodeAt(h),128>m?e[d>>2]|=m<<p[d++&3]:(2048>m?e[d>>2]|=(192|m>>6)<<p[d++&3]:(55296>m||57344<=m?e[d>>2]|=(224|m>>12)<<p[d++&3]:(m=65536+((m&1023)<<10|a.charCodeAt(++h)&1023),e[d>>2]|=(240|m>>18)<<p[d++&3],e[d>>2]|=(128|m>>12&63)<<p[d++&3]),e[d>>2]|=(128|m>>6&63)<<p[d++&3]),e[d>>2]|=(128|m&63)<<p[d++&3]);this.lastByteIndex=d;if(d>=g){this.start=d-g;this.block=e[k];for(d=0;d<k;++d)f[d]^=e[d];v(f);this.reset=!0}else this.start=
d}return this};n.prototype.finalize=function(){var a=this.blocks,b=this.lastByteIndex,c=this.blockCount,e=this.s;a[b>>2]|=this.padding[b&3];if(this.lastByteIndex==this.byteCount)for(a[0]=a[c],b=1;b<c+1;++b)a[b]=0;a[c-1]|=2147483648;for(b=0;b<c;++b)e[b]^=a[b];v(e)};n.prototype.toString=n.prototype.hex=function(){this.finalize();for(var a=this.blockCount,b=this.s,c=this.outputBlocks,e=this.extraBytes,g=0,k=0,h="",f;k<c;){for(g=0;g<a&&k<c;++g,++k)f=b[g],h+=l[f>>4&15]+l[f&15]+l[f>>12&15]+l[f>>8&15]+l[f>>
20&15]+l[f>>16&15]+l[f>>28&15]+l[f>>24&15];0==k%a&&v(b)}e&&(f=b[g],0<e&&(h+=l[f>>4&15]+l[f&15]),1<e&&(h+=l[f>>12&15]+l[f>>8&15]),2<e&&(h+=l[f>>20&15]+l[f>>16&15]));return h};n.prototype.buffer=function(){this.finalize();var a=this.blockCount,b=this.s,c=this.outputBlocks,e=this.extraBytes,g=0,k=0,h=this.outputBits>>3,f;f=e?new ArrayBuffer(c+1<<2):new ArrayBuffer(h);for(var d=new Uint32Array(f);k<c;){for(g=0;g<a&&k<c;++g,++k)d[k]=b[g];0==k%a&&v(b)}e&&(d[g]=b[g],f=f.slice(0,h));return f};n.prototype.digest=
n.prototype.array=function(){this.finalize();for(var a=this.blockCount,b=this.s,c=this.outputBlocks,e=this.extraBytes,g=0,k=0,h=[],f,d;k<c;){for(g=0;g<a&&k<c;++g,++k)f=k<<2,d=b[g],h[f]=d&255,h[f+1]=d>>8&255,h[f+2]=d>>16&255,h[f+3]=d>>24&255;0==k%a&&v(b)}e&&(f=k<<2,d=b[g],0<e&&(h[f]=d&255),1<e&&(h[f+1]=d>>8&255),2<e&&(h[f+2]=d>>16&255));return h};var v=function(a){var b,c,e,g,k,h,f,d,m,l,n,p,q,r,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,aa,ba,ca,da;for(e=0;48>e;e+=2)g=a[0]^
a[10]^a[20]^a[30]^a[40],k=a[1]^a[11]^a[21]^a[31]^a[41],h=a[2]^a[12]^a[22]^a[32]^a[42],f=a[3]^a[13]^a[23]^a[33]^a[43],d=a[4]^a[14]^a[24]^a[34]^a[44],m=a[5]^a[15]^a[25]^a[35]^a[45],l=a[6]^a[16]^a[26]^a[36]^a[46],n=a[7]^a[17]^a[27]^a[37]^a[47],p=a[8]^a[18]^a[28]^a[38]^a[48],q=a[9]^a[19]^a[29]^a[39]^a[49],b=p^(h<<1|f>>>31),c=q^(f<<1|h>>>31),a[0]^=b,a[1]^=c,a[10]^=b,a[11]^=c,a[20]^=b,a[21]^=c,a[30]^=b,a[31]^=c,a[40]^=b,a[41]^=c,b=g^(d<<1|m>>>31),c=k^(m<<1|d>>>31),a[2]^=b,a[3]^=c,a[12]^=b,a[13]^=c,a[22]^=
b,a[23]^=c,a[32]^=b,a[33]^=c,a[42]^=b,a[43]^=c,b=h^(l<<1|n>>>31),c=f^(n<<1|l>>>31),a[4]^=b,a[5]^=c,a[14]^=b,a[15]^=c,a[24]^=b,a[25]^=c,a[34]^=b,a[35]^=c,a[44]^=b,a[45]^=c,b=d^(p<<1|q>>>31),c=m^(q<<1|p>>>31),a[6]^=b,a[7]^=c,a[16]^=b,a[17]^=c,a[26]^=b,a[27]^=c,a[36]^=b,a[37]^=c,a[46]^=b,a[47]^=c,b=l^(g<<1|k>>>31),c=n^(k<<1|g>>>31),a[8]^=b,a[9]^=c,a[18]^=b,a[19]^=c,a[28]^=b,a[29]^=c,a[38]^=b,a[39]^=c,a[48]^=b,a[49]^=c,b=a[0],c=a[1],M=a[11]<<4|a[10]>>>28,N=a[10]<<4|a[11]>>>28,u=a[20]<<3|a[21]>>>29,v=
a[21]<<3|a[20]>>>29,aa=a[31]<<9|a[30]>>>23,ba=a[30]<<9|a[31]>>>23,I=a[40]<<18|a[41]>>>14,J=a[41]<<18|a[40]>>>14,A=a[2]<<1|a[3]>>>31,B=a[3]<<1|a[2]>>>31,g=a[13]<<12|a[12]>>>20,k=a[12]<<12|a[13]>>>20,O=a[22]<<10|a[23]>>>22,P=a[23]<<10|a[22]>>>22,w=a[33]<<13|a[32]>>>19,x=a[32]<<13|a[33]>>>19,ca=a[42]<<2|a[43]>>>30,da=a[43]<<2|a[42]>>>30,U=a[5]<<30|a[4]>>>2,V=a[4]<<30|a[5]>>>2,C=a[14]<<6|a[15]>>>26,D=a[15]<<6|a[14]>>>26,h=a[25]<<11|a[24]>>>21,f=a[24]<<11|a[25]>>>21,Q=a[34]<<15|a[35]>>>17,R=a[35]<<15|
a[34]>>>17,y=a[45]<<29|a[44]>>>3,z=a[44]<<29|a[45]>>>3,p=a[6]<<28|a[7]>>>4,q=a[7]<<28|a[6]>>>4,W=a[17]<<23|a[16]>>>9,X=a[16]<<23|a[17]>>>9,E=a[26]<<25|a[27]>>>7,F=a[27]<<25|a[26]>>>7,d=a[36]<<21|a[37]>>>11,m=a[37]<<21|a[36]>>>11,S=a[47]<<24|a[46]>>>8,T=a[46]<<24|a[47]>>>8,K=a[8]<<27|a[9]>>>5,L=a[9]<<27|a[8]>>>5,r=a[18]<<20|a[19]>>>12,t=a[19]<<20|a[18]>>>12,Y=a[29]<<7|a[28]>>>25,Z=a[28]<<7|a[29]>>>25,G=a[38]<<8|a[39]>>>24,H=a[39]<<8|a[38]>>>24,l=a[48]<<14|a[49]>>>18,n=a[49]<<14|a[48]>>>18,a[0]=b^~g&
h,a[1]=c^~k&f,a[10]=p^~r&u,a[11]=q^~t&v,a[20]=A^~C&E,a[21]=B^~D&F,a[30]=K^~M&O,a[31]=L^~N&P,a[40]=U^~W&Y,a[41]=V^~X&Z,a[2]=g^~h&d,a[3]=k^~f&m,a[12]=r^~u&w,a[13]=t^~v&x,a[22]=C^~E&G,a[23]=D^~F&H,a[32]=M^~O&Q,a[33]=N^~P&R,a[42]=W^~Y&aa,a[43]=X^~Z&ba,a[4]=h^~d&l,a[5]=f^~m&n,a[14]=u^~w&y,a[15]=v^~x&z,a[24]=E^~G&I,a[25]=F^~H&J,a[34]=O^~Q&S,a[35]=P^~R&T,a[44]=Y^~aa&ca,a[45]=Z^~ba&da,a[6]=d^~l&b,a[7]=m^~n&c,a[16]=w^~y&p,a[17]=x^~z&q,a[26]=G^~I&A,a[27]=H^~J&B,a[36]=Q^~S&K,a[37]=R^~T&L,a[46]=aa^~ca&U,a[47]=
ba^~da&V,a[8]=l^~b&g,a[9]=n^~c&k,a[18]=y^~p&r,a[19]=z^~q&t,a[28]=I^~A&C,a[29]=J^~B&D,a[38]=S^~K&M,a[39]=T^~L&N,a[48]=ca^~U&W,a[49]=da^~V&X,a[0]^=ha[e],a[1]^=ha[e+1]};if(!r.JS_SHA3_TEST&&ga)module.exports=x;else if(r)for(var ka in x)r[ka]=x[ka]})(this);

View File

@ -0,0 +1,211 @@
spider.debug = {
y : 0,
window : null,
editorGadget : null,
disabled: false,
fatalError: false,
Init : function() {
// A webview is attached, don't display the built-in debug window
if (window.spiderDebug)
{
return;
}
this.window = spider_OpenWindow(-1, 0, 0, 350, 150, "SpiderBasic - Debug output", (1 << 4) | (1 << 5));
this.editorGadget = spider_EditorGadget(-1, 5, 5, spider_WindowWidth(spider.debug.window) - 10, spider_WindowHeight(spider.debug.window) - 10, (1 << 0));
spider_StickyWindow(this.window, 1);
// Position the window in the top/right corner
spider_ResizeWindow(this.window, spider_DesktopWidth() - spider_WindowWidth(this.window, 1)-10, 10, -0xFFFF , -0xFFFF)
spider_BindEvent(4, // PB_Event_CloseWindow
function() {
spider_CloseWindow(spider.debug.window);
spider.debug.disabled = true;
},
this.window);
spider_BindEvent(7, // PB_Event_SizeWindow
function() {
spider_ResizeGadget(spider.debug.editorGadget, 5, 5, spider_WindowWidth(spider.debug.window) - 10, spider_WindowHeight(spider.debug.window) - 10);
},
this.window);
},
RawPrint : function(text) {
if (this.editorGadget && !this.disabled)
{
spider_SetGadgetText(this.editorGadget, spider_GetGadgetText(this.editorGadget)+text+"\n");
var editorTextArea = spider_GadgetID(this.editorGadget).gadget.domNode;
// Use jquery animate to scroll down automatically
$(editorTextArea).animate({
scrollTop:$(editorTextArea)[0].scrollHeight - $(editorTextArea).height()
},0);
}
},
Print : function(text) {
if (spider.debug.fatalError) // Don't do anything if the program has already crash
return;
// log in browser console first, just in case the GUI text doesn't work
console.log(text);
// A webview is attached, forward the debug to the IDE debug output
if (window.spiderDebug)
{
window.spiderDebug({"command": 5, "text": ""+text });
}
else
{
this.RawPrint(text);
}
},
CheckSingleFlags : function(parameter, flags, allowedFlags)
{
var callerName = spider.debug.CheckSingleFlags.caller.name;
var functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
if (allowedFlags.indexOf(flags) === -1)
throw new Error(functionName+"(): : invalid value specified for parameter '"+parameter+"'.", { cause: "spider" });
},
CheckCombinationFlags : function(parameter, flags, allowedFlags)
{
var callerName = spider.debug.CheckCombinationFlags.caller.name;
var functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
var allFlags = 0;
for (var k = 0; k < allowedFlags.length; k++)
{
allFlags |= allowedFlags[k];
}
if ((allFlags & flags) !== flags) // Something is wrong is the specified value doesn't fit in the flags
throw new Error(functionName+"(): : invalid value specified for parameter '"+parameter+"'.", { cause: "spider" });
},
Error : function(text, callerName)
{
if (spider.debug.fatalError) // Don't do anything if the program has already crash
return;
if (typeof callerName === "undefined")
{
callerName = spider.debug.Error.caller.name;
}
functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
throw new Error(functionName+"(): "+text, { cause: "spider" });
},
CheckId : function(callerName, ObjectName, id)
{
if (spider.debug.fatalError) // Don't do anything if the program has already crash
return;
var functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
if (id < -1)
throw new Error(functionName+"(): #"+ObjectName+" object number can't be negative (value: "+id+").", { cause: "spider" });
else if (id >= 10000)
throw new Error(functionName+"(): #"+ObjectName+" object number is very high (over 10000), are you sure of that ?", { cause: "spider" });
},
CheckObject : function(callerName, ObjectName, isObject)
{
if (spider.debug.fatalError) // Don't do anything if the program has already crash
return;
var functionName = callerName.substring(7, callerName.length - 6); // remove 'spider_' and '_DEBUG'
if (isObject === 0)
throw new Error(functionName+"(): The specified #"+ObjectName+" is not initialised.", { cause: "spider" });
},
ThrowError : function(functionName, text)
{
if (spider.debug.fatalError) // Don't do anything if the program has already crash
return;
throw new Error(functionName+"(): "+ text, { cause: "spider" });
},
DebuggerLineGetLine : function(a)
{
return ((a) & ((1 << 20)-1));
},
DebuggerLineGetFile : function(a)
{
return (((a) >> 20) & ((1 << (32-20))-1));
},
DisplayError : function(text)
{
if (spider.debug.fatalError) // Don't do anything if the program has already crash
return;
// A webview is attached
if (window.spiderDebug)
{
window.spiderDebug( { "command": 8, "lineId": spiderLine, "text": text } );
}
else
{
var line = spider.debug.DebuggerLineGetLine(spiderLine)+1;
var fileIndex = spider.debug.DebuggerLineGetFile(spiderLine);
var filename = spider.debugFilename;
if (fileIndex > 0) // It's an include file
{
filename = spider.debugIncludes[fileIndex-1];
}
spider.debug.Print(filename+":"+line+" "+text);
}
}
};
// temporary Shortcut
spider.Debug = function(text) {
spider.debug.Print(text);
};
// temporary Shortcut
function debug(text) {
spider.debug.Print(text);
}
// global error handler
window.addEventListener("error", (event) => {
if (spider.debug.fatalError) // Don't do anything if the program has already crash
return;
var text;
if (event.error.cause == "spider") // It's a SpiderBasic exception
{
text = event.error.message;
}
else
{
// Not a SpiderBasic exception, put the full details
text = `${event.type}: ${event.message} (${event.filename}, line: ${event.lineno})`;
}
spider.debug.DisplayError(text);
spider.debug.fatalError = true;
});

View File

@ -0,0 +1,25 @@
[
{"AbstractOnlyError": {"text":"method is abstract only and requires implementation"} },
{"AccessError": {"text":"requested or required access is not allowed"} },
{"ItemExistError": {"text":"object with specified ID already exist"} },
{"InvalidAccessError": {"text":"operation or parameter is not allowed"} },
{"InvalidDataError": {"text":"store data must be an array of objects"} },
{"InvalidParameterError": {"text":"Invalid parameter specified"} },
{"InvalidPropertyError": {"text":"invalid property or type specified"} },
{"InvalidObjectError": {"text":"item is not an a valid store object"} },
{"InvalidPathError": {"text":"invalid path"} },
{"InvalidResponseError": {"text":"function returned an invalid or unexpected response"} },
{"InvalidTypeError": {"text":"parameter or property type is invalid"} },
{"InvalidVersionError": {"text":"invalid dojo or dijit version"} },
{"InvalidWidgetError": {"text":"invalid widget"} },
{"MethodMissingError": {"text":"a required function is missing"} },
{"NotFoundError": {"text":"the object can not be found here."} },
{"ParameterMissingError": {"text":"required parameter is missing"} },
{"PropertyMissingError": {"text":"required property is missing"} },
{"ReadOnlyError": {"text":"property is READ-ONLY"} },
{"RequestCancelError": {"text":"request was canceled"} },
{"RequestError": {"text":"XHR request failed"} },
{"RequestPendingError": {"text":"another request is still pending"} },
{"UnknownVersionError": {"text":"unknown dojo and/or dijit version"} }
]

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.claro .cbtreeCheckBox {background-image: url('images/spriteCheckbox.gif'); background-repeat: no-repeat; width: 16px; height: 16px; margin: 0; padding: 0;}.claro .cbtreeCheckBox {background-position: -16px;}.claro .cbtreeCheckBoxChecked {background-position: 0px;}.claro .cbtreeCheckBoxMixed {background-position: -32px;}.claro .cbtreeCheckBoxDisabled {background-position: -64px;}.claro .cbtreeCheckBoxCheckedDisabled {background-position: -48px;}.claro .cbtreeCheckBoxMixedDisabled {background-position: -80px;}.claro .cbtreeCheckBoxReadOnly {background-position: -64px;}.claro .cbtreeCheckBoxCheckedReadOnly {background-position: -48px;}.claro .cbtreeCheckBoxMixedReadOnly {background-position: -80px;}.claro .cbtreeCheckBoxHover {background-position: -112px;}.claro .cbtreeCheckBoxCheckedHover {background-position: -96px;}.claro .cbtreeCheckBoxMixedHover {background-position: -128px;}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

1122
Server/www/spiderbasic/dojo/dojo.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
//>>built
define("dojo/nls/colors",{root:{aliceblue:"alice blue",antiquewhite:"antique white",aqua:"aqua",aquamarine:"aquamarine",azure:"azure",beige:"beige",bisque:"bisque",black:"black",blanchedalmond:"blanched almond",blue:"blue",blueviolet:"blue-violet",brown:"brown",burlywood:"burlywood",cadetblue:"cadet blue",chartreuse:"chartreuse",chocolate:"chocolate",coral:"coral",cornflowerblue:"cornflower blue",cornsilk:"cornsilk",crimson:"crimson",cyan:"cyan",darkblue:"dark blue",darkcyan:"dark cyan",darkgoldenrod:"dark goldenrod",
darkgray:"dark gray",darkgreen:"dark green",darkgrey:"dark gray",darkkhaki:"dark khaki",darkmagenta:"dark magenta",darkolivegreen:"dark olive green",darkorange:"dark orange",darkorchid:"dark orchid",darkred:"dark red",darksalmon:"dark salmon",darkseagreen:"dark sea green",darkslateblue:"dark slate blue",darkslategray:"dark slate gray",darkslategrey:"dark slate gray",darkturquoise:"dark turquoise",darkviolet:"dark violet",deeppink:"deep pink",deepskyblue:"deep sky blue",dimgray:"dim gray",dimgrey:"dim gray",
dodgerblue:"dodger blue",firebrick:"fire brick",floralwhite:"floral white",forestgreen:"forest green",fuchsia:"fuchsia",gainsboro:"gainsboro",ghostwhite:"ghost white",gold:"gold",goldenrod:"goldenrod",gray:"gray",green:"green",greenyellow:"green-yellow",grey:"gray",honeydew:"honeydew",hotpink:"hot pink",indianred:"indian red",indigo:"indigo",ivory:"ivory",khaki:"khaki",lavender:"lavender",lavenderblush:"lavender blush",lawngreen:"lawn green",lemonchiffon:"lemon chiffon",lightblue:"light blue",lightcoral:"light coral",
lightcyan:"light cyan",lightgoldenrodyellow:"light goldenrod yellow",lightgray:"light gray",lightgreen:"light green",lightgrey:"light gray",lightpink:"light pink",lightsalmon:"light salmon",lightseagreen:"light sea green",lightskyblue:"light sky blue",lightslategray:"light slate gray",lightslategrey:"light slate gray",lightsteelblue:"light steel blue",lightyellow:"light yellow",lime:"lime",limegreen:"lime green",linen:"linen",magenta:"magenta",maroon:"maroon",mediumaquamarine:"medium aquamarine",
mediumblue:"medium blue",mediumorchid:"medium orchid",mediumpurple:"medium purple",mediumseagreen:"medium sea green",mediumslateblue:"medium slate blue",mediumspringgreen:"medium spring green",mediumturquoise:"medium turquoise",mediumvioletred:"medium violet-red",midnightblue:"midnight blue",mintcream:"mint cream",mistyrose:"misty rose",moccasin:"moccasin",navajowhite:"navajo white",navy:"navy",oldlace:"old lace",olive:"olive",olivedrab:"olive drab",orange:"orange",orangered:"orange red",orchid:"orchid",
palegoldenrod:"pale goldenrod",palegreen:"pale green",paleturquoise:"pale turquoise",palevioletred:"pale violet-red",papayawhip:"papaya whip",peachpuff:"peach puff",peru:"peru",pink:"pink",plum:"plum",powderblue:"powder blue",purple:"purple",red:"red",rosybrown:"rosy brown",royalblue:"royal blue",saddlebrown:"saddle brown",salmon:"salmon",sandybrown:"sandy brown",seagreen:"sea green",seashell:"seashell",sienna:"sienna",silver:"silver",skyblue:"sky blue",slateblue:"slate blue",slategray:"slate gray",
slategrey:"slate gray",snow:"snow",springgreen:"spring green",steelblue:"steel blue",tan:"tan",teal:"teal",thistle:"thistle",tomato:"tomato",transparent:"transparent",turquoise:"turquoise",violet:"violet",wheat:"wheat",white:"white",whitesmoke:"white smoke",yellow:"yellow",yellowgreen:"yellow green"},bs:!0,mk:!0,sr:!0,zh:!0,"zh-tw":!0,uk:!0,tr:!0,th:!0,sv:!0,sl:!0,sk:!0,ru:!0,ro:!0,pt:!0,"pt-pt":!0,pl:!0,nl:!0,nb:!0,ko:!0,kk:!0,ja:!0,it:!0,id:!0,hu:!0,hr:!0,he:!0,fr:!0,fi:!0,eu:!0,es:!0,el:!0,de:!0,
da:!0,cs:!0,ca:!0,bg:!0,az:!0,ar:!0});
//# sourceMappingURL=colors.js.map

View File

@ -0,0 +1,27 @@
//>>built
define("dojo/nls/dojo_ar",{"dijit/form/nls/validate":{invalidMessage:"\u0627\u0644\u0642\u064a\u0645\u0629 \u0627\u0644\u062a\u064a \u062a\u0645 \u0627\u062f\u062e\u0627\u0644\u0647\u0627 \u063a\u064a\u0631 \u0635\u062d\u064a\u062d\u0629.",rangeMessage:"\u0647\u0630\u0647 \u0627\u0644\u0642\u064a\u0645\u0629 \u0644\u064a\u0633 \u0628\u0627\u0644\u0645\u062f\u0649 \u0627\u0644\u0635\u062d\u064a\u062d.",_localized:{},missingMessage:"\u064a\u062c\u0628 \u0627\u062f\u062e\u0627\u0644 \u0647\u0630\u0647 \u0627\u0644\u0642\u064a\u0645\u0629."},
"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u0633\u0628\u062a".split(" "),"months-format-narrow":"\u064a\u0641\u0645\u0623\u0648\u0646\u0644\u063a\u0633\u0643\u0628\u062f".split(""),"field-second-relative+0":"\u0627\u0644\u0622\u0646",
"quarters-standAlone-narrow":["\u0661","\u0662","\u0663","\u0664"],"field-weekday":"\u0627\u0644\u064a\u0648\u0645","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E\u060c d/M/y","field-wed-relative+0":"\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062d\u0627\u0644\u064a","field-wed-relative+1":"\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062a\u0627\u0644\u064a","dateFormatItem-GyMMMEd":"E\u060c d MMM\u060c y G","dateFormatItem-MMMEd":"E\u060c d MMM",eraNarrow:["\u0642.\u0645",
"\u0645"],"dateFormatItem-yMM":"MM/y","field-tue-relative+-1":"\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u0645\u0627\u0636\u064a","days-format-short":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u0633\u0628\u062a".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}",
"dateFormat-long":"d MMMM\u060c y","field-fri-relative+-1":"\u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u0645\u0627\u0636\u064a\u0629","field-wed-relative+-1":"\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u0645\u0627\u0636\u064a","months-format-wide":"\u064a\u0646\u0627\u064a\u0631 \u0641\u0628\u0631\u0627\u064a\u0631 \u0645\u0627\u0631\u0633 \u0623\u0628\u0631\u064a\u0644 \u0645\u0627\u064a\u0648 \u064a\u0648\u0646\u064a\u0648 \u064a\u0648\u0644\u064a\u0648 \u0623\u063a\u0633\u0637\u0633 \u0633\u0628\u062a\u0645\u0628\u0631 \u0623\u0643\u062a\u0648\u0628\u0631 \u0646\u0648\u0641\u0645\u0628\u0631 \u062f\u064a\u0633\u0645\u0628\u0631".split(" "),
"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"\u0645","dateFormat-full":"EEEE\u060c d MMMM\u060c y","field-thu-relative+-1":"\u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u0645\u0627\u0636\u064a","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d/M/y","field-era":"\u0627\u0644\u0639\u0635\u0631","dateFormatItem-yM":"M/y","months-standAlone-wide":"\u064a\u0646\u0627\u064a\u0631 \u0641\u0628\u0631\u0627\u064a\u0631 \u0645\u0627\u0631\u0633 \u0623\u0628\u0631\u064a\u0644 \u0645\u0627\u064a\u0648 \u064a\u0648\u0646\u064a\u0648 \u064a\u0648\u0644\u064a\u0648 \u0623\u063a\u0633\u0637\u0633 \u0633\u0628\u062a\u0645\u0628\u0631 \u0623\u0643\u062a\u0648\u0628\u0631 \u0646\u0648\u0641\u0645\u0628\u0631 \u062f\u064a\u0633\u0645\u0628\u0631".split(" "),
"timeFormat-short":"h:mm a","quarters-format-wide":["\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0623\u0648\u0644","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0646\u064a","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0644\u062b","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0631\u0627\u0628\u0639"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"h:mm:ss a z","field-year":"\u0627\u0644\u0633\u0646\u0629","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}",
"field-hour":"\u0627\u0644\u0633\u0627\u0639\u0627\u062a","dateFormatItem-MMdd":"dd/MM","months-format-abbr":"\u064a\u0646\u0627\u064a\u0631 \u0641\u0628\u0631\u0627\u064a\u0631 \u0645\u0627\u0631\u0633 \u0623\u0628\u0631\u064a\u0644 \u0645\u0627\u064a\u0648 \u064a\u0648\u0646\u064a\u0648 \u064a\u0648\u0644\u064a\u0648 \u0623\u063a\u0633\u0637\u0633 \u0633\u0628\u062a\u0645\u0628\u0631 \u0623\u0643\u062a\u0648\u0628\u0631 \u0646\u0648\u0641\u0645\u0628\u0631 \u062f\u064a\u0633\u0645\u0628\u0631".split(" "),
"field-sat-relative+0":"\u0627\u0644\u0633\u0628\u062a \u0627\u0644\u062d\u0627\u0644\u064a","field-sat-relative+1":"\u0627\u0644\u0633\u0628\u062a \u0627\u0644\u062a\u0627\u0644\u064a","timeFormat-full":"h:mm:ss a zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"\u0627\u0644\u064a\u0648\u0645","field-thu-relative+0":"\u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062d\u0627\u0644\u064a","field-day-relative+1":"\u063a\u062f\u064b\u0627","field-thu-relative+1":"\u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062a\u0627\u0644\u064a",
"dateFormatItem-GyMMMd":"d MMM\u060c y G","field-day-relative+2":"\u0628\u0639\u062f \u0627\u0644\u063a\u062f","dateFormatItem-H":"HH","months-standAlone-abbr":"\u064a\u0646\u0627\u064a\u0631 \u0641\u0628\u0631\u0627\u064a\u0631 \u0645\u0627\u0631\u0633 \u0623\u0628\u0631\u064a\u0644 \u0645\u0627\u064a\u0648 \u064a\u0648\u0646\u064a\u0648 \u064a\u0648\u0644\u064a\u0648 \u0623\u063a\u0633\u0637\u0633 \u0633\u0628\u062a\u0645\u0628\u0631 \u0623\u0643\u062a\u0648\u0628\u0631 \u0646\u0648\u0641\u0645\u0628\u0631 \u062f\u064a\u0633\u0645\u0628\u0631".split(" "),
"quarters-format-abbr":["\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0623\u0648\u0644","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0646\u064a","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0644\u062b","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0631\u0627\u0628\u0639"],"quarters-standAlone-wide":["\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0623\u0648\u0644","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0646\u064a","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0644\u062b",
"\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0631\u0627\u0628\u0639"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u0633\u0628\u062a".split(" "),"dateFormatItem-MMMMd":"d MMMM","dayPeriods-format-abbr-noon":"noon",
"timeFormat-medium":"h:mm:ss a","field-sun-relative+0":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u062d\u0627\u0644\u064a","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u062a\u0627\u0644\u064a","quarters-standAlone-abbr":["\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0623\u0648\u0644","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0646\u064a","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u062b\u0627\u0644\u062b","\u0627\u0644\u0631\u0628\u0639 \u0627\u0644\u0631\u0627\u0628\u0639"],
eraAbbr:["\u0642.\u0645","\u0645"],"field-minute":"\u0627\u0644\u062f\u0642\u0627\u0626\u0642","field-dayperiod":"\u0635/\u0645","days-standAlone-abbr":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u0633\u0628\u062a".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["\u0661",
"\u0662","\u0663","\u0664"],"field-day-relative+-1":"\u0623\u0645\u0633","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"\u0623\u0648\u0644 \u0623\u0645\u0633","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E\u060c d/M","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"\u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629","field-fri-relative+1":"\u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u062a\u0627\u0644\u064a\u0629",
"dateFormatItem-yMMMM":"MMMM y","field-day":"\u064a\u0648\u0645","days-format-wide":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u0633\u0628\u062a".split(" "),"field-zone":"\u0627\u0644\u062a\u0648\u0642\u064a\u062a","months-standAlone-narrow":"\u064a\u0641\u0645\u0623\u0648\u0646\u0644\u063a\u0633\u0643\u0628\u062f".split(""),
"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"\u0627\u0644\u0633\u0646\u0629 \u0627\u0644\u0645\u0627\u0636\u064a\u0629","field-month-relative+-1":"\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u0645\u0627\u0636\u064a","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 \u0627\u0644\u062e\u0645\u064a\u0633 \u0627\u0644\u062c\u0645\u0639\u0629 \u0627\u0644\u0633\u0628\u062a".split(" "),
eraNames:["\u0642\u0628\u0644 \u0627\u0644\u0645\u064a\u0644\u0627\u062f","\u0645\u064a\u0644\u0627\u062f\u064a"],"dateFormatItem-yMMMd":"d MMM\u060c y","days-format-narrow":"\u062d\u0646\u062b\u0631\u062e\u062c\u0633".split(""),"field-month":"\u0627\u0644\u0634\u0647\u0631","days-standAlone-narrow":"\u062d\u0646\u062b\u0631\u062e\u062c\u0633".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u062d\u0627\u0644\u064a","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",
"field-tue-relative+1":"\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 \u0627\u0644\u062a\u0627\u0644\u064a","dayPeriods-format-wide-am":"\u0635","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E\u060c d MMMM","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"\u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062d\u0627\u0644\u064a","field-mon-relative+1":"\u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u062a\u0627\u0644\u064a",
"dateFormat-short":"d/M/y","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"\u0627\u0644\u062b\u0648\u0627\u0646\u064a","field-sat-relative+-1":"\u0627\u0644\u0633\u0628\u062a \u0627\u0644\u0645\u0627\u0636\u064a","dateFormatItem-yMMMEd":"E\u060c d MMM\u060c y","field-sun-relative+-1":"\u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0645\u0627\u0636\u064a","field-month-relative+0":"\u0647\u0630\u0627 \u0627\u0644\u0634\u0647\u0631",
"field-month-relative+1":"\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u062a\u0627\u0644\u064a","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E\u060c d","field-week":"\u0627\u0644\u0623\u0633\u0628\u0648\u0639","dateFormat-medium":"dd/MM/y","field-week-relative+-1":"\u0627\u0644\u0623\u0633\u0628\u0648\u0639 \u0627\u0644\u0645\u0627\u0636\u064a","field-year-relative+0":"\u0647\u0630\u0647 \u0627\u0644\u0633\u0646\u0629","field-year-relative+1":"\u0627\u0644\u0633\u0646\u0629 \u0627\u0644\u062a\u0627\u0644\u064a\u0629",
"dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"\u0627\u0644\u0627\u062b\u0646\u064a\u0646 \u0627\u0644\u0645\u0627\u0636\u064a","field-week-relative+0":"\u0647\u0630\u0627 \u0627\u0644\u0623\u0633\u0628\u0648\u0639","field-week-relative+1":"\u0627\u0644\u0623\u0633\u0628\u0648\u0639 \u0627\u0644\u062a\u0627\u0644\u064a"},"dijit/nls/loading":{_localized:{},
loadingState:"\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0645\u064a\u0644...",errorState:"\u0639\u0641\u0648\u0627\u060c \u062d\u062f\u062b \u062e\u0637\u0623"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0\u062a\u0631\u0644\u064a\u0648","currencySpacing-afterCurrency-insertBetween":"\u00a0",
nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000 \u062a\u0631\u064a\u0644\u064a\u0648\u0646",decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u0627\u0644\u0627\u062e\u062a\u064a\u0627\u0631\u0627\u062a \u0627\u0644\u0633\u0627\u0628\u0642\u0629",
_localized:{},nextMessage:"\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u0627\u062e\u062a\u064a\u0627\u0631\u0627\u062a"},"dijit/nls/common":{buttonOk:"\u062d\u0633\u0646\u0627",buttonCancel:"\u0627\u0644\u063a\u0627\u0621",_localized:{},buttonSave:"\u062d\u0641\u0638",itemClose:"\u0627\u063a\u0644\u0627\u0642"}});
//# sourceMappingURL=dojo_ar.js.map

View File

@ -0,0 +1,16 @@
//>>built
define("dojo/nls/dojo_ca",{"dijit/form/nls/validate":{invalidMessage:"El valor introdu\u00eft no \u00e9s v\u00e0lid",rangeMessage:"Aquest valor \u00e9s fora de l'interval",_localized:{},missingMessage:"Aquest valor \u00e9s necessari"},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"dg. dl. dm. dc. dj. dv. ds.".split(" "),"months-format-narrow":"GN FB M\u00c7 AB MG JN JL AG ST OC NV DS".split(" "),"field-second-relative+0":"ara","quarters-standAlone-narrow":["1",
"2","3","4"],"field-weekday":"dia de la setmana","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E, d/M/y","field-wed-relative+0":"aquest dimecres","field-wed-relative+1":"dimecres que ve","dateFormatItem-GyMMMEd":"E, d MMM, y G","dateFormatItem-MMMEd":"E d MMM",eraNarrow:["aC","dC"],"field-tue-relative+-1":"dimarts passat","days-format-short":"dg. dl. dt. dc. dj. dv. ds.".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM 'de' y","field-fri-relative+-1":"divendres passat",
"field-wed-relative+-1":"dimecres passat","months-format-wide":"gener febrer mar\u00e7 abril maig juny juliol agost setembre octubre novembre desembre".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"p. m.","dateFormat-full":"EEEE, d MMMM 'de' y","field-thu-relative+-1":"dijous passat","dateFormatItem-Md":"d/M","dateFormatItem-GyMMMM":"LLLL 'de' y G",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon",
"dateFormatItem-yMd":"d/M/y","field-era":"era","dateFormatItem-yM":"M/y","months-standAlone-wide":"gener febrer mar\u00e7 abril maig juny juliol agost setembre octubre novembre desembre".split(" "),"timeFormat-short":"H:mm","quarters-format-wide":["1r trimestre","2n trimestre","3r trimestre","4t trimestre"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"H:mm:ss z","field-year":"any","dateFormatItem-yMMM":"LLL y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"hora","months-format-abbr":"gen. feb. mar\u00e7 abr. maig juny jul. ag. set. oct. nov. des.".split(" "),
"field-sat-relative+0":"aquest dissabte","field-sat-relative+1":"dissabte que ve","timeFormat-full":"H:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"avui","field-thu-relative+0":"aquest dijous","field-day-relative+1":"dem\u00e0","field-thu-relative+1":"dijous que ve","dateFormatItem-GyMMMd":"d MMM y G","field-day-relative+2":"dem\u00e0 passat","dateFormatItem-H":"H","months-standAlone-abbr":"gen. feb. mar\u00e7 abr. maig juny jul. ag. set. oct. nov. des.".split(" "),
"quarters-format-abbr":["1T","2T","3T","4T"],"quarters-standAlone-wide":["1r trimestre","2n trimestre","3r trimestre","4t trimestre"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"diumenge dilluns dimarts dimecres dijous divendres dissabte".split(" "),"dateFormatItem-MMMMd":"d MMMM","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H:mm:ss","field-sun-relative+0":"aquest diumenge","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"diumenge que ve","quarters-standAlone-abbr":["1T",
"2T","3T","4T"],eraAbbr:["aC","dC"],"field-minute":"minut","field-dayperiod":"a. m./p. m.","days-standAlone-abbr":"dg. dl. dt. dc. dj. dv. ds.".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"ahir","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a.m.","dateFormatItem-h":"h a","field-day-relative+-2":"abans-d'ahir","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E d/M","dateTimeFormat-full":"{1} {0}",
"field-fri-relative+0":"aquest divendres","field-fri-relative+1":"divendres que ve","dateFormatItem-yMMMM":"LLLL 'de' y","field-day":"dia","days-format-wide":"diumenge dilluns dimarts dimecres dijous divendres dissabte".split(" "),"field-zone":"zona","months-standAlone-narrow":"GN FB M\u00c7 AB MG JN JL AG ST OC NV DS".split(" "),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"l'any passat","field-month-relative+-1":"el mes passat","dateTimeFormats-appendItem-Year":"{1} {0}",
"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"dg. dl. dt. dc. dj. dv. ds.".split(" "),eraNames:["abans de Crist","a. de la n. e.","despr\u00e9s de Crist","de la n. e."],"dateFormatItem-yMMMd":"d MMM y","days-format-narrow":"dg dl dt dc dj dv ds".split(" "),"field-month":"mes","days-standAlone-narrow":"dg dl dt dc dj dv ds".split(" "),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"aquest dimarts","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",
"field-tue-relative+1":"dimarts que ve","dayPeriods-format-wide-am":"a. m.","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-EHm":"E H:mm","field-mon-relative+0":"aquest dilluns","field-mon-relative+1":"dilluns que ve","dateFormat-short":"d/M/yy","dateFormatItem-EHms":"E H:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"segon","field-sat-relative+-1":"dissabte passat",
"dateFormatItem-yMMMEd":"E, d MMM, y","field-sun-relative+-1":"diumenge passat","field-month-relative+0":"aquest mes","field-month-relative+1":"el mes que ve","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"setmana","dateFormat-medium":"dd/MM/y","field-week-relative+-1":"la setmana passada","field-year-relative+0":"enguany","field-year-relative+1":"l'any que ve","dayPeriods-format-narrow-pm":"p.m.","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss",
"dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"LLL y G","field-mon-relative+-1":"dilluns passat","field-week-relative+0":"aquesta setmana","field-week-relative+1":"la setmana que ve"},"dijit/nls/loading":{_localized:{},loadingState:"S'est\u00e0 carregant...",errorState:"Ens sap greu. S'ha produ\u00eft un error."},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",
minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0B","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4;(#,##0.00\u00a0\u00a4)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0%","decimalFormat-long":"000 bilions",decimalFormat:"#,##0.###",decimal:",",
"currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Opcions anteriors",_localized:{},nextMessage:"M\u00e9s opcions"},"dijit/nls/common":{buttonOk:"D'acord",buttonCancel:"Cancel\u00b7la",_localized:{},buttonSave:"Desa",itemClose:"Tanca"}});
//# sourceMappingURL=dojo_ca.js.map

View File

@ -0,0 +1,18 @@
//>>built
define("dojo/nls/dojo_cs",{"dijit/form/nls/validate":{invalidMessage:"Zadan\u00e1 hodnota nen\u00ed platn\u00e1.",rangeMessage:"Tato hodnota je mimo rozsah.",_localized:{},missingMessage:"Tato hodnota je vy\u017eadov\u00e1na."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"ne po \u00fat st \u010dt p\u00e1 so".split(" "),"months-format-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),"field-second-relative+0":"nyn\u00ed","quarters-standAlone-narrow":["1","2","3",
"4"],"field-weekday":"Den v t\u00fddnu","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d. M. y","field-wed-relative+0":"tuto st\u0159edu","field-wed-relative+1":"p\u0159\u00ed\u0161t\u00ed st\u0159edu","dateFormatItem-GyMMMEd":"E d. M. y G","dateFormatItem-MMMEd":"E d. M.",eraNarrow:["p\u0159.n.l.","n.l."],"field-tue-relative+-1":"minul\u00e9 \u00fater\u00fd","days-format-short":"ne po \u00fat st \u010dt p\u00e1 so".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d. MMMM y",
"field-fri-relative+-1":"minul\u00fd p\u00e1tek","field-wed-relative+-1":"minulou st\u0159edu","months-format-wide":"ledna \u00fanora b\u0159ezna dubna kv\u011btna \u010dervna \u010dervence srpna z\u00e1\u0159\u00ed \u0159\u00edjna listopadu prosince".split(" "),"dateTimeFormat-medium":"{1} {0}","dateFormatItem-yMMMMd":"d. MMMM y","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE d. MMMM y","field-thu-relative+-1":"minul\u00fd \u010dtvrtek","dateFormatItem-Md":"d. M.",_localized:{},"dayPeriods-format-abbr-am":"AM",
"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d. M. y","field-era":"Letopo\u010det","dateFormatItem-yM":"M/y","months-standAlone-wide":"leden \u00fanor b\u0159ezen duben kv\u011bten \u010derven \u010dervenec srpen z\u00e1\u0159\u00ed \u0159\u00edjen listopad prosinec".split(" "),"timeFormat-short":"H:mm","quarters-format-wide":["1. \u010dtvrtlet\u00ed","2. \u010dtvrtlet\u00ed","3. \u010dtvrtlet\u00ed","4. \u010dtvrtlet\u00ed"],"dateFormatItem-yQQQQ":"QQQQ y",
"timeFormat-long":"H:mm:ss z","field-year":"Rok","dateFormatItem-yMMM":"LLLL y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"Hodina","months-format-abbr":"led \u00fano b\u0159e dub kv\u011b \u010dvn \u010dvc srp z\u00e1\u0159 \u0159\u00edj lis pro".split(" "),"field-sat-relative+0":"tuto sobotu","field-sat-relative+1":"p\u0159\u00ed\u0161t\u00ed sobotu","timeFormat-full":"H:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"dnes","field-thu-relative+0":"tento \u010dtvrtek",
"field-day-relative+1":"z\u00edtra","field-thu-relative+1":"p\u0159\u00ed\u0161t\u00ed \u010dtvrtek","dateFormatItem-GyMMMd":"d. M. y G","field-day-relative+2":"poz\u00edt\u0159\u00ed","dateFormatItem-H":"H","months-standAlone-abbr":"led \u00fano b\u0159e dub kv\u011b \u010dvn \u010dvc srp z\u00e1\u0159 \u0159\u00edj lis pro".split(" "),"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["1. \u010dtvrtlet\u00ed","2. \u010dtvrtlet\u00ed","3. \u010dtvrtlet\u00ed","4. \u010dtvrtlet\u00ed"],
"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"ned\u011ble pond\u011bl\u00ed \u00fater\u00fd st\u0159eda \u010dtvrtek p\u00e1tek sobota".split(" "),"dateFormatItem-MMMMd":"d. MMMM","dateFormatItem-GyMMMMd":"d. MMMM y G","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H:mm:ss","field-sun-relative+0":"tuto ned\u011bli","dateFormatItem-Hm":"H:mm","field-sun-relative+1":"p\u0159\u00ed\u0161t\u00ed ned\u011bli","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],eraAbbr:["p\u0159. n. l.",
"n. l."],"field-minute":"Minuta","field-dayperiod":"AM/PM","days-standAlone-abbr":"ne po \u00fat st \u010dt p\u00e1 so".split(" "),"dateFormatItem-d":"d.","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"v\u010dera","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-h":"h a","field-day-relative+-2":"p\u0159edev\u010d\u00edrem","dateFormatItem-MMMd":"d. M.","dateFormatItem-MEd":"E d. M.","dateTimeFormat-full":"{1} {0}",
"field-fri-relative+0":"tento p\u00e1tek","field-fri-relative+1":"p\u0159\u00ed\u0161t\u00ed p\u00e1tek","dateFormatItem-yMMMM":"LLLL y","field-day":"Den","days-format-wide":"ned\u011ble pond\u011bl\u00ed \u00fater\u00fd st\u0159eda \u010dtvrtek p\u00e1tek sobota".split(" "),"field-zone":"\u010casov\u00e9 p\u00e1smo","months-standAlone-narrow":"l\u00fabdk\u010d\u010dsz\u0159lp".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"minul\u00fd rok",
"field-month-relative+-1":"minul\u00fd m\u011bs\u00edc","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"ne po \u00fat st \u010dt p\u00e1 so".split(" "),eraNames:["p\u0159. n. l.","n. l."],"dateFormatItem-yMMMd":"d. M. y","days-format-narrow":"NP\u00daS\u010cPS".split(""),"field-month":"M\u011bs\u00edc","days-standAlone-narrow":"NP\u00daS\u010cPS".split(""),"dateFormatItem-MMM":"LLL",
"field-tue-relative+0":"toto \u00fater\u00fd","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"p\u0159\u00ed\u0161t\u00ed \u00fater\u00fd","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E d. MMMM","dateFormatItem-EHm":"E H:mm","field-mon-relative+0":"toto pond\u011bl\u00ed","field-mon-relative+1":"p\u0159\u00ed\u0161t\u00ed pond\u011bl\u00ed","dateFormat-short":"dd.MM.yy",
"dateFormatItem-EHms":"E H:mm:ss","dateFormatItem-yMMMMEd":"E d. MMMM y","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"Sekunda","field-sat-relative+-1":"minulou sobotu","dateFormatItem-yMMMEd":"E d. M. y","field-sun-relative+-1":"minulou ned\u011bli","field-month-relative+0":"tento m\u011bs\u00edc","field-month-relative+1":"p\u0159\u00ed\u0161t\u00ed m\u011bs\u00edc","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d.","field-week":"T\u00fdden",
"dateFormat-medium":"d. M. y","field-week-relative+-1":"minul\u00fd t\u00fdden","field-year-relative+0":"tento rok","field-year-relative+1":"p\u0159\u00ed\u0161t\u00ed rok","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"LLLL y G","field-mon-relative+-1":"minul\u00e9 pond\u011bl\u00ed","dateFormatItem-GyMMMMEd":"E d. MMMM y G","field-week-relative+0":"tento t\u00fdden","field-week-relative+1":"p\u0159\u00ed\u0161t\u00ed t\u00fdden"},
"dijit/nls/loading":{_localized:{},loadingState:"Prob\u00edh\u00e1 na\u010d\u00edt\u00e1n\u00ed...",errorState:"Omlouv\u00e1me se, do\u0161lo k chyb\u011b"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0bil'.'","currencySpacing-afterCurrency-insertBetween":"\u00a0",
nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 bilion\u016f",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"P\u0159edchoz\u00ed volby",_localized:{},nextMessage:"Dal\u0161\u00ed volby"},
"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Storno",_localized:{},buttonSave:"Ulo\u017eit",itemClose:"Zav\u0159\u00edt"}});
//# sourceMappingURL=dojo_cs.js.map

View File

@ -0,0 +1,16 @@
//>>built
define("dojo/nls/dojo_da",{"dijit/form/nls/validate":{invalidMessage:"Den angivne v\u00e6rdi er ugyldig.",rangeMessage:"V\u00e6rdien er uden for intervallet.",_localized:{},missingMessage:"V\u00e6rdien er p\u00e5kr\u00e6vet."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h.mm a","days-standAlone-short":"s\u00f8 ma ti on to fr l\u00f8".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"nu","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Ugedag",
"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d/M/y","field-wed-relative+0":"denne onsdag","field-wed-relative+1":"n\u00e6ste onsdag","dateFormatItem-GyMMMEd":"E d. MMM y G","dateFormatItem-MMMEd":"E d. MMM",eraNarrow:["fKr","fvt","eKr","vt"],"dateFormatItem-yMM":"MM/y","field-tue-relative+-1":"sidste tirsdag","days-format-short":"s\u00f8 ma ti on to fr l\u00f8".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d. MMM y","field-fri-relative+-1":"sidste fredag",
"field-wed-relative+-1":"sidste onsdag","months-format-wide":"januar februar marts april maj juni juli august september oktober november december".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE 'den' d. MMMM y","field-thu-relative+-1":"sidste torsdag","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"middag","dateFormatItem-yMd":"d/M/y",
"field-era":"\u00c6ra","dateFormatItem-yM":"M/y","months-standAlone-wide":"januar februar marts april maj juni juli august september oktober november december".split(" "),"timeFormat-short":"HH.mm","quarters-format-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"HH.mm.ss z","field-year":"\u00c5r","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"Time","dateFormatItem-MMdd":"dd/MM","months-format-abbr":"jan. feb. mar. apr. maj jun. jul. aug. sep. okt. nov. dec.".split(" "),
"field-sat-relative+0":"denne l\u00f8rdag","field-sat-relative+1":"n\u00e6ste l\u00f8rdag","timeFormat-full":"HH.mm.ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"i dag","field-thu-relative+0":"denne torsdag","field-day-relative+1":"i morgen","field-thu-relative+1":"n\u00e6ste torsdag","dateFormatItem-GyMMMd":"d. MMM y G","field-day-relative+2":"i overmorgen","dateFormatItem-H":"HH","months-standAlone-abbr":"jan feb mar apr maj jun jul aug sep okt nov dec".split(" "),
"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"M","days-standAlone-wide":"s\u00f8ndag mandag tirsdag onsdag torsdag fredag l\u00f8rdag".split(" "),"dayPeriods-format-abbr-noon":"middag","timeFormat-medium":"HH.mm.ss","field-sun-relative+0":"denne s\u00f8ndag","dateFormatItem-Hm":"HH.mm","field-sun-relative+1":"n\u00e6ste s\u00f8ndag","quarters-standAlone-abbr":["K1","K2","K3",
"K4"],eraAbbr:["f.Kr.","e.Kr."],"field-minute":"Minut","field-dayperiod":"AM/PM","days-standAlone-abbr":"s\u00f8n man tir ons tor fre l\u00f8r".split(" "),"dateFormatItem-d":"d.","dateFormatItem-ms":"mm.ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"i g\u00e5r","dateTimeFormat-long":"{1} 'kl.' {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"i forg\u00e5rs","dateFormatItem-MMMd":"d. MMM","dateFormatItem-MEd":"E d/M","dateTimeFormat-full":"{1} 'kl.' {0}",
"field-fri-relative+0":"denne fredag","field-fri-relative+1":"n\u00e6ste fredag","field-day":"Dag","days-format-wide":"s\u00f8ndag mandag tirsdag onsdag torsdag fredag l\u00f8rdag".split(" "),"field-zone":"Tidszone","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"sidste \u00e5r","field-month-relative+-1":"sidste m\u00e5ned","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h.mm a",
"dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"s\u00f8n. man. tir. ons. tor. fre. l\u00f8r.".split(" "),eraNames:["f.Kr.","f\u00f8r vesterlandsk tidsregning","e.Kr.","vesterlandsk tidsregning"],"dateFormatItem-yMMMd":"d. MMM y","days-format-narrow":"SMTOTFL".split(""),"field-month":"M\u00e5ned","days-standAlone-narrow":"SMTOTFL".split(""),"dateFormatItem-MMM":"MMM","field-tue-relative+0":"denne tirsdag","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",
"field-tue-relative+1":"n\u00e6ste tirsdag","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E d. MMMM","dateFormatItem-EHm":"E HH.mm","field-mon-relative+0":"denne mandag","field-mon-relative+1":"n\u00e6ste mandag","dateFormat-short":"dd/MM/yy","dateFormatItem-EHms":"E HH.mm.ss","dateFormatItem-Ehms":"E h.mm.ss a","dayPeriods-format-narrow-noon":"middag","field-second":"Sekund","field-sat-relative+-1":"sidste l\u00f8rdag",
"dateFormatItem-yMMMEd":"E d. MMM y","field-sun-relative+-1":"sidste s\u00f8ndag","field-month-relative+0":"denne m\u00e5ned","field-month-relative+1":"n\u00e6ste m\u00e5ned","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E 'd'. d.","field-week":"Uge","dateFormat-medium":"dd/MM/y","field-week-relative+-1":"sidste uge","field-year-relative+0":"i \u00e5r","field-year-relative+1":"n\u00e6ste \u00e5r","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH.mm.ss",
"dateFormatItem-hms":"h.mm.ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"sidste mandag","field-week-relative+0":"denne uge","field-week-relative+1":"n\u00e6ste uge"},"dijit/nls/loading":{_localized:{},loadingState:"Indl\u00e6ser...",errorState:"Der er opst\u00e5et en fejl"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",
_localized:{},"decimalFormat-short":"000\u00a0bill","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 billioner",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Forrige valg",
_localized:{},nextMessage:"Flere valg"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Annull\u00e9r",_localized:{},buttonSave:"Gem",itemClose:"Luk"}});
//# sourceMappingURL=dojo_da.js.map

View File

@ -0,0 +1,16 @@
//>>built
define("dojo/nls/dojo_de",{"dijit/form/nls/validate":{invalidMessage:"Der eingegebene Wert ist ung\u00fcltig. ",rangeMessage:"Dieser Wert liegt au\u00dferhalb des g\u00fcltigen Bereichs. ",_localized:{},missingMessage:"Dieser Wert ist erforderlich."},"dojo/cldr/nls/gregorian":{"dateTimeFormats-appendItem-Year":"{1} {0}","field-tue-relative+-1":"Letzten Dienstag","field-year":"Jahr","dateFormatItem-Hm":"HH:mm","field-wed-relative+0":"Diesen Mittwoch","field-wed-relative+1":"N\u00e4chsten Mittwoch",
"dayPeriods-format-wide-night":"nachts","dateFormatItem-ms":"mm:ss","timeFormat-short":"HH:mm","field-minute":"Minute","dateTimeFormat-short":"{1} {0}","field-day-relative+0":"Heute","field-day-relative+1":"Morgen","field-day-relative+2":"\u00dcbermorgen","field-tue-relative+0":"Diesen Dienstag","field-tue-relative+1":"N\u00e4chsten Dienstag","dayPeriods-format-narrow-am":"a","dateFormatItem-MMMd":"d. MMM","dayPeriods-format-abbr-am":"AM","field-week-relative+0":"Diese Woche","field-month-relative+0":"Dieser Monat",
"field-week-relative+1":"N\u00e4chste Woche","field-month-relative+1":"N\u00e4chster Monat","timeFormat-medium":"HH:mm:ss","field-second-relative+0":"jetzt","dayPeriods-format-wide-afternoon":"nachmittags","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-narrow":"JFMAMJJASOND".split(""),eraNames:["v. Chr.","n. Chr."],"dateFormatItem-GyMMMEd":"E, d. MMM y G","field-day":"Tag","field-year-relative+-1":"Letztes Jahr","dayPeriods-format-wide-am":"vorm.","field-wed-relative+-1":"Letzten Mittwoch",
"dateTimeFormat-medium":"{1} {0}","field-second":"Sekunde","days-standAlone-narrow":"SMDMDFS".split(""),"dateFormatItem-Ehms":"E, h:mm:ss a","dateFormat-long":"d. MMMM y","dateFormatItem-GyMMMd":"d. MMM y G","dateFormatItem-yMMMEd":"E, d. MMM y","quarters-standAlone-wide":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"days-format-narrow":"SMDMDFS".split(""),"dateTimeFormats-appendItem-Timezone":"{0} {1}","field-mon-relative+-1":"Letzten Montag","dateFormatItem-GyMMM":"MMM y G","field-month":"Monat",
"dateFormatItem-MMM":"LLL","field-dayperiod":"Tagesh\u00e4lfte","dayPeriods-format-narrow-pm":"p","dateFormat-medium":"dd.MM.y",eraAbbr:["v. Chr.","n. Chr."],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"dayPeriods-format-abbr-pm":"PM","dateFormatItem-MMd":"d.MM.","field-mon-relative+0":"Diesen Montag","field-mon-relative+1":"N\u00e4chsten Montag","months-format-narrow":"JFMAMJJASOND".split(""),"days-format-short":"So. Mo. Di. Mi. Do. Fr. Sa.".split(" "),"quarters-format-narrow":["1","2","3",
"4"],"dayPeriods-format-wide-pm":"nachm.","field-sat-relative+-1":"Letzten Samstag","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormat-long":"{1} {0}","dateFormatItem-Md":"d.M.","field-hour":"Stunde","dateFormatItem-yQQQQ":"QQQQ y","months-format-wide":"Januar Februar M\u00e4rz April Mai Juni Juli August September Oktober November Dezember".split(" "),"dateFormat-full":"EEEE, d. MMMM y","field-month-relative+-1":"Letzter Monat","dayPeriods-format-wide-earlyMorning":"morgens","dateFormatItem-Hms":"HH:mm:ss",
"field-fri-relative+0":"Diesen Freitag","field-fri-relative+1":"N\u00e4chsten Freitag","dayPeriods-format-narrow-noon":"n","dayPeriods-format-wide-morning":"vormittags","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",_localized:{},"field-week-relative+-1":"Letzte Woche","dateFormatItem-Ehm":"E h:mm a","months-format-abbr":"Jan. Feb. M\u00e4rz Apr. Mai Juni Juli Aug. Sep. Okt. Nov. Dez.".split(" "),"timeFormat-long":"HH:mm:ss z","dateFormatItem-yMMM":"MMM y","dateFormat-short":"dd.MM.yy","days-standAlone-wide":"Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag".split(" "),
"dateTimeFormats-appendItem-Era":"{1} {0}","dateFormatItem-H":"HH 'Uhr'","dateFormatItem-M":"L","months-standAlone-wide":"Januar Februar M\u00e4rz April Mai Juni Juli August September Oktober November Dezember".split(" "),"field-sun-relative+-1":"Letzten Sonntag","dateFormatItem-MMMMEd":"E, d. MMMM","days-standAlone-abbr":"So Mo Di Mi Do Fr Sa".split(" "),"dateTimeFormat-full":"{1} {0}","dateFormatItem-hm":"h:mm a","dateFormatItem-d":"d","field-weekday":"Wochentag","field-sat-relative+0":"Diesen Samstag",
"dateFormatItem-h":"h a","field-sat-relative+1":"N\u00e4chsten Samstag","months-standAlone-abbr":"Jan Feb M\u00e4r Apr Mai Jun Jul Aug Sep Okt Nov Dez".split(" "),"dateFormatItem-yMM":"MM.y","timeFormat-full":"HH:mm:ss zzzz","dateFormatItem-MEd":"E, d.M.","dateFormatItem-y":"y","field-thu-relative+0":"Diesen Donnerstag","field-thu-relative+1":"N\u00e4chsten Donnerstag","dateFormatItem-hms":"h:mm:ss a","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dayPeriods-format-abbr-noon":"noon","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})",
"field-thu-relative+-1":"Letzten Donnerstag","dateFormatItem-yMd":"d.M.y","field-week":"Woche","quarters-standAlone-narrow":["1","2","3","4"],"quarters-format-wide":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"dateFormatItem-Ed":"E, d.","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","days-standAlone-short":"So. Mo. Di. Mi. Do. Fr. Sa.".split(" "),"dayPeriods-format-wide-evening":"abends","dateFormatItem-yMMdd":"dd.MM.y","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"field-year-relative+0":"Dieses Jahr",
"field-year-relative+1":"N\u00e4chstes Jahr","field-fri-relative+-1":"Letzten Freitag",eraNarrow:["v. Chr.","n. Chr."],"dayPeriods-format-wide-noon":"Mittag","dateFormatItem-yQQQ":"QQQ y","days-format-wide":"Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag".split(" "),"dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateFormatItem-EHm":"E, HH:mm","field-zone":"Zeitzone","dateFormatItem-yM":"M.y","dateFormatItem-yMMMM":"MMMM y","dateFormatItem-MMMEd":"E, d. MMM","dateFormatItem-EHms":"E, HH:mm:ss",
"dateFormatItem-yMEd":"E, d.M.y","field-day-relative+-1":"Gestern","field-day-relative+-2":"Vorgestern","days-format-abbr":"So. Mo. Di. Mi. Do. Fr. Sa.".split(" "),"field-sun-relative+0":"Diesen Sonntag","dateFormatItem-MMdd":"dd.MM.","field-sun-relative+1":"N\u00e4chsten Sonntag","dateFormatItem-yMMMd":"d. MMM y","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-Gy":"y G","field-era":"Epoche"},"dijit/nls/loading":{_localized:{},loadingState:"Wird geladen...",errorState:"Es ist ein Fehler aufgetreten."},
"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00b7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0Bio","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",
perMille:"\u2030",group:".",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 Billionen",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Vorherige Auswahl",_localized:{},nextMessage:"Weitere Auswahlm\u00f6glichkeiten"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Abbrechen",_localized:{},buttonSave:"Speichern",itemClose:"Schlie\u00dfen"}});
//# sourceMappingURL=dojo_de.js.map

View File

@ -0,0 +1,26 @@
//>>built
define("dojo/nls/dojo_el",{"dijit/form/nls/validate":{invalidMessage:"\u0397 \u03c4\u03b9\u03bc\u03ae \u03c0\u03bf\u03c5 \u03ba\u03b1\u03c4\u03b1\u03c7\u03c9\u03c1\u03ae\u03c3\u03b1\u03c4\u03b5 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b7.",rangeMessage:"\u0397 \u03c4\u03b9\u03bc\u03ae \u03b1\u03c5\u03c4\u03ae \u03b4\u03b5\u03bd \u03b1\u03bd\u03ae\u03ba\u03b5\u03b9 \u03c3\u03c4\u03bf \u03b5\u03cd\u03c1\u03bf\u03c2 \u03ad\u03b3\u03ba\u03c5\u03c1\u03c9\u03bd \u03c4\u03b9\u03bc\u03ce\u03bd.",
_localized:{},missingMessage:"\u0397 \u03c4\u03b9\u03bc\u03ae \u03b1\u03c5\u03c4\u03ae \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03b1\u03c0\u03b1\u03c1\u03b1\u03af\u03c4\u03b7\u03c4\u03b1 \u03bd\u03b1 \u03ba\u03b1\u03b8\u03bf\u03c1\u03b9\u03c3\u03c4\u03b5\u03af."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"\u039a\u03c5 \u0394\u03b5 \u03a4\u03c1 \u03a4\u03b5 \u03a0\u03ad \u03a0\u03b1 \u03a3\u03ac".split(" "),"months-format-narrow":"\u0399\u03a6\u039c\u0391\u039c\u0399\u0399\u0391\u03a3\u039f\u039d\u0394".split(""),
"field-second-relative+0":"\u03c4\u03ce\u03c1\u03b1","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"\u0397\u03bc\u03ad\u03c1\u03b1 \u03b5\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1\u03c2","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"E, d/M/y","field-wed-relative+0":"\u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7","field-wed-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7","dateFormatItem-GyMMMEd":"E, d MMM y G",
"dateFormatItem-MMMEd":"E, d MMM",eraNarrow:["\u03c0.\u03a7.","\u03bc.\u03a7."],"field-tue-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u03a4\u03c1\u03af\u03c4\u03b7","days-format-short":"\u039a\u03c5 \u0394\u03b5 \u03a4\u03c1 \u03a4\u03b5 \u03a0\u03ad \u03a0\u03b1 \u03a3\u03ac".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM y","field-fri-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae",
"field-wed-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7","months-format-wide":"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5 \u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5 \u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5 \u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5 \u039c\u03b1\u0390\u03bf\u03c5 \u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5 \u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5 \u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5 \u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5 \u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5 \u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5 \u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split(" "),
"dateTimeFormat-medium":"{1} - {0}","dayPeriods-format-wide-pm":"\u03bc.\u03bc.","dateFormat-full":"EEEE, d MMMM y","field-thu-relative+-1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u03a0\u03ad\u03bc\u03c0\u03c4\u03b7","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d/M/y","field-era":"\u03a0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2","dateFormatItem-yM":"M/y",
"months-standAlone-wide":"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2 \u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2 \u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2 \u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2 \u039c\u03ac\u03b9\u03bf\u03c2 \u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2 \u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2 \u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2 \u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2 \u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2 \u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2 \u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split(" "),
"timeFormat-short":"h:mm a","quarters-format-wide":["1\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf","2\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf","3\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf","4\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf"],"dateFormatItem-yQQQQ":"y QQQQ","timeFormat-long":"h:mm:ss a z","field-year":"\u0388\u03c4\u03bf\u03c2","dateFormatItem-yMMM":"LLL y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"\u038f\u03c1\u03b1","months-format-abbr":"\u0399\u03b1\u03bd \u03a6\u03b5\u03b2 \u039c\u03b1\u03c1 \u0391\u03c0\u03c1 \u039c\u03b1\u0390 \u0399\u03bf\u03c5\u03bd \u0399\u03bf\u03c5\u03bb \u0391\u03c5\u03b3 \u03a3\u03b5\u03c0 \u039f\u03ba\u03c4 \u039d\u03bf\u03b5 \u0394\u03b5\u03ba".split(" "),
"field-sat-relative+0":"\u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf","field-sat-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf \u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf","timeFormat-full":"h:mm:ss a zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"\u03c3\u03ae\u03bc\u03b5\u03c1\u03b1","field-thu-relative+0":"\u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03a0\u03ad\u03bc\u03c0\u03c4\u03b7","field-day-relative+1":"\u03b1\u03cd\u03c1\u03b9\u03bf",
"field-thu-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u03a0\u03ad\u03bc\u03c0\u03c4\u03b7","dateFormatItem-GyMMMd":"d MMM y G","field-day-relative+2":"\u03bc\u03b5\u03b8\u03b1\u03cd\u03c1\u03b9\u03bf","dateFormatItem-H":"HH","months-standAlone-abbr":"\u0399\u03b1\u03bd \u03a6\u03b5\u03b2 \u039c\u03ac\u03c1 \u0391\u03c0\u03c1 \u039c\u03ac\u03b9 \u0399\u03bf\u03cd\u03bd \u0399\u03bf\u03cd\u03bb \u0391\u03cd\u03b3 \u03a3\u03b5\u03c0 \u039f\u03ba\u03c4 \u039d\u03bf\u03ad \u0394\u03b5\u03ba".split(" "),
"quarters-format-abbr":["\u03a41","\u03a42","\u03a43","\u03a44"],"quarters-standAlone-wide":["1\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf","2\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf","3\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf","4\u03bf \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf"],"dateFormatItem-Gy":"y G","dateFormatItem-HHmmss":"HH:mm:ss","dateFormatItem-M":"L","days-standAlone-wide":"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae \u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1 \u03a4\u03c1\u03af\u03c4\u03b7 \u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7 \u03a0\u03ad\u03bc\u03c0\u03c4\u03b7 \u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae \u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split(" "),
"dateFormatItem-MMMMd":"d MMMM","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"h:mm:ss a","field-sun-relative+0":"\u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae","quarters-standAlone-abbr":["\u03a41","\u03a42","\u03a43","\u03a44"],eraAbbr:["\u03c0.\u03a7.","\u03bc.\u03a7."],"field-minute":"\u039b\u03b5\u03c0\u03c4\u03cc",
"field-dayperiod":"\u03c0.\u03bc./\u03bc.\u03bc.","days-standAlone-abbr":"\u039a\u03c5\u03c1 \u0394\u03b5\u03c5 \u03a4\u03c1\u03af \u03a4\u03b5\u03c4 \u03a0\u03ad\u03bc \u03a0\u03b1\u03c1 \u03a3\u03ac\u03b2".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"\u03c7\u03b8\u03b5\u03c2","dateTimeFormat-long":"{1} - {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"\u03c0\u03c1\u03bf\u03c7\u03b8\u03ad\u03c2",
"dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E, d/M","dateTimeFormat-full":"{1} - {0}","field-fri-relative+0":"\u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae","field-fri-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae","dateFormatItem-yMMMM":"LLLL y","field-day":"\u0397\u03bc\u03ad\u03c1\u03b1","days-format-wide":"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae \u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1 \u03a4\u03c1\u03af\u03c4\u03b7 \u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7 \u03a0\u03ad\u03bc\u03c0\u03c4\u03b7 \u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae \u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split(" "),
"field-zone":"\u0396\u03ce\u03bd\u03b7","months-standAlone-narrow":"\u0399\u03a6\u039c\u0391\u039c\u0399\u0399\u0391\u03a3\u039f\u039d\u0394".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf \u03ad\u03c4\u03bf\u03c2","field-month-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2","dateTimeFormats-appendItem-Year":"{1} {0}",
"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"\u039a\u03c5\u03c1 \u0394\u03b5\u03c5 \u03a4\u03c1\u03af \u03a4\u03b5\u03c4 \u03a0\u03ad\u03bc \u03a0\u03b1\u03c1 \u03a3\u03ac\u03b2".split(" "),eraNames:["\u03c0.\u03a7.","\u03bc.\u03a7."],"dateFormatItem-yMMMd":"d MMM y","days-format-narrow":"\u039a\u0394\u03a4\u03a4\u03a0\u03a0\u03a3".split(""),"field-month":"\u039c\u03ae\u03bd\u03b1\u03c2","days-standAlone-narrow":"\u039a\u0394\u03a4\u03a4\u03a0\u03a0\u03a3".split(""),
"dateFormatItem-MMM":"LLL","dateFormatItem-HHmm":"HH:mm","field-tue-relative+0":"\u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03a4\u03c1\u03af\u03c4\u03b7","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u03a4\u03c1\u03af\u03c4\u03b7","dayPeriods-format-wide-am":"\u03c0.\u03bc.","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E, d MMMM",
"dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"\u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7 \u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1","field-mon-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1","dateFormat-short":"d/M/yy","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"\u0394\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03bf","field-sat-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf \u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf",
"dateFormatItem-yMMMEd":"E, d MMM y","field-sun-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae","field-month-relative+0":"\u03c4\u03c1\u03ad\u03c7\u03c9\u03bd \u03bc\u03ae\u03bd\u03b1\u03c2","field-month-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"\u0395\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1",
"dateFormat-medium":"d MMM y","field-week-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u03b5\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1","field-year-relative+0":"\u03c6\u03ad\u03c4\u03bf\u03c2","field-year-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf \u03ad\u03c4\u03bf\u03c2","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1} - {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"LLL y G","field-mon-relative+-1":"\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1",
"field-week-relative+0":"\u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03b5\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1","field-week-relative+1":"\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u03b5\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1"},"dijit/nls/loading":{_localized:{},loadingState:"\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7...",errorState:"\u03a3\u03b1\u03c2 \u03b6\u03b7\u03c4\u03bf\u03cd\u03bc\u03b5 \u03c3\u03c5\u03b3\u03bd\u03ce\u03bc\u03b7, \u03c0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1"},
"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0\u03c4\u03c1\u03b9\u03c3'.'","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4",
"currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0%","decimalFormat-long":"000 \u03c4\u03c1\u03b9\u03c3\u03b5\u03ba\u03b1\u03c4\u03bf\u03bc\u03bc\u03cd\u03c1\u03b9\u03b1",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"e"},"dijit/form/nls/ComboBox":{previousMessage:"\u03a0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b5\u03c2 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2",
_localized:{},nextMessage:"\u03a0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2"},"dijit/nls/common":{buttonOk:"\u039f\u039a",buttonCancel:"\u0391\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7",_localized:{},buttonSave:"\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7",itemClose:"\u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf"}});
//# sourceMappingURL=dojo_el.js.map

View File

@ -0,0 +1,15 @@
//>>built
define("dojo/nls/dojo_en-gb",{"dijit/form/nls/validate":{invalidMessage:"The value entered is not valid.",rangeMessage:"This value is out of range.",_localized:{},missingMessage:"This value is required."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"Su Mo Tu We Th Fr Sa".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"now","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Day of the Week","dateFormatItem-yQQQ":"QQQ y",
"dateFormatItem-yMEd":"E, dd/MM/y","field-wed-relative+0":"this Wednesday","field-wed-relative+1":"next Wednesday","dateFormatItem-GyMMMEd":"E, d MMM y G","dateFormatItem-MMMEd":"E d MMM",eraNarrow:["B","A"],"field-tue-relative+-1":"last Tuesday","days-format-short":"Su Mo Tu We Th Fr Sa".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM y","field-fri-relative+-1":"last Friday","field-wed-relative+-1":"last Wednesday","months-format-wide":"January February March April May June July August September October November December".split(" "),
"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"pm","dateFormat-full":"EEEE, d MMMM y","field-thu-relative+-1":"last Thursday","dateFormatItem-Md":"dd/MM",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"dd/MM/y","field-era":"Era","dateFormatItem-yM":"MM/y","months-standAlone-wide":"January February March April May June July August September October November December".split(" "),
"timeFormat-short":"HH:mm","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"HH:mm:ss z","field-year":"Year","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{0} {1}","field-hour":"Hour","dateFormatItem-MMdd":"dd/MM","months-format-abbr":"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),"field-sat-relative+0":"this Saturday","field-sat-relative+1":"next Saturday","timeFormat-full":"HH:mm:ss zzzz",
"dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"today","field-thu-relative+0":"this Thursday","field-day-relative+1":"tomorrow","field-thu-relative+1":"next Thursday","dateFormatItem-GyMMMd":"d MMM y G","dateFormatItem-H":"HH","months-standAlone-abbr":"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"LL",
"days-standAlone-wide":"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),"dateFormatItem-MMMMd":"d MMMM","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"this Sunday","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"next Sunday","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],eraAbbr:["BC","AD"],"field-minute":"Minute","field-dayperiod":"am/pm","days-standAlone-abbr":"Sun Mon Tue Wed Thu Fri Sat".split(" "),"dateFormatItem-d":"d",
"dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"yesterday","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E dd/MM","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"this Friday","field-fri-relative+1":"next Friday","dateFormatItem-yMMMM":"MMMM y","field-day":"Day","days-format-wide":"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),
"field-zone":"Time Zone","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"last year","field-month-relative+-1":"last month","dateTimeFormats-appendItem-Year":"{0} {1}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"Sun Mon Tue Wed Thu Fri Sat".split(" "),eraNames:["Before Christ","Anno Domini"],"dateFormatItem-yMMMd":"d MMM y",
"days-format-narrow":"SMTWTFS".split(""),"field-month":"Month","days-standAlone-narrow":"SMTWTFS".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"this Tuesday","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"next Tuesday","dayPeriods-format-wide-am":"am","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"this Monday","field-mon-relative+1":"next Monday",
"dateFormat-short":"dd/MM/y","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"Second","field-sat-relative+-1":"last Saturday","dateFormatItem-yMMMEd":"E, d MMM y","field-sun-relative+-1":"last Sunday","field-month-relative+0":"this month","field-month-relative+1":"next month","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"Week","dateFormat-medium":"d MMM y","field-week-relative+-1":"last week",
"field-year-relative+0":"this year","field-year-relative+1":"next year","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"last Monday","field-week-relative+0":"this week","field-week-relative+1":"next week"},"dijit/nls/loading":{_localized:{},loadingState:"Loading...",errorState:"Sorry, an error occurred"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",
infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000 trillion",
decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Previous choices",_localized:{},nextMessage:"More choices"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Cancel",_localized:{},buttonSave:"Save",itemClose:"Close"}});
//# sourceMappingURL=dojo_en-gb.js.map

View File

@ -0,0 +1,15 @@
//>>built
define("dojo/nls/dojo_en-us",{"dijit/form/nls/validate":{invalidMessage:"The value entered is not valid.",rangeMessage:"This value is out of range.",_localized:{},missingMessage:"This value is required."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"Su Mo Tu We Th Fr Sa".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"now","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Day of the Week","dateFormatItem-yQQQ":"QQQ y",
"dateFormatItem-yMEd":"E, M/d/y","field-wed-relative+0":"this Wednesday","field-wed-relative+1":"next Wednesday","dateFormatItem-GyMMMEd":"E, MMM d, y G","dateFormatItem-MMMEd":"E, MMM d",eraNarrow:["B","A"],"field-tue-relative+-1":"last Tuesday","days-format-short":"Su Mo Tu We Th Fr Sa".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"MMMM d, y","field-fri-relative+-1":"last Friday","field-wed-relative+-1":"last Wednesday","months-format-wide":"January February March April May June July August September October November December".split(" "),
"dateTimeFormat-medium":"{1}, {0}","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, MMMM d, y","field-thu-relative+-1":"last Thursday","dateFormatItem-Md":"M/d",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"M/d/y","field-era":"Era","dateFormatItem-yM":"M/y","months-standAlone-wide":"January February March April May June July August September October November December".split(" "),
"timeFormat-short":"h:mm a","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"h:mm:ss a z","field-year":"Year","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{0} {1}","field-hour":"Hour","months-format-abbr":"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),"field-sat-relative+0":"this Saturday","field-sat-relative+1":"next Saturday","timeFormat-full":"h:mm:ss a zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})",
"field-day-relative+0":"today","field-thu-relative+0":"this Thursday","field-day-relative+1":"tomorrow","field-thu-relative+1":"next Thursday","dateFormatItem-GyMMMd":"MMM d, y G","dateFormatItem-H":"HH","months-standAlone-abbr":"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),
"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"h:mm:ss a","field-sun-relative+0":"this Sunday","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"next Sunday","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],eraAbbr:["BC","AD"],"field-minute":"Minute","field-dayperiod":"AM/PM","days-standAlone-abbr":"Sun Mon Tue Wed Thu Fri Sat".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"yesterday","dateTimeFormat-long":"{1} 'at' {0}",
"dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","dateFormatItem-MMMd":"MMM d","dateFormatItem-MEd":"E, M/d","dateTimeFormat-full":"{1} 'at' {0}","field-fri-relative+0":"this Friday","field-fri-relative+1":"next Friday","field-day":"Day","days-format-wide":"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),"field-zone":"Time Zone","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"last year",
"field-month-relative+-1":"last month","dateTimeFormats-appendItem-Year":"{0} {1}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"Sun Mon Tue Wed Thu Fri Sat".split(" "),eraNames:["Before Christ","Anno Domini"],"dateFormatItem-yMMMd":"MMM d, y","days-format-narrow":"SMTWTFS".split(""),"field-month":"Month","days-standAlone-narrow":"SMTWTFS".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"this Tuesday",
"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"next Tuesday","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"this Monday","field-mon-relative+1":"next Monday","dateFormat-short":"M/d/yy","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"Second","field-sat-relative+-1":"last Saturday",
"dateFormatItem-yMMMEd":"E, MMM d, y","field-sun-relative+-1":"last Sunday","field-month-relative+0":"this month","field-month-relative+1":"next month","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"d E","field-week":"Week","dateFormat-medium":"MMM d, y","field-week-relative+-1":"last week","field-year-relative+0":"this year","field-year-relative+1":"next year","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1}, {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a",
"dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"last Monday","field-week-relative+0":"this week","field-week-relative+1":"next week"},"dijit/nls/loading":{_localized:{},loadingState:"Loading...",errorState:"Sorry, an error occurred"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},
"decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000 trillion",decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Previous choices",
_localized:{},nextMessage:"More choices"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Cancel",_localized:{},buttonSave:"Save",itemClose:"Close"}});
//# sourceMappingURL=dojo_en-us.js.map

View File

@ -0,0 +1,16 @@
//>>built
define("dojo/nls/dojo_es-es",{"dijit/form/nls/validate":{invalidMessage:"El valor especificado no es v\u00e1lido.",rangeMessage:"Este valor est\u00e1 fuera del intervalo.",_localized:{},missingMessage:"Este valor es necesario."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E, h:mm a","days-standAlone-short":"DO LU MA MI JU VI SA".split(" "),"months-format-narrow":"EFMAMJJASOND".split(""),"field-second-relative+0":"ahora","quarters-standAlone-narrow":["1T","2T","3T","4T"],"field-weekday":"d\u00eda de la semana",
"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE, d/M/y","field-wed-relative+0":"este mi\u00e9rcoles","field-wed-relative+1":"el pr\u00f3ximo mi\u00e9rcoles","dateFormatItem-GyMMMEd":"E, d 'de' MMMM 'de' y G","dateFormatItem-MMMEd":"E d 'de' MMM",eraNarrow:["a. C.","d. C."],"dateFormatItem-yMM":"M/y","field-tue-relative+-1":"el martes pasado","dateFormatItem-MMMdd":"dd-MMM","days-format-short":"DO LU MA MI JU VI SA".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d 'de' MMMM 'de' y",
"field-fri-relative+-1":"el viernes pasado","field-wed-relative+-1":"el mi\u00e9rcoles pasado","months-format-wide":"enero febrero marzo abril mayo junio julio agosto septiembre octubre noviembre diciembre".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"p. m.","dateFormat-full":"EEEE, d 'de' MMMM 'de' y","field-thu-relative+-1":"el jueves pasado","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})",
"dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d/M/y","field-era":"era","dateFormatItem-yM":"M/y","months-standAlone-wide":"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre Noviembre Diciembre".split(" "),"timeFormat-short":"H:mm","quarters-format-wide":["1.er trimestre","2.\u00ba trimestre","3.er trimestre","4.\u00ba trimestre"],"dateFormatItem-yQQQQ":"QQQQ 'de' y","timeFormat-long":"H:mm:ss z","field-year":"a\u00f1o","dateFormatItem-yMMM":"MMM 'de' y","dateTimeFormats-appendItem-Era":"{1} {0}",
"field-hour":"hora","dateFormatItem-MMdd":"d/M","months-format-abbr":"ene. feb. mar. abr. may. jun. jul. ago. sept. oct. nov. dic.".split(" "),"field-sat-relative+0":"este s\u00e1bado","field-sat-relative+1":"el pr\u00f3ximo s\u00e1bado","timeFormat-full":"H:mm:ss (zzzz)","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"hoy","field-thu-relative+0":"este jueves","field-day-relative+1":"ma\u00f1ana","field-thu-relative+1":"el pr\u00f3ximo jueves","dateFormatItem-GyMMMd":"d MMM 'de' y G",
"field-day-relative+2":"pasado ma\u00f1ana","dateFormatItem-H":"H","months-standAlone-abbr":"Ene. Feb. Mar. Abr. May. Jun. Jul. Ago. Sept. Oct. Nov. Dic.".split(" "),"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1.er trimestre","2.\u00ba trimestre","3.er trimestre","4.\u00ba trimestre"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"Domingo Lunes Martes Mi\u00e9rcoles Jueves Viernes S\u00e1bado".split(" "),"dateFormatItem-MMMMd":"d 'de' MMMM",
"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H:mm:ss","field-sun-relative+0":"este domingo","dateFormatItem-Hm":"H:mm","field-sun-relative+1":"el pr\u00f3ximo domingo","quarters-standAlone-abbr":["T1","T2","T3","T4"],eraAbbr:["a. C.","d. C."],"field-minute":"minuto","field-dayperiod":"periodo del d\u00eda","days-standAlone-abbr":"Dom. Lun. Mar. Mi\u00e9. Jue. Vie. S\u00e1b.".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1T","2T","3T","4T"],"field-day-relative+-1":"ayer",
"dateTimeFormat-long":"{1}, {0}","dayPeriods-format-narrow-am":"a.m.","dateFormatItem-h":"h a","field-day-relative+-2":"antes de ayer","dateFormatItem-MMMd":"d 'de' MMM","dateFormatItem-MEd":"E, d/M","dateTimeFormat-full":"{1}, {0}","field-fri-relative+0":"este viernes","field-fri-relative+1":"el pr\u00f3ximo viernes","dateFormatItem-yMMMM":"MMMM 'de' y","field-day":"d\u00eda","days-format-wide":"domingo lunes martes mi\u00e9rcoles jueves viernes s\u00e1bado".split(" "),"field-zone":"zona horaria",
"months-standAlone-narrow":"EFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"el a\u00f1o pasado","field-month-relative+-1":"el mes pasado","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"dom. lun. mar. mi\u00e9. jue. vie. s\u00e1b.".split(" "),eraNames:["antes de Cristo","anno D\u00f3mini"],"dateFormatItem-yMMMd":"d 'de' MMM 'de' y",
"days-format-narrow":"DLMXJVS".split(""),"field-month":"mes","days-standAlone-narrow":"DLMXJVS".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"este martes","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"el pr\u00f3ximo martes","dayPeriods-format-wide-am":"a. m.","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E, H:mm","field-mon-relative+0":"este lunes","field-mon-relative+1":"el pr\u00f3ximo lunes",
"dateFormat-short":"d/M/yy","dateFormatItem-MMd":"d/M","dateFormatItem-EHms":"E, H:mm:ss","dateFormatItem-Ehms":"E, h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"segundo","field-sat-relative+-1":"el s\u00e1bado pasado","dateFormatItem-yMMMEd":"EEE, d 'de' MMMM 'de' y","field-sun-relative+-1":"el domingo pasado","field-month-relative+0":"este mes","field-month-relative+1":"el pr\u00f3ximo mes","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"semana",
"dateFormat-medium":"d/M/y","field-week-relative+-1":"la semana pasada","field-year-relative+0":"este a\u00f1o","field-year-relative+1":"el pr\u00f3ximo a\u00f1o","dayPeriods-format-narrow-pm":"p.m.","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM 'de' y G","field-mon-relative+-1":"el lunes pasado","field-week-relative+0":"esta semana","field-week-relative+1":"la pr\u00f3xima semana"},"dijit/nls/loading":{_localized:{},loadingState:"Cargando...",
errorState:"Lo siento, se ha producido un error"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000B","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4",
"currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0%","decimalFormat-long":"000 billones",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Opciones anteriores",_localized:{},nextMessage:"M\u00e1s opciones"},"dijit/nls/common":{buttonOk:"Aceptar",buttonCancel:"Cancelar",_localized:{},buttonSave:"Guardar",itemClose:"Cerrar"}});
//# sourceMappingURL=dojo_es-es.js.map

View File

@ -0,0 +1,17 @@
//>>built
define("dojo/nls/dojo_fi-fi",{"dijit/form/nls/validate":{invalidMessage:"Annettu arvo ei kelpaa.",rangeMessage:"T\u00e4m\u00e4 arvo on sallitun alueen ulkopuolella.",_localized:{},missingMessage:"T\u00e4m\u00e4 arvo on pakollinen."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h.mm a","days-standAlone-short":"su ma ti ke to pe la".split(" "),"months-format-narrow":"THMHTKHESLMJ".split(""),"field-second-relative+0":"nyt","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"viikonp\u00e4iv\u00e4",
"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d.M.y","field-wed-relative+0":"t\u00e4n\u00e4 keskiviikkona","field-wed-relative+1":"ensi keskiviikkona","dateFormatItem-GyMMMEd":"E d. MMM y G","dateFormatItem-MMMEd":"ccc d. MMM",eraNarrow:["eK","jK"],"dateFormatItem-yMM":"M.y","field-tue-relative+-1":"viime tiistaina","days-format-short":"su ma ti ke to pe la".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d. MMMM y","field-fri-relative+-1":"viime perjantaina",
"field-wed-relative+-1":"viime keskiviikkona","months-format-wide":"tammikuuta helmikuuta maaliskuuta huhtikuuta toukokuuta kes\u00e4kuuta hein\u00e4kuuta elokuuta syyskuuta lokakuuta marraskuuta joulukuuta".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"ip.","dateFormat-full":"cccc d. MMMM y","field-thu-relative+-1":"viime torstaina","dateFormatItem-Md":"d.M.","dayPeriods-standAlone-wide-pm":"ip.",_localized:{},"dayPeriods-format-abbr-am":"ap.","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})",
"dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d.M.y","field-era":"aikakausi","dateFormatItem-yM":"L.y","months-standAlone-wide":"tammikuu helmikuu maaliskuu huhtikuu toukokuu kes\u00e4kuu hein\u00e4kuu elokuu syyskuu lokakuu marraskuu joulukuu".split(" "),"timeFormat-short":"H.mm","quarters-format-wide":["1. nelj\u00e4nnes","2. nelj\u00e4nnes","3. nelj\u00e4nnes","4. nelj\u00e4nnes"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"H.mm.ss z","field-year":"vuosi","dateFormatItem-yMMM":"LLL y",
"dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"tunti","months-format-abbr":"tammikuuta helmikuuta maaliskuuta huhtikuuta toukokuuta kes\u00e4kuuta hein\u00e4kuuta elokuuta syyskuuta lokakuuta marraskuuta joulukuuta".split(" "),"field-sat-relative+0":"t\u00e4n\u00e4 lauantaina","field-sat-relative+1":"ensi lauantaina","timeFormat-full":"H.mm.ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"t\u00e4n\u00e4\u00e4n","field-thu-relative+0":"t\u00e4n\u00e4 torstaina",
"field-day-relative+1":"huomenna","field-thu-relative+1":"ensi torstaina","dateFormatItem-GyMMMd":"d. MMM y G","field-day-relative+2":"ylihuomenna","dateFormatItem-H":"H","months-standAlone-abbr":"tammi helmi maalis huhti touko kes\u00e4 hein\u00e4 elo syys loka marras joulu".split(" "),"quarters-format-abbr":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],"quarters-standAlone-wide":["1. nelj\u00e4nnes","2. nelj\u00e4nnes","3. nelj\u00e4nnes","4. nelj\u00e4nnes"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L",
"days-standAlone-wide":"sunnuntai maanantai tiistai keskiviikko torstai perjantai lauantai".split(" "),"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H.mm.ss","field-sun-relative+0":"t\u00e4n\u00e4 sunnuntaina","dateFormatItem-Hm":"H.mm","field-sun-relative+1":"ensi sunnuntaina","quarters-standAlone-abbr":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],eraAbbr:["eKr.","jKr."],"field-minute":"minuutti","field-dayperiod":"vuorokaudenaika","days-standAlone-abbr":"su ma ti ke to pe la".split(" "),
"dateFormatItem-d":"d","dateFormatItem-ms":"m.ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"eilen","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"ap.","dateFormatItem-h":"h a","field-day-relative+-2":"toissap\u00e4iv\u00e4n\u00e4","dateFormatItem-MMMd":"d. MMM","dateFormatItem-MEd":"E d.M.","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"t\u00e4n\u00e4 perjantaina","field-fri-relative+1":"ensi perjantaina","dateFormatItem-yMMMM":"LLLL y","field-day":"p\u00e4iv\u00e4",
"dateFormatItem-yMMMMccccd":"cccc d. MMMM y","days-format-wide":"sunnuntaina maanantaina tiistaina keskiviikkona torstaina perjantaina lauantaina".split(" "),"field-zone":"aikavy\u00f6hyke","months-standAlone-narrow":"THMHTKHESLMJ".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"viime vuonna","field-month-relative+-1":"viime kuussa","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h.mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})",
"dayPeriods-format-abbr-pm":"ip.","days-format-abbr":"su ma ti ke to pe la".split(" "),eraNames:["ennen Kristuksen syntym\u00e4\u00e4","j\u00e4lkeen Kristuksen syntym\u00e4n"],"dateFormatItem-yMMMd":"d. MMM y","days-format-narrow":"SMTKTPL".split(""),"field-month":"kuukausi","days-standAlone-narrow":"SMTKTPL".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"t\u00e4n\u00e4 tiistaina","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"ensi tiistaina","dayPeriods-format-wide-am":"ap.",
"dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dayPeriods-standAlone-wide-am":"ap.","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E H.mm","field-mon-relative+0":"t\u00e4n\u00e4 maanantaina","field-mon-relative+1":"ensi maanantaina","dateFormat-short":"d.M.y","dateFormatItem-EHms":"E H.mm.ss","dateFormatItem-Ehms":"E h.mm.ss a","dayPeriods-format-narrow-noon":"n","field-second":"sekunti","field-sat-relative+-1":"viime lauantaina","dateFormatItem-yMMMEd":"E d. MMM y",
"field-sun-relative+-1":"viime sunnuntaina","field-month-relative+0":"t\u00e4ss\u00e4 kuussa","field-month-relative+1":"ensi kuussa","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d.","field-week":"viikko","dateFormat-medium":"d.M.y","field-week-relative+-1":"viime viikolla","field-year-relative+0":"t\u00e4n\u00e4 vuonna","field-year-relative+1":"ensi vuonna","dayPeriods-format-narrow-pm":"ip.","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H.mm.ss","dateFormatItem-hms":"h.mm.ss a",
"dateFormatItem-GyMMM":"LLL y G","field-mon-relative+-1":"viime maanantaina","field-week-relative+0":"t\u00e4ll\u00e4 viikolla","field-week-relative+1":"ensi viikolla"},"dijit/nls/loading":{_localized:{},loadingState:"Lataus on meneill\u00e4\u00e4n...",errorState:"On ilmennyt virhe."},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"\u2212","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",
_localized:{},"decimalFormat-short":"000\u00a0bilj'.'","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"ep\u00e4luku",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 biljoonaa",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},
"dijit/form/nls/ComboBox":{previousMessage:"Edelliset valinnat",_localized:{},nextMessage:"Lis\u00e4\u00e4 valintoja"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Peruuta",_localized:{},buttonSave:"Tallenna",itemClose:"Sulje"}});
//# sourceMappingURL=dojo_fi-fi.js.map

View File

@ -0,0 +1,16 @@
//>>built
define("dojo/nls/dojo_fr-fr",{"dijit/form/nls/validate":{invalidMessage:"La valeur indiqu\u00e9e n'est pas correcte.",rangeMessage:"Cette valeur n'est pas comprise dans la plage autoris\u00e9e.",_localized:{},missingMessage:"Cette valeur est requise."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"dim. lun. mar. mer. jeu. ven. sam.".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"maintenant","quarters-standAlone-narrow":["1",
"2","3","4"],"field-weekday":"jour de la semaine","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d/M/y","field-wed-relative+0":"ce mercredi","field-wed-relative+1":"mercredi prochain","dateFormatItem-GyMMMEd":"E d MMM y G","dateFormatItem-MMMEd":"E d MMM",eraNarrow:["av. J.-C.","ap. J.-C."],"field-tue-relative+-1":"mardi dernier","dayPeriods-format-wide-morning":"matin","days-format-short":"di lu ma me je ve sa".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM y",
"field-fri-relative+-1":"vendredi dernier","field-wed-relative+-1":"mercredi dernier","months-format-wide":"janvier f\u00e9vrier mars avril mai juin juillet ao\u00fbt septembre octobre novembre d\u00e9cembre".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE d MMMM y","field-thu-relative+-1":"jeudi dernier","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"midi",
"dateFormatItem-yMd":"d/M/y","field-era":"\u00e8re","dateFormatItem-yM":"M/y","months-standAlone-wide":"janvier f\u00e9vrier mars avril mai juin juillet ao\u00fbt septembre octobre novembre d\u00e9cembre".split(" "),"timeFormat-short":"HH:mm","quarters-format-wide":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"HH:mm:ss z","field-year":"ann\u00e9e","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"heure",
"months-format-abbr":"janv. f\u00e9vr. mars avr. mai juin juil. ao\u00fbt sept. oct. nov. d\u00e9c.".split(" "),"field-sat-relative+0":"ce samedi","field-sat-relative+1":"samedi prochain","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"aujourd\u2019hui","dayPeriods-format-narrow-morning":"matin","field-thu-relative+0":"ce jeudi","field-day-relative+1":"demain","field-thu-relative+1":"jeudi prochain","dateFormatItem-GyMMMd":"d MMM y G","field-day-relative+2":"apr\u00e8s-demain",
"dateFormatItem-H":"HH 'h'","months-standAlone-abbr":"janv. f\u00e9vr. mars avr. mai juin juil. ao\u00fbt sept. oct. nov. d\u00e9c.".split(" "),"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"dimanche lundi mardi mercredi jeudi vendredi samedi".split(" "),"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"ce dimanche",
"dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"dimanche prochain","quarters-standAlone-abbr":["T1","T2","T3","T4"],eraAbbr:["av. J.-C.","ap. J.-C."],"field-minute":"minute","field-dayperiod":"cadran","days-standAlone-abbr":"dim. lun. mar. mer. jeu. ven. sam.".split(" "),"dayPeriods-format-wide-night":"soir","dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"hier","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a",
"dateFormatItem-h":"h a","field-day-relative+-2":"avant-hier","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E d/M","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"ce vendredi","field-fri-relative+1":"vendredi prochain","dateFormatItem-yMMMM":"MMMM y","field-day":"jour","days-format-wide":"dimanche lundi mardi mercredi jeudi vendredi samedi".split(" "),"field-zone":"fuseau horaire","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})",
"field-year-relative+-1":"l\u2019ann\u00e9e derni\u00e8re","dayPeriods-format-narrow-night":"soir","field-month-relative+-1":"le mois dernier","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"dim. lun. mar. mer. jeu. ven. sam.".split(" "),eraNames:["avant J\u00e9sus-Christ","apr\u00e8s J\u00e9sus-Christ"],"dateFormatItem-yMMMd":"d MMM y","days-format-narrow":"DLMMJVS".split(""),
"field-month":"mois","days-standAlone-narrow":"DLMMJVS".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"ce mardi","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"mardi prochain","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"ce lundi","field-mon-relative+1":"lundi prochain","dateFormat-short":"dd/MM/y","dayPeriods-format-wide-afternoon":"apr\u00e8s-midi",
"dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"midi","field-second":"seconde","field-sat-relative+-1":"samedi dernier","dateFormatItem-yMMMEd":"E d MMM y","field-sun-relative+-1":"dimanche dernier","field-month-relative+0":"ce mois-ci","field-month-relative+1":"le mois prochain","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"semaine","dateFormat-medium":"d MMM y","field-week-relative+-1":"la semaine derni\u00e8re",
"field-year-relative+0":"cette ann\u00e9e","field-year-relative+1":"l\u2019ann\u00e9e prochaine","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"lundi dernier","field-week-relative+0":"cette semaine","field-week-relative+1":"la semaine prochaine"},"dijit/nls/loading":{_localized:{},loadingState:"Chargement...",errorState:"Une erreur est survenue"},"dojo/cldr/nls/number":{scientificFormat:"#E0",
"currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0Bn","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4;(#,##0.00\u00a0\u00a4)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",
perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 billions",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Choix pr\u00e9c\u00e9dents",_localized:{},nextMessage:"Plus de choix"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Annuler",_localized:{},buttonSave:"Enregistrer",itemClose:"Fermer"}});
//# sourceMappingURL=dojo_fr-fr.js.map

View File

@ -0,0 +1,25 @@
//>>built
define("dojo/nls/dojo_he-il",{"dijit/form/nls/validate":{invalidMessage:"\u05d4\u05e2\u05e8\u05da \u05e9\u05e6\u05d5\u05d9\u05df \u05d0\u05d9\u05e0\u05d5 \u05d7\u05d5\u05e7\u05d9.",rangeMessage:"\u05d4\u05e2\u05e8\u05da \u05de\u05d7\u05d5\u05e5 \u05dc\u05d8\u05d5\u05d5\u05d7.",_localized:{},missingMessage:"\u05d6\u05d4\u05d5 \u05e2\u05e8\u05da \u05d3\u05e8\u05d5\u05e9."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"\u05d0\u05f3 \u05d1\u05f3 \u05d2\u05f3 \u05d3\u05f3 \u05d4\u05f3 \u05d5\u05f3 \u05e9\u05f3".split(" "),
"months-format-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),"field-second-relative+0":"\u05e2\u05db\u05e9\u05d9\u05d5","quarters-standAlone-narrow":["\u05e81","\u05e82","\u05e83","\u05e84"],"field-weekday":"\u05d9\u05d5\u05dd \u05d1\u05e9\u05d1\u05d5\u05e2","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"E, d/M/y","field-wed-relative+0":"\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9","field-wed-relative+1":"\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9 \u05d4\u05d1\u05d0","dateFormatItem-GyMMMEd":"E, d \u05d1MMM y G",
"dateFormatItem-MMMEd":"E, d \u05d1MMM",eraNarrow:["\u05dc\u05e4\u05e0\u05d4\u05f4\u05e1","BCE","\u05dc\u05e1\u05d4\u05f4\u05e0","CE"],"dateFormatItem-yMM":"MM/y","field-tue-relative+-1":"\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9 \u05e9\u05e2\u05d1\u05e8","days-format-short":"\u05d0\u05f3 \u05d1\u05f3 \u05d2\u05f3 \u05d3\u05f3 \u05d4\u05f3 \u05d5\u05f3 \u05e9\u05f3".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d \u05d1MMMM y","field-fri-relative+-1":"\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9\u05d9 \u05e9\u05e2\u05d1\u05e8",
"field-wed-relative+-1":"\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9 \u05e9\u05e2\u05d1\u05e8","months-format-wide":"\u05d9\u05e0\u05d5\u05d0\u05e8 \u05e4\u05d1\u05e8\u05d5\u05d0\u05e8 \u05de\u05e8\u05e5 \u05d0\u05e4\u05e8\u05d9\u05dc \u05de\u05d0\u05d9 \u05d9\u05d5\u05e0\u05d9 \u05d9\u05d5\u05dc\u05d9 \u05d0\u05d5\u05d2\u05d5\u05e1\u05d8 \u05e1\u05e4\u05d8\u05de\u05d1\u05e8 \u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8 \u05e0\u05d5\u05d1\u05de\u05d1\u05e8 \u05d3\u05e6\u05de\u05d1\u05e8".split(" "),
"dateTimeFormat-medium":"{1}, {0}","dayPeriods-format-wide-pm":"\u05d0\u05d7\u05d4\u05f4\u05e6","dateFormat-full":"EEEE, d \u05d1MMMM y","field-thu-relative+-1":"\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9 \u05e9\u05e2\u05d1\u05e8","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d.M.y","field-era":"\u05ea\u05e7\u05d5\u05e4\u05d4","dateFormatItem-yM":"M.y",
"months-standAlone-wide":"\u05d9\u05e0\u05d5\u05d0\u05e8 \u05e4\u05d1\u05e8\u05d5\u05d0\u05e8 \u05de\u05e8\u05e5 \u05d0\u05e4\u05e8\u05d9\u05dc \u05de\u05d0\u05d9 \u05d9\u05d5\u05e0\u05d9 \u05d9\u05d5\u05dc\u05d9 \u05d0\u05d5\u05d2\u05d5\u05e1\u05d8 \u05e1\u05e4\u05d8\u05de\u05d1\u05e8 \u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8 \u05e0\u05d5\u05d1\u05de\u05d1\u05e8 \u05d3\u05e6\u05de\u05d1\u05e8".split(" "),"timeFormat-short":"HH:mm","quarters-format-wide":["\u05e8\u05d1\u05e2\u05d5\u05df 1","\u05e8\u05d1\u05e2\u05d5\u05df 2",
"\u05e8\u05d1\u05e2\u05d5\u05df 3","\u05e8\u05d1\u05e2\u05d5\u05df 4"],"dateFormatItem-yQQQQ":"y QQQQ","timeFormat-long":"HH:mm:ss z","field-year":"\u05e9\u05e0\u05d4","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"\u05e9\u05e2\u05d4","months-format-abbr":"\u05d9\u05e0\u05d5\u05f3 \u05e4\u05d1\u05e8\u05f3 \u05de\u05e8\u05e5 \u05d0\u05e4\u05e8\u05f3 \u05de\u05d0\u05d9 \u05d9\u05d5\u05e0\u05d9 \u05d9\u05d5\u05dc\u05d9 \u05d0\u05d5\u05d2\u05f3 \u05e1\u05e4\u05d8\u05f3 \u05d0\u05d5\u05e7\u05f3 \u05e0\u05d5\u05d1\u05f3 \u05d3\u05e6\u05de\u05f3".split(" "),
"field-sat-relative+0":"\u05d4\u05e9\u05d1\u05ea \u05d4\u05d6\u05d0\u05ea","field-sat-relative+1":"\u05d4\u05e9\u05d1\u05ea \u05d4\u05d1\u05d0\u05d4","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"\u05d4\u05d9\u05d5\u05dd","field-thu-relative+0":"\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9","field-day-relative+1":"\u05de\u05d7\u05e8","field-thu-relative+1":"\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9 \u05d4\u05d1\u05d0","dateFormatItem-GyMMMd":"d \u05d1MMM y G",
"field-day-relative+2":"\u05de\u05d7\u05e8\u05ea\u05d9\u05d9\u05dd","dateFormatItem-H":"HH","months-standAlone-abbr":"\u05d9\u05e0\u05d5\u05f3 \u05e4\u05d1\u05e8\u05f3 \u05de\u05e8\u05e5 \u05d0\u05e4\u05e8\u05f3 \u05de\u05d0\u05d9 \u05d9\u05d5\u05e0\u05d9 \u05d9\u05d5\u05dc\u05d9 \u05d0\u05d5\u05d2\u05f3 \u05e1\u05e4\u05d8\u05f3 \u05d0\u05d5\u05e7\u05f3 \u05e0\u05d5\u05d1\u05f3 \u05d3\u05e6\u05de\u05f3".split(" "),"quarters-format-abbr":["\u05e8\u05d1\u05e2\u05d5\u05df 1","\u05e8\u05d1\u05e2\u05d5\u05df 2",
"\u05e8\u05d1\u05e2\u05d5\u05df 3","\u05e8\u05d1\u05e2\u05d5\u05df 4"],"quarters-standAlone-wide":["\u05e8\u05d1\u05e2\u05d5\u05df 1","\u05e8\u05d1\u05e2\u05d5\u05df 2","\u05e8\u05d1\u05e2\u05d5\u05df 3","\u05e8\u05d1\u05e2\u05d5\u05df 4"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df;\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9;\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9;\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9;\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9;\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9\u05d9;\u05d9\u05d5\u05dd \u05e9\u05d1\u05ea".split(";"),
"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df \u05d4\u05d1\u05d0","quarters-standAlone-abbr":["\u05e8\u05d1\u05e2\u05d5\u05df 1","\u05e8\u05d1\u05e2\u05d5\u05df 2","\u05e8\u05d1\u05e2\u05d5\u05df 3","\u05e8\u05d1\u05e2\u05d5\u05df 4"],eraAbbr:["\u05dc\u05e4\u05e0\u05d4\u05f4\u05e1","BCE","\u05dc\u05e1\u05d4\u05f4\u05e0",
"CE"],"field-minute":"\u05d3\u05e7\u05d4","field-dayperiod":"\u05dc\u05e4\u05e0\u05d4\u05f4\u05e6/\u05d0\u05d7\u05d4\u05f4\u05e6","days-standAlone-abbr":"\u05d9\u05d5\u05dd \u05d0\u05f3;\u05d9\u05d5\u05dd \u05d1\u05f3;\u05d9\u05d5\u05dd \u05d2\u05f3;\u05d9\u05d5\u05dd \u05d3\u05f3;\u05d9\u05d5\u05dd \u05d4\u05f3;\u05d9\u05d5\u05dd \u05d5\u05f3;\u05e9\u05d1\u05ea".split(";"),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"\u05d0\u05ea\u05de\u05d5\u05dc",
"dateTimeFormat-long":"{1} \u05d1\u05e9\u05e2\u05d4 {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"\u05e9\u05dc\u05e9\u05d5\u05dd","dateFormatItem-MMMd":"d \u05d1MMM","dateFormatItem-MEd":"E, d/M","dateTimeFormat-full":"{1} \u05d1\u05e9\u05e2\u05d4 {0}","field-fri-relative+0":"\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9\u05d9","field-fri-relative+1":"\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9\u05d9 \u05d4\u05d1\u05d0","dateFormatItem-yMMMM":"MMMM y","field-day":"\u05d9\u05d5\u05dd",
"days-format-wide":"\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df;\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9;\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9;\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9;\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9;\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9\u05d9;\u05d9\u05d5\u05dd \u05e9\u05d1\u05ea".split(";"),"field-zone":"\u05d0\u05d6\u05d5\u05e8","months-standAlone-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})",
"field-year-relative+-1":"\u05d4\u05e9\u05e0\u05d4 \u05e9\u05e2\u05d1\u05e8\u05d4","field-month-relative+-1":"\u05d4\u05d7\u05d5\u05d3\u05e9 \u05e9\u05e2\u05d1\u05e8","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"\u05d9\u05d5\u05dd \u05d0\u05f3;\u05d9\u05d5\u05dd \u05d1\u05f3;\u05d9\u05d5\u05dd \u05d2\u05f3;\u05d9\u05d5\u05dd \u05d3\u05f3;\u05d9\u05d5\u05dd \u05d4\u05f3;\u05d9\u05d5\u05dd \u05d5\u05f3;\u05e9\u05d1\u05ea".split(";"),
eraNames:["\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e1\u05e4\u05d9\u05e8\u05d4","\u05dc\u05e1\u05e4\u05d9\u05e8\u05d4","\u05dc\u05e1\u05d4\u05f4\u05e0","CE"],"dateFormatItem-yMMMd":"d \u05d1MMM y","days-format-narrow":"\u05d0\u05f3 \u05d1\u05f3 \u05d2\u05f3 \u05d3\u05f3 \u05d4\u05f3 \u05d5\u05f3 \u05e9\u05f3".split(" "),"field-month":"\u05d7\u05d5\u05d3\u05e9","days-standAlone-narrow":"\u05d0\u05f3 \u05d1\u05f3 \u05d2\u05f3 \u05d3\u05f3 \u05d4\u05f3 \u05d5\u05f3 \u05e9\u05f3".split(" "),"dateFormatItem-MMM":"LLL",
"field-tue-relative+0":"\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9 \u05d4\u05d1\u05d0","dayPeriods-format-wide-am":"\u05dc\u05e4\u05e0\u05d4\u05f4\u05e6","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E H:mm","field-mon-relative+0":"\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9 \u05d4\u05d6\u05d4",
"field-mon-relative+1":"\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9 \u05d4\u05d1\u05d0","dateFormat-short":"dd/MM/yy","dateFormatItem-EHms":"E H:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"\u05e9\u05e0\u05d9\u05d9\u05d4","field-sat-relative+-1":"\u05d4\u05e9\u05d1\u05ea \u05e9\u05e2\u05d1\u05e8\u05d4","dateFormatItem-yMMMEd":"E, d \u05d1MMM y","field-sun-relative+-1":"\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df \u05e9\u05e2\u05d1\u05e8","field-month-relative+0":"\u05d4\u05d7\u05d5\u05d3\u05e9",
"field-month-relative+1":"\u05d4\u05d7\u05d5\u05d3\u05e9 \u05d4\u05d1\u05d0","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E \u05d4-d","field-week":"\u05e9\u05d1\u05d5\u05e2","dateFormat-medium":"d \u05d1MMM y","field-week-relative+-1":"\u05d4\u05e9\u05d1\u05d5\u05e2 \u05e9\u05e2\u05d1\u05e8","field-year-relative+0":"\u05d4\u05e9\u05e0\u05d4","field-year-relative+1":"\u05d4\u05e9\u05e0\u05d4 \u05d4\u05d1\u05d0\u05d4","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1}, {0}",
"dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9 \u05e9\u05e2\u05d1\u05e8","field-week-relative+0":"\u05d4\u05e9\u05d1\u05d5\u05e2","field-week-relative+1":"\u05d4\u05e9\u05d1\u05d5\u05e2 \u05d4\u05d1\u05d0"},"dijit/nls/loading":{_localized:{},loadingState:"\u05d8\u05e2\u05d9\u05e0\u05d4...",errorState:"\u05d0\u05d9\u05e8\u05e2\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4"},"dojo/cldr/nls/number":{scientificFormat:"#E0",
"currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",
percentFormat:"#,##0%","decimalFormat-long":"000 \u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df",decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u05d4\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d4\u05e7\u05d5\u05d3\u05de\u05d5\u05ea",_localized:{},nextMessage:"\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e0\u05d5\u05e1\u05e4\u05d5\u05ea"},"dijit/nls/common":{buttonOk:"\u05d0\u05d9\u05e9\u05d5\u05e8",
buttonCancel:"\u05d1\u05d9\u05d8\u05d5\u05dc",_localized:{},buttonSave:"\u05e9\u05de\u05d9\u05e8\u05d4",itemClose:"\u05e1\u05d2\u05d9\u05e8\u05d4"}});
//# sourceMappingURL=dojo_he-il.js.map

View File

@ -0,0 +1,17 @@
//>>built
define("dojo/nls/dojo_hu",{"dijit/form/nls/validate":{invalidMessage:"A megadott \u00e9rt\u00e9k \u00e9rv\u00e9nytelen.",rangeMessage:"Az \u00e9rt\u00e9k k\u00edv\u00fcl van a megengedett tartom\u00e1nyon.",_localized:{},missingMessage:"Meg kell adni egy \u00e9rt\u00e9ket."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"V H K Sze Cs P Szo".split(" "),"months-format-narrow":"J F M \u00c1 M J J A Sz O N D".split(" "),"field-second-relative+0":"most","quarters-standAlone-narrow":["1.",
"2.","3.","4."],"field-weekday":"h\u00e9t napja","dateFormatItem-yQQQ":"y. QQQ","dateFormatItem-yMEd":"y. MM. dd., E","field-wed-relative+0":"ez a szerda","field-wed-relative+1":"k\u00f6vetkez\u0151 szerda","dateFormatItem-GyMMMEd":"G y. MMM d., E","dateFormatItem-MMMEd":"MMM d., E",eraNarrow:["ie.","isz."],"field-tue-relative+-1":"el\u0151z\u0151 kedd","days-format-short":"V H K Sze Cs P Szo".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"y. MMMM d.","field-fri-relative+-1":"el\u0151z\u0151 p\u00e9ntek",
"field-wed-relative+-1":"el\u0151z\u0151 szerda","months-format-wide":"janu\u00e1r febru\u00e1r m\u00e1rcius \u00e1prilis m\u00e1jus j\u00fanius j\u00falius augusztus szeptember okt\u00f3ber november december".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"du.","dateFormat-full":"y. MMMM d., EEEE","field-thu-relative+-1":"el\u0151z\u0151 cs\u00fct\u00f6rt\u00f6k","dateFormatItem-Md":"M. d.",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})",
"dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"y. MM. dd.","field-era":"\u00e9ra","dateFormatItem-yM":"y. M.","months-standAlone-wide":"janu\u00e1r febru\u00e1r m\u00e1rcius \u00e1prilis m\u00e1jus j\u00fanius j\u00falius augusztus szeptember okt\u00f3ber november december".split(" "),"timeFormat-short":"H:mm","quarters-format-wide":["I. negyed\u00e9v","II. negyed\u00e9v","III. negyed\u00e9v","IV. negyed\u00e9v"],"dateFormatItem-yQQQQ":"y. QQQQ","timeFormat-long":"H:mm:ss z","field-year":"\u00e9v",
"dateFormatItem-yMMM":"y. MMM","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"\u00f3ra","months-format-abbr":"jan. febr. m\u00e1rc. \u00e1pr. m\u00e1j. j\u00fan. j\u00fal. aug. szept. okt. nov. dec.".split(" "),"field-sat-relative+0":"ez a szombat","field-sat-relative+1":"k\u00f6vetkez\u0151 szombat","timeFormat-full":"H:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"ma","field-thu-relative+0":"ez a cs\u00fct\u00f6rt\u00f6k","field-day-relative+1":"holnap",
"field-thu-relative+1":"k\u00f6vetkez\u0151 cs\u00fct\u00f6rt\u00f6k","dateFormatItem-GyMMMd":"G y. MMM d.","field-day-relative+2":"holnaput\u00e1n","dateFormatItem-H":"H","months-standAlone-abbr":"jan. febr. m\u00e1rc. \u00e1pr. m\u00e1j. j\u00fan. j\u00fal. aug. szept. okt. nov. dec.".split(" "),"quarters-format-abbr":["N1","N2","N3","N4"],"quarters-standAlone-wide":["1. negyed\u00e9v","2. negyed\u00e9v","3. negyed\u00e9v","4. negyed\u00e9v"],"dateFormatItem-Gy":"G y.","dateFormatItem-M":"L","days-standAlone-wide":"vas\u00e1rnap h\u00e9tf\u0151 kedd szerda cs\u00fct\u00f6rt\u00f6k p\u00e9ntek szombat".split(" "),
"dateFormatItem-MMMMd":"MMMM d.","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H:mm:ss","field-sun-relative+0":"ez a vas\u00e1rnap","dateFormatItem-Hm":"H:mm","field-sun-relative+1":"k\u00f6vetkez\u0151 vas\u00e1rnap","quarters-standAlone-abbr":["N1","N2","N3","N4"],eraAbbr:["i. e.","i. sz."],"field-minute":"perc","field-dayperiod":"napszak","days-standAlone-abbr":"V H K Sze Cs P Szo".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1.","2.","3.",
"4."],"field-day-relative+-1":"tegnap","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"de.","dateFormatItem-h":"a h","field-day-relative+-2":"tegnapel\u0151tt","dateFormatItem-MMMd":"MMM d.","dateFormatItem-MEd":"M. d., E","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"ez a p\u00e9ntek","field-fri-relative+1":"k\u00f6vetkez\u0151 p\u00e9ntek","dateFormatItem-yMMMM":"y. MMMM","field-day":"nap","days-format-wide":"vas\u00e1rnap h\u00e9tf\u0151 kedd szerda cs\u00fct\u00f6rt\u00f6k p\u00e9ntek szombat".split(" "),
"field-zone":"id\u0151z\u00f3na","months-standAlone-narrow":"J F M \u00c1 M J J A Sz O N D".split(" "),"dateFormatItem-y":"y.","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"el\u0151z\u0151 \u00e9v","field-month-relative+-1":"el\u0151z\u0151 h\u00f3nap","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"a h:mm","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"V H K Sze Cs P Szo".split(" "),eraNames:["id\u0151sz\u00e1m\u00edt\u00e1sunk el\u0151tt",
"id\u0151sz\u00e1m\u00edt\u00e1sunk szerint"],"dateFormatItem-yMMMd":"y. MMM d.","days-format-narrow":"V H K Sz Cs P Sz".split(" "),"field-month":"h\u00f3nap","days-standAlone-narrow":"V H K Sz Cs P Sz".split(" "),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"ez a kedd","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"k\u00f6vetkez\u0151 kedd","dayPeriods-format-wide-am":"de.","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})",
"dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"ez a h\u00e9tf\u0151","field-mon-relative+1":"k\u00f6vetkez\u0151 h\u00e9tf\u0151","dateFormat-short":"y. MM. dd.","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"m\u00e1sodperc","field-sat-relative+-1":"el\u0151z\u0151 szombat","dateFormatItem-yMMMEd":"y. MMM d., E","field-sun-relative+-1":"el\u0151z\u0151 vas\u00e1rnap","field-month-relative+0":"ez a h\u00f3nap","field-month-relative+1":"k\u00f6vetkez\u0151 h\u00f3nap",
"dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"d., E","field-week":"h\u00e9t","dateFormat-medium":"y. MMM d.","field-week-relative+-1":"el\u0151z\u0151 h\u00e9t","field-year-relative+0":"ez az \u00e9v","field-year-relative+1":"k\u00f6vetkez\u0151 \u00e9v","dayPeriods-format-narrow-pm":"du.","dateFormatItem-mmss":"mm:ss","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"a h:mm:ss","dateFormatItem-GyMMM":"G y. MMM","field-mon-relative+-1":"el\u0151z\u0151 h\u00e9tf\u0151",
"field-week-relative+0":"ez a h\u00e9t","field-week-relative+1":"k\u00f6vetkez\u0151 h\u00e9t"},"dijit/nls/loading":{_localized:{},loadingState:"Bet\u00f6lt\u00e9s...",errorState:"Sajn\u00e1lom, hiba t\u00f6rt\u00e9nt"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0B",
"currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0%","decimalFormat-long":"000 billi\u00f3",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"El\u0151z\u0151 men\u00fcpontok",
_localized:{},nextMessage:"Tov\u00e1bbi men\u00fcpontok"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"M\u00e9gse",_localized:{},buttonSave:"Ment\u00e9s",itemClose:"Bez\u00e1r\u00e1s"}});
//# sourceMappingURL=dojo_hu.js.map

View File

@ -0,0 +1,16 @@
//>>built
define("dojo/nls/dojo_it-it",{"dijit/form/nls/validate":{invalidMessage:"Il valore immesso non \u00e8 valido.",rangeMessage:"Questo valore \u00e8 fuori dall'intervallo consentito.",_localized:{},missingMessage:"Questo valore \u00e8 obbligatorio."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h.mm a","days-standAlone-short":"dom lun mar mer gio ven sab".split(" "),"months-format-narrow":"GFMAMGLASOND".split(""),"field-second-relative+0":"ora","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"giorno della settimana",
"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d/M/y","field-wed-relative+0":"questo mercoled\u00ec","field-wed-relative+1":"mercoled\u00ec prossimo","dateFormatItem-GyMMMEd":"E d MMM y G","dateFormatItem-MMMEd":"E d MMM",eraNarrow:["aC","BCE","dC","CE"],"field-tue-relative+-1":"marted\u00ec scorso","days-format-short":"dom lun mar mer gio ven sab".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"dd MMMM y","field-fri-relative+-1":"venerd\u00ec scorso","field-wed-relative+-1":"mercoled\u00ec scorso",
"months-format-wide":"gennaio febbraio marzo aprile maggio giugno luglio agosto settembre ottobre novembre dicembre".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE d MMMM y","field-thu-relative+-1":"gioved\u00ec scorso","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d/M/y","field-era":"era","dateFormatItem-yM":"M/y",
"months-standAlone-wide":"Gennaio Febbraio Marzo Aprile Maggio Giugno Luglio Agosto Settembre Ottobre Novembre Dicembre".split(" "),"timeFormat-short":"HH:mm","quarters-format-wide":["1\u00ba trimestre","2\u00ba trimestre","3\u00ba trimestre","4\u00ba trimestre"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"HH:mm:ss z","field-year":"anno","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"ora","months-format-abbr":"gen feb mar apr mag giu lug ago set ott nov dic".split(" "),
"field-sat-relative+0":"questo sabato","field-sat-relative+1":"sabato prossimo","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"oggi","field-thu-relative+0":"questo gioved\u00ec","field-day-relative+1":"domani","field-thu-relative+1":"gioved\u00ec prossimo","dateFormatItem-GyMMMd":"d MMM y G","field-day-relative+2":"dopodomani","dateFormatItem-H":"HH","months-standAlone-abbr":"gen feb mar apr mag giu lug ago set ott nov dic".split(" "),
"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["Primo trimestre","Secondo trimestre","Terzo trimestre","Quarto trimestre"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"Domenica Luned\u00ec Marted\u00ec Mercoled\u00ec Gioved\u00ec Venerd\u00ec Sabato".split(" "),"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"questa domenica","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"domenica prossima","quarters-standAlone-abbr":["T1",
"T2","T3","T4"],eraAbbr:["aC","BCE","dC","CE"],"field-minute":"minuto","field-dayperiod":"periodo del giorno","days-standAlone-abbr":"dom lun mar mer gio ven sab".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"ieri","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"m.","dateFormatItem-h":"hh a","field-day-relative+-2":"l'altro ieri","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E d/M","dateTimeFormat-full":"{1} {0}",
"field-fri-relative+0":"questo venerd\u00ec","field-fri-relative+1":"venerd\u00ec prossimo","dateFormatItem-yMMMM":"MMMM y","field-day":"giorno","days-format-wide":"domenica luned\u00ec marted\u00ec mercoled\u00ec gioved\u00ec venerd\u00ec sabato".split(" "),"field-zone":"fuso orario","months-standAlone-narrow":"GFMAMGLASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"anno scorso","field-month-relative+-1":"mese scorso","dateTimeFormats-appendItem-Year":"{1} {0}",
"dateFormatItem-hm":"hh:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"dom lun mar mer gio ven sab".split(" "),eraNames:["a.C.","BCE","d.C.","CE"],"dateFormatItem-yMMMd":"d MMM y","days-format-narrow":"DLMMGVS".split(""),"field-month":"mese","days-standAlone-narrow":"DLMMGVS".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"questo marted\u00ec","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"marted\u00ec prossimo",
"dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E HH.mm","field-mon-relative+0":"questo luned\u00ec","field-mon-relative+1":"luned\u00ec prossimo","dateFormat-short":"dd/MM/yy","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"secondo","field-sat-relative+-1":"sabato scorso","dateFormatItem-yMMMEd":"E d MMM y","field-sun-relative+-1":"domenica scorsa",
"field-month-relative+0":"questo mese","field-month-relative+1":"mese prossimo","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"settimana","dateFormat-medium":"dd/MMM/y","field-week-relative+-1":"settimana scorsa","field-year-relative+0":"quest'anno","field-year-relative+1":"anno prossimo","dayPeriods-format-narrow-pm":"p.","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"hh:mm:ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"luned\u00ec scorso",
"field-week-relative+0":"questa settimana","field-week-relative+1":"settimana prossima"},"dijit/nls/loading":{_localized:{},loadingState:"Caricamento in corso...",errorState:"Si \u00e8 verificato un errore"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0Bln",
"currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0%","decimalFormat-long":"000 bilioni",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Scelte precedenti",_localized:{},
nextMessage:"Scelte successive"},"dijit/nls/common":{buttonOk:"Ok",buttonCancel:"Annulla",_localized:{},buttonSave:"Salva",itemClose:"Chiudi"}});
//# sourceMappingURL=dojo_it-it.js.map

View File

@ -0,0 +1,19 @@
//>>built
define("dojo/nls/dojo_ja-jp",{"dijit/form/nls/validate":{invalidMessage:"\u5165\u529b\u3057\u305f\u5024\u306f\u7121\u52b9\u3067\u3059\u3002",rangeMessage:"\u3053\u306e\u5024\u306f\u7bc4\u56f2\u5916\u3067\u3059\u3002",_localized:{},missingMessage:"\u3053\u306e\u5024\u306f\u5fc5\u9808\u3067\u3059\u3002"},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"a K \u6642 mm \u5206 (E)","days-standAlone-short":"\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f".split(""),"months-format-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),
"field-second-relative+0":"\u4eca\u3059\u3050","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"\u66dc\u65e5","dateFormatItem-yQQQ":"y/QQQ","dateFormatItem-yMEd":"y/M/d(E)","field-wed-relative+0":"\u4eca\u9031\u306e\u6c34\u66dc\u65e5","field-wed-relative+1":"\u6765\u9031\u306e\u6c34\u66dc\u65e5","dateFormatItem-GyMMMEd":"Gy\u5e74M\u6708d\u65e5(E)","dateFormatItem-MMMEd":"M\u6708d\u65e5(E)",eraNarrow:["BC","BCE","AD","CE"],"dateFormatItem-yMM":"y/MM","field-tue-relative+-1":"\u5148\u9031\u306e\u706b\u66dc\u65e5",
"days-format-short":"\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f".split(""),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"y\u5e74M\u6708d\u65e5","field-fri-relative+-1":"\u5148\u9031\u306e\u91d1\u66dc\u65e5","field-wed-relative+-1":"\u5148\u9031\u306e\u6c34\u66dc\u65e5","months-format-wide":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"\u5348\u5f8c",
"dateFormat-full":"y\u5e74M\u6708d\u65e5EEEE","field-thu-relative+-1":"\u5148\u9031\u306e\u6728\u66dc\u65e5","dateFormatItem-Md":"M/d",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"\u6b63\u5348","dateFormatItem-yMd":"y/M/d","field-era":"\u6642\u4ee3","dateFormatItem-yM":"y/M","months-standAlone-wide":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),"timeFormat-short":"H:mm",
"quarters-format-wide":["\u7b2c1\u56db\u534a\u671f","\u7b2c2\u56db\u534a\u671f","\u7b2c3\u56db\u534a\u671f","\u7b2c4\u56db\u534a\u671f"],"dateFormatItem-MEEEEd":"M/dEEEE","dateFormatItem-yQQQQ":"yQQQQ","timeFormat-long":"H:mm:ss z","field-year":"\u5e74","dateFormatItem-yMMM":"y\u5e74M\u6708","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"\u6642","months-format-abbr":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),"field-sat-relative+0":"\u4eca\u9031\u306e\u571f\u66dc\u65e5",
"field-sat-relative+1":"\u6765\u9031\u306e\u571f\u66dc\u65e5","timeFormat-full":"H\u6642mm\u5206ss\u79d2 zzzz","dateFormatItem-yMEEEEd":"y/M/dEEEE","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"\u4eca\u65e5","field-thu-relative+0":"\u4eca\u9031\u306e\u6728\u66dc\u65e5","field-day-relative+1":"\u660e\u65e5","field-thu-relative+1":"\u6765\u9031\u306e\u6728\u66dc\u65e5","dateFormatItem-GyMMMd":"Gy\u5e74M\u6708d\u65e5","field-day-relative+2":"\u660e\u5f8c\u65e5","dateFormatItem-H":"H\u6642",
"months-standAlone-abbr":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["\u7b2c1\u56db\u534a\u671f","\u7b2c2\u56db\u534a\u671f","\u7b2c3\u56db\u534a\u671f","\u7b2c4\u56db\u534a\u671f"],"dateFormatItem-Gy":"Gy\u5e74","dateFormatItem-M":"M\u6708","days-standAlone-wide":"\u65e5\u66dc\u65e5 \u6708\u66dc\u65e5 \u706b\u66dc\u65e5 \u6c34\u66dc\u65e5 \u6728\u66dc\u65e5 \u91d1\u66dc\u65e5 \u571f\u66dc\u65e5".split(" "),
"dateFormatItem-yMMMEEEEd":"y\u5e74M\u6708d\u65e5EEEE","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H:mm:ss","field-sun-relative+0":"\u4eca\u9031\u306e\u65e5\u66dc\u65e5","dateFormatItem-Hm":"H:mm","field-sun-relative+1":"\u6765\u9031\u306e\u65e5\u66dc\u65e5","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],eraAbbr:["\u7d00\u5143\u524d","\u897f\u66a6"],"field-minute":"\u5206","field-dayperiod":"\u5348\u524d/\u5348\u5f8c","days-standAlone-abbr":"\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f".split(""),
"dateFormatItem-d":"d\u65e5","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"\u6628\u65e5","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"\u5348\u524d","dateFormatItem-h":"aK\u6642","field-day-relative+-2":"\u4e00\u6628\u65e5","dateFormatItem-MMMd":"M\u6708d\u65e5","dateFormatItem-EEEEd":"d\u65e5EEEE","dateFormatItem-MEd":"M/d(E)","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"\u4eca\u9031\u306e\u91d1\u66dc\u65e5","field-fri-relative+1":"\u6765\u9031\u306e\u91d1\u66dc\u65e5",
"field-day":"\u65e5","days-format-wide":"\u65e5\u66dc\u65e5 \u6708\u66dc\u65e5 \u706b\u66dc\u65e5 \u6c34\u66dc\u65e5 \u6728\u66dc\u65e5 \u91d1\u66dc\u65e5 \u571f\u66dc\u65e5".split(" "),"field-zone":"\u30bf\u30a4\u30e0\u30be\u30fc\u30f3","months-standAlone-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),"dateFormatItem-y":"y\u5e74","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"\u6628\u5e74","field-month-relative+-1":"\u5148\u6708","dateTimeFormats-appendItem-Year":"{1} {0}",
"dateFormatItem-hm":"aK:mm","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateFormatItem-GyMMMEEEEd":"Gy\u5e74M\u6708d\u65e5EEEE","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f".split(""),eraNames:["\u7d00\u5143\u524d","\u897f\u66a6\u7d00\u5143\u524d","\u897f\u66a6"],"dateFormatItem-yMMMd":"y\u5e74M\u6708d\u65e5","days-format-narrow":"\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f".split(""),"dateFormatItem-MMMEEEEd":"M\u6708d\u65e5EEEE","field-month":"\u6708",
"days-standAlone-narrow":"\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f".split(""),"dateFormatItem-MMM":"M\u6708","field-tue-relative+0":"\u4eca\u9031\u306e\u706b\u66dc\u65e5","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"\u6765\u9031\u306e\u706b\u66dc\u65e5","dayPeriods-format-wide-am":"\u5348\u524d","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"HH \u6642 mm \u5206 (E)","field-mon-relative+0":"\u4eca\u9031\u306e\u6708\u66dc\u65e5",
"field-mon-relative+1":"\u6765\u9031\u306e\u6708\u66dc\u65e5","dateFormat-short":"y/MM/dd","dateFormatItem-EHms":"HH \u6642 mm \u5206 ss \u79d2 (E)","dateFormatItem-Ehms":"a K \u6642 mm \u5206 ss \u79d2 (E)","dayPeriods-format-narrow-noon":"\u6b63\u5348","field-second":"\u79d2","field-sat-relative+-1":"\u5148\u9031\u306e\u571f\u66dc\u65e5","dateFormatItem-yMMMEd":"y\u5e74M\u6708d\u65e5(E)","field-sun-relative+-1":"\u5148\u9031\u306e\u65e5\u66dc\u65e5","field-month-relative+0":"\u4eca\u6708","field-month-relative+1":"\u7fcc\u6708",
"dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"d\u65e5(E)","field-week":"\u9031","dateFormat-medium":"y/MM/dd","field-week-relative+-1":"\u5148\u9031","field-year-relative+0":"\u4eca\u5e74","field-year-relative+1":"\u7fcc\u5e74","dayPeriods-format-narrow-pm":"\u5348\u5f8c","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"aK:mm:ss","dateFormatItem-GyMMM":"Gy\u5e74M\u6708","field-mon-relative+-1":"\u5148\u9031\u306e\u6708\u66dc\u65e5","field-week-relative+0":"\u4eca\u9031",
"field-week-relative+1":"\u7fcc\u9031"},"dijit/nls/loading":{_localized:{},loadingState:"\u30ed\u30fc\u30c9\u4e2d...",errorState:"\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u5146","currencySpacing-afterCurrency-insertBetween":"\u00a0",
nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000\u5146",decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u4ee5\u524d\u306e\u9078\u629e\u9805\u76ee",_localized:{},nextMessage:"\u8ffd\u52a0\u306e\u9078\u629e\u9805\u76ee"},
"dijit/nls/common":{buttonOk:"OK",buttonCancel:"\u30ad\u30e3\u30f3\u30bb\u30eb",_localized:{},buttonSave:"\u4fdd\u5b58",itemClose:"\u9589\u3058\u308b"}});
//# sourceMappingURL=dojo_ja-jp.js.map

View File

@ -0,0 +1,19 @@
//>>built
define("dojo/nls/dojo_ko-kr",{"dijit/form/nls/validate":{invalidMessage:"\uc785\ub825\ub41c \uac12\uc774 \uc62c\ubc14\ub974\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.",rangeMessage:"\uc774 \uac12\uc740 \ubc94\uc704\ub97c \ubc97\uc5b4\ub0a9\ub2c8\ub2e4.",_localized:{},missingMessage:"\uc774 \uac12\uc740 \ud544\uc218\uc785\ub2c8\ub2e4."},"dojo/cldr/nls/gregorian":{"dateTimeFormats-appendItem-Year":"{1} {0}","field-tue-relative+-1":"\uc9c0\ub09c \ud654\uc694\uc77c","field-year":"\ub144","dateFormatItem-MEEEEd":"M. d. EEEE",
"dateFormatItem-Hm":"HH:mm","field-wed-relative+0":"\uc774\ubc88 \uc218\uc694\uc77c","field-wed-relative+1":"\ub2e4\uc74c \uc218\uc694\uc77c","dateFormatItem-ms":"mm:ss","timeFormat-short":"a h:mm","field-minute":"\ubd84","dateTimeFormat-short":"{1} {0}","field-day-relative+0":"\uc624\ub298","field-day-relative+1":"\ub0b4\uc77c","field-day-relative+2":"\ubaa8\ub808","field-tue-relative+0":"\uc774\ubc88 \ud654\uc694\uc77c","field-tue-relative+1":"\ub2e4\uc74c \ud654\uc694\uc77c","dayPeriods-format-narrow-am":"a",
"dateFormatItem-MMMd":"MMM d\uc77c","dayPeriods-format-abbr-am":"AM","field-week-relative+0":"\uc774\ubc88 \uc8fc","field-month-relative+0":"\uc774\ubc88 \ub2ec","field-week-relative+1":"\ub2e4\uc74c \uc8fc","field-month-relative+1":"\ub2e4\uc74c \ub2ec","timeFormat-medium":"a h:mm:ss","field-second-relative+0":"\uc9c0\uae08","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-narrow":"1\uc6d4 2\uc6d4 3\uc6d4 4\uc6d4 5\uc6d4 6\uc6d4 7\uc6d4 8\uc6d4 9\uc6d4 10\uc6d4 11\uc6d4 12\uc6d4".split(" "),
eraNames:["\uc11c\ub825\uae30\uc6d0\uc804","\uc11c\ub825\uae30\uc6d0"],"dateFormatItem-GyMMMEd":"G y\ub144 MMM d\uc77c (E)","field-day":"\uc77c","field-year-relative+-1":"\uc9c0\ub09c\ud574","dayPeriods-format-wide-am":"\uc624\uc804","field-wed-relative+-1":"\uc9c0\ub09c \uc218\uc694\uc77c","dateTimeFormat-medium":"{1} {0}","field-second":"\ucd08","days-standAlone-narrow":"\uc77c\uc6d4\ud654\uc218\ubaa9\uae08\ud1a0".split(""),"dateFormatItem-Ehms":"(E) a h:mm:ss","dateFormat-long":"y\ub144 M\uc6d4 d\uc77c",
"dateFormatItem-GyMMMd":"G y\ub144 MMM d\uc77c","dateFormatItem-yMMMEd":"y\ub144 MMM d\uc77c (E)","dateFormatItem-MMMEEEEd":"MMM d\uc77c EEEE","quarters-standAlone-wide":["\uc81c 1/4\ubd84\uae30","\uc81c 2/4\ubd84\uae30","\uc81c 3/4\ubd84\uae30","\uc81c 4/4\ubd84\uae30"],"days-format-narrow":"\uc77c\uc6d4\ud654\uc218\ubaa9\uae08\ud1a0".split(""),"dateTimeFormats-appendItem-Timezone":"{0} {1}","field-mon-relative+-1":"\uc9c0\ub09c \uc6d4\uc694\uc77c","dateFormatItem-GyMMM":"G y\ub144 MMM","field-month":"\uc6d4",
"dateFormatItem-MMM":"LLL","field-dayperiod":"\uc624\uc804/\uc624\ud6c4","dayPeriods-format-narrow-pm":"p","dateFormat-medium":"y. M. d.","dateFormatItem-EEEEd":"d\uc77c EEEE",eraAbbr:["\uae30\uc6d0\uc804","\uc11c\uae30"],"quarters-standAlone-abbr":["1\ubd84\uae30","2\ubd84\uae30","3\ubd84\uae30","4\ubd84\uae30"],"dayPeriods-format-abbr-pm":"PM","field-mon-relative+0":"\uc774\ubc88 \uc6d4\uc694\uc77c","field-mon-relative+1":"\ub2e4\uc74c \uc6d4\uc694\uc77c","months-format-narrow":"1\uc6d4 2\uc6d4 3\uc6d4 4\uc6d4 5\uc6d4 6\uc6d4 7\uc6d4 8\uc6d4 9\uc6d4 10\uc6d4 11\uc6d4 12\uc6d4".split(" "),
"days-format-short":"\uc77c\uc6d4\ud654\uc218\ubaa9\uae08\ud1a0".split(""),"quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-wide-pm":"\uc624\ud6c4","field-sat-relative+-1":"\uc9c0\ub09c \ud1a0\uc694\uc77c","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormat-long":"{1} {0}","dateFormatItem-Md":"M. d.","field-hour":"\uc2dc","dateFormatItem-yQQQQ":"y\ub144 QQQQ","months-format-wide":"1\uc6d4 2\uc6d4 3\uc6d4 4\uc6d4 5\uc6d4 6\uc6d4 7\uc6d4 8\uc6d4 9\uc6d4 10\uc6d4 11\uc6d4 12\uc6d4".split(" "),
"dateFormat-full":"y\ub144 M\uc6d4 d\uc77c EEEE","field-month-relative+-1":"\uc9c0\ub09c\ub2ec","dateFormatItem-Hms":"H\uc2dc m\ubd84 s\ucd08","field-fri-relative+0":"\uc774\ubc88 \uae08\uc694\uc77c","field-fri-relative+1":"\ub2e4\uc74c \uae08\uc694\uc77c","dayPeriods-format-narrow-noon":"n","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",_localized:{},"field-week-relative+-1":"\uc9c0\ub09c\uc8fc","dateFormatItem-Ehm":"(E) a h:mm","months-format-abbr":"1\uc6d4 2\uc6d4 3\uc6d4 4\uc6d4 5\uc6d4 6\uc6d4 7\uc6d4 8\uc6d4 9\uc6d4 10\uc6d4 11\uc6d4 12\uc6d4".split(" "),
"timeFormat-long":"a h\uc2dc m\ubd84 s\ucd08 z","dateFormatItem-yMMM":"y\ub144 MMM","dateFormat-short":"yy. M. d.","days-standAlone-wide":"\uc77c\uc694\uc77c \uc6d4\uc694\uc77c \ud654\uc694\uc77c \uc218\uc694\uc77c \ubaa9\uc694\uc77c \uae08\uc694\uc77c \ud1a0\uc694\uc77c".split(" "),"dateFormatItem-yMMMEEEEd":"y\ub144 MMM d\uc77c EEEE","dateTimeFormats-appendItem-Era":"{1} {0}","dateFormatItem-mmss":"mm:ss","dateFormatItem-H":"H\uc2dc","dateFormatItem-M":"M\uc6d4","months-standAlone-wide":"1\uc6d4 2\uc6d4 3\uc6d4 4\uc6d4 5\uc6d4 6\uc6d4 7\uc6d4 8\uc6d4 9\uc6d4 10\uc6d4 11\uc6d4 12\uc6d4".split(" "),
"field-sun-relative+-1":"\uc9c0\ub09c \uc77c\uc694\uc77c","days-standAlone-abbr":"\uc77c\uc6d4\ud654\uc218\ubaa9\uae08\ud1a0".split(""),"dateTimeFormat-full":"{1} {0}","dateFormatItem-HHmmss":"HH:mm:ss","dateFormatItem-hm":"a h:mm","dateFormatItem-d":"d\uc77c","field-weekday":"\uc694\uc77c","field-sat-relative+0":"\uc774\ubc88 \ud1a0\uc694\uc77c","dateFormatItem-h":"a h\uc2dc","field-sat-relative+1":"\ub2e4\uc74c \ud1a0\uc694\uc77c","months-standAlone-abbr":"1\uc6d4 2\uc6d4 3\uc6d4 4\uc6d4 5\uc6d4 6\uc6d4 7\uc6d4 8\uc6d4 9\uc6d4 10\uc6d4 11\uc6d4 12\uc6d4".split(" "),
"dateFormatItem-yMM":"y. M.","timeFormat-full":"a h\uc2dc m\ubd84 s\ucd08 zzzz","dateFormatItem-MEd":"M. d. (E)","dateFormatItem-y":"y\ub144","field-thu-relative+0":"\uc774\ubc88 \ubaa9\uc694\uc77c","field-thu-relative+1":"\ub2e4\uc74c \ubaa9\uc694\uc77c","dateFormatItem-hms":"a h:mm:ss","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dayPeriods-format-abbr-noon":"noon","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-thu-relative+-1":"\uc9c0\ub09c \ubaa9\uc694\uc77c","dateFormatItem-yMd":"y. M. d.",
"field-week":"\uc8fc","quarters-standAlone-narrow":["1","2","3","4"],"quarters-format-wide":["\uc81c 1/4\ubd84\uae30","\uc81c 2/4\ubd84\uae30","\uc81c 3/4\ubd84\uae30","\uc81c 4/4\ubd84\uae30"],"dateFormatItem-Ed":"d\uc77c (E)","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","days-standAlone-short":"\uc77c\uc6d4\ud654\uc218\ubaa9\uae08\ud1a0".split(""),"quarters-format-abbr":["1\ubd84\uae30","2\ubd84\uae30","3\ubd84\uae30","4\ubd84\uae30"],"field-year-relative+0":"\uc62c\ud574","field-year-relative+1":"\ub0b4\ub144",
"field-fri-relative+-1":"\uc9c0\ub09c \uae08\uc694\uc77c",eraNarrow:["\uae30\uc6d0\uc804","\uc11c\uae30"],"dayPeriods-format-wide-noon":"noon","dateFormatItem-yQQQ":"y\ub144 QQQ","days-format-wide":"\uc77c\uc694\uc77c \uc6d4\uc694\uc77c \ud654\uc694\uc77c \uc218\uc694\uc77c \ubaa9\uc694\uc77c \uae08\uc694\uc77c \ud1a0\uc694\uc77c".split(" "),"dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateFormatItem-EHm":"(E) HH:mm","dateFormatItem-GyMMMEEEEd":"G y\ub144 MMM d\uc77c EEEE","field-zone":"\uc2dc\uac04\ub300",
"dateFormatItem-yM":"y. M.","dateFormatItem-MMMEd":"MMM d\uc77c (E)","dateFormatItem-EHms":"(E) HH:mm:ss","dateFormatItem-yMEd":"y. M. d. (E)","field-day-relative+-1":"\uc5b4\uc81c","field-day-relative+-2":"\uadf8\uc800\uaed8","days-format-abbr":"\uc77c\uc6d4\ud654\uc218\ubaa9\uae08\ud1a0".split(""),"field-sun-relative+0":"\uc774\ubc88 \uc77c\uc694\uc77c","field-sun-relative+1":"\ub2e4\uc74c \uc77c\uc694\uc77c","dateFormatItem-yMMMd":"y\ub144 MMM d\uc77c","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})",
"dateFormatItem-Gy":"G y\ub144","field-era":"\uc5f0\ud638","dateFormatItem-yMEEEEd":"y. M. d. EEEE"},"dijit/nls/loading":{_localized:{},loadingState:"\ub85c\ub4dc \uc911...",errorState:"\uc8c4\uc1a1\ud569\ub2c8\ub2e4. \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4."},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",
_localized:{},"decimalFormat-short":"000\uc870","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000\uc870",decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\uc774\uc804 \uc120\ud0dd\uc0ac\ud56d",
_localized:{},nextMessage:"\uae30\ud0c0 \uc120\ud0dd\uc0ac\ud56d"},"dijit/nls/common":{buttonOk:"\ud655\uc778",buttonCancel:"\ucde8\uc18c",_localized:{},buttonSave:"\uc800\uc7a5",itemClose:"\ub2eb\uae30"}});
//# sourceMappingURL=dojo_ko-kr.js.map

View File

@ -0,0 +1,16 @@
//>>built
define("dojo/nls/dojo_nb",{"dijit/form/nls/validate":{invalidMessage:"Den angitte verdien er ikke gyldig.",rangeMessage:"Denne verdien er utenfor gyldig omr\u00e5de.",_localized:{},missingMessage:"Denne verdien er obligatorisk."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h.mm a","days-standAlone-short":"s\u00f8. ma. ti. on. to. fr. l\u00f8.".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"n\u00e5","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Ukedag",
"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d.MM.y","field-wed-relative+0":"onsdag denne uken","field-wed-relative+1":"onsdag neste uke","dateFormatItem-GyMMMEd":"E d. MMM y G","dateFormatItem-MMMEd":"E d. MMM",eraNarrow:["f.Kr.","fvt.","e.Kr.","vt"],"dateFormatItem-yMM":"MM.y","field-tue-relative+-1":"tirsdag sist uke","days-format-short":"s\u00f8. ma. ti. on. to. fr. l\u00f8.".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d. MMMM y","field-fri-relative+-1":"fredag sist uke",
"field-wed-relative+-1":"onsdag sist uke","months-format-wide":"januar februar mars april mai juni juli august september oktober november desember".split(" "),"dateTimeFormat-medium":"{1}, {0}","dayPeriods-format-wide-pm":"p.m.","dateFormat-full":"EEEE d. MMMM y","field-thu-relative+-1":"torsdag sist uke","dateFormatItem-Md":"d.M.",_localized:{},"dayPeriods-format-abbr-am":"a.m.","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d.M.y",
"field-era":"Tidsalder","dateFormatItem-yM":"M.y","months-standAlone-wide":"januar februar mars april mai juni juli august september oktober november desember".split(" "),"timeFormat-short":"HH.mm","quarters-format-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"HH.mm.ss z","field-year":"\u00c5r","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"Time","dateFormatItem-MMdd":"d.M.","months-format-abbr":"jan. feb. mar. apr. mai jun. jul. aug. sep. okt. nov. des.".split(" "),
"field-sat-relative+0":"l\u00f8rdag denne uken","field-sat-relative+1":"l\u00f8rdag neste uke","timeFormat-full":"HH.mm.ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"i dag","field-thu-relative+0":"torsdag denne uken","field-day-relative+1":"i morgen","field-thu-relative+1":"torsdag neste uke","dateFormatItem-GyMMMd":"d. MMM y G","field-day-relative+2":"i overmorgen","dateFormatItem-H":"HH","months-standAlone-abbr":"jan feb mar apr mai jun jul aug sep okt nov des".split(" "),
"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L.","days-standAlone-wide":"s\u00f8ndag mandag tirsdag onsdag torsdag fredag l\u00f8rdag".split(" "),"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH.mm.ss","field-sun-relative+0":"s\u00f8ndag denne uken","dateFormatItem-Hm":"HH.mm","field-sun-relative+1":"s\u00f8ndag neste uke","quarters-standAlone-abbr":["K1","K2",
"K3","K4"],eraAbbr:["f.Kr.","e.Kr."],"field-minute":"Minutt","field-dayperiod":"AM/PM","days-standAlone-abbr":"s\u00f8. ma. ti. on. to. fr. l\u00f8.".split(" "),"dateFormatItem-d":"d.","dateFormatItem-ms":"mm.ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"i g\u00e5r","dateTimeFormat-long":"{1} 'kl.' {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"i forg\u00e5rs","dateFormatItem-MMMd":"d. MMM","dateFormatItem-MEd":"E d.M","dateTimeFormat-full":"{1} {0}",
"field-fri-relative+0":"fredag denne uken","field-fri-relative+1":"fredag neste uke","dateFormatItem-yMMMM":"MMMM y","field-day":"Dag","days-format-wide":"s\u00f8ndag mandag tirsdag onsdag torsdag fredag l\u00f8rdag".split(" "),"field-zone":"Tidssone","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"I fjor","field-month-relative+-1":"Sist m\u00e5ned","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h.mm a",
"dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"p.m.","days-format-abbr":"s\u00f8n. man. tir. ons. tor. fre. l\u00f8r.".split(" "),eraNames:["f.Kr.","e.Kr."],"dateFormatItem-yMMMd":"d. MMM y","days-format-narrow":"SMTOTFL".split(""),"field-month":"M\u00e5ned","days-standAlone-narrow":"SMTOTFL".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"tirsdag denne uken","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"tirsdag neste uke",
"dayPeriods-format-wide-am":"a.m.","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E HH.mm","field-mon-relative+0":"mandag denne uken","field-mon-relative+1":"mandag neste uke","dateFormat-short":"dd.MM.yy","dateFormatItem-EHms":"E HH.mm.ss","dateFormatItem-Ehms":"E h.mm.ss a","dayPeriods-format-narrow-noon":"n","field-second":"Sekund","field-sat-relative+-1":"l\u00f8rdag sist uke","dateFormatItem-yMMMEd":"E d. MMM y",
"field-sun-relative+-1":"s\u00f8ndag sist uke","field-month-relative+0":"Denne m\u00e5neden","field-month-relative+1":"Neste m\u00e5ned","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d.","field-week":"Uke","dateFormat-medium":"d. MMM y","field-week-relative+-1":"Sist uke","field-year-relative+0":"Dette \u00e5ret","field-year-relative+1":"Neste \u00e5r","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1}, {0}","dateFormatItem-Hms":"HH.mm.ss","dateFormatItem-hms":"h.mm.ss a",
"dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"mandag sist uke","field-week-relative+0":"Denne uken","field-week-relative+1":"Neste uke"},"dijit/nls/loading":{_localized:{},loadingState:"Laster inn...",errorState:"Det oppsto en feil"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"\u2212","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",
_localized:{},"decimalFormat-short":"000\u00a0bill","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4\u00a0#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 billioner",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Tidligere valg",
_localized:{},nextMessage:"Flere valg"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Avbryt",_localized:{},buttonSave:"Lagre",itemClose:"Lukk"}});
//# sourceMappingURL=dojo_nb.js.map

View File

@ -0,0 +1,15 @@
//>>built
define("dojo/nls/dojo_nl-nl",{"dijit/form/nls/validate":{invalidMessage:"De opgegeven waarde is ongeldig.",rangeMessage:"Deze waarde is niet toegestaan.",_localized:{},missingMessage:"Deze waarde is verplicht."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"zo ma di wo do vr za".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"nu","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Dag van de week","dateFormatItem-yQQQ":"QQQ y",
"dateFormatItem-yMEd":"E d-M-y","field-wed-relative+0":"deze woensdag","field-wed-relative+1":"volgende week woensdag","dateFormatItem-GyMMMEd":"E d MMM y G","dateFormatItem-MMMEd":"E d MMM",eraNarrow:["v.C.","vgj","n.C.","gj"],"field-tue-relative+-1":"afgelopen dinsdag","days-format-short":"zo ma di wo do vr za".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM y","field-fri-relative+-1":"afgelopen vrijdag","field-wed-relative+-1":"afgelopen woensdag","months-format-wide":"januari februari maart april mei juni juli augustus september oktober november december".split(" "),
"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE d MMMM y","field-thu-relative+-1":"afgelopen donderdag","dateFormatItem-Md":"d-M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"12 uur 's middags","dateFormatItem-yMd":"d-M-y","field-era":"Tijdperk","dateFormatItem-yM":"M-y","months-standAlone-wide":"januari februari maart april mei juni juli augustus september oktober november december".split(" "),
"timeFormat-short":"HH:mm","quarters-format-wide":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"HH:mm:ss z","field-year":"Jaar","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"Uur","months-format-abbr":"jan. feb. mrt. apr. mei jun. jul. aug. sep. okt. nov. dec.".split(" "),"field-sat-relative+0":"deze zaterdag","field-sat-relative+1":"volgende week zaterdag","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})",
"field-day-relative+0":"vandaag","field-thu-relative+0":"deze donderdag","field-day-relative+1":"morgen","field-thu-relative+1":"volgende week donderdag","dateFormatItem-GyMMMd":"d MMM y G","field-day-relative+2":"overmorgen","dateFormatItem-H":"HH","months-standAlone-abbr":"jan feb mrt apr mei jun jul aug sep okt nov dec".split(" "),"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L",
"days-standAlone-wide":"zondag maandag dinsdag woensdag donderdag vrijdag zaterdag".split(" "),"dateFormatItem-MMMMd":"d MMMM","dayPeriods-format-abbr-noon":"12 uur 's middags","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"deze zondag","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"volgende week zondag","quarters-standAlone-abbr":["K1","K2","K3","K4"],eraAbbr:["v.Chr.","n.Chr."],"field-minute":"Minuut","field-dayperiod":"AM/PM","days-standAlone-abbr":"zo ma di wo do vr za".split(" "),
"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"gisteren","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-h":"h a","field-day-relative+-2":"eergisteren","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E d-M","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"deze vrijdag","field-fri-relative+1":"volgende week vrijdag","dateFormatItem-yMMMM":"MMMM y","field-day":"Dag","days-format-wide":"zondag maandag dinsdag woensdag donderdag vrijdag zaterdag".split(" "),
"field-zone":"Zone","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"vorig jaar","field-month-relative+-1":"vorige maand","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"zo ma di wo do vr za".split(" "),eraNames:["Voor Christus","v\u00f3\u00f3r gewone jaartelling","na Christus",
"gewone jaartelling"],"dateFormatItem-yMMMd":"d MMM y","days-format-narrow":"ZMDWDVZ".split(""),"field-month":"Maand","days-standAlone-narrow":"ZMDWDVZ".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"deze dinsdag","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"volgende week dinsdag","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"deze maandag",
"field-mon-relative+1":"volgende week maandag","dateFormat-short":"dd-MM-yy","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"Seconde","field-sat-relative+-1":"afgelopen zaterdag","dateFormatItem-yMMMEd":"E d MMM y","field-sun-relative+-1":"afgelopen zondag","field-month-relative+0":"deze maand","field-month-relative+1":"volgende maand","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"Week",
"dateFormat-medium":"d MMM y","field-week-relative+-1":"vorige week","field-year-relative+0":"dit jaar","field-year-relative+1":"volgend jaar","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"afgelopen maandag","field-week-relative+0":"deze week","field-week-relative+1":"volgende week"},"dijit/nls/loading":{_localized:{},loadingState:"Bezig met laden...",errorState:"Er is een fout opgetreden"},
"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0bln'.'","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4\u00a0#,##0.00;(\u00a4\u00a0#,##0.00)",
"currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0%","decimalFormat-long":"000 biljoen",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Eerdere opties",_localized:{},nextMessage:"Meer opties"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Annuleren",_localized:{},buttonSave:"Opslaan",itemClose:"Sluiten"}});
//# sourceMappingURL=dojo_nl-nl.js.map

View File

@ -0,0 +1,17 @@
//>>built
define("dojo/nls/dojo_pl",{"dijit/form/nls/validate":{invalidMessage:"Wprowadzona warto\u015b\u0107 jest nieprawid\u0142owa.",rangeMessage:"Ta warto\u015b\u0107 jest spoza zakresu.",_localized:{},missingMessage:"Ta warto\u015b\u0107 jest wymagana."},"dojo/cldr/nls/gregorian":{"dateTimeFormats-appendItem-Year":"{1} {0}","field-tue-relative+-1":"w zesz\u0142y wtorek","field-year":"rok","dateFormatItem-Hm":"HH:mm","field-wed-relative+0":"w t\u0119 \u015brod\u0119","field-wed-relative+1":"w przysz\u0142\u0105 \u015brod\u0119",
"dayPeriods-format-wide-night":"w nocy","dateFormatItem-ms":"mm:ss","timeFormat-short":"HH:mm","field-minute":"minuta","dateTimeFormat-short":"{1}, {0}","field-day-relative+0":"dzisiaj","field-day-relative+1":"jutro","field-day-relative+2":"pojutrze","field-tue-relative+0":"w ten wtorek","field-tue-relative+1":"w przysz\u0142y wtorek","dayPeriods-format-narrow-am":"a","dateFormatItem-MMMd":"d MMM","dayPeriods-format-abbr-am":"AM","field-week-relative+0":"w tym tygodniu","field-month-relative+0":"w tym miesi\u0105cu",
"field-week-relative+1":"w przysz\u0142ym tygodniu","field-month-relative+1":"w przysz\u0142ym miesi\u0105cu","timeFormat-medium":"HH:mm:ss","field-second-relative+0":"teraz","dayPeriods-format-wide-afternoon":"po po\u0142udniu","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-narrow":"slmkmclswplg".split(""),eraNames:["p.n.e.","n.e."],"dateFormatItem-GyMMMEd":"E, d MMM y G","field-day":"dzie\u0144","field-year-relative+-1":"w zesz\u0142ym roku","dayPeriods-format-wide-am":"AM",
"field-wed-relative+-1":"w zesz\u0142\u0105 \u015brod\u0119","dateTimeFormat-medium":"{1}, {0}","field-second":"sekunda","days-standAlone-narrow":"NPW\u015aCPS".split(""),"dateFormatItem-Ehms":"E, h:mm:ss a","dateFormat-long":"d MMMM y","dateFormatItem-GyMMMd":"d MMM y G","dateFormatItem-yMMMEd":"E, d MMM y","quarters-standAlone-wide":["I kwarta\u0142","II kwarta\u0142","III kwarta\u0142","IV kwarta\u0142"],"days-format-narrow":"NPW\u015aCPS".split(""),"dateTimeFormats-appendItem-Timezone":"{0} {1}",
"field-mon-relative+-1":"w zesz\u0142y poniedzia\u0142ek","dateFormatItem-GyMMM":"MMM y G","field-month":"miesi\u0105c","dateFormatItem-MMM":"LLL","field-dayperiod":"rano / po po\u0142udniu / wieczorem","dayPeriods-format-narrow-pm":"p","dateFormat-medium":"d MMM y",eraAbbr:["p.n.e.","n.e."],"quarters-standAlone-abbr":["1 kw.","2 kw.","3 kw.","4 kw."],"dayPeriods-format-abbr-pm":"PM","field-mon-relative+0":"w ten poniedzia\u0142ek","field-mon-relative+1":"w przysz\u0142y poniedzia\u0142ek","months-format-narrow":"slmkmclswplg".split(""),
"days-format-short":"niedz. pon. wt. \u015br. czw. pt. sob.".split(" "),"quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-wide-pm":"PM","field-sat-relative+-1":"w zesz\u0142\u0105 sobot\u0119","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormat-long":"{1} {0}","dateFormatItem-Md":"d.MM","field-hour":"godzina","dateFormatItem-yQQQQ":"QQQQ y","months-format-wide":"stycznia lutego marca kwietnia maja czerwca lipca sierpnia wrze\u015bnia pa\u017adziernika listopada grudnia".split(" "),
"dateFormat-full":"EEEE, d MMMM y","field-month-relative+-1":"w zesz\u0142ym miesi\u0105cu","dayPeriods-format-wide-earlyMorning":"nad ranem","dateFormatItem-Hms":"HH:mm:ss","field-fri-relative+0":"w ten pi\u0105tek","field-fri-relative+1":"w przysz\u0142y pi\u0105tek","dayPeriods-format-narrow-noon":"n","dayPeriods-format-wide-morning":"rano","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",_localized:{},"field-week-relative+-1":"Zesz\u0142y tydzie\u0144","dateFormatItem-Ehm":"E, h:mm a","months-format-abbr":"sty lut mar kwi maj cze lip sie wrz pa\u017a lis gru".split(" "),
"timeFormat-long":"HH:mm:ss z","dateFormatItem-yMMM":"LLL y","dateFormat-short":"dd.MM.y","days-standAlone-wide":"niedziela poniedzia\u0142ek wtorek \u015broda czwartek pi\u0105tek sobota".split(" "),"dateTimeFormats-appendItem-Era":"{1} {0}","dateFormatItem-MMMMd":"d MMMM","dateFormatItem-H":"HH","dateFormatItem-M":"L","months-standAlone-wide":"stycze\u0144 luty marzec kwiecie\u0144 maj czerwiec lipiec sierpie\u0144 wrzesie\u0144 pa\u017adziernik listopad grudzie\u0144".split(" "),"field-sun-relative+-1":"w zesz\u0142\u0105 niedziel\u0119",
"days-standAlone-abbr":"niedz. pon. wt. \u015br. czw. pt. sob.".split(" "),"dateTimeFormat-full":"{1} {0}","dateFormatItem-hm":"h:mm a","dateFormatItem-d":"d","field-weekday":"dzie\u0144 tygodnia","field-sat-relative+0":"w t\u0119 sobot\u0119","dateFormatItem-h":"h a","field-sat-relative+1":"w przysz\u0142\u0105 sobot\u0119","dayPeriods-format-wide-lateMorning":"przed po\u0142udniem","months-standAlone-abbr":"sty lut mar kwi maj cze lip sie wrz pa\u017a lis gru".split(" "),"dateFormatItem-yMM":"MM.y",
"timeFormat-full":"HH:mm:ss zzzz","dateFormatItem-MEd":"E, d.MM","dateFormatItem-y":"y","field-thu-relative+0":"w ten czwartek","field-thu-relative+1":"w przysz\u0142y czwartek","dateFormatItem-hms":"h:mm:ss a","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dayPeriods-format-abbr-noon":"noon","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-thu-relative+-1":"w zesz\u0142y czwartek","dateFormatItem-yMd":"d.MM.y","field-week":"tydzie\u0144","quarters-standAlone-narrow":["1","2","3","4"],
"quarters-format-wide":["I kwarta\u0142","II kwarta\u0142","III kwarta\u0142","IV kwarta\u0142"],"dateFormatItem-Ed":"E, d","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","days-standAlone-short":"niedz. pon. wt. \u015br. czw. pt. sob.".split(" "),"dayPeriods-format-wide-evening":"wieczorem","quarters-format-abbr":["K1","K2","K3","K4"],"field-year-relative+0":"w tym roku","field-year-relative+1":"w przysz\u0142ym roku","field-fri-relative+-1":"w zesz\u0142y pi\u0105tek",eraNarrow:["p.n.e.","n.e."],
"dayPeriods-format-wide-noon":"w po\u0142udnie","dateFormatItem-yQQQ":"QQQ y","days-format-wide":"niedziela poniedzia\u0142ek wtorek \u015broda czwartek pi\u0105tek sobota".split(" "),"dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateFormatItem-EHm":"E, HH:mm","field-zone":"strefa czasowa","dateFormatItem-yM":"MM.y","dateFormatItem-yMMMM":"LLLL y","dateFormatItem-MMMEd":"E, d MMM","dateFormatItem-EHms":"E, HH:mm:ss","dateFormatItem-yMEd":"E, d.MM.y","field-day-relative+-1":"wczoraj","field-day-relative+-2":"przedwczoraj",
"days-format-abbr":"niedz. pon. wt. \u015br. czw. pt. sob.".split(" "),"field-sun-relative+0":"w t\u0119 niedziel\u0119","dateFormatItem-MMdd":"d.MM","field-sun-relative+1":"w przysz\u0142\u0105 niedziel\u0119","dateFormatItem-yMMMd":"d MMM y","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-Gy":"y G","field-era":"era"},"dijit/nls/loading":{_localized:{},loadingState:"\u0141adowanie...",errorState:"Niestety, wyst\u0105pi\u0142 b\u0142\u0105d"},"dojo/cldr/nls/number":{scientificFormat:"#E0",
"currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0bln","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4;(#,##0.00\u00a0\u00a4)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",
perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0%","decimalFormat-long":"000 biliona",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Poprzednie wybory",_localized:{},nextMessage:"Wi\u0119cej wybor\u00f3w"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Anuluj",_localized:{},buttonSave:"Zapisz",itemClose:"Zamknij"}});
//# sourceMappingURL=dojo_pl.js.map

View File

@ -0,0 +1,17 @@
//>>built
define("dojo/nls/dojo_pt-br",{"dijit/form/nls/validate":{invalidMessage:"O valor inserido n\u00e3o \u00e9 v\u00e1lido.",rangeMessage:"Este valor est\u00e1 fora do intervalo. ",_localized:{},missingMessage:"Este valor \u00e9 necess\u00e1rio."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E, h:mm a","days-standAlone-short":"dom seg ter qua qui sex s\u00e1b".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"agora","quarters-standAlone-narrow":["1","2","3","4"],
"field-weekday":"Dia da semana","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"E, dd/MM/y","field-wed-relative+0":"esta quarta-feira","field-wed-relative+1":"pr\u00f3xima quarta-feira","dateFormatItem-GyMMMEd":"E, d 'de' MMM 'de' y G","dateFormatItem-MMMEd":"E, d 'de' MMM",eraNarrow:["a.C.","d.C."],"dateFormatItem-yMM":"MM/y","field-tue-relative+-1":"ter\u00e7a-feira passada","dayPeriods-format-wide-morning":"manh\u00e3","days-format-short":"dom seg ter qua qui sex s\u00e1b".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}",
"dateFormat-long":"d 'de' MMMM 'de' y","field-fri-relative+-1":"sexta-feira passada","field-wed-relative+-1":"quarta-feira passada","months-format-wide":"janeiro fevereiro mar\u00e7o abril maio junho julho agosto setembro outubro novembro dezembro".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, d 'de' MMMM 'de' y","field-thu-relative+-1":"quinta-feira passada","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})",
"dayPeriods-format-wide-noon":"meio-dia","dateFormatItem-yMd":"dd/MM/y","field-era":"Era","dateFormatItem-yM":"MM/y","months-standAlone-wide":"janeiro fevereiro mar\u00e7o abril maio junho julho agosto setembro outubro novembro dezembro".split(" "),"timeFormat-short":"HH:mm","quarters-format-wide":["1\u00ba trimestre","2\u00ba trimestre","3\u00ba trimestre","4\u00ba trimestre"],"dateFormatItem-yQQQQ":"y QQQQ","timeFormat-long":"HH:mm:ss z","field-year":"Ano","dateFormatItem-yMMM":"MMM 'de' y","dateTimeFormats-appendItem-Era":"{1} {0}",
"field-hour":"Hora","dateFormatItem-MMdd":"dd/MM","months-format-abbr":"jan fev mar abr mai jun jul ago set out nov dez".split(" "),"field-sat-relative+0":"este s\u00e1bado","field-sat-relative+1":"pr\u00f3ximo s\u00e1bado","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"hoje","field-thu-relative+0":"esta quinta-feira","field-day-relative+1":"amanh\u00e3","field-thu-relative+1":"pr\u00f3xima quinta-feira","dateFormatItem-GyMMMd":"d 'de' MMM 'de' y G",
"field-day-relative+2":"depois de amanh\u00e3","dateFormatItem-H":"HH","months-standAlone-abbr":"jan fev mar abr mai jun jul ago set out nov dez".split(" "),"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1\u00ba trimestre","2\u00ba trimestre","3\u00ba trimestre","4\u00ba trimestre"],"dateFormatItem-Gy":"y G","dateFormatItem-HHmmss":"HH:mm:ss","dateFormatItem-M":"L","days-standAlone-wide":"domingo segunda-feira ter\u00e7a-feira quarta-feira quinta-feira sexta-feira s\u00e1bado".split(" "),
"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"este domingo","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"pr\u00f3ximo domingo","quarters-standAlone-abbr":["T1","T2","T3","T4"],eraAbbr:["a.C.","d.C."],"field-minute":"Minuto","field-dayperiod":"Per\u00edodo do dia","days-standAlone-abbr":"dom seg ter qua qui sex s\u00e1b".split(" "),"dayPeriods-format-wide-night":"noite","dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1",
"2","3","4"],"field-day-relative+-1":"ontem","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"anteontem","dateFormatItem-MMMd":"d 'de' MMM","dateFormatItem-MEd":"E, dd/MM","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"esta sexta-feira","field-fri-relative+1":"pr\u00f3xima sexta-feira","field-day":"Dia","days-format-wide":"domingo segunda-feira ter\u00e7a-feira quarta-feira quinta-feira sexta-feira s\u00e1bado".split(" "),
"field-zone":"Fuso","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"ano passado","field-month-relative+-1":"m\u00eas passado","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"dom seg ter qua qui sex s\u00e1b".split(" "),eraNames:["Antes de Cristo","Ano do Senhor"],"dateFormatItem-yMMMd":"d 'de' MMM 'de' y",
"days-format-narrow":"DSTQQSS".split(""),"field-month":"M\u00eas","days-standAlone-narrow":"DSTQQSS".split(""),"dateFormatItem-MMM":"LLL","dateFormatItem-HHmm":"HH:mm","field-tue-relative+0":"esta ter\u00e7a-feira","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"pr\u00f3xima ter\u00e7a-feira","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E, HH:mm","field-mon-relative+0":"esta segunda-feira",
"field-mon-relative+1":"pr\u00f3xima segunda-feira","dateFormat-short":"dd/MM/yy","dayPeriods-format-wide-afternoon":"tarde","dateFormatItem-EHms":"E, HH:mm:ss","dateFormatItem-Ehms":"E, h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"Segundo","field-sat-relative+-1":"s\u00e1bado passado","dateFormatItem-yMMMEd":"E, d 'de' MMM 'de' y","field-sun-relative+-1":"domingo passado","field-month-relative+0":"este m\u00eas","field-month-relative+1":"pr\u00f3ximo m\u00eas","dateTimeFormats-appendItem-Timezone":"{0} {1}",
"dateFormatItem-Ed":"E, d","field-week":"Semana","dateFormat-medium":"dd/MM/y","field-week-relative+-1":"semana passada","field-year-relative+0":"este ano","field-year-relative+1":"pr\u00f3ximo ano","dayPeriods-format-narrow-pm":"p","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM 'de' y G","field-mon-relative+-1":"segunda-feira passada","field-week-relative+0":"esta semana","field-week-relative+1":"pr\u00f3xima semana"},
"dijit/nls/loading":{_localized:{},loadingState:"Carregando...",errorState:"Desculpe, ocorreu um erro"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0tri","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",
currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0%","decimalFormat-long":"000 trilh\u00f5es",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Op\u00e7\u00f5es anteriores",_localized:{},nextMessage:"Mais op\u00e7\u00f5es"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Cancelar",_localized:{},
buttonSave:"Salvar",itemClose:"Fechar"}});
//# sourceMappingURL=dojo_pt-br.js.map

View File

@ -0,0 +1,17 @@
//>>built
define("dojo/nls/dojo_pt-pt",{"dijit/form/nls/validate":{invalidMessage:"O valor introduzido n\u00e3o \u00e9 v\u00e1lido.",rangeMessage:"Este valor encontra-se fora do intervalo.",_localized:{},missingMessage:"Este valor \u00e9 requerido."},"dojo/cldr/nls/gregorian":{"dateTimeFormats-appendItem-Year":"{1} {0}","field-tue-relative+-1":"ter\u00e7a-feira passada","field-year":"Ano","dateFormatItem-Hm":"HH:mm","field-wed-relative+0":"esta quarta-feira","field-wed-relative+1":"pr\u00f3xima quarta-feira",
"dayPeriods-format-wide-night":"noite","dateFormatItem-ms":"mm:ss","timeFormat-short":"HH:mm","field-minute":"Minuto","dateTimeFormat-short":"{1}, {0}","field-day-relative+0":"hoje","field-day-relative+1":"amanh\u00e3","field-day-relative+2":"depois de amanh\u00e3","field-tue-relative+0":"esta ter\u00e7a-feira","field-tue-relative+1":"pr\u00f3xima ter\u00e7a-feira","dayPeriods-format-narrow-am":"a.m.","dateFormatItem-MMMd":"d/MM","dayPeriods-format-abbr-am":"a.m.","field-week-relative+0":"esta semana",
"field-month-relative+0":"este m\u00eas","field-week-relative+1":"pr\u00f3xima semana","field-month-relative+1":"pr\u00f3ximo m\u00eas","timeFormat-medium":"HH:mm:ss","field-second-relative+0":"agora","dayPeriods-format-wide-afternoon":"tarde","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-narrow":"JFMAMJJASOND".split(""),eraNames:["a.C.","d.C."],"dayPeriods-standAlone-abbr-pm":"p.m.","dateFormatItem-GyMMMEd":"E, d 'de' MMM 'de' y G","field-day":"Dia","field-year-relative+-1":"ano passado",
"dayPeriods-format-wide-am":"da manh\u00e3","field-wed-relative+-1":"quarta-feira passada","dateTimeFormat-medium":"{1}, {0}","field-second":"Segundo","days-standAlone-narrow":"DSTQQSS".split(""),"dayPeriods-standAlone-wide-pm":"p.m.","dateFormatItem-Ehms":"E, h:mm:ss a","dateFormat-long":"d 'de' MMMM 'de' y","dateFormatItem-GyMMMd":"d 'de' MMM 'de' y G","dateFormatItem-yMMMEd":"E, d/MM/y","quarters-standAlone-wide":["1.\u00ba trimestre","2.\u00ba trimestre","3.\u00ba trimestre","4.\u00ba trimestre"],
"days-format-narrow":"DSTQQSS".split(""),"dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-HHmm":"HH:mm","field-mon-relative+-1":"segunda-feira passada","dateFormatItem-GyMMM":"MMM 'de' y G","field-month":"M\u00eas","dateFormatItem-MMM":"LLL","field-dayperiod":"Da manh\u00e3/da tarde","dayPeriods-format-narrow-pm":"p.m.","dateFormat-medium":"dd/MM/y",eraAbbr:["a.C.","d.C."],"quarters-standAlone-abbr":["T1","T2","T3","T4"],"dayPeriods-format-abbr-pm":"p.m.","field-mon-relative+0":"esta segunda-feira",
"field-mon-relative+1":"pr\u00f3xima segunda-feira","months-format-narrow":"JFMAMJJASOND".split(""),"days-format-short":"do sg te qu qi sx sb".split(" "),"quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-wide-pm":"da tarde","field-sat-relative+-1":"s\u00e1bado passado","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormat-long":"{1} '\u00e0s' {0}","dateFormatItem-Md":"d/M","field-hour":"Hora","dateFormatItem-yQQQQ":"QQQQ 'de' y","months-format-wide":"Janeiro Fevereiro Mar\u00e7o Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro".split(" "),
"dateFormat-full":"EEEE, d 'de' MMMM 'de' y","field-month-relative+-1":"m\u00eas passado","dateFormatItem-Hms":"HH:mm:ss","field-fri-relative+0":"esta sexta-feira","field-fri-relative+1":"pr\u00f3xima sexta-feira","dayPeriods-format-narrow-noon":"n","dayPeriods-format-wide-morning":"manh\u00e3","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",_localized:{},"field-week-relative+-1":"semana passada","dateFormatItem-Ehm":"E, h:mm a","months-format-abbr":"Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez".split(" "),
"timeFormat-long":"HH:mm:ss z","dateFormatItem-yMMM":"MM/y","dateFormat-short":"dd/MM/yy","days-standAlone-wide":"domingo segunda-feira ter\u00e7a-feira quarta-feira quinta-feira sexta-feira s\u00e1bado".split(" "),"dateTimeFormats-appendItem-Era":"{1} {0}","dateFormatItem-yMMMEEEEd":"EEEE, d/MM/y","dateFormatItem-MMMMd":"d 'de' MMMM","dateFormatItem-H":"HH","dateFormatItem-M":"L","months-standAlone-wide":"Janeiro Fevereiro Mar\u00e7o Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro".split(" "),
"dateFormatItem-yMMMMEd":"E, d 'de' MMMM 'de' y","field-sun-relative+-1":"domingo passado","days-standAlone-abbr":"dom seg ter qua qui sex s\u00e1b".split(" "),"dateFormatItem-MMMMEd":"E, d 'de' MMMM","dateTimeFormat-full":"{1} '\u00e0s' {0}","dateFormatItem-HHmmss":"HH:mm:ss","dateFormatItem-hm":"h:mm a","dateFormatItem-d":"d","field-weekday":"Dia da semana","field-sat-relative+0":"este s\u00e1bado","dateFormatItem-h":"h a","field-sat-relative+1":"pr\u00f3ximo s\u00e1bado","months-standAlone-abbr":"Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez".split(" "),
"dateFormatItem-yMM":"MM/y","timeFormat-full":"HH:mm:ss zzzz","dateFormatItem-MEd":"E, dd/MM","dateFormatItem-y":"y","field-thu-relative+0":"esta quinta-feira","field-thu-relative+1":"pr\u00f3xima quinta-feira","dateFormatItem-hms":"h:mm:ss a","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dayPeriods-format-abbr-noon":"noon","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-thu-relative+-1":"quinta-feira passada","dateFormatItem-yMd":"dd/MM/y","field-week":"Semana","quarters-standAlone-narrow":["1",
"2","3","4"],"quarters-format-wide":["1.\u00ba trimestre","2.\u00ba trimestre","3.\u00ba trimestre","4.\u00ba trimestre"],"dateFormatItem-Ed":"E, d","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","days-standAlone-short":"do sg te qu qi sx sb".split(" "),"quarters-format-abbr":["T1","T2","T3","T4"],"field-year-relative+0":"este ano","field-year-relative+1":"pr\u00f3ximo ano","field-fri-relative+-1":"sexta-feira passada",eraNarrow:["a.C.","d.C."],"dayPeriods-format-wide-noon":"meio-dia","dateFormatItem-yQQQ":"QQQQ 'de' y",
"days-format-wide":"domingo segunda-feira ter\u00e7a-feira quarta-feira quinta-feira sexta-feira s\u00e1bado".split(" "),"dateFormatItem-yMMMMd":"d 'de' MMMM 'de' y","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateFormatItem-EHm":"E, HH:mm","field-zone":"Fuso hor\u00e1rio","dateFormatItem-yM":"MM/y","dateFormatItem-yMMMM":"MMMM 'de' y","dateFormatItem-MMMEd":"E, d/MM","dateFormatItem-EHms":"E, HH:mm:ss","dateFormatItem-yMEd":"E, dd/MM/y","field-day-relative+-1":"ontem","dayPeriods-standAlone-abbr-am":"a.m.",
"field-day-relative+-2":"anteontem","days-format-abbr":"dom seg ter qua qui sex s\u00e1b".split(" "),"field-sun-relative+0":"este domingo","dateFormatItem-MMdd":"dd/MM","field-sun-relative+1":"pr\u00f3ximo domingo","dateFormatItem-yMMMd":"d/MM/y","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-Gy":"y G","field-era":"Era","dayPeriods-standAlone-wide-am":"a.m."},"dijit/nls/loading":{_localized:{},loadingState:"A carregar...",errorState:"Lamentamos, mas ocorreu um erro"},"dojo/cldr/nls/number":{scientificFormat:"#E0",
"currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0Bi","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4;(#,##0.00\u00a0\u00a4)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",
perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0%","decimalFormat-long":"000 bili\u00f5es",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Op\u00e7\u00f5es anteriores",_localized:{},nextMessage:"Mais op\u00e7\u00f5es"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Cancelar",_localized:{},buttonSave:"Guardar",itemClose:"Fechar"}});
//# sourceMappingURL=dojo_pt-pt.js.map

View File

@ -0,0 +1,26 @@
//>>built
define("dojo/nls/dojo_ru",{"dijit/form/nls/validate":{invalidMessage:"\u0423\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.",rangeMessage:"\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.",_localized:{},missingMessage:"\u042d\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435."},
"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"\u0432\u0441 \u043f\u043d \u0432\u0442 \u0441\u0440 \u0447\u0442 \u043f\u0442 \u0441\u0431".split(" "),"months-format-narrow":"\u042f\u0424\u041c\u0410\u041c\u0418\u0418\u0410\u0421\u041e\u041d\u0414".split(""),"field-second-relative+0":"\u0441\u0435\u0439\u0447\u0430\u0441","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"\u0414\u0435\u043d\u044c \u043d\u0435\u0434\u0435\u043b\u0438","dateFormatItem-yQQQ":"QQQ y '\u0433'.",
"dateFormatItem-yMEd":"ccc, d.MM.y '\u0433'.","field-wed-relative+0":"\u0432 \u044d\u0442\u0443 \u0441\u0440\u0435\u0434\u0443","field-wed-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0440\u0435\u0434\u0443","dateFormatItem-GyMMMEd":"E, d MMM y G","dateFormatItem-MMMEd":"ccc, d MMM",eraNarrow:["\u0434\u043e \u043d.\u044d.","\u043d.\u044d."],"dateFormatItem-yMM":"MM.y","field-tue-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0432\u0442\u043e\u0440\u043d\u0438\u043a",
"days-format-short":"\u0432\u0441 \u043f\u043d \u0432\u0442 \u0441\u0440 \u0447\u0442 \u043f\u0442 \u0441\u0431".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM y '\u0433'.","field-fri-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u0443\u044e \u043f\u044f\u0442\u043d\u0438\u0446\u0443","field-wed-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u0443\u044e \u0441\u0440\u0435\u0434\u0443","months-format-wide":"\u044f\u043d\u0432\u0430\u0440\u044f \u0444\u0435\u0432\u0440\u0430\u043b\u044f \u043c\u0430\u0440\u0442\u0430 \u0430\u043f\u0440\u0435\u043b\u044f \u043c\u0430\u044f \u0438\u044e\u043d\u044f \u0438\u044e\u043b\u044f \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f \u043e\u043a\u0442\u044f\u0431\u0440\u044f \u043d\u043e\u044f\u0431\u0440\u044f \u0434\u0435\u043a\u0430\u0431\u0440\u044f".split(" "),
"dateTimeFormat-medium":"{1}, {0}","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, d MMMM y '\u0433'.","field-thu-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0447\u0435\u0442\u0432\u0435\u0440\u0433","dateFormatItem-Md":"dd.MM",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"dd.MM.y","field-era":"\u042d\u0440\u0430","dateFormatItem-yM":"MM.y","months-standAlone-wide":"\u042f\u043d\u0432\u0430\u0440\u044c \u0424\u0435\u0432\u0440\u0430\u043b\u044c \u041c\u0430\u0440\u0442 \u0410\u043f\u0440\u0435\u043b\u044c \u041c\u0430\u0439 \u0418\u044e\u043d\u044c \u0418\u044e\u043b\u044c \u0410\u0432\u0433\u0443\u0441\u0442 \u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c \u041e\u043a\u0442\u044f\u0431\u0440\u044c \u041d\u043e\u044f\u0431\u0440\u044c \u0414\u0435\u043a\u0430\u0431\u0440\u044c".split(" "),
"timeFormat-short":"H:mm","quarters-format-wide":["1-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b","2-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b","3-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b","4-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b"],"dateFormatItem-yQQQQ":"QQQQ y '\u0433'.","timeFormat-long":"H:mm:ss z","field-year":"\u0413\u043e\u0434","dateFormatItem-yMMM":"LLL y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"\u0427\u0430\u0441","dateFormatItem-MMdd":"dd.MM",
"months-format-abbr":"\u044f\u043d\u0432. \u0444\u0435\u0432\u0440. \u043c\u0430\u0440\u0442\u0430 \u0430\u043f\u0440. \u043c\u0430\u044f \u0438\u044e\u043d\u044f \u0438\u044e\u043b\u044f \u0430\u0432\u0433. \u0441\u0435\u043d\u0442. \u043e\u043a\u0442. \u043d\u043e\u044f\u0431. \u0434\u0435\u043a.".split(" "),"field-sat-relative+0":"\u0432 \u044d\u0442\u0443 \u0441\u0443\u0431\u0431\u043e\u0442\u0443","field-sat-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0443\u0431\u0431\u043e\u0442\u0443",
"timeFormat-full":"H:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"\u0441\u0435\u0433\u043e\u0434\u043d\u044f","dateFormatItem-E":"ccc","field-thu-relative+0":"\u0432 \u044d\u0442\u043e\u0442 \u0447\u0435\u0442\u0432\u0435\u0440\u0433","field-day-relative+1":"\u0437\u0430\u0432\u0442\u0440\u0430","field-thu-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0447\u0435\u0442\u0432\u0435\u0440\u0433","dateFormatItem-GyMMMd":"d MMM y '\u0433'. G",
"field-day-relative+2":"\u043f\u043e\u0441\u043b\u0435\u0437\u0430\u0432\u0442\u0440\u0430","dateFormatItem-H":"H","months-standAlone-abbr":"\u042f\u043d\u0432. \u0424\u0435\u0432\u0440. \u041c\u0430\u0440\u0442 \u0410\u043f\u0440. \u041c\u0430\u0439 \u0418\u044e\u043d\u044c \u0418\u044e\u043b\u044c \u0410\u0432\u0433. \u0421\u0435\u043d\u0442. \u041e\u043a\u0442. \u041d\u043e\u044f\u0431. \u0414\u0435\u043a.".split(" "),"quarters-format-abbr":["1-\u0439 \u043a\u0432.","2-\u0439 \u043a\u0432.","3-\u0439 \u043a\u0432.",
"4-\u0439 \u043a\u0432."],"quarters-standAlone-wide":["1-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b","2-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b","3-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b","4-\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435 \u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a \u0412\u0442\u043e\u0440\u043d\u0438\u043a \u0421\u0440\u0435\u0434\u0430 \u0427\u0435\u0442\u0432\u0435\u0440\u0433 \u041f\u044f\u0442\u043d\u0438\u0446\u0430 \u0421\u0443\u0431\u0431\u043e\u0442\u0430".split(" "),
"dateFormatItem-yLLLL":"LLLL y","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H:mm:ss","field-sun-relative+0":"\u0432 \u044d\u0442\u043e \u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435","dateFormatItem-Hm":"H:mm","field-sun-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435","quarters-standAlone-abbr":["1-\u0439 \u043a\u0432.","2-\u0439 \u043a\u0432.","3-\u0439 \u043a\u0432.",
"4-\u0439 \u043a\u0432."],eraAbbr:["\u0434\u043e \u043d. \u044d.","\u043d. \u044d."],"field-minute":"\u041c\u0438\u043d\u0443\u0442\u0430","field-dayperiod":"\u0414\u041f/\u041f\u041f","days-standAlone-abbr":"\u0412\u0441 \u041f\u043d \u0412\u0442 \u0421\u0440 \u0427\u0442 \u041f\u0442 \u0421\u0431".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"\u0432\u0447\u0435\u0440\u0430","dateTimeFormat-long":"{1}, {0}","dayPeriods-format-narrow-am":"AM",
"dateFormatItem-h":"h a","field-day-relative+-2":"\u043f\u043e\u0437\u0430\u0432\u0447\u0435\u0440\u0430","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E, dd.MM","dateTimeFormat-full":"{1}, {0}","field-fri-relative+0":"\u0432 \u044d\u0442\u0443 \u043f\u044f\u0442\u043d\u0438\u0446\u0443","field-fri-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043f\u044f\u0442\u043d\u0438\u0446\u0443","dateFormatItem-yMMMM":"LLLL y","field-day":"\u0414\u0435\u043d\u044c","days-format-wide":"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435 \u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a \u0432\u0442\u043e\u0440\u043d\u0438\u043a \u0441\u0440\u0435\u0434\u0430 \u0447\u0435\u0442\u0432\u0435\u0440\u0433 \u043f\u044f\u0442\u043d\u0438\u0446\u0430 \u0441\u0443\u0431\u0431\u043e\u0442\u0430".split(" "),
"field-zone":"\u0427\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441","months-standAlone-narrow":"\u042f\u0424\u041c\u0410\u041c\u0418\u0418\u0410\u0421\u041e\u041d\u0414".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443","field-month-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u043c\u0435\u0441\u044f\u0446\u0435","dateTimeFormats-appendItem-Year":"{1} {0}",
"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"\u0432\u0441 \u043f\u043d \u0432\u0442 \u0441\u0440 \u0447\u0442 \u043f\u0442 \u0441\u0431".split(" "),eraNames:["\u0434\u043e \u043d.\u044d.","\u043d.\u044d."],"dateFormatItem-yMMMd":"d MMM y '\u0433'.","days-format-narrow":"\u0432\u0441 \u043f\u043d \u0432\u0442 \u0441\u0440 \u0447\u0442 \u043f\u0442 \u0441\u0431".split(" "),"field-month":"\u041c\u0435\u0441\u044f\u0446",
"days-standAlone-narrow":"\u0412\u041f\u0412\u0421\u0427\u041f\u0421".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"\u0432 \u044d\u0442\u043e\u0442 \u0432\u0442\u043e\u0440\u043d\u0438\u043a","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0442\u043e\u0440\u043d\u0438\u043a","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})",
"dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"\u0432 \u044d\u0442\u043e\u0442 \u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a","field-mon-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a","dateFormat-short":"dd.MM.yy","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"\u0421\u0435\u043a\u0443\u043d\u0434\u0430",
"field-sat-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u0443\u044e \u0441\u0443\u0431\u0431\u043e\u0442\u0443","dateFormatItem-yMMMEd":"E, d MMM y","field-sun-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0435 \u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435","field-month-relative+0":"\u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u044f\u0446\u0435","field-month-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043c\u0435\u0441\u044f\u0446\u0435",
"dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"ccc, d","field-week":"\u041d\u0435\u0434\u0435\u043b\u044f","dateFormat-medium":"d MMM y '\u0433'.","field-week-relative+-1":"\u043d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0435","field-year-relative+0":"\u0432 \u044d\u0442\u043e\u043c\u0443 \u0433\u043e\u0434\u0443","field-year-relative+1":"\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0433\u043e\u0434\u0443","dayPeriods-format-narrow-pm":"PM",
"dateTimeFormat-short":"{1}, {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"LLL y G","field-mon-relative+-1":"\u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a","field-week-relative+0":"\u043d\u0430 \u044d\u0442\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0435","field-week-relative+1":"\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043d\u0435\u0434\u0435\u043b\u0435"},
"dijit/nls/loading":{_localized:{},loadingState:"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...",errorState:"\u0418\u0437\u0432\u0438\u043d\u0438\u0442\u0435, \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",
_localized:{},"decimalFormat-short":"000\u00a0\u0442\u0440\u043b\u043d","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"\u043d\u0435\u00a0\u0447\u0438\u0441\u043b\u043e",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 \u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u0430",decimalFormat:"#,##0.###",
decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b",_localized:{},nextMessage:"\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"\u041e\u0442\u043c\u0435\u043d\u0430",_localized:{},buttonSave:"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c",
itemClose:"\u0417\u0430\u043a\u0440\u044b\u0442\u044c"}});
//# sourceMappingURL=dojo_ru.js.map

View File

@ -0,0 +1,17 @@
//>>built
define("dojo/nls/dojo_sk",{"dijit/form/nls/validate":{invalidMessage:"Zadan\u00e1 hodnota nie je platn\u00e1.",rangeMessage:"T\u00e1to hodnota je mimo rozsah.",_localized:{},missingMessage:"T\u00e1to hodnota je povinn\u00e1."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm","days-standAlone-short":"Ne Po Ut St \u0160t Pi So".split(" "),"months-format-narrow":"jfmamjjasond".split(""),"field-second-relative+0":"teraz","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"De\u0148 v t\u00fd\u017edni",
"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d. M. y","field-wed-relative+0":"T\u00fato stredu","field-wed-relative+1":"Bud\u00facu stredu","dateFormatItem-GyMMMEd":"E, d. MMM y G","dateFormatItem-MMMEd":"E, d. MMM.",eraNarrow:["pred n.l.","n.l."],"field-tue-relative+-1":"Minul\u00fd utorok","days-format-short":"Ne Po Ut St \u0160t Pi So".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d. MMMM y","field-fri-relative+-1":"Minul\u00fd piatok","field-wed-relative+-1":"Minul\u00fa stredu",
"months-format-wide":"janu\u00e1ra febru\u00e1ra marca apr\u00edla m\u00e1ja j\u00fana j\u00fala augusta septembra okt\u00f3bra novembra decembra".split(" "),"dateTimeFormat-medium":"{1} {0}","dateFormatItem-yMMMMd":"d. MMMM y","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, d. MMMM y","field-thu-relative+-1":"Minul\u00fd \u0161tvrtok","dateFormatItem-Md":"d.M.",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon",
"dateFormatItem-yMd":"d.M.y","field-era":"\u00c9ra","dateFormatItem-yM":"M.y","months-standAlone-wide":"janu\u00e1r febru\u00e1r marec apr\u00edl m\u00e1j j\u00fan j\u00fal august september okt\u00f3ber november december".split(" "),"timeFormat-short":"H:mm","quarters-format-wide":["1. \u0161tvr\u0165rok","2. \u0161tvr\u0165rok","3. \u0161tvr\u0165rok","4. \u0161tvr\u0165rok"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"H:mm:ss z","field-year":"Rok","dateFormatItem-yMMM":"LLL y","dateTimeFormats-appendItem-Era":"{1} {0}",
"field-hour":"Hodina","months-format-abbr":"jan feb mar apr m\u00e1j j\u00fan j\u00fal aug sep okt nov dec".split(" "),"field-sat-relative+0":"T\u00fato sobotu","field-sat-relative+1":"Bud\u00facu sobotu","timeFormat-full":"H:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"Dnes","field-thu-relative+0":"Tento \u0161tvrtok","field-day-relative+1":"Zajtra","field-thu-relative+1":"Bud\u00faci \u0161tvrtok","dateFormatItem-GyMMMd":"d.M.y G","field-day-relative+2":"Pozajtra",
"dateFormatItem-H":"H","months-standAlone-abbr":"jan feb mar apr m\u00e1j j\u00fan j\u00fal aug sep okt nov dec".split(" "),"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["1. \u0161tvr\u0165rok","2. \u0161tvr\u0165rok","3. \u0161tvr\u0165rok","4. \u0161tvr\u0165rok"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L.","days-standAlone-wide":"nede\u013ea pondelok utorok streda \u0161tvrtok piatok sobota".split(" "),"dateFormatItem-MMMMd":"d. MMMM","dateFormatItem-GyMMMMd":"d. MMMM y G",
"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"H:mm:ss","field-sun-relative+0":"T\u00fato nede\u013eu","dateFormatItem-Hm":"H:mm","field-sun-relative+1":"Bud\u00facu nede\u013eu","quarters-standAlone-abbr":["1Q","2Q","3Q","4Q"],eraAbbr:["pred n.l.","n.l."],"field-minute":"Min\u00fata","field-dayperiod":"\u010cas\u0165 d\u0148a","days-standAlone-abbr":"ne po ut st \u0161t pi so".split(" "),"dateFormatItem-d":"d.","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"V\u010dera",
"dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"Predv\u010derom","dateFormatItem-MMMd":"d. MMM.","dateFormatItem-MEd":"E, d.M.","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"Tento piatok","field-fri-relative+1":"Bud\u00faci piatok","dateFormatItem-yMMMM":"LLLL y","field-day":"De\u0148","days-format-wide":"nede\u013ea pondelok utorok streda \u0161tvrtok piatok sobota".split(" "),"field-zone":"\u010casov\u00e9 p\u00e1smo",
"months-standAlone-narrow":"jfmamjjasond".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"Minul\u00fd rok","field-month-relative+-1":"Posledn\u00fd mesiac","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"ne po ut st \u0161t pi so".split(" "),eraNames:["pred n.l.","n.l."],"dateFormatItem-yMMMd":"d.M.y","days-format-narrow":"NPUS\u0160PS".split(""),
"field-month":"Mesiac","days-standAlone-narrow":"NPUS\u0160PS".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"Tento utorok","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"Bud\u00faci utorok","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E, d. MMMM","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"Tento pondelok","field-mon-relative+1":"Bud\u00faci pondelok",
"dateFormat-short":"d.M.y","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss","dayPeriods-format-narrow-noon":"n","field-second":"Sekunda","field-sat-relative+-1":"Minul\u00fa sobotu","dateFormatItem-yMMMEd":"E, d. MMM y","field-sun-relative+-1":"Minul\u00fa nede\u013eu","field-month-relative+0":"Tento mesiac","field-month-relative+1":"Bud\u00faci mesiac","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d.","field-week":"T\u00fd\u017ede\u0148","dateFormat-medium":"d.M.y",
"field-week-relative+-1":"Minul\u00fd t\u00fd\u017ede\u0148","field-year-relative+0":"Tento rok","field-year-relative+1":"Bud\u00faci rok","dayPeriods-format-narrow-pm":"p","dateFormatItem-mmss":"mm:ss","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"LLL y G","field-mon-relative+-1":"Minul\u00fd pondelok","field-week-relative+0":"Tento t\u00fd\u017ede\u0148","field-week-relative+1":"Bud\u00faci t\u00fd\u017ede\u0148"},"dijit/nls/loading":{_localized:{},
loadingState:"Zav\u00e1dza sa...",errorState:"\u013dutujeme, ale vyskytla sa chyba"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0bil'.'","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",
currencyFormat:"#,##0.00\u00a0\u00a4;(#,##0.00\u00a0\u00a4)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 bili\u00f3nov",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"Predch\u00e1dzaj\u00face mo\u017enosti",_localized:{},nextMessage:"Viac mo\u017enost\u00ed"},"dijit/nls/common":{buttonOk:"OK",
buttonCancel:"Zru\u0161i\u0165",_localized:{},buttonSave:"Ulo\u017ei\u0165",itemClose:"Zatvori\u0165"}});
//# sourceMappingURL=dojo_sk.js.map

View File

@ -0,0 +1,16 @@
//>>built
define("dojo/nls/dojo_sl",{"dijit/form/nls/validate":{invalidMessage:"Vnesena vrednost ni veljavna.",rangeMessage:"Ta vrednost je izven obmo\u010dja.",_localized:{},missingMessage:"Ta vrednost je zahtevana."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h.mm a","days-standAlone-short":"ned. pon. tor. sre. \u010det. pet. sob.".split(" "),"months-format-narrow":"jfmamjjasond".split(""),"field-second-relative+0":"zdaj","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Dan v tednu",
"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E, d. M. y","field-wed-relative+0":"To sredo","field-wed-relative+1":"Naslednjo sredo","dateFormatItem-GyMMMEd":"E, d. MMM y G","dateFormatItem-MMMEd":"E, d. MMM",eraNarrow:["pr. n. \u0161t.","po Kr.","po n. \u0161t."],"field-tue-relative+-1":"Prej\u0161nji torek","days-format-short":"ned. pon. tor. sre. \u010det. pet. sob.".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"dd. MMMM y","field-fri-relative+-1":"Prej\u0161nji petek",
"field-wed-relative+-1":"Prej\u0161njo sredo","months-format-wide":"januar februar marec april maj junij julij avgust september oktober november december".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"pop.","dateFormat-full":"EEEE, dd. MMMM y","field-thu-relative+-1":"Prej\u0161nji \u010detrtek","dateFormatItem-Md":"d. M.",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d. M. y",
"field-era":"Doba","dateFormatItem-yM":"M/y","months-standAlone-wide":"januar februar marec april maj junij julij avgust september oktober november december".split(" "),"timeFormat-short":"HH.mm","quarters-format-wide":["1. \u010detrtletje","2. \u010detrtletje","3. \u010detrtletje","4. \u010detrtletje"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"HH.mm.ss z","field-year":"Leto","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"Ura","months-format-abbr":"jan. feb. mar. apr. maj jun. jul. avg. sep. okt. nov. dec.".split(" "),
"field-sat-relative+0":"To soboto","field-sat-relative+1":"Naslednjo soboto","timeFormat-full":"HH.mm.ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"Danes","field-thu-relative+0":"Ta \u010detrtek","field-day-relative+1":"Jutri","field-thu-relative+1":"Naslednji \u010detrtek","dateFormatItem-GyMMMd":"d. MMM y G","field-day-relative+2":"Pojutri\u0161njem","dateFormatItem-H":"HH","months-standAlone-abbr":"jan feb mar apr maj jun jul avg sep okt nov dec".split(" "),
"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["1. \u010detrtletje","2. \u010detrtletje","3. \u010detrtletje","4. \u010detrtletje"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"nedelja ponedeljek torek sreda \u010detrtek petek sobota".split(" "),"dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH.mm.ss","field-sun-relative+0":"To nedeljo","dateFormatItem-Hm":"HH.mm","field-sun-relative+1":"Naslednjo nedeljo","quarters-standAlone-abbr":["Q1",
"Q2","Q3","Q4"],eraAbbr:["pr. n. \u0161t.","po Kr.","po n. \u0161t."],"field-minute":"Minuta","field-dayperiod":"\u010cas dneva","days-standAlone-abbr":"ned pon tor sre \u010det pet sob".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm.ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"V\u010deraj","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"Predv\u010deraj\u0161njim","dateFormatItem-MMMd":"d. MMM",
"dateFormatItem-MEd":"E, d. MM.","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"Ta petek","field-fri-relative+1":"Naslednji petek","dateFormatItem-yMMMM":"MMMM y","field-day":"Dan","days-format-wide":"nedelja ponedeljek torek sreda \u010detrtek petek sobota".split(" "),"field-zone":"Obmo\u010dje","months-standAlone-narrow":"jfmamjjasond".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"Lani","field-month-relative+-1":"Prej\u0161nji mesec",
"dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h.mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"ned. pon. tor. sre. \u010det. pet. sob.".split(" "),"dateFormatItem-GyM":"M/y G",eraNames:["pred na\u0161im \u0161tetjem","na\u0161e \u0161tetje","po n. \u0161t."],"dateFormatItem-yMMMd":"d. MMM y","days-format-narrow":"npts\u010dps".split(""),"field-month":"Mesec","days-standAlone-narrow":"npts\u010dps".split(""),"dateFormatItem-MMM":"LLL",
"field-tue-relative+0":"Ta torek","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"Naslednji torek","dayPeriods-format-wide-am":"dop.","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-EHm":"E HH.mm","field-mon-relative+0":"Ta ponedeljek","field-mon-relative+1":"Naslednji ponedeljek","dateFormat-short":"d. MM. yy","dateFormatItem-EHms":"E HH.mm.ss","dateFormatItem-Ehms":"E h.mm.ss a","dayPeriods-format-narrow-noon":"n",
"field-second":"Sekunda","field-sat-relative+-1":"Prej\u0161njo soboto","dateFormatItem-yMMMEd":"E, d. MMM y","field-sun-relative+-1":"Prej\u0161njo nedeljo","field-month-relative+0":"Ta mesec","field-month-relative+1":"Naslednji mesec","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E, d.","field-week":"Teden","dateFormat-medium":"d. MMM y","field-week-relative+-1":"Prej\u0161nji teden","field-year-relative+0":"Letos","field-year-relative+1":"Naslednje leto","dayPeriods-format-narrow-pm":"p",
"dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH.mm.ss","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"Prej\u0161nji ponedeljek","field-week-relative+0":"Ta teden","field-week-relative+1":"Naslednji teden"},"dijit/nls/loading":{_localized:{},loadingState:"Nalaganje ...",errorState:"Oprostite, pri\u0161lo je do napake."},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",
list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0bil'.'","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4;(#,##0.00\u00a0\u00a4)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"#,##0%","decimalFormat-long":"000 bilijonov",decimalFormat:"#,##0.###",
decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"e"},"dijit/form/nls/ComboBox":{previousMessage:"Prej\u0161nje izbire",_localized:{},nextMessage:"Dodatne izbire"},"dijit/nls/common":{buttonOk:"V redu",buttonCancel:"Prekli\u010di",_localized:{},buttonSave:"Shrani",itemClose:"Zapri"}});
//# sourceMappingURL=dojo_sl.js.map

View File

@ -0,0 +1,16 @@
//>>built
define("dojo/nls/dojo_sv",{"dijit/form/nls/validate":{invalidMessage:"Angivet v\u00e4rde \u00e4r inte giltigt.",rangeMessage:"V\u00e4rdet ligger utanf\u00f6r intervallet.",_localized:{},missingMessage:"V\u00e4rdet kr\u00e4vs."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"S\u00f6 M\u00e5 Ti On To Fr L\u00f6".split(" "),"months-format-narrow":"JFMAMJJASOND".split(""),"field-second-relative+0":"nu","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Veckodag",
"dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"E, y-MM-dd","field-wed-relative+0":"onsdag denna vecka","field-wed-relative+1":"onsdag n\u00e4sta vecka","dateFormatItem-GyMMMEd":"E d MMM y G","dateFormatItem-MMMEd":"E d MMM",eraNarrow:["f.Kr.","fvt","e.Kr.","vt"],"dateFormatItem-yMM":"y-MM","field-tue-relative+-1":"tisdag f\u00f6rra veckan","days-format-short":"s\u00f6 m\u00e5 ti on to fr l\u00f6".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM y","field-fri-relative+-1":"fredag f\u00f6rra veckan",
"field-wed-relative+-1":"onsdag f\u00f6rra veckan","months-format-wide":"januari februari mars april maj juni juli augusti september oktober november december".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"em","dateFormat-full":"EEEE d MMMM y","field-thu-relative+-1":"torsdag f\u00f6rra veckan","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"FM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"y-MM-dd",
"field-era":"Era","dateFormatItem-yM":"y-MM","months-standAlone-wide":"Januari Februari Mars April Maj Juni Juli Augusti September Oktober November December".split(" "),"timeFormat-short":"HH:mm","quarters-format-wide":["1:a kvartalet","2:a kvartalet","3:e kvartalet","4:e kvartalet"],"dateFormatItem-yQQQQ":"y QQQQ","timeFormat-long":"HH:mm:ss z","field-year":"\u00c5r","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"timme","dateFormatItem-MMdd":"dd/MM","months-format-abbr":"jan feb mar apr maj jun jul aug sep okt nov dec".split(" "),
"field-sat-relative+0":"l\u00f6rdag denna vecka","field-sat-relative+1":"l\u00f6rdag n\u00e4sta vecka","timeFormat-full":"'kl'. HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"i dag","field-thu-relative+0":"torsdag denna vecka","field-day-relative+1":"i morgon","field-thu-relative+1":"torsdag n\u00e4sta vecka","dateFormatItem-GyMMMd":"d MMM y G","field-day-relative+2":"i \u00f6vermorgon","dateFormatItem-H":"HH","months-standAlone-abbr":"Jan Feb Mar Apr Maj Jun Jul Aug Sep Okt Nov Dec".split(" "),
"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1:a kvartalet","2:a kvartalet","3:e kvartalet","4:e kvartalet"],"dateFormatItem-Gy":"y G","dateFormatItem-M":"L","days-standAlone-wide":"S\u00f6ndag M\u00e5ndag Tisdag Onsdag Torsdag Fredag L\u00f6rdag".split(" "),"dateFormatItem-MMMMd":"d MMMM","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"s\u00f6ndag denna vecka","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"s\u00f6ndag n\u00e4sta vecka",
"quarters-standAlone-abbr":["K1","K2","K3","K4"],eraAbbr:["f.Kr.","e.Kr."],"field-minute":"Minut","field-dayperiod":"fm/em","days-standAlone-abbr":"S\u00f6n M\u00e5n Tis Ons Tor Fre L\u00f6r".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"i g\u00e5r","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"f","dateFormatItem-h":"h a","field-day-relative+-2":"i f\u00f6rrg\u00e5r","dateFormatItem-MMMd":"d MMM",
"dateFormatItem-MEd":"E d/M","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"fredag denna vecka","field-fri-relative+1":"fredag n\u00e4sta vecka","field-day":"Dag","days-format-wide":"s\u00f6ndag m\u00e5ndag tisdag onsdag torsdag fredag l\u00f6rdag".split(" "),"field-zone":"Tidszon","months-standAlone-narrow":"JFMAMJJASOND".split(""),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"i fjol","field-month-relative+-1":"f\u00f6rra m\u00e5naden",
"dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"EM","days-format-abbr":"s\u00f6n m\u00e5n tis ons tors fre l\u00f6r".split(" "),eraNames:["f\u00f6re Kristus","f\u00f6re v\u00e4sterl\u00e4ndsk tider\u00e4kning","efter Kristus","v\u00e4sterl\u00e4ndsk tider\u00e4kning"],"dateFormatItem-yMMMd":"d MMM y","days-format-narrow":"SMTOTFL".split(""),"field-month":"M\u00e5nad","days-standAlone-narrow":"SMTOTFL".split(""),
"dateFormatItem-MMM":"LLL","field-tue-relative+0":"tisdag denna vecka","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"tisdag n\u00e4sta vecka","dayPeriods-format-wide-am":"fm","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"m\u00e5ndag denna vecka","field-mon-relative+1":"m\u00e5ndag n\u00e4sta vecka","dateFormat-short":"y-MM-dd",
"dateFormatItem-MMd":"d/M","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"Sekund","field-sat-relative+-1":"l\u00f6rdag f\u00f6rra veckan","dateFormatItem-yMMMEd":"E d MMM y","field-sun-relative+-1":"s\u00f6ndag f\u00f6rra veckan","field-month-relative+0":"denna m\u00e5nad","field-month-relative+1":"n\u00e4sta m\u00e5nad","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"Vecka","dateFormat-medium":"d MMM y",
"field-week-relative+-1":"f\u00f6rra veckan","field-year-relative+0":"i \u00e5r","field-year-relative+1":"n\u00e4sta \u00e5r","dayPeriods-format-narrow-pm":"e","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM y G","field-mon-relative+-1":"m\u00e5ndag f\u00f6rra veckan","field-week-relative+0":"denna vecka","field-week-relative+1":"n\u00e4sta vecka"},"dijit/nls/loading":{_localized:{},loadingState:"L\u00e4ser in...",errorState:"Det har intr\u00e4ffat ett fel."},
"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00b7",list:";",percentSign:"%",minusSign:"\u2212","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0bn","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"\u00a4\u00a4\u00a4",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",
perMille:"\u2030",group:"\u00a0",percentFormat:"#,##0\u00a0%","decimalFormat-long":"000 biljoner",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"\u00d710^"},"dijit/form/nls/ComboBox":{previousMessage:"Tidigare val",_localized:{},nextMessage:"Fler val"},"dijit/nls/common":{buttonOk:"OK",buttonCancel:"Avbryt",_localized:{},buttonSave:"Spara",itemClose:"St\u00e4ng"}});
//# sourceMappingURL=dojo_sv.js.map

View File

@ -0,0 +1,25 @@
//>>built
define("dojo/nls/dojo_th",{"dijit/form/nls/validate":{invalidMessage:"\u0e04\u0e48\u0e32\u0e17\u0e35\u0e48\u0e1b\u0e49\u0e2d\u0e19\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07",rangeMessage:"\u0e04\u0e48\u0e32\u0e19\u0e35\u0e49\u0e40\u0e01\u0e34\u0e19\u0e0a\u0e48\u0e27\u0e07",_localized:{},missingMessage:"\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e35\u0e04\u0e48\u0e32\u0e19\u0e35\u0e49"},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E h:mm a","days-standAlone-short":"\u0e2d\u0e32. \u0e08. \u0e2d. \u0e1e. \u0e1e\u0e24. \u0e28. \u0e2a.".split(" "),
"months-format-narrow":"\u0e21.\u0e04. \u0e01.\u0e1e. \u0e21\u0e35.\u0e04. \u0e40\u0e21.\u0e22. \u0e1e.\u0e04. \u0e21\u0e34.\u0e22. \u0e01.\u0e04. \u0e2a.\u0e04. \u0e01.\u0e22. \u0e15.\u0e04. \u0e1e.\u0e22. \u0e18.\u0e04.".split(" "),"field-second-relative+0":"\u0e02\u0e13\u0e30\u0e19\u0e35\u0e49","quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"\u0e27\u0e31\u0e19\u0e43\u0e19\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d/M/y","field-wed-relative+0":"\u0e1e\u0e38\u0e18\u0e19\u0e35\u0e49",
"field-wed-relative+1":"\u0e1e\u0e38\u0e18\u0e2b\u0e19\u0e49\u0e32","dateFormatItem-GyMMMEd":"E d MMM G y","dateFormatItem-MMMEd":"E d MMM",eraNarrow:["\u0e01\u0e48\u0e2d\u0e19 \u0e04.\u0e28.","\u0e01.\u0e2a.\u0e28.","\u0e04.\u0e28.","\u0e2a.\u0e28."],"field-tue-relative+-1":"\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","days-format-short":"\u0e2d\u0e32. \u0e08. \u0e2d. \u0e1e. \u0e1e\u0e24. \u0e28. \u0e2a.".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}",
"dateFormat-long":"d MMMM y","field-fri-relative+-1":"\u0e28\u0e38\u0e01\u0e23\u0e4c\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","field-wed-relative+-1":"\u0e1e\u0e38\u0e18\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","months-format-wide":"\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21 \u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c \u0e21\u0e35\u0e19\u0e32\u0e04\u0e21 \u0e40\u0e21\u0e29\u0e32\u0e22\u0e19 \u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21 \u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19 \u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21 \u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21 \u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 \u0e15\u0e38\u0e25\u0e32\u0e04\u0e21 \u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19 \u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21".split(" "),
"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07","dateFormat-full":"EEEE\u0e17\u0e35\u0e48 d MMMM G y","field-thu-relative+-1":"\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","dateFormatItem-Md":"d/M",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon","dateFormatItem-yMd":"d/M/y","field-era":"\u0e2a\u0e21\u0e31\u0e22",
"dateFormatItem-yM":"M/y","months-standAlone-wide":"\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21 \u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c \u0e21\u0e35\u0e19\u0e32\u0e04\u0e21 \u0e40\u0e21\u0e29\u0e32\u0e22\u0e19 \u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21 \u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19 \u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21 \u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21 \u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 \u0e15\u0e38\u0e25\u0e32\u0e04\u0e21 \u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19 \u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21".split(" "),
"timeFormat-short":"HH:mm","quarters-format-wide":["\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 1","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 2","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 3","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 4"],"dateFormatItem-yQQQQ":"QQQQ y","timeFormat-long":"H \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 mm \u0e19\u0e32\u0e17\u0e35 ss \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 z","field-year":"\u0e1b\u0e35","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}","field-hour":"\u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",
"months-format-abbr":"\u0e21.\u0e04. \u0e01.\u0e1e. \u0e21\u0e35.\u0e04. \u0e40\u0e21.\u0e22. \u0e1e.\u0e04. \u0e21\u0e34.\u0e22. \u0e01.\u0e04. \u0e2a.\u0e04. \u0e01.\u0e22. \u0e15.\u0e04. \u0e1e.\u0e22. \u0e18.\u0e04.".split(" "),"field-sat-relative+0":"\u0e40\u0e2a\u0e32\u0e23\u0e4c\u0e19\u0e35\u0e49","field-sat-relative+1":"\u0e40\u0e2a\u0e32\u0e23\u0e4c\u0e2b\u0e19\u0e49\u0e32","timeFormat-full":"H \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 mm \u0e19\u0e32\u0e17\u0e35 ss \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 zzzz",
"dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49","field-thu-relative+0":"\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e19\u0e35\u0e49","field-day-relative+1":"\u0e1e\u0e23\u0e38\u0e48\u0e07\u0e19\u0e35\u0e49","field-thu-relative+1":"\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e2b\u0e19\u0e49\u0e32","dateFormatItem-GyMMMd":"d MMM G y","field-day-relative+2":"\u0e21\u0e30\u0e23\u0e37\u0e19\u0e19\u0e35\u0e49","dateFormatItem-H":"HH","months-standAlone-abbr":"\u0e21.\u0e04. \u0e01.\u0e1e. \u0e21\u0e35.\u0e04. \u0e40\u0e21.\u0e22. \u0e1e.\u0e04. \u0e21\u0e34.\u0e22. \u0e01.\u0e04. \u0e2a.\u0e04. \u0e01.\u0e22. \u0e15.\u0e04. \u0e1e.\u0e22. \u0e18.\u0e04.".split(" "),
"quarters-format-abbr":["\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 1","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 2","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 3","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 4"],"quarters-standAlone-wide":["\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 1","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 2","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 3","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 4"],"dateFormatItem-Gy":"G y","dateFormatItem-M":"L","days-standAlone-wide":"\u0e27\u0e31\u0e19\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c \u0e27\u0e31\u0e19\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c \u0e27\u0e31\u0e19\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23 \u0e27\u0e31\u0e19\u0e1e\u0e38\u0e18 \u0e27\u0e31\u0e19\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35 \u0e27\u0e31\u0e19\u0e28\u0e38\u0e01\u0e23\u0e4c \u0e27\u0e31\u0e19\u0e40\u0e2a\u0e32\u0e23\u0e4c".split(" "),
"dateFormatItem-MMMMd":"d MMMM","dayPeriods-format-abbr-noon":"noon","timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c\u0e19\u0e35\u0e49","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c\u0e2b\u0e19\u0e49\u0e32","quarters-standAlone-abbr":["\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 1","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 2","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 3","\u0e44\u0e15\u0e23\u0e21\u0e32\u0e2a 4"],eraAbbr:["\u0e1b\u0e35\u0e01\u0e48\u0e2d\u0e19 \u0e04.\u0e28.",
"\u0e04.\u0e28."],"field-minute":"\u0e19\u0e32\u0e17\u0e35","field-dayperiod":"\u0e0a\u0e48\u0e27\u0e07\u0e27\u0e31\u0e19","days-standAlone-abbr":"\u0e2d\u0e32. \u0e08. \u0e2d. \u0e1e. \u0e1e\u0e24. \u0e28. \u0e2a.".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"a","dateFormatItem-h":"h a","field-day-relative+-2":"\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19\u0e0b\u0e37\u0e19",
"dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E d/M","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"\u0e28\u0e38\u0e01\u0e23\u0e4c\u0e19\u0e35\u0e49","field-fri-relative+1":"\u0e28\u0e38\u0e01\u0e23\u0e4c\u0e2b\u0e19\u0e49\u0e32","dateFormatItem-yMMMM":"MMMM y","field-day":"\u0e27\u0e31\u0e19","days-format-wide":"\u0e27\u0e31\u0e19\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c \u0e27\u0e31\u0e19\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c \u0e27\u0e31\u0e19\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23 \u0e27\u0e31\u0e19\u0e1e\u0e38\u0e18 \u0e27\u0e31\u0e19\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35 \u0e27\u0e31\u0e19\u0e28\u0e38\u0e01\u0e23\u0e4c \u0e27\u0e31\u0e19\u0e40\u0e2a\u0e32\u0e23\u0e4c".split(" "),
"field-zone":"\u0e40\u0e02\u0e15\u0e40\u0e27\u0e25\u0e32","months-standAlone-narrow":"\u0e21.\u0e04. \u0e01.\u0e1e. \u0e21\u0e35.\u0e04. \u0e40\u0e21.\u0e22. \u0e1e.\u0e04. \u0e21\u0e34.\u0e22. \u0e01.\u0e04. \u0e2a.\u0e04. \u0e01.\u0e22. \u0e15.\u0e04. \u0e1e.\u0e22. \u0e18.\u0e04.".split(" "),"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"\u0e1b\u0e35\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","field-month-relative+-1":"\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27",
"dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"\u0e2d\u0e32. \u0e08. \u0e2d. \u0e1e. \u0e1e\u0e24. \u0e28. \u0e2a.".split(" "),eraNames:["\u0e1b\u0e35\u0e01\u0e48\u0e2d\u0e19\u0e04\u0e23\u0e34\u0e2a\u0e15\u0e4c\u0e28\u0e31\u0e01\u0e23\u0e32\u0e0a","\u0e01\u0e48\u0e2d\u0e19\u0e2a\u0e32\u0e21\u0e31\u0e0d\u0e28\u0e31\u0e01\u0e23\u0e32\u0e0a","\u0e04\u0e23\u0e34\u0e2a\u0e15\u0e4c\u0e28\u0e31\u0e01\u0e23\u0e32\u0e0a",
"\u0e2a\u0e32\u0e21\u0e31\u0e0d\u0e28\u0e31\u0e01\u0e23\u0e32\u0e0a"],"dateFormatItem-yMMMd":"d MMM y","days-format-narrow":"\u0e2d\u0e32 \u0e08 \u0e2d \u0e1e \u0e1e\u0e24 \u0e28 \u0e2a".split(" "),"field-month":"\u0e40\u0e14\u0e37\u0e2d\u0e19","days-standAlone-narrow":"\u0e2d\u0e32 \u0e08 \u0e2d \u0e1e \u0e1e\u0e24 \u0e28 \u0e2a".split(" "),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23\u0e19\u0e35\u0e49","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",
"field-tue-relative+1":"\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23\u0e2b\u0e19\u0e49\u0e32","dayPeriods-format-wide-am":"\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c\u0e19\u0e35\u0e49","field-mon-relative+1":"\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c\u0e2b\u0e19\u0e49\u0e32",
"dateFormat-short":"d/M/yy","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E h:mm:ss a","dayPeriods-format-narrow-noon":"n","field-second":"\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35","field-sat-relative+-1":"\u0e40\u0e2a\u0e32\u0e23\u0e4c\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","dateFormatItem-yMMMEd":"E d MMM y","field-sun-relative+-1":"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","field-month-relative+0":"\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e19\u0e35\u0e49",
"field-month-relative+1":"\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e2b\u0e19\u0e49\u0e32","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"E d","field-week":"\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c","dateFormat-medium":"d MMM y","field-week-relative+-1":"\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","field-year-relative+0":"\u0e1b\u0e35\u0e19\u0e35\u0e49","field-year-relative+1":"\u0e1b\u0e35\u0e2b\u0e19\u0e49\u0e32","dayPeriods-format-narrow-pm":"p",
"dateFormatItem-mmss":"mm:ss","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-GyMMM":"MMM G y","field-mon-relative+-1":"\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27","field-week-relative+0":"\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c\u0e19\u0e35\u0e49","field-week-relative+1":"\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c\u0e2b\u0e19\u0e49\u0e32"},"dijit/nls/loading":{_localized:{},loadingState:"\u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14...",
errorState:"\u0e02\u0e2d\u0e2d\u0e20\u0e31\u0e22 \u0e40\u0e01\u0e34\u0e14\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0\u0e25'.'\u0e25'.'","currencySpacing-afterCurrency-insertBetween":"\u00a0",
nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000 \u0e25\u0e49\u0e32\u0e19\u0e25\u0e49\u0e32\u0e19",decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u0e01\u0e32\u0e23\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e01\u0e48\u0e2d\u0e19\u0e2b\u0e19\u0e49\u0e32",
_localized:{},nextMessage:"\u0e01\u0e32\u0e23\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21"},"dijit/nls/common":{buttonOk:"\u0e15\u0e01\u0e25\u0e07",buttonCancel:"\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01",_localized:{},buttonSave:"\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01",itemClose:"\u0e1b\u0e34\u0e14"}});
//# sourceMappingURL=dojo_th.js.map

View File

@ -0,0 +1,16 @@
//>>built
define("dojo/nls/dojo_tr",{"dijit/form/nls/validate":{invalidMessage:"Girilen de\u011fer ge\u00e7ersiz.",rangeMessage:"Bu de\u011fer aral\u0131k d\u0131\u015f\u0131nda.",_localized:{},missingMessage:"Bu de\u011fer gerekli."},"dojo/cldr/nls/gregorian":{"dateFormatItem-Ehm":"E a h:mm","days-standAlone-short":"Pa Pt Sa \u00c7a Pe Cu Ct".split(" "),"months-format-narrow":"O\u015eMNMHTAEEKA".split(""),"field-second-relative+0":"\u015fimdi","quarters-standAlone-narrow":["1.","2.","3.","4."],"field-weekday":"Haftan\u0131n G\u00fcn\u00fc",
"dateFormatItem-yQQQ":"y/QQQ","dateFormatItem-yMEd":"dd.MM.y E","field-wed-relative+0":"bu \u00e7ar\u015famba","field-wed-relative+1":"gelecek \u00e7ar\u015famba","dateFormatItem-GyMMMEd":"G d MMM y E","dateFormatItem-MMMEd":"d MMMM E",eraNarrow:["M\u00d6","MS"],"dateFormatItem-yMM":"MM.y","field-tue-relative+-1":"ge\u00e7en sal\u0131","days-format-short":"Pa Pt Sa \u00c7a Pe Cu Ct".split(" "),"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"d MMMM y","field-fri-relative+-1":"ge\u00e7en cuma",
"field-wed-relative+-1":"ge\u00e7en \u00e7ar\u015famba","months-format-wide":"Ocak \u015eubat Mart Nisan May\u0131s Haziran Temmuz A\u011fustos Eyl\u00fcl Ekim Kas\u0131m Aral\u0131k".split(" "),"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"\u00d6S","dateFormat-full":"d MMMM y EEEE","field-thu-relative+-1":"ge\u00e7en per\u015fembe","dateFormatItem-Md":"dd/MM",_localized:{},"dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dayPeriods-format-wide-noon":"noon",
"dateFormatItem-yMd":"dd.MM.y","field-era":"Miladi D\u00f6nem","dateFormatItem-yM":"MM/y","months-standAlone-wide":"Ocak \u015eubat Mart Nisan May\u0131s Haziran Temmuz A\u011fustos Eyl\u00fcl Ekim Kas\u0131m Aral\u0131k".split(" "),"timeFormat-short":"HH:mm","quarters-format-wide":["1. \u00e7eyrek","2. \u00e7eyrek","3. \u00e7eyrek","4. \u00e7eyrek"],"dateFormatItem-yQQQQ":"y/QQQQ","timeFormat-long":"HH:mm:ss z","field-year":"Y\u0131l","dateFormatItem-yMMM":"MMM y","dateTimeFormats-appendItem-Era":"{1} {0}",
"field-hour":"Saat","months-format-abbr":"Oca \u015eub Mar Nis May Haz Tem A\u011fu Eyl Eki Kas Ara".split(" "),"field-sat-relative+0":"bu cumartesi","field-sat-relative+1":"gelecek cumartesi","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"bug\u00fcn","field-thu-relative+0":"bu per\u015fembe","field-day-relative+1":"yar\u0131n","field-thu-relative+1":"gelecek per\u015fembe","dateFormatItem-GyMMMd":"G dd MMM y","field-day-relative+2":"\u00f6b\u00fcr g\u00fcn",
"dateFormatItem-H":"HH","months-standAlone-abbr":"Oca \u015eub Mar Nis May Haz Tem A\u011fu Eyl Eki Kas Ara".split(" "),"quarters-format-abbr":["\u00c71","\u00c72","\u00c73","\u00c74"],"quarters-standAlone-wide":["1. \u00e7eyrek","2. \u00e7eyrek","3. \u00e7eyrek","4. \u00e7eyrek"],"dateFormatItem-Gy":"G y","dateFormatItem-M":"L","days-standAlone-wide":"Pazar Pazartesi Sal\u0131 \u00c7ar\u015famba Per\u015fembe Cuma Cumartesi".split(" "),"dateFormatItem-MMMMd":"dd MMMM","dayPeriods-format-abbr-noon":"noon",
"timeFormat-medium":"HH:mm:ss","field-sun-relative+0":"bu pazar","dateFormatItem-Hm":"HH:mm","field-sun-relative+1":"gelecek pazar","quarters-standAlone-abbr":["\u00c71","\u00c72","\u00c73","\u00c74"],eraAbbr:["M\u00d6","MS"],"field-minute":"Dakika","field-dayperiod":"\u00d6\u00d6/\u00d6S","days-standAlone-abbr":"Paz Pzt Sal \u00c7ar Per Cum Cmt".split(" "),"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1.","2.","3.","4."],"field-day-relative+-1":"d\u00fcn","dateTimeFormat-long":"{1} {0}",
"dayPeriods-format-narrow-am":"a","dateFormatItem-h":"a h","field-day-relative+-2":"evvelsi g\u00fcn","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"dd/MM E","dateTimeFormat-full":"{1} {0}","field-fri-relative+0":"bu cuma","field-fri-relative+1":"gelecek cuma","dateFormatItem-yMMMM":"MMMM y","field-day":"G\u00fcn","days-format-wide":"Pazar Pazartesi Sal\u0131 \u00c7ar\u015famba Per\u015fembe Cuma Cumartesi".split(" "),"field-zone":"Saat Dilimi","months-standAlone-narrow":"O\u015eMNMHTAEEKA".split(""),
"dateFormatItem-y":"y","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-year-relative+-1":"ge\u00e7en y\u0131l","field-month-relative+-1":"ge\u00e7en ay","dateTimeFormats-appendItem-Year":"{1} {0}","dateFormatItem-hm":"a h:mm","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":"Paz Pzt Sal \u00c7ar Per Cum Cmt".split(" "),eraNames:["Milattan \u00d6nce","Milattan Sonra"],"dateFormatItem-yMMMd":"dd MMM y","days-format-narrow":"PPS\u00c7PCC".split(""),
"field-month":"Ay","days-standAlone-narrow":"PPS\u00c7PCC".split(""),"dateFormatItem-MMM":"LLL","field-tue-relative+0":"bu sal\u0131","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-tue-relative+1":"gelecek sal\u0131","dayPeriods-format-wide-am":"\u00d6\u00d6","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-MMMMEd":"dd MMMM E","dateFormatItem-EHm":"E HH:mm","field-mon-relative+0":"bu pazartesi","field-mon-relative+1":"gelecek pazartesi",
"dateFormat-short":"d.MM.y","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-Ehms":"E a h:mm:ss","dayPeriods-format-narrow-noon":"n","field-second":"Saniye","field-sat-relative+-1":"ge\u00e7en cumartesi","dateFormatItem-yMMMEd":"d MMM y E","field-sun-relative+-1":"ge\u00e7en pazar","field-month-relative+0":"bu ay","field-month-relative+1":"gelecek ay","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormatItem-Ed":"d E","field-week":"Hafta","dateFormat-medium":"d MMM y","field-week-relative+-1":"ge\u00e7en hafta",
"field-year-relative+0":"bu y\u0131l","field-year-relative+1":"gelecek y\u0131l","dayPeriods-format-narrow-pm":"p","dateFormatItem-mmss":"mm:ss","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"a h:mm:ss","dateFormatItem-GyMMM":"G MMM y","field-mon-relative+-1":"ge\u00e7en pazartesi","field-week-relative+0":"bu hafta","field-week-relative+1":"gelecek hafta"},"dijit/nls/loading":{_localized:{},loadingState:"Y\u00fckleniyor...",errorState:"\u00dczg\u00fcn\u00fcz, bir hata olu\u015ftu"},
"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u00a0Tn","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"#,##0.00\u00a0\u00a4;(#,##0.00\u00a0\u00a4)",
"currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:".",percentFormat:"%#,##0","decimalFormat-long":"000 trilyon",decimalFormat:"#,##0.###",decimal:",","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u00d6nceki se\u00e7enekler",_localized:{},nextMessage:"Di\u011fer se\u00e7enekler"},"dijit/nls/common":{buttonOk:"Tamam",buttonCancel:"\u0130ptal",_localized:{},buttonSave:"Kaydet",itemClose:"Kapat"}});
//# sourceMappingURL=dojo_tr.js.map

View File

@ -0,0 +1,20 @@
//>>built
define("dojo/nls/dojo_zh-cn",{"dijit/form/nls/validate":{invalidMessage:"\u8f93\u5165\u7684\u503c\u65e0\u6548\u3002",rangeMessage:"\u6b64\u503c\u8d85\u51fa\u8303\u56f4\u3002",_localized:{},missingMessage:"\u8be5\u503c\u662f\u5fc5\u9700\u7684\u3002"},"dojo/cldr/nls/gregorian":{"dateTimeFormats-appendItem-Year":"{1} {0}","field-tue-relative+-1":"\u4e0a\u5468\u4e8c","field-year":"\u5e74","dayPeriods-format-wide-weeHours":"\u51cc\u6668","dateFormatItem-Hm":"HH:mm","field-wed-relative+0":"\u672c\u5468\u4e09",
"field-wed-relative+1":"\u4e0b\u5468\u4e09","dayPeriods-format-wide-night":"\u665a\u4e0a","dateFormatItem-ms":"mm:ss","timeFormat-short":"ah:mm","field-minute":"\u5206\u949f","dateTimeFormat-short":"{1} {0}","field-day-relative+0":"\u4eca\u5929","field-day-relative+1":"\u660e\u5929","field-day-relative+2":"\u540e\u5929","field-tue-relative+0":"\u672c\u5468\u4e8c","field-tue-relative+1":"\u4e0b\u5468\u4e8c","dayPeriods-format-narrow-am":"\u4e0a\u5348","dateFormatItem-MMMd":"M\u6708d\u65e5","dayPeriods-format-abbr-am":"AM",
"dayPeriods-format-narrow-earlyMorning":"\u6e05\u6668","field-week-relative+0":"\u672c\u5468","field-month-relative+0":"\u672c\u6708","field-week-relative+1":"\u4e0b\u5468","field-month-relative+1":"\u4e0b\u4e2a\u6708","timeFormat-medium":"ah:mm:ss","dateFormatItem-MMMMdd":"M\u6708dd\u65e5","field-second-relative+0":"\u73b0\u5728","dayPeriods-format-wide-afternoon":"\u4e0b\u5348","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),
eraNames:["\u516c\u5143\u524d","\u516c\u5143"],"dateFormatItem-GyMMMEd":"Gy\u5e74M\u6708d\u65e5E","field-day":"\u65e5","field-year-relative+-1":"\u53bb\u5e74","dayPeriods-format-wide-am":"\u4e0a\u5348","dayPeriods-format-narrow-midDay":"\u4e2d\u5348","field-wed-relative+-1":"\u4e0a\u5468\u4e09","dateTimeFormat-medium":"{1} {0}","field-second":"\u79d2\u949f","days-standAlone-narrow":"\u65e5\u4e00\u4e8c\u4e09\u56db\u4e94\u516d".split(""),"dateFormatItem-Ehms":"Eah:mm:ss","dateFormat-long":"y\u5e74M\u6708d\u65e5",
"dateFormatItem-GyMMMd":"Gy\u5e74M\u6708d\u65e5","dateFormatItem-yMMMEd":"y\u5e74M\u6708d\u65e5E","quarters-standAlone-wide":["\u7b2c\u4e00\u5b63\u5ea6","\u7b2c\u4e8c\u5b63\u5ea6","\u7b2c\u4e09\u5b63\u5ea6","\u7b2c\u56db\u5b63\u5ea6"],"days-format-narrow":"\u65e5\u4e00\u4e8c\u4e09\u56db\u4e94\u516d".split(""),"dateTimeFormats-appendItem-Timezone":"{1}{0}","field-mon-relative+-1":"\u4e0a\u5468\u4e00","dateFormatItem-GyMMM":"Gy\u5e74M\u6708","field-month":"\u6708","dateFormatItem-MMM":"LLL","field-dayperiod":"\u4e0a\u5348/\u4e0b\u5348",
"dayPeriods-format-narrow-pm":"\u4e0b\u5348","dateFormat-medium":"y\u5e74M\u6708d\u65e5",eraAbbr:["\u516c\u5143\u524d","\u516c\u5143"],"quarters-standAlone-abbr":["1\u5b63\u5ea6","2\u5b63\u5ea6","3\u5b63\u5ea6","4\u5b63\u5ea6"],"dayPeriods-format-abbr-pm":"PM","field-mon-relative+0":"\u672c\u5468\u4e00","field-mon-relative+1":"\u4e0b\u5468\u4e00","months-format-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),"days-format-short":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),
"quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-wide-pm":"\u4e0b\u5348","field-sat-relative+-1":"\u4e0a\u5468\u516d","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormat-long":"{1} {0}","dateFormatItem-Md":"M/d","field-hour":"\u5c0f\u65f6","dateFormatItem-yQQQQ":"y\u5e74\u7b2cQ\u5b63\u5ea6","months-format-wide":"\u4e00\u6708 \u4e8c\u6708 \u4e09\u6708 \u56db\u6708 \u4e94\u6708 \u516d\u6708 \u4e03\u6708 \u516b\u6708 \u4e5d\u6708 \u5341\u6708 \u5341\u4e00\u6708 \u5341\u4e8c\u6708".split(" "),
"dateFormat-full":"y\u5e74M\u6708d\u65e5EEEE","field-month-relative+-1":"\u4e0a\u4e2a\u6708","dayPeriods-format-wide-earlyMorning":"\u6e05\u6668","dateFormatItem-Hms":"HH:mm:ss","field-fri-relative+0":"\u672c\u5468\u4e94","field-fri-relative+1":"\u4e0b\u5468\u4e94","dayPeriods-format-narrow-noon":"\u4e2d\u5348","dayPeriods-format-narrow-morning":"\u4e0a\u5348","dayPeriods-format-wide-morning":"\u4e0a\u5348","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",_localized:{},"field-week-relative+-1":"\u4e0a\u5468",
"dateFormatItem-Ehm":"Eah:mm","months-format-abbr":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),"timeFormat-long":"zah:mm:ss","dateFormatItem-yMMM":"y\u5e74M\u6708","dateFormat-short":"yy/M/d","days-standAlone-wide":"\u661f\u671f\u65e5 \u661f\u671f\u4e00 \u661f\u671f\u4e8c \u661f\u671f\u4e09 \u661f\u671f\u56db \u661f\u671f\u4e94 \u661f\u671f\u516d".split(" "),"dateTimeFormats-appendItem-Era":"{1} {0}","dateFormatItem-H":"H\u65f6",
"dateFormatItem-M":"M\u6708","months-standAlone-wide":"\u4e00\u6708 \u4e8c\u6708 \u4e09\u6708 \u56db\u6708 \u4e94\u6708 \u516d\u6708 \u4e03\u6708 \u516b\u6708 \u4e5d\u6708 \u5341\u6708 \u5341\u4e00\u6708 \u5341\u4e8c\u6708".split(" "),"field-sun-relative+-1":"\u4e0a\u5468\u65e5","days-standAlone-abbr":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),"dateTimeFormat-full":"{1} {0}","dateFormatItem-hm":"ah:mm","dayPeriods-format-wide-midDay":"\u4e2d\u5348",
"dateFormatItem-d":"d\u65e5","field-weekday":"\u661f\u671f","field-sat-relative+0":"\u672c\u5468\u516d","dateFormatItem-h":"ah\u65f6","field-sat-relative+1":"\u4e0b\u5468\u516d","months-standAlone-abbr":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),"dateFormatItem-yMM":"y\u5e74M\u6708","timeFormat-full":"zzzzah:mm:ss","dateFormatItem-MEd":"M/dE","dateFormatItem-y":"y\u5e74","field-thu-relative+0":"\u672c\u5468\u56db","field-thu-relative+1":"\u4e0b\u5468\u56db",
"dateFormatItem-hms":"ah:mm:ss","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dayPeriods-format-abbr-noon":"noon","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-thu-relative+-1":"\u4e0a\u5468\u56db","dateFormatItem-yMd":"y/M/d","field-week":"\u5468","quarters-standAlone-narrow":["1","2","3","4"],"quarters-format-wide":["\u7b2c\u4e00\u5b63\u5ea6","\u7b2c\u4e8c\u5b63\u5ea6","\u7b2c\u4e09\u5b63\u5ea6","\u7b2c\u56db\u5b63\u5ea6"],"dayPeriods-format-narrow-weeHours":"\u51cc\u6668","dateFormatItem-Ed":"d\u65e5E",
"dayPeriods-format-narrow-afternoon":"\u4e0b\u5348","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","days-standAlone-short":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),"quarters-format-abbr":["1\u5b63\u5ea6","2\u5b63\u5ea6","3\u5b63\u5ea6","4\u5b63\u5ea6"],"field-year-relative+0":"\u4eca\u5e74","field-year-relative+1":"\u660e\u5e74","field-fri-relative+-1":"\u4e0a\u5468\u4e94",eraNarrow:["\u516c\u5143\u524d","\u516c\u5143"],"dayPeriods-format-wide-noon":"\u4e2d\u5348",
"dateFormatItem-yQQQ":"y\u5e74\u7b2cQ\u5b63\u5ea6","days-format-wide":"\u661f\u671f\u65e5 \u661f\u671f\u4e00 \u661f\u671f\u4e8c \u661f\u671f\u4e09 \u661f\u671f\u56db \u661f\u671f\u4e94 \u661f\u671f\u516d".split(" "),"dayPeriods-format-narrow-night":"\u665a\u4e0a","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateFormatItem-EHm":"EHH:mm","field-zone":"\u65f6\u533a","dateFormatItem-yM":"y/M","dateFormatItem-yMMMM":"y\u5e74M\u6708","dateFormatItem-MMMEd":"M\u6708d\u65e5E","dateFormatItem-EHms":"EHH:mm:ss",
"dateFormatItem-yMEd":"y/M/dE","field-day-relative+-1":"\u6628\u5929","field-day-relative+-2":"\u524d\u5929","days-format-abbr":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),"field-sun-relative+0":"\u672c\u5468\u65e5","dateFormatItem-MMdd":"MM/dd","field-sun-relative+1":"\u4e0b\u5468\u65e5","dateFormatItem-yMMMd":"y\u5e74M\u6708d\u65e5","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-Gy":"Gy\u5e74","field-era":"\u7eaa\u5143"},
"dijit/nls/loading":{_localized:{},loadingState:"\u6b63\u5728\u52a0\u8f7d...",errorState:"\u5bf9\u4e0d\u8d77\uff0c\u53d1\u751f\u4e86\u9519\u8bef"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",superscriptingExponent:"\u00d7",list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000\u5146","currencySpacing-afterCurrency-insertBetween":"\u00a0",
nan:"NaN",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000\u5146",decimalFormat:"#,##0.###",decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u5148\u524d\u9009\u9879",_localized:{},nextMessage:"\u66f4\u591a\u9009\u9879"},
"dijit/nls/common":{buttonOk:"\u786e\u5b9a",buttonCancel:"\u53d6\u6d88",_localized:{},buttonSave:"\u4fdd\u5b58",itemClose:"\u5173\u95ed"}});
//# sourceMappingURL=dojo_zh-cn.js.map

View File

@ -0,0 +1,19 @@
//>>built
define("dojo/nls/dojo_zh-tw",{"dijit/form/nls/validate":{invalidMessage:"\u8f38\u5165\u7684\u503c\u7121\u6548\u3002",rangeMessage:"\u6b64\u503c\u8d85\u51fa\u7bc4\u570d\u3002",_localized:{},missingMessage:"\u5fc5\u9808\u63d0\u4f9b\u6b64\u503c\u3002"},"dojo/cldr/nls/gregorian":{"dateTimeFormats-appendItem-Year":"{1} {0}","field-tue-relative+-1":"\u4e0a\u9031\u4e8c","field-year":"\u5e74","dayPeriods-format-wide-weeHours":"\u51cc\u6668","dateFormatItem-Hm":"HH:mm","field-wed-relative+0":"\u672c\u9031\u4e09",
"field-wed-relative+1":"\u4e0b\u9031\u4e09","dayPeriods-format-wide-night":"\u665a\u4e0a","dateFormatItem-ms":"mm:ss","timeFormat-short":"ah:mm","field-minute":"\u5206\u9418","dateTimeFormat-short":"{1} {0}","field-day-relative+0":"\u4eca\u5929","field-day-relative+1":"\u660e\u5929","field-day-relative+2":"\u5f8c\u5929","field-tue-relative+0":"\u672c\u9031\u4e8c","field-tue-relative+1":"\u4e0b\u9031\u4e8c","dayPeriods-format-narrow-am":"\u4e0a\u5348","dateFormatItem-MMMd":"M\u6708d\u65e5","dayPeriods-format-abbr-am":"AM",
"dayPeriods-format-narrow-earlyMorning":"\u6e05\u6668","field-week-relative+0":"\u672c\u9031","field-month-relative+0":"\u672c\u6708","field-week-relative+1":"\u4e0b\u9031","field-month-relative+1":"\u4e0b\u500b\u6708","timeFormat-medium":"ah:mm:ss","dateFormatItem-MMMMdd":"M\u6708dd\u65e5","field-second-relative+0":"\u73fe\u5728","dayPeriods-format-wide-afternoon":"\u4e0b\u5348","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),
eraNames:["\u897f\u5143\u524d","\u897f\u5143"],"dateFormatItem-GyMMMEd":"G y \u5e74 M \u6708 d \u65e5E","field-day":"\u65e5","field-year-relative+-1":"\u53bb\u5e74","dayPeriods-format-wide-am":"\u4e0a\u5348","dayPeriods-format-narrow-midDay":"\u4e2d\u5348","field-wed-relative+-1":"\u4e0a\u9031\u4e09","dateTimeFormat-medium":"{1} {0}","field-second":"\u79d2","days-standAlone-narrow":"\u65e5\u4e00\u4e8c\u4e09\u56db\u4e94\u516d".split(""),"dateFormatItem-Ehms":"E a h:mm:ss","dateFormat-long":"y\u5e74M\u6708d\u65e5",
"dateFormatItem-GyMMMd":"G y \u5e74 M \u6708 d \u65e5","dateFormatItem-yMMMEd":"y\u5e74M\u6708d\u65e5E",$locale:"zh-hant-tw","quarters-standAlone-wide":["\u7b2c1\u5b63","\u7b2c2\u5b63","\u7b2c3\u5b63","\u7b2c4\u5b63"],"days-format-narrow":"\u65e5\u4e00\u4e8c\u4e09\u56db\u4e94\u516d".split(""),"dateTimeFormats-appendItem-Timezone":"{0} {1}","field-mon-relative+-1":"\u4e0a\u9031\u4e00","dateFormatItem-GyMMM":"G y \u5e74 M \u6708","field-month":"\u6708","dateFormatItem-MMM":"LLL","field-dayperiod":"\u4e0a\u5348/\u4e0b\u5348",
"dayPeriods-format-narrow-pm":"\u4e0b\u5348","dateFormat-medium":"y\u5e74M\u6708d\u65e5",eraAbbr:["\u897f\u5143\u524d","\u897f\u5143"],"quarters-standAlone-abbr":["\u7b2c1\u5b63","\u7b2c2\u5b63","\u7b2c3\u5b63","\u7b2c4\u5b63"],"dayPeriods-format-abbr-pm":"PM","field-mon-relative+0":"\u672c\u9031\u4e00","field-mon-relative+1":"\u4e0b\u9031\u4e00","months-format-narrow":"1 2 3 4 5 6 7 8 9 10 11 12".split(" "),"days-format-short":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),
"quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-wide-pm":"\u4e0b\u5348","field-sat-relative+-1":"\u4e0a\u9031\u516d","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormat-long":"{1} {0}","dateFormatItem-Md":"M/d","field-hour":"\u5c0f\u6642","dateFormatItem-yQQQQ":"y\u5e74QQQQ","months-format-wide":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),"dateFormat-full":"y\u5e74M\u6708d\u65e5EEEE","field-month-relative+-1":"\u4e0a\u500b\u6708",
"dayPeriods-format-wide-earlyMorning":"\u6e05\u6668","dateFormatItem-Hms":"HH:mm:ss","field-fri-relative+0":"\u672c\u9031\u4e94","field-fri-relative+1":"\u4e0b\u9031\u4e94","dayPeriods-format-narrow-noon":"\u4e2d\u5348","dayPeriods-format-narrow-morning":"\u4e0a\u5348","dayPeriods-format-wide-morning":"\u4e0a\u5348","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})",_localized:{},"field-week-relative+-1":"\u4e0a\u9031","dateFormatItem-Ehm":"E a h:mm","months-format-abbr":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),
"timeFormat-long":"zah\u6642mm\u5206ss\u79d2","dateFormatItem-yMMM":"y\u5e74M\u6708","dateFormat-short":"y/M/d","days-standAlone-wide":"\u661f\u671f\u65e5 \u661f\u671f\u4e00 \u661f\u671f\u4e8c \u661f\u671f\u4e09 \u661f\u671f\u56db \u661f\u671f\u4e94 \u661f\u671f\u516d".split(" "),"dateTimeFormats-appendItem-Era":"{1} {0}","dateFormatItem-H":"H\u6642","dateFormatItem-M":"M\u6708","months-standAlone-wide":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),
"field-sun-relative+-1":"\u4e0a\u9031\u65e5","days-standAlone-abbr":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),"dateTimeFormat-full":"{1}{0}","dateFormatItem-hm":"ah:mm","dayPeriods-format-wide-midDay":"\u4e2d\u5348","dateFormatItem-d":"d\u65e5","field-weekday":"\u9031\u5929","field-sat-relative+0":"\u672c\u9031\u516d","dateFormatItem-h":"ah\u6642","field-sat-relative+1":"\u4e0b\u9031\u516d","months-standAlone-abbr":"1\u6708 2\u6708 3\u6708 4\u6708 5\u6708 6\u6708 7\u6708 8\u6708 9\u6708 10\u6708 11\u6708 12\u6708".split(" "),
"dateFormatItem-yMM":"y-MM","timeFormat-full":"zzzzah\u6642mm\u5206ss\u79d2","dateFormatItem-MEd":"M/d\uff08E\uff09","dateFormatItem-y":"y\u5e74","field-thu-relative+0":"\u672c\u9031\u56db","field-thu-relative+1":"\u4e0b\u9031\u56db","dateFormatItem-hms":"ah:mm:ss","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dayPeriods-format-abbr-noon":"noon","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-thu-relative+-1":"\u4e0a\u9031\u56db","dateFormatItem-yMd":"y/M/d","field-week":"\u9031","quarters-standAlone-narrow":["1",
"2","3","4"],"quarters-format-wide":["\u7b2c1\u5b63","\u7b2c2\u5b63","\u7b2c3\u5b63","\u7b2c4\u5b63"],"dayPeriods-format-narrow-weeHours":"\u51cc\u6668","dateFormatItem-Ed":"d\u65e5\uff08E\uff09","dayPeriods-format-narrow-afternoon":"\u4e0b\u5348","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","days-standAlone-short":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),"quarters-format-abbr":["\u7b2c1\u5b63","\u7b2c2\u5b63","\u7b2c3\u5b63","\u7b2c4\u5b63"],
"field-year-relative+0":"\u4eca\u5e74","field-year-relative+1":"\u660e\u5e74","field-fri-relative+-1":"\u4e0a\u9031\u4e94",eraNarrow:["\u897f\u5143\u524d","\u897f\u5143"],"dayPeriods-format-wide-noon":"\u4e2d\u5348","dateFormatItem-yQQQ":"y\u5e74QQQ","days-format-wide":"\u661f\u671f\u65e5 \u661f\u671f\u4e00 \u661f\u671f\u4e8c \u661f\u671f\u4e09 \u661f\u671f\u56db \u661f\u671f\u4e94 \u661f\u671f\u516d".split(" "),"dayPeriods-format-narrow-night":"\u665a\u4e0a","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})",
"dateFormatItem-EHm":"E HH:mm","field-zone":"\u6642\u5340","dateFormatItem-yM":"y/M","dateFormatItem-yMMMM":"y\u5e74M\u6708","dateFormatItem-MMMEd":"M\u6708d\u65e5E","dateFormatItem-EHms":"E HH:mm:ss","dateFormatItem-yMEd":"y/M/d\uff08E\uff09","field-day-relative+-1":"\u6628\u5929","field-day-relative+-2":"\u524d\u5929","days-format-abbr":"\u5468\u65e5 \u5468\u4e00 \u5468\u4e8c \u5468\u4e09 \u5468\u56db \u5468\u4e94 \u5468\u516d".split(" "),"field-sun-relative+0":"\u672c\u9031\u65e5","dateFormatItem-MMdd":"MM/dd",
"field-sun-relative+1":"\u4e0b\u9031\u65e5","dateFormatItem-yMMMd":"y\u5e74M\u6708d\u65e5","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormatItem-Gy":"G y \u5e74","field-era":"\u5e74\u4ee3"},"dijit/nls/loading":{_localized:{},loadingState:"\u8f09\u5165\u4e2d...",errorState:"\u62b1\u6b49\uff0c\u767c\u751f\u932f\u8aa4"},"dojo/cldr/nls/number":{scientificFormat:"#E0","currencySpacing-afterCurrency-currencyMatch":"[:^S:]",infinity:"\u221e",$locale:"zh-hant-tw",superscriptingExponent:"\u00d7",
list:";",percentSign:"%",minusSign:"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]",_localized:{},"decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":"\u00a0",nan:"\u975e\u6578\u503c",plusSign:"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]",currencyFormat:"\u00a4#,##0.00;(\u00a4#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:^S:]",perMille:"\u2030",group:",",percentFormat:"#,##0%","decimalFormat-long":"000\u5146",decimalFormat:"#,##0.###",
decimal:".","currencySpacing-beforeCurrency-insertBetween":"\u00a0",exponential:"E"},"dijit/form/nls/ComboBox":{previousMessage:"\u524d\u4e00\u500b\u9078\u64c7\u9805",_localized:{},nextMessage:"\u5176\u4ed6\u9078\u64c7\u9805"},"dijit/nls/common":{buttonOk:"\u78ba\u5b9a",buttonCancel:"\u53d6\u6d88",_localized:{},buttonSave:"\u5132\u5b58",itemClose:"\u95dc\u9589"}});
//# sourceMappingURL=dojo_zh-tw.js.map

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 B

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 B

View File

@ -0,0 +1,23 @@
<?xml version="1.0" ?>
<!--
Source file for buttonDisabled.png, which is used by IE7-9 for Button gradients.
Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
Output should match gradients defined in Button.css. It is however an approximation, since generated
output has a constant height, rather than matching the height of each button.
-->
<svg xmlns="http://www.w3.org/2000/svg" width="1px" height="18px" viewBox="0 0 1 18" preserveAspectRatio="none">
<defs>
<linearGradient id="disabled" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" stop-color="#ffffff" stop-opacity="1"/>
<stop offset="50%" stop-color="#ffffff" stop-opacity="0"/>
</linearGradient>
</defs>
<!--
Swatch for disabled buttons. It will only fill the top part of the disabled buttons.
The bottom of disabled buttons are pure background-color
-->
<rect x="0" y="0" width="1" height="18" fill="url(#disabled)"/>
</svg>

After

Width:  |  Height:  |  Size: 1012 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

View File

@ -0,0 +1,24 @@
<?xml version="1.0" ?>
<!--
Source file for buttonEnabled.png, which is used by IE7-9 for Button gradients.
Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
Output should match gradients defined in Button.css. It is however an approximation, since generated
output has a constant height, rather than matching the height of each button.
-->
<svg xmlns="http://www.w3.org/2000/svg" width="1px" height="149px" viewBox="0 0 1 149" preserveAspectRatio="none">
<defs>
<linearGradient id="enabled" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" stop-color="#ffffff" stop-opacity="1"/>
<stop offset="2%" stop-color="#ffffff" stop-opacity="0"/>
<stop offset="15%" stop-color="#ffffff" stop-opacity="0.7"/> <!-- near bottom of average height buttons -->
</linearGradient>
</defs>
<!--
Swatch for enabled buttons. It's 149px tall to account for tall buttons, but usually
only the top will be visible.
-->
<rect x="0" y="0" width="1" height="149" fill="url(#enabled)"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 B

View File

@ -0,0 +1,19 @@
<?xml version="1.0" ?>
<!--
Source file for standardGradient.png, which is used by IE7-9 for light-to-dark gradient of many widgets.
Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
Output should match CSS gradient from .standard-gradient() mixin in variables.css.
It is however an approximation, since generated
output has a constant height, rather than matching the height of each node.
-->
<svg xmlns="http://www.w3.org/2000/svg" width="1px" height="16px" viewBox="0 0 1 1" preserveAspectRatio="none">
<defs>
<linearGradient id="gradient" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" stop-color="rgb(190,190,190)" stop-opacity="0.98"/>
<stop offset="20%" stop-color="#ffffff" stop-opacity="0.65"/>
<stop offset="100%" stop-color="#ffffff" stop-opacity="0"/>
</linearGradient>
</defs>
<rect x="0" y="0" width="1" height="1" fill="url(#gradient)"/>
</svg>

After

Width:  |  Height:  |  Size: 979 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 998 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 649 B

Some files were not shown because too many files have changed in this diff Show More