Story privacy badge

This commit is contained in:
Ilya Laktyushin 2023-07-17 21:09:41 +02:00
parent 88ecedba25
commit 42be53c03a
13 changed files with 868 additions and 40 deletions

View File

@ -9552,8 +9552,9 @@ Sorry for the inconvenience.";
"Story.ContextDeleteStory" = "Delete Story";
"Story.TooltipPrivacyCloseFriendsMy" = "Only people from your close friends list will see this story.";
"Story.TooltipPrivacyCloseFriends" = "You are seeing this story because you have\nbeen added to %@'s list of close friends.";
"Story.TooltipPrivacyContacts" = "Only %@'s contacts can view this story.";
"Story.TooltipPrivacySelectedContacts" = "Only some contacts %@ selected can view this story.";
"Story.ToastViewInChat" = "View in Chat";
"Story.ToastReactionSent" = "Reaction Sent.";

View File

@ -363,7 +363,7 @@ public final class StoryItemSetContainerComponent: Component {
let moreButton = ComponentView<Empty>()
let soundButton = ComponentView<Empty>()
var closeFriendIcon: ComponentView<Empty>?
var privacyIcon: ComponentView<Empty>?
var captionItem: CaptionItem?
@ -1314,7 +1314,7 @@ public final class StoryItemSetContainerComponent: Component {
if let soundButtonView = self.soundButton.view {
soundButtonView.layer.animateAlpha(from: 0.0, to: soundButtonView.alpha, duration: 0.25)
}
if let closeFriendIcon = self.closeFriendIcon?.view {
if let closeFriendIcon = self.privacyIcon?.view {
closeFriendIcon.layer.animateAlpha(from: 0.0, to: closeFriendIcon.alpha, duration: 0.25)
}
self.closeButton.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25)
@ -1455,7 +1455,7 @@ public final class StoryItemSetContainerComponent: Component {
if let soundButtonView = self.soundButton.view {
soundButtonView.layer.animateAlpha(from: soundButtonView.alpha, to: 0.0, duration: 0.25, removeOnCompletion: false)
}
if let closeFriendIconView = self.closeFriendIcon?.view {
if let closeFriendIconView = self.privacyIcon?.view {
closeFriendIconView.layer.animateAlpha(from: closeFriendIconView.alpha, to: 0.0, duration: 0.25, removeOnCompletion: false)
}
if let captionView = self.captionItem?.view.view {
@ -2443,38 +2443,62 @@ public final class StoryItemSetContainerComponent: Component {
}
}
let storyPrivacyIcon: StoryPrivacyIconComponent.Privacy?
if component.slice.item.storyItem.isCloseFriends {
let closeFriendIcon: ComponentView<Empty>
var closeFriendIconTransition = transition
if let current = self.closeFriendIcon {
closeFriendIcon = current
storyPrivacyIcon = .closeFriends
} else if component.slice.item.storyItem.isContacts {
storyPrivacyIcon = .contacts
} else if component.slice.item.storyItem.isSelectedContacts {
storyPrivacyIcon = .selectedContacts
} else if component.slice.peer.id == component.context.account.peerId {
storyPrivacyIcon = .everyone
} else {
storyPrivacyIcon = nil
}
if let storyPrivacyIcon {
let privacyIcon: ComponentView<Empty>
var privacyIconTransition = transition
if let current = self.privacyIcon {
privacyIcon = current
} else {
closeFriendIconTransition = .immediate
closeFriendIcon = ComponentView()
self.closeFriendIcon = closeFriendIcon
privacyIconTransition = .immediate
privacyIcon = ComponentView()
self.privacyIcon = privacyIcon
}
let closeFriendIconSize = closeFriendIcon.update(
transition: closeFriendIconTransition,
let closeFriendIconSize = privacyIcon.update(
transition: privacyIconTransition,
component: AnyComponent(PlainButtonComponent(
content: AnyComponent(BundleIconComponent(
name: "Stories/CloseStoryIcon",
tintColor: nil,
maxSize: nil
)),
content: AnyComponent(
StoryPrivacyIconComponent(
privacy: storyPrivacyIcon,
isEditable: component.slice.peer.id == component.context.account.peerId
)
),
effectAlignment: .center,
action: { [weak self] in
guard let self, let component = self.component else {
return
}
guard let closeFriendIconView = self.closeFriendIcon?.view else {
if component.slice.peer.id == component.context.account.peerId {
self.openItemPrivacySettings()
return
}
guard let closeFriendIconView = self.privacyIcon?.view else {
return
}
let tooltipText: String
if component.slice.peer.id == component.context.account.peerId {
tooltipText = component.strings.Story_TooltipPrivacyCloseFriendsMy
} else {
switch storyPrivacyIcon {
case .closeFriends:
tooltipText = component.strings.Story_TooltipPrivacyCloseFriends(component.slice.peer.compactDisplayTitle).string
case .contacts:
tooltipText = component.strings.Story_TooltipPrivacyContacts(component.slice.peer.compactDisplayTitle).string
case .selectedContacts:
tooltipText = component.strings.Story_TooltipPrivacySelectedContacts(component.slice.peer.compactDisplayTitle).string
case .everyone:
tooltipText = ""
}
let tooltipScreen = TooltipScreen(
account: component.context.account,
sharedContext: component.context.sharedContext,
@ -2499,16 +2523,16 @@ public final class StoryItemSetContainerComponent: Component {
containerSize: CGSize(width: 44.0, height: 44.0)
)
let closeFriendIconFrame = CGRect(origin: CGPoint(x: headerRightOffset - closeFriendIconSize.width - 8.0, y: 23.0), size: closeFriendIconSize)
if let closeFriendIconView = closeFriendIcon.view {
if let closeFriendIconView = privacyIcon.view {
if closeFriendIconView.superview == nil {
self.controlsContainerView.addSubview(closeFriendIconView)
}
closeFriendIconTransition.setFrame(view: closeFriendIconView, frame: closeFriendIconFrame)
privacyIconTransition.setFrame(view: closeFriendIconView, frame: closeFriendIconFrame)
headerRightOffset -= 44.0
}
} else if let closeFriendIcon = self.closeFriendIcon {
self.closeFriendIcon = nil
} else if let closeFriendIcon = self.privacyIcon {
self.privacyIcon = nil
closeFriendIcon.view?.removeFromSuperview()
}

View File

@ -41,48 +41,50 @@ final class StoryPrivacyIconComponent: Component {
self.state = state
let size = CGSize(width: component.isEditable ? 40.0 : 24.0, height: 24.0)
self.image = generateImage(size, rotatedContext: { size, context in
self.image = generateImage(size, contextGenerator: { size, context in
let bounds = CGRect(origin: .zero, size: size)
context.clear(bounds)
let path: CGPath
if size.width == size.height {
path = CGPath(ellipseIn: CGRect(origin: .zero, size: size), transform: nil)
path = CGPath(ellipseIn: bounds, transform: nil)
} else {
path = CGPath(roundedRect: CGRect(origin: .zero, size: size), cornerWidth: size.height / 2.0, cornerHeight: size.height / 2.0, transform: nil)
path = CGPath(roundedRect: bounds, cornerWidth: size.height / 2.0, cornerHeight: size.height / 2.0, transform: nil)
}
context.addPath(path)
context.clip()
var locations: [CGFloat] = [0.0, 1.0]
var locations: [CGFloat] = [1.0, 0.0]
let colors: [CGColor]
let icon: UIImage
var icon: UIImage?
switch component.privacy {
case .everyone:
colors = [UIColor(rgb: 0x4faaff).cgColor, UIColor(rgb: 0x017aff).cgColor]
icon = UIImage()
icon = UIImage(bundleImageName: "Stories/PrivacyEveryone")
case .closeFriends:
colors = [UIColor(rgb: 0x87d93a).cgColor, UIColor(rgb: 0x31b73b).cgColor]
icon = UIImage()
icon = UIImage(bundleImageName: "Stories/PrivacyCloseFriends")
case .contacts:
colors = [UIColor(rgb: 0xc36eff).cgColor, UIColor(rgb: 0x8c61fa).cgColor]
icon = UIImage()
icon = UIImage(bundleImageName: "Stories/PrivacyContacts")
case .selectedContacts:
colors = [UIColor(rgb: 0xffb643).cgColor, UIColor(rgb: 0xf69a36).cgColor]
icon = UIImage()
icon = UIImage(bundleImageName: "Stories/PrivacySelectedContacts")
}
let colorSpace = CGColorSpaceCreateDeviceRGB()
let gradient = CGGradient(colorsSpace: colorSpace, colors: colors as CFArray, locations: &locations)!
context.drawLinearGradient(gradient, start: CGPoint(x: 0.0, y: 0.0), end: CGPoint(x: 0.0, y: size.height), options: CGGradientDrawingOptions())
if let cgImage = icon.cgImage {
context.draw(cgImage, in: CGRect(origin: .zero, size: icon.size))
if let icon, let cgImage = icon.cgImage {
context.draw(cgImage, in: CGRect(origin: CGPoint(x: component.isEditable ? 1.0 : 0.0, y: 0.0), size: icon.size))
}
if component.isEditable {
let arrowIcon = UIImage()
if let cgImage = arrowIcon.cgImage {
context.draw(cgImage, in: CGRect(origin: .zero, size: icon.size))
if let arrowIcon = UIImage(bundleImageName: "Stories/PrivacyDownArrow"), let cgImage = arrowIcon.cgImage {
context.draw(cgImage, in: CGRect(origin: CGPoint(x: size.width - arrowIcon.size.width - 6.0, y: floorToScreenPixels((size.height - arrowIcon.size.height) / 2.0)), size: arrowIcon.size))
}
}
})

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "close_friends.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,156 @@
%PDF-1.7
1 0 obj
<< /Type /XObject
/Length 2 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 24.000000 24.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 3.639893 6.344296 cm
1.000000 1.000000 1.000000 scn
7.906197 0.972034 m
8.185396 1.140079 8.534603 1.140079 8.813802 0.972034 c
11.741163 -0.789910 l
12.407873 -1.191195 13.229085 -0.593198 13.051833 0.164504 c
12.276699 3.477976 l
12.202148 3.796658 12.310615 4.130385 12.558279 4.344343 c
15.138153 6.573098 l
15.727732 7.082436 15.413402 8.050200 14.637055 8.115883 c
11.237473 8.403505 l
10.912478 8.431002 10.629348 8.635992 10.501773 8.936163 c
9.169889 12.069943 l
8.866268 12.784330 7.853731 12.784333 7.550110 12.069945 c
6.218227 8.936163 l
6.090652 8.635993 5.807520 8.431002 5.482525 8.403505 c
2.082942 8.115883 l
1.306596 8.050200 0.992266 7.082436 1.581845 6.573099 c
4.161719 4.344343 l
4.409384 4.130385 4.517849 3.796658 4.443299 3.477976 c
3.668166 0.164505 l
3.490914 -0.593197 4.312125 -1.191195 4.978834 -0.789911 c
7.906197 0.972034 l
h
f*
n
Q
endstream
endobj
2 0 obj
934
endobj
3 0 obj
<< /Type /XObject
/Length 4 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 24.000000 24.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.850980 0.850980 0.850980 scn
24.000000 12.000000 m
24.000000 5.372583 18.627417 0.000000 12.000000 0.000000 c
5.372583 0.000000 0.000000 5.372583 0.000000 12.000000 c
0.000000 18.627417 5.372583 24.000000 12.000000 24.000000 c
18.627417 24.000000 24.000000 18.627417 24.000000 12.000000 c
h
f
n
Q
endstream
endobj
4 0 obj
387
endobj
5 0 obj
<< /XObject << /X1 1 0 R >>
/ExtGState << /E1 << /SMask << /Type /Mask
/G 3 0 R
/S /Alpha
>>
/Type /ExtGState
>> >>
>>
endobj
6 0 obj
<< /Length 7 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
/E1 gs
/X1 Do
Q
endstream
endobj
7 0 obj
46
endobj
8 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
/Resources 5 0 R
/Contents 6 0 R
/Parent 9 0 R
>>
endobj
9 0 obj
<< /Kids [ 8 0 R ]
/Count 1
/Type /Pages
>>
endobj
10 0 obj
<< /Pages 9 0 R
/Type /Catalog
>>
endobj
xref
0 11
0000000000 65535 f
0000000010 00000 n
0000001192 00000 n
0000001214 00000 n
0000001849 00000 n
0000001871 00000 n
0000002169 00000 n
0000002271 00000 n
0000002292 00000 n
0000002465 00000 n
0000002539 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 10 0 R
/Size 11
>>
startxref
2599
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "contacts.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,231 @@
%PDF-1.7
1 0 obj
<< /Type /XObject
/Length 2 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 24.000000 24.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 4.832031 4.831968 cm
1.000000 1.000000 1.000000 scn
14.336000 7.168000 m
14.336000 3.209223 11.126778 0.000000 7.168000 0.000000 c
3.209223 0.000000 0.000000 3.209223 0.000000 7.168000 c
0.000000 11.126778 3.209223 14.336000 7.168000 14.336000 c
11.126778 14.336000 14.336000 11.126778 14.336000 7.168000 c
h
11.029660 3.789469 m
10.114908 4.571531 8.827744 4.962564 7.168171 4.962564 c
5.510108 4.962564 4.223779 4.572244 3.308579 3.791444 c
3.198709 3.697709 3.054291 3.543928 2.930439 3.405277 c
2.778217 3.234865 2.788850 2.976903 2.952451 2.817385 c
3.073660 2.699200 3.210053 2.570437 3.310692 2.487403 c
4.359039 1.622445 5.702928 1.102871 7.168171 1.102871 c
8.634604 1.102871 9.979486 1.623290 11.028034 2.489694 c
11.127872 2.572187 11.263104 2.699939 11.383461 2.817362 c
11.546887 2.976804 11.557580 3.234535 11.405600 3.404923 c
11.282407 3.543037 11.138890 3.696083 11.029660 3.789469 c
h
9.373669 8.822415 m
9.373669 10.040501 8.386215 11.027954 7.168130 11.027954 c
5.950045 11.027954 4.962592 10.040501 4.962592 8.822415 c
4.962592 7.604330 5.950045 6.616877 7.168130 6.616877 c
8.386215 6.616877 9.373669 7.604330 9.373669 8.822415 c
h
f*
n
Q
endstream
endobj
2 0 obj
1228
endobj
3 0 obj
<< /Type /XObject
/Length 4 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 24.000000 24.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.850980 0.850980 0.850980 scn
24.000000 12.000000 m
24.000000 5.372583 18.627417 0.000000 12.000000 0.000000 c
5.372583 0.000000 0.000000 5.372583 0.000000 12.000000 c
0.000000 18.627417 5.372583 24.000000 12.000000 24.000000 c
18.627417 24.000000 24.000000 18.627417 24.000000 12.000000 c
h
f
n
Q
endstream
endobj
4 0 obj
387
endobj
5 0 obj
<< /Type /XObject
/Length 6 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << /XObject << /X1 1 0 R >>
/ExtGState << /E1 << /SMask << /Type /Mask
/G 3 0 R
/S /Alpha
>>
/Type /ExtGState
>> >>
>>
/BBox [ 0.000000 0.000000 24.000000 24.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
/E1 gs
/X1 Do
Q
endstream
endobj
6 0 obj
46
endobj
7 0 obj
<< /Type /XObject
/Length 8 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 24.000000 24.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.000000 0.000000 scn
0.000000 12.000000 m
0.000000 18.627417 5.372584 24.000000 12.000000 24.000000 c
12.000000 24.000000 l
18.627417 24.000000 24.000000 18.627417 24.000000 12.000000 c
24.000000 12.000000 l
24.000000 5.372583 18.627417 0.000000 12.000000 0.000000 c
12.000000 0.000000 l
5.372584 0.000000 0.000000 5.372583 0.000000 12.000000 c
0.000000 12.000000 l
h
f
n
Q
endstream
endobj
8 0 obj
472
endobj
9 0 obj
<< /XObject << /X1 5 0 R >>
/ExtGState << /E1 << /SMask << /Type /Mask
/G 7 0 R
/S /Alpha
>>
/Type /ExtGState
>> >>
>>
endobj
10 0 obj
<< /Length 11 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
/E1 gs
/X1 Do
Q
endstream
endobj
11 0 obj
46
endobj
12 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
/Resources 9 0 R
/Contents 10 0 R
/Parent 13 0 R
>>
endobj
13 0 obj
<< /Kids [ 12 0 R ]
/Count 1
/Type /Pages
>>
endobj
14 0 obj
<< /Pages 13 0 R
/Type /Catalog
>>
endobj
xref
0 15
0000000000 65535 f
0000000010 00000 n
0000001486 00000 n
0000001509 00000 n
0000002144 00000 n
0000002166 00000 n
0000002832 00000 n
0000002853 00000 n
0000003573 00000 n
0000003595 00000 n
0000003893 00000 n
0000003997 00000 n
0000004019 00000 n
0000004195 00000 n
0000004271 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 14 0 R
/Size 15
>>
startxref
4332
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "down_arrow.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,92 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
0.000000 -1.000000 1.000000 0.000000 3.205152 5.500000 cm
1.000000 1.000000 1.000000 scn
0.470226 5.930075 m
0.210527 6.189774 -0.210527 6.189774 -0.470226 5.930075 c
-0.729925 5.670377 -0.729925 5.249322 -0.470226 4.989624 c
0.470226 5.930075 l
h
4.000000 1.459849 m
4.470226 0.989624 l
4.729925 1.249322 4.729925 1.670377 4.470226 1.930075 c
4.000000 1.459849 l
h
-0.470226 -2.069925 m
-0.729925 -2.329623 -0.729925 -2.750678 -0.470226 -3.010377 c
-0.210527 -3.270076 0.210527 -3.270076 0.470226 -3.010377 c
-0.470226 -2.069925 l
h
-0.470226 4.989624 m
3.529774 0.989624 l
4.470226 1.930075 l
0.470226 5.930075 l
-0.470226 4.989624 l
h
3.529774 1.930075 m
-0.470226 -2.069925 l
0.470226 -3.010377 l
4.470226 0.989624 l
3.529774 1.930075 l
h
f
n
Q
endstream
endobj
3 0 obj
779
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 9.330002 8.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Pages 5 0 R
/Type /Catalog
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000000869 00000 n
0000000891 00000 n
0000001062 00000 n
0000001136 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
1195
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "public.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,100 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 6.000000 5.519524 cm
1.000000 1.000000 1.000000 scn
2.823530 4.239948 m
4.682996 4.239948 l
4.857792 4.239948 4.945190 4.239948 5.030216 4.233620 c
5.423162 4.204372 5.801950 4.074408 6.130080 3.856249 c
6.201078 3.809046 6.270064 3.755390 6.408029 3.648083 c
6.408045 3.648071 l
8.050591 2.370535 l
9.317920 1.384834 9.951585 0.891985 10.483602 0.896511 c
10.946416 0.900450 11.382551 1.113756 11.669800 1.476662 c
12.000000 1.893831 12.000000 2.696596 12.000000 4.302126 c
12.000000 9.824834 l
12.000000 11.430362 12.000000 12.233126 11.669800 12.650295 c
11.382551 13.013201 10.946416 13.226507 10.483602 13.230446 c
9.951585 13.234972 9.317920 12.742123 8.050591 11.756422 c
6.408045 10.478886 l
6.270069 10.371571 6.201080 10.317913 6.130080 10.270708 c
5.801950 10.052550 5.423162 9.922585 5.030216 9.893337 c
4.945190 9.887009 4.857792 9.887009 4.682995 9.887009 c
2.823529 9.887009 l
1.264137 9.887009 0.000000 8.622871 0.000000 7.063478 c
0.000000 5.504086 1.264137 4.239948 2.823530 4.239948 c
h
2.867944 2.794148 m
2.823317 2.669311 2.823317 2.513694 2.823317 2.202460 c
2.823317 1.416263 l
2.823317 0.636566 3.455386 0.004498 4.235082 0.004498 c
5.014778 0.004498 5.646847 0.636567 5.646847 1.416263 c
5.646847 2.202461 l
5.646847 2.513694 5.646847 2.669311 5.602220 2.794148 c
5.525096 3.009894 5.355299 3.179691 5.139553 3.256816 c
5.014715 3.301442 4.859099 3.301442 4.547866 3.301442 c
3.922298 3.301442 l
3.611065 3.301442 3.455449 3.301442 3.330611 3.256816 c
3.114865 3.179691 2.945068 3.009894 2.867944 2.794148 c
h
f*
n
Q
endstream
endobj
3 0 obj
1610
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Pages 5 0 R
/Type /Catalog
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000001700 00000 n
0000001723 00000 n
0000001896 00000 n
0000001970 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2029
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "selected_contacts.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,162 @@
%PDF-1.7
1 0 obj
<< /Type /XObject
/Length 2 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 24.000000 24.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 4.660004 6.674881 cm
1.000000 1.000000 1.000000 scn
5.146568 6.930217 m
6.422345 6.930217 7.456567 7.964439 7.456567 9.240217 c
7.456567 10.515994 6.422345 11.550217 5.146568 11.550217 c
3.870790 11.550217 2.836568 10.515994 2.836568 9.240217 c
2.836568 7.964439 3.870790 6.930217 5.146568 6.930217 c
h
10.427466 6.930110 m
11.520990 6.930110 12.407467 7.816586 12.407467 8.910110 c
12.407467 10.003633 11.520990 10.890109 10.427466 10.890109 c
9.333943 10.890109 8.447467 10.003633 8.447467 8.910110 c
8.447467 7.816586 9.333943 6.930110 10.427466 6.930110 c
h
5.146821 5.280002 m
8.024133 5.280002 9.425701 3.891067 10.108419 2.537938 c
10.765203 1.236212 9.574854 0.000002 8.116822 0.000002 c
2.176821 0.000002 l
0.718790 0.000002 -0.471559 1.236211 0.185224 2.537937 c
0.867942 3.891067 2.269510 5.280002 5.146821 5.280002 c
h
8.928054 5.152647 m
9.879559 4.534925 10.495606 3.718197 10.891599 2.933352 c
11.169246 2.383063 11.227625 1.827765 11.121881 1.320235 c
12.736839 1.320235 l
13.830363 1.320235 14.721933 2.245488 14.238333 3.226266 c
13.722783 4.271839 12.651772 5.357882 10.426840 5.357882 c
9.850128 5.357882 9.350945 5.284914 8.918867 5.158597 c
8.928054 5.152647 l
h
f*
n
Q
endstream
endobj
2 0 obj
1259
endobj
3 0 obj
<< /Type /XObject
/Length 4 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 24.000000 24.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.850980 0.850980 0.850980 scn
24.000000 12.000000 m
24.000000 5.372583 18.627417 0.000000 12.000000 0.000000 c
5.372583 0.000000 0.000000 5.372583 0.000000 12.000000 c
0.000000 18.627417 5.372583 24.000000 12.000000 24.000000 c
18.627417 24.000000 24.000000 18.627417 24.000000 12.000000 c
h
f
n
Q
endstream
endobj
4 0 obj
387
endobj
5 0 obj
<< /XObject << /X1 1 0 R >>
/ExtGState << /E1 << /SMask << /Type /Mask
/G 3 0 R
/S /Alpha
>>
/Type /ExtGState
>> >>
>>
endobj
6 0 obj
<< /Length 7 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
/E1 gs
/X1 Do
Q
endstream
endobj
7 0 obj
46
endobj
8 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
/Resources 5 0 R
/Contents 6 0 R
/Parent 9 0 R
>>
endobj
9 0 obj
<< /Kids [ 8 0 R ]
/Count 1
/Type /Pages
>>
endobj
10 0 obj
<< /Pages 9 0 R
/Type /Catalog
>>
endobj
xref
0 11
0000000000 65535 f
0000000010 00000 n
0000001517 00000 n
0000001540 00000 n
0000002175 00000 n
0000002197 00000 n
0000002495 00000 n
0000002597 00000 n
0000002618 00000 n
0000002791 00000 n
0000002865 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 10 0 R
/Size 11
>>
startxref
2925
%%EOF